include Config
+VER = ipfire
+
THISAPP = boot-$(VERSION).img
TARGET = $(DIR_INFO)/$(THISAPP)
sed -e 's/boot IPFire/boot IPFire $(VERSION)/' $(DIR_SRC)/config/kernel/install-message \
> /install/mnt/message; \
cp $(DIR_SRC)/config/kernel/syslinux.cfg /install/mnt/syslinux.cfg; \
- cp /boot/vmlinuz-installer /install/mnt/vmlinuz; \
+ cp /boot/vmlinuz-$(KVER) /install/mnt/vmlinuz; \
cp /install/images/fdinitrd.gz /install/mnt/instroot.gz; \
umount /install/mnt; \
losetup -d $$LOOPDEV; \
# Makefiles are based on LFSMake, which is #
# Copyright (C) 2002 Rod Roard <rod@sunsetsystems.com> #
# #
-# Modifications by: #
-# ??-12-2003 Mark Wormgoor < mark@wormgoor.com> #
-# - Modified Makefile for IPCop build #
-# #
-# $Id: driver.img,v 1.24.2.7 2006/01/29 20:17:30 franck78 Exp $
-# #
###############################################################################
###############################################################################
include Config
+VER = ipfire
+
THISAPP = driver-$(VERSION).img
TARGET = $(DIR_INFO)/$(THISAPP)
# make new dependencies
depmod -a -F /boot/System.map-$(KVER) $(KVER)
- if [ "$(MACHINE)" = "i386" ]; then \
- depmod -a -F /boot/System.map-$(KVER)-smp $(KVER)-smp; \
- fi
+ depmod -a -F /boot/System.map-$(KVER)-smp $(KVER)-smp
# Create drivers floppy
cd /tmp && rm -rf drivers.tgz drivers.tar bin lib etc var
cd /tmp && tar xf drivers.tar
cd /tmp && mkdir -p {bin,etc/pcmcia,var/lib/pcmcia,var/run}
cd /tmp && cp -aR /install/misc/bin/* bin
- cd /tmp && cp -r /etc/pcmcia/{config*,net*} etc/pcmcia
+# cd /tmp && cp -r /etc/pcmcia/{config*,net*} etc/pcmcia
# cardmgr wants to execute these to bring up the card, we'll
# create blank ones as we'll bring them up ourselves
- cd /tmp/etc/pcmcia && rm -f network
- cd /tmp/etc/pcmcia && touch network
- cd /tmp/etc/pcmcia && chmod +x network
+# cd /tmp/etc/pcmcia && rm -f network
+# cd /tmp/etc/pcmcia && touch network
+# cd /tmp/etc/pcmcia && chmod +x network
cd /tmp && tar -cf - bin/ etc/pcmcia var lib/modules/$(KVER) | gzip -9 -c > drivers.tgz
- if [ "$(MACHINE)" = "alpha" ]; then \
- cp /tmp/drivers.tgz /install/images/drivers-$(VERSION).img; \
- else \
- dd if=/tmp/drivers.tgz of=/install/images/drivers-$(VERSION).img bs=1440k count=1 conv=sync; \
- fi
+ dd if=/tmp/drivers.tgz of=/install/images/drivers-$(VERSION).img bs=2880k count=1 conv=sync
rm -rf /tmp/drivers.tgz /tmp/drivers.tar /tmp/bin /tmp/lib
### If this fails, the disk is TOO FULL !!!!
# Makefiles are based on LFSMake, which is #
# Copyright (C) 2002 Rod Roard <rod@sunsetsystems.com> #
# #
-# Modifications by: #
-# ??-12-2003 Mark Wormgoor < mark@wormgoor.com> #
-# - Modified Makefile for IPCop build #
-# #
-# $Id: initrd,v 1.26.2.8 2005/12/03 21:28:44 franck78 Exp $
-# #
###############################################################################
###############################################################################
include Config
+VER = ipfire
+
THISAPP = initrd
DIR_APP = $(DIR_SRC)/$(THISAPP)
TARGET = $(DIR_INFO)/$(THISAPP)
# Finish up initrd directory
-mkdir -p /install/initrd/{etc,lib/modules/$(KVER)/kernel/drivers,cdrom,dev,harddisk,proc,tmp,usr/share/terminfo/l,var/run} && \
ln -sf /bin /install/initrd/sbin
- cd /install/initrd/dev && /dev/make_devices
+# cd /install/initrd/dev && /dev/make_devices
cp -aRf $(DIR_SRC)/config/install/* /install/initrd/etc/
rm -rf /install/initrd/etc/CVS/
cd /install/initrd/dev && ln -sf fd0 floppy
chmod 755 /install/initrd/etc/halt /install/initrd/etc/rc
cp -f /usr/share/terminfo/l/linux /install/initrd/usr/share/terminfo/l
- if [ "$(MACHINE)" = "alpha" ]; then \
- tar cvzf /tmp/libc.tgz /usr/share/locale /lib/libc.* /lib/libc-* /lib/libdl* /lib/libnsl* /lib/libresolv* /lib/libutil* /lib/ld* /lib/libcrypt*; \
- tar xvzf /tmp/libc.tgz -C /install/initrd; \
- strip /install/initrd/lib/*; \
- rm -f /tmp/libc.tgz; \
- fi
-
# Extra modules
-mkdir -p /install/initrd/lib/modules/$(KVER)/kernel/drivers/scsi
- cp -f /lib/modules/$(KVER)/kernel/drivers/scsi/{scsi_mod.o.gz,sd_mod.o.gz,sr_mod.o.gz} \
+ cp -f /lib/modules/$(KVER)/kernel/drivers/scsi/{scsi_mod.ko,sd_mod.ko,sr_mod.ko} \
/install/initrd/lib/modules/$(KVER)/kernel/drivers/scsi/
-mkdir -p /install/initrd/lib/modules/$(KVER)/kernel/drivers/usb/storage/
- cp -f /lib/modules/$(KVER)/kernel/drivers/usb/storage/*.o.gz \
+ cp -f /lib/modules/$(KVER)/kernel/drivers/usb/storage/*.ko \
/install/initrd/lib/modules/$(KVER)/kernel/drivers/usb/storage/
-mkdir -p /install/initrd/lib/modules/$(KVER)/kernel/drivers/usb/host/
- cp -f /lib/modules/$(KVER)/kernel/drivers/usb/host/{usb-*,ehci*} \
- /lib/modules/$(KVER)/kernel/drivers/usb/hid.o.gz \
- /lib/modules/$(KVER)/kernel/drivers/usb/*core.o.gz \
+ cp -f /lib/modules/$(KVER)/kernel/drivers/usb/host/ehci* \
+ /lib/modules/$(KVER)/kernel/drivers/usb/input/usbhid.ko \
+ /lib/modules/$(KVER)/kernel/drivers/usb/core/usbcore.ko \
/install/initrd/lib/modules/$(KVER)/kernel/drivers/usb/
- -mkdir -p /install/initrd/lib/modules/$(KVER)/kernel/drivers/input
- cp -f /lib/modules/$(KVER)/kernel/drivers/input/{input.o.gz,keybdev.o.gz} \
- /install/initrd/lib/modules/$(KVER)/kernel/drivers/input/
+# -mkdir -p /install/initrd/lib/modules/$(KVER)/kernel/drivers/input
+# cp -f /lib/modules/$(KVER)/kernel/drivers/input/{input.ko,keybdev.ko} \
+# /install/initrd/lib/modules/$(KVER)/kernel/drivers/input/
- -mkdir -p /install/initrd/lib/modules/$(KVER)/kernel/drivers/pnp
- cp -f /lib/modules/$(KVER)/kernel/drivers/pnp/* \
- /install/initrd/lib/modules/$(KVER)/kernel/drivers/pnp/
+# -mkdir -p /install/initrd/lib/modules/$(KVER)/kernel/drivers/pnp
+# cp -f /lib/modules/$(KVER)/kernel/drivers/pnp/* \
+# /install/initrd/lib/modules/$(KVER)/kernel/drivers/pnp/
cp -f /lib/modules/$(KVER)/modules.* /install/initrd/lib/modules/$(KVER)/
# Makefiles are based on LFSMake, which is #
# Copyright (C) 2002 Rod Roard <rod@sunsetsystems.com> #
# #
-# Modifications by: #
-# ??-12-2003 Mark Wormgoor < mark@wormgoor.com> #
-# - Modified Makefile for IPCop build #
-# #
-# $Id: installer,v 1.6.2.3 2005/02/05 15:38:15 gespinasse Exp $
-# #
###############################################################################
###############################################################################
include Config
+VER = ipfire
+
THISAPP = installer
DIR_APP = $(DIR_SRC)/$(THISAPP)
TARGET = $(DIR_INFO)/$(THISAPP)
# Makefiles are based on LFSMake, which is #
# Copyright (C) 2002 Rod Roard <rod@sunsetsystems.com> #
# #
-# Modifications by: #
-# ??-12-2003 Mark Wormgoor < mark@wormgoor.com> #
-# - Modified Makefile for IPCop build #
-# #
-# $Id: newt,v 1.8.2.3 2005/02/05 15:38:15 gespinasse Exp $
-# #
###############################################################################
###############################################################################
THISAPP = newt-utf8_$(VER)
DL_FILE = $(THISAPP).orig.tar.gz
-DL_FROM = $(URL_DEBIAN)/n/newt-utf8
+DL_FROM = $(URL_IPFIRE)
DIR_APP = $(DIR_SRC)/newt-0.50.17
ifeq "$(LFS_PASS)" "install"
TARGET = $(DIR_INFO)/$(THISAPP)-install
ifeq "$(LFS_PASS)" "install"
cd $(DIR_APP)/lib && CFLAGS="-Os -fomit-frame-pointer" ./configure
- cd $(DIR_APP)/lib && CFLAGS="-Os -fomit-frame-pointer" make
+ cd $(DIR_APP)/lib && CFLAGS="-Os -fomit-frame-pointer" make $(MAKETUNING)
-mkdir -p /install/include/pci
cd $(DIR_APP) && install -m 0644 lib/libpci.a /install/lib
cd $(DIR_APP) && install -m 0644 lib/{config,header,pci}.h /install/include/pci
THISAPP = pcmciautils-$(VER)
DL_FILE = $(THISAPP).tar.bz2
-DL_FROM = $(URL_SFNET)/pcmcia-cs
+DL_FROM = $(URL_IPFIRE)
DIR_APP = $(DIR_SRC)/$(THISAPP)
ifeq "$(LFS_PASS)" "install"
TARGET = $(DIR_INFO)/$(THISAPP)-install
$(TARGET) : $(patsubst %,$(DIR_DL)/%,$(objects))
@$(PREBUILD)
@rm -rf $(DIR_APP) && cd $(DIR_SRC) && tar jxf $(DIR_DL)/$(DL_FILE)
- cd $(DIR_APP) && make #$(MAKETUNING)
- cd $(DIR_APP) && make install
-## This is saved...
-#ifeq "$(LFS_PASS)" "install"
-# cd $(DIR_APP) && ./Configure -n --kernel=/usr/src/linux --notrust --cardbus --pnp --apm --nox11 --srctree --ucc=gcc --kcc="$(KGCC)"
+ifeq "$(LFS_PASS)" "install"
# cd $(DIR_APP) && make -C cardmgr
# cd $(DIR_APP) && mkdir -p /install/misc/bin
# cd $(DIR_APP) && install -s -m 0755 cardmgr/cardmgr /install/misc/bin
# cd $(DIR_APP) && install -s -m 0755 cardmgr/cardctl /install/misc/bin
-#else
-# cd $(DIR_APP) && ./Configure -n --kernel=/usr/src/linux --notrust --cardbus --pnp --apm --nox11 --srctree --ucc=gcc --kcc="$(KGCC)"
-# cd $(DIR_APP) && make all
-# cd $(DIR_APP) && make install
-#
-# # Install our own extra pcmcia configs
-# cp $(DIR_SRC)/src/pcmcia/*.conf /etc/pcmcia
-#endif
+else
+ cd $(DIR_APP) && make
+ cd $(DIR_APP) && make install
+
+ # Install our own extra pcmcia configs
+ cp $(DIR_SRC)/src/pcmcia/*.conf /etc/pcmcia
+endif
@rm -rf $(DIR_APP)
@$(POSTBUILD)
# Makefiles are based on LFSMake, which is #
# Copyright (C) 2002 Rod Roard <rod@sunsetsystems.com> #
# #
-# Modifications by: #
-# ??-12-2003 Mark Wormgoor < mark@wormgoor.com> #
-# - Modified Makefile for IPCop build #
-# #
-# $Id: scsi.img,v 1.19.2.4 2005/02/05 15:38:15 gespinasse Exp $
-# #
###############################################################################
###############################################################################
include Config
+VER = ipfire
+
THISAPP = scsi-$(VERSION).img
TARGET = $(DIR_INFO)/$(THISAPP)
-mkdir -p /install/images
cd /tmp && rm -rf scsi.tgz scsi.tar bin etc lib var
- cd / && tar -cf /tmp/scsi.tar lib/modules/$(KVER)/kernel/drivers/{scsi,pcmcia,message/fusion} lib/modules/$(KVER)/kernel/drivers/block/{DAC960.o.gz,cpqarray.o.gz,cciss.o.gz} lib/modules/$(KVER)/kernel/drivers/ide
+ cd / && tar -cf /tmp/scsi.tar lib/modules/$(KVER)/kernel/drivers/{scsi,pcmcia,message/fusion} lib/modules/$(KVER)/kernel/drivers/block/{DAC960.ko,cpqarray.ko,cciss.ko} lib/modules/$(KVER)/kernel/drivers/ide
cd /tmp && tar xf scsi.tar
cd /tmp && rm -f lib/modules/$(KVER)/kernel/drivers/message/fusion/mptlan*
cd /tmp && mkdir -p {bin,etc/pcmcia/scsi,var/lib/pcmcia,var/run}
cd /tmp && cp -aR /install/misc/bin/* bin
- cd /tmp && cp -r /etc/pcmcia/{config*,scsi*} etc/pcmcia/scsi
+# cd /tmp && cp -r /etc/pcmcia/{config*,scsi*} etc/pcmcia/scsi
# cardmgr wants to execute these to bring up the card, we'll
# create blank ones as we'll bring them up ourselves
- cd /tmp/etc/pcmcia/scsi && rm -f scsi
- cd /tmp/etc/pcmcia/scsi && touch scsi
- cd /tmp/etc/pcmcia/scsi && chmod +x scsi
+# cd /tmp/etc/pcmcia/scsi && rm -f scsi
+# cd /tmp/etc/pcmcia/scsi && touch scsi
+# cd /tmp/etc/pcmcia/scsi && chmod +x scsi
cd /tmp && tar -cf - bin/ etc/pcmcia var lib/modules/$(KVER) | gzip -9 -c > scsi.tgz
- if [ "$(MACHINE)" = "alpha" ]; then \
- cp /tmp/scsi.tgz /install/images/scsidrv-$(VERSION).img; \
- else \
- dd if=/tmp/scsi.tgz of=/install/images/scsidrv-$(VERSION).img bs=2880k count=1 conv=sync; \
- fi
+ dd if=/tmp/scsi.tgz of=/install/images/scsidrv-$(VERSION).img bs=2880k count=1 conv=sync
rm -f /tmp/scsi.tgz
### If this fails, the disk is TOO FULL !!!!
@rm -rf $(DIR_APP) && cd $(DIR_SRC) && tar jxf $(DIR_DL)/$(DL_FILE)
ifeq "$(LFS_PASS)" "install"
-mkdir -p /install/lib
- cd $(DIR_APP) && sed -i -e 's/libslang.a:/libslang.a:\ $$(OBJS)/' Makefile
- cd $(DIR_APP) && CFLAGS="-Os -fomit-frame-pointer -Wall -fPIC" make -e libslang.a
- cd $(DIR_APP) && install -m 0644 libslang.a /install/lib
- -mkdir -p /install/include/slang
- cd $(DIR_APP) && install -m 0644 slang.h slcurses.h /install/include/slang
+ cd $(DIR_APP) && ./configure --prefix=""
+ cd $(DIR_APP) && make $(MAKETUNING) elf
+ cd $(DIR_APP)/src && make $(MAKETUNING) install-elf DESTDIR="/opt/$(MACHINE)-uClibc"
+ rm -vf /opt/$(MACHINE)-uClibc/lib/libslang.so*
else
cd $(DIR_APP) && ./configure --prefix=/usr --sysconfdir=/etc
- cd $(DIR_APP) && make
- cd $(DIR_APP) && make elf
- cd $(DIR_APP) && make install-elf
+ cd $(DIR_APP) && make $(MAKETUNING)
+ cd $(DIR_APP) && make elf $(MAKETUNING)
+ cd $(DIR_APP) && make install-elf $(MAKETUNING)
cd $(DIR_APP) && chmod -v 755 /usr/lib/libslang.so.2.0.6
endif
@rm -rf $(DIR_APP)
# Normal build or /tools build.
#
ifeq "$(ROOT)" ""
+ifeq "$(LFS_PASS)" "install"
+ TARGET = $(DIR_INFO)/$(THISAPP)-install
+else
TARGET = $(DIR_INFO)/$(THISAPP)
+endif
else
TARGET = $(DIR_INFO)/$(THISAPP)-tools
endif
@$(PREBUILD)
@rm -rf $(DIR_APP) && cd $(DIR_SRC) && tar jxf $(DIR_DL)/$(DL_FILE)
ifeq "$(ROOT)" ""
+ifeq "$(LFS_PASS)" "install"
+ cd $(DIR_APP) && CFLAGS="-Os -fomit-frame-pointer" ./configure
+ cd $(DIR_APP) && echo "HAVE_SLANG=yes" >> make_include
+ cd $(DIR_APP) && echo "SLANGFLAGS=-I/opt/$(MACHINE)-uClibc/include/slang" >> make_include
+ cd $(DIR_APP)/fdisk && make cfdisk
+ cd $(DIR_APP)/fdisk && install -m 0755 cfdisk /install/initrd/bin
+ cd $(DIR_APP)/disk-utils && make LDFLAGS=-static mkfs.minix fsck.minix
+ cd $(DIR_APP)/disk-utils && install -m 0755 mkfs.minix /sbin/mkfs.minix.static
+ cd $(DIR_APP)/disk-utils && install -m 0755 fsck.minix /sbin/fsck.minix.static
+else
cd $(DIR_APP) && sed -i 's@etc/adjtime@var/lib/hwclock/adjtime@g' \
hwclock/hwclock.c
-mkdir -p /var/lib/hwclock
cd $(DIR_APP) && ./configure
cd $(DIR_APP) && make $(MAKETUNING) HAVE_KILL=yes HAVE_SLN=yes
cd $(DIR_APP) && make HAVE_KILL=yes HAVE_SLN=yes install
+endif
else
cd $(DIR_APP) && sed -i 's@/usr/include@/tools/include@g' configure
cd $(DIR_APP) && ./configure
installmake sysvinit
installmake e2fsprogs
installmake misc-progs
-exiterror STOP HERE!
- ipfiremake syslinux
- ipfiremake as86
- ipfiremake mbr
+ installmake sysfsutils
+# installmake hwinfo
installmake slang
installmake util-linux
installmake newt
installmake pciutils
- installmake pcmcia-cs
- installmake kbd
+ installmake pcmciautils
installmake installer
installmake scsi.img
installmake driver.img
installmake initrd
installmake boot.img
+exiterror STOP HERE!
+ ipfiremake syslinux
+ ipfiremake as86
+ ipfiremake mbr
+ installmake kbd
}
buildpackages() {
--- /dev/null
+----------------------------------------------------------------------
+
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 675 Mass Ave, Cambridge, MA 02139, USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+\f
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+\f
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+\f
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+\f
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+\f
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) 19yy <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) 19yy name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General
+Public License instead of this License.
--- /dev/null
+22/3/2005: v10.16
+ - updated X11 data (#74130)
+
+21/3/2005: v10.15
+ - mls: faster hwscand
+
+21/3/2005: v10.14
+ - updated X11 data (#74022)
+
+19/3/2005: v10.13
+ - fix wrong entry for Fritz!Card DSL SL USB and
+ make ppp mode detection safer (#71995)
+ - adjusted ltmodem info (#71979)
+
+18/3/2005: v10.12
+ - updated nongpl info
+ - reverting slamr patch (#72301)
+ - pcmcia info updated (#73057)
+ - pci dev names updated
+ - read /proc/modules less often
+ - updated X11 data
+ - aic7xxx/aic79xx driver info update
+ - fix Fritz!Box Fon entry in database
+
+17/3/2005: v10.11
+ - another notebook (#67412)
+ - do wlan detection for --netcard (#73077)
+ - remove Eicon cards from 64 bit archs, the driver does not support
+ 64 bit yet (#55722)
+
+16/3/2005: v10.10
+ - updated notebook display data
+ - fix udev db reading
+ - updated X11 data
+ - ltmodem device id update
+ - no check for gfx card changes (#72907)
+
+14/3/2005: v10.9
+ - hardware detection for ISDN PCMCIA cards (#71208)
+ - updated ISDN data
+ - updated X11 data
+ - better network type detection (#70991, #71231, #67325)
+ - load some acpi modules on hp notebook (#72146)
+ - fixed isapnp sound card detection (#67303)
+ - slamr: ttySL0 -> ttyLT0 (#72301)
+
+7/3/2005: v10.8
+ - updated X11 data
+
+4/3/2005: v10.7
+ - s390: made ccwgroup walking more robust
+ - fixed bios base mem detection
+ - allow device class in 'hwinfo --db' request
+ - updated X11 data
+
+28/2/2005: v10.6
+ - jg: improved wlan patch (no dependency on libiw)
+
+28/2/2005: v10.5
+ - fixed model name for some SGI hardware (#63973)
+ - fix Fritz!Card DSL SL USB ID (#66674)
+ - better heuristics to assign BIOS driver numbers (#66669)
+ - removed ahci vs. ata_piix hack (#65218)
+
+25/2/2005: v10.4
+ - report pci class 0x403 as audio devices (#66466)
+ - load ahci *and* ata_piix (#65218)
+ - symlink /dev/fb might be missing; trying fb0, too (#66501)
+ - reorder modules.pcimap entries so that more specific matches are
+ considered first (#66594)
+ - ensure nvida network cards are network cards (#65852)
+ - updated X11 data
+
+23/2/2005: v10.3
+ - reworked pcmcia code to give cardbus devices sysfs ids
+
+21/2/2005: v10.2
+ - jg: added wlan feature detection
+
+17/2/2005: v10.1
+ - notebook lcd data update
+ - build shared tiny lib
+
+15/2/2005: v10.0
+ - libhd interface changes: geometry values
+ - prepare for wlan feature detection
+ - x11 db update
+ - better disk geometry handling
+
+8/2/2005: v9.36
+ - added '--kernel-version' option
+
+31/1/2004: v9.35
+ - updated X11 data
+
+14/12/2004: v9.34
+ - fixed access to undefined memory (#39238)
+ - fix segfault when using 'x11=foo' boot option (#46367)
+ - add additional check to catch broken BIOSes (#48665)
+ - abort BIOS code execution if it takes too long (#48665)
+ - find usb serial lines
+
+2/12/2004: v9.33
+ - s390: identify new CU types 2107, 1750 as DASD
+ - fixed some dvb entries (#47057)
+ - s390: added new prog_if ID pif_dasd_fba to identify FBA DASDs
+ (reqd. by fehr)
+ - less agressively assume scsi devs are disks (#47654)
+ - fixed external hardware db parser (#47606, comment 6)
+ - ibm notebook data updated
+ - avoid libsysfs accidentally reading pci config space
+ - fixed parsing of scsi serial id (#48757)
+ - look at /sys/class/net/*/type, too (#48812)
+
+13/10/2004: v9.32
+ - report network interfaces correctly even though udev lists them
+
+12/10/2004: v9.31
+ - report usb host-to-host links as network devs (#22739)
+
+11/10/2004: v9.30
+ - find ide devices != cdrom & disk (#39911, #45229)
+ - return special ids for synaptics touchpad (#46649)
+
+7/10/2004: v9.29
+ - fixed segfault with large /proc/interrupt entries (e.g. 512 cpus) (#46582)
+
+1/10/2004: v9.28
+ - list bluetooth isdn box as bt device, too (#46626)
+
+1/10/2004: v9.27
+ - smartlink-softmodem is back (#46594)
+ - added some dvb cards (#46612)
+
+30/9/2004: v9.26
+ - updated X11 data (#45870)
+
+29/9/2004: v9.25
+ - removed obsolete module info; reworked pcmcia info
+
+29/9/2004: v9.24
+ - updated pcmcia & usb network data (#33647)
+ - updated pci device names
+
+29/9/2004: v9.23
+ - use SG_IO for SCSI device accesses (#46058)
+
+28/9/2004: v9.22
+ - added gen-hwcfg-disk.sh (#46311)
+
+27/9/2004: v9.21
+ - updated ancient audio info (#46096)
+ - add ipw/atmel firmware packages (#45960)
+ - updated X11 data
+ - added new isdn cards to database
+
+27/9/2004: v9.20
+ - report bluetooth devices (#45893)
+
+24/9/2004: v9.19
+ - return package info for sony notebooks, too (35245)
+
+23/9/2004: v9.18
+ - added --pcmcia option to hwscanqueue (#44290)
+ - return package info in system entry (#35245)
+
+22/9/2004: v9.17
+ - updated X11 data
+
+21/9/2004: v9.16
+ - drop workaround for multiple hotplug events by broken kernel
+
+21/9/2004: v9.15
+ - replaced raiddetect with dmraid
+
+20/9/2004: v9.14
+ - sata info update (#45551)
+ - look at smbios data for smp detection, too
+
+17/9/2004: v9.13
+ - added some epson scanners (#45074)
+ - adaptec module info update
+
+13/9/2004: v9.12
+ - kernel-nongpl stuff only for i386 (#45099)
+ - updated megaraid module info
+ - ibm notebook info update (#45038)
+
+13/9/2004: v9.11
+ - clear hd_data struct after it has been released (#44855)
+ - updated X11 data
+ - changed sata vendor name handling a bit
+ - isdn: remove old bluetooth packages from database
+
+10/9/2004: v9.10
+ - sata driver seems to generate a dummy scsi vendor name (#44286)
+
+6/9/2004: v9.9
+ - updated tv-card info
+
+6/9/2004: v9.8
+ - removed ancient function hd_has_special_eide()
+ - use edd module to get extended BIOS features (#44649)
+ - 'hwinfo --map' includes a hardware scan
+
+3/9/2004: v9.7
+ - win modem dev name change (#44253)
+ - added nongpl module info
+ - fixed /tmp file handling (#44538)
+
+30/8/2004: v9.6
+ - changed hwbootscan to use bash (#44199)
+ - fixed hd.ids parser bug
+ - updated X11 data
+
+23/8/2004: v9.5
+ - updated X11 data
+ - added display sizes for a number of IBM notebooks
+
+18/8/2004: v9.4
+ - new wlan data (#42759, #39481, #43921)
+ - hwscan now really moved to /sbin
+
+16/8/2004: v9.3
+ - move hwscan* to /sbin (#43601)
+
+5/8/2004: v9.2
+ - push/pop don't work with 32bit regs on amd64 (#43531)
+
+4/8/2004: v9.1
+ - get netcard link state via ethtool ioctl
+
+6/7/2004: v9.0
+ - ids/src/s390: changed "OSA Express Ethernet card" to "OSA Express
+ Network card" (can be Token Ring, too)
+ - joined changes up to 8.60 from 9.1 branch:
+ - major 229, minors >= 128 are hvsi%u devies (host virtual
+ serial interface) (requested by IBM)
+ - ids/src/s390: use subclass 0x86 for OSA Express (bug #41461)
+ - changed Broadcom netcard name (#42362)
+ - dac960 data corrected (#41659)
+ - s390: set status.available to yes for IUCV devs (bug #41525)
+ - s390: give bus_iucv a name (bug #41525)
+ - s390: give the IUCV "controller" subclass ID and name (bug #41525)
+ - ia64: fixed unaligned accesses (#41589)
+ - check file size so we don't read outside mmap()-ed region
+ - ppc: handle iseries_veth correctly in loaded and unloaded module
+ state. #41347/LTC#8984
+ - send smaller scsi INQUIRY command (#38731)
+ - added scsi.noserial probe option; useful for some usb sticks (#40485)
+ - adding pci id fix from #40175
+ - updated b44 vs. bcm4400 data
+ - s390: fixed several DASD IDs
+ - s390: fixed --disk filtering (bug #41231)
+ - made --only more effective (#37933)
+ - hwscanqueue: closing file descriptors to allow parent to terminate
+ - added debug option to cpu emulation to help tracing bios related system
+ crashes (#40644)
+ - use sysfs_bus_id for unique ID calculation on CCW devices to avoid
+ duplicate IDs (bug #40587)
+ - read /proc/iSeries/config to get number of veth devs (#40527)
+ - load sg module before looking for scanners (#40478)
+ - updated usb scanner data (#40480)
+ - got latest pci device names from pciutils
+ - use mmap() to access /dev/mem & re-enable bios access
+ on ia64 (#34550)
+ - take out ips (#39993)
+ - fixed cdb_x11 script (#40335)
+ - updated X11 data (#40335)
+ - fixed UML fix (#40271)
+ - don't check alternate settings (#40266)
+ - added functions necessary to build a model name to tiny version;
+ this is needed by linuxrc (#39092)
+ - detect IUCV pseudodevices (bug #39456)
+ - added hd_busid_to_hwcfg() (bug #39456)
+ - updated X11 data (#39767)
+ - fixed strange side effect of UML detection (#39946)
+ - s390: enhance grouped channel detection using ccwgroup bus
+ - use *last* console parameter for serial console
+ - look for usb network cards (#37870)
+ - network class id cleanup (#39456)
+ - add bus.name for bus.id == bus_ccw
+ - avoid unspecific network types (#38874)
+ - fixed memory size detection (#34895, #38758)
+ - report UML network (#39521)
+ - 'hwinfo --map' returns mapping new -> old block
+ device names (#39437)
+ - s390: set is.notready flag on unformatted DASDs (bug #39174)
+ - rewrote serial console handling (#39029, #23322, #35824)
+ - updated X11 data (#39282)
+ - subclass 0x83 for xpnet card (#35867)
+ - add UML keyboard (#38922)
+ - s390: add bus id bus_ccw
+ - s390: set bus.id, sysfs_bus_id and sysfs_device_link for all devices
+ - s390: do not do pr_s390disks by default, and run it after pr_s390
+ to keep already detected non-disk devices from being deleted
+ - s390: implement rw/ro info properly
+ - s390: fake geometry and size of unformatted DASDs to most likely
+ values
+ - removed veth.* (not needed)
+ - fixed bug in modules.alias conversion script (#38800)
+ - fixed linmodem data (#38800)
+ - handle veth devices on iSeries (#38696, #37981)
+ - another de4x5 vs. tulip case (#39127)
+ - fixed cdrom config segfault (might happen while reading inconsistent
+ cdrom config data)
+ - support pSeries vscsi (#36029)
+ - bcm5700, not tg3 on ppc* (#38647)
+ - add Acer TravelMate 660 & Asus S5200N LCD sizes (#38149)
+ - make SGI IOC4 known as storage controller (#38628)
+ - support SGI XPNET (#35867)
+
+6/4/2004: v8.38
+ - do call --partion with --fast in hwscand polling code
+
+6/4/2004: v8.37
+ - fixed unique ids for pci devs (#37570)
+
+6/4/2004: v8.36
+ - run raiddetect only on x86-like archs (#36157)
+ - don't run raiddetect if we didn't find any disks
+
+5/4/2004: v8.35
+ - don't run raiddetect if --fast option is used
+
+5/4/2004: v8.34
+ - make --only accept device names, too (#38265)
+ - check return value from hd_sysfs_id() (#38266)
+ - make it more resistant against strange libsysfs data (#38259)
+ - tg3 vs bcm5700 again (#38268)
+
+2/4/2004: v8.33
+ - another wlan card (#38119)
+
+2/4/2004: v8.32
+ - store driver list & sysfs info in hardware config files
+
+2/4/2004: v8.31
+ - add Fritz!Card DSL SL USB in database
+ - hwbootscan: move icon creation from coldplug
+ - lt modem (#36552)
+ - fixed some module names (#37285, #37518)
+ - added dvb cards (#32730)
+ - use old bios disk assign code if there's no edd info
+
+1/4/2004: v8.30
+ - wlan card detection fix (#37872)
+ - updated X11 data
+ - read isapnp from sysfs (#35157)
+
+1/4/2004: v8.29
+ - hwscanqueue: remember commands and ignore the same commands for 20
+ seconds (workaround some unexpected signals from kernel)
+ - hwscand: set long timeout to 10 seconds
+ - hwscan*: add --partition command
+
+31/3/2004: v8.28
+ - rewrote input device handling
+ - load ide-cd, sd_mod, sr_mod before looking for block devs (#37558)
+ - fixed usb printer detection
+ - run 'raiddetect' to tag ide soft raid devices
+ - minor vbe bios fixes
+
+30/3/2004: v8.27
+ - changed bios probing to do less things
+ - added duplicate DASD detection code from the late dasd.c
+ to block.c (bug #37068)
+ - changed bios probing to do less things
+ - another winmodem (#37335)
+
+29/3/2004: v8.26
+ - don't run modprobe if it doesn't exist
+
+29/3/2004: v8.25
+ - add edd support
+
+28/3/2004: v8.24
+ - added hwscand hwscanqueue
+ - use sysfs for usb devices
+ - scsi tapes detected again
+ - added hardware class 'tape'
+ - added getsysinfo script (collect data to debug hw detection)
+
+25/3/2004: v8.23
+ - added hd_is_uml() to report if we're running in an UM kernel
+ - b44 vs. bcm4400 (#36763)
+ - fix inconsitency in device name list
+ - allow device names in 'hwscan --show'
+
+22/3/2004: v8.22
+ - removed Intel-v92ham support (#36667)
+ - worked on new sysfs block code
+
+21/3/2004: v8.21
+ - use sysfs for block devices
+
+15/3/2004: v8.20
+ - fixed 8139cp/too module info (#36028)
+
+15/3/2004: v8.19
+ - do not reverse sysfs order (libsysfs does it)
+ - updated X11 data
+ - return real device name, not udev symlink
+ - DSL hardware detection for none pppoe (kkeil)
+
+14/3/2004: v8.18
+ - s390: added two missing DASD device types
+ - added '--root' option (for testing)
+ - added '--db' option for database queries
+ - fixed 'x11i' parameter handling
+ - read pci.handmap
+
+9/3/2004: v8.17
+ - udevinfo moved to /usr/bin
+
+8/3/2004: v8.16
+ - added host info for s390 SCSI devices
+ - added disk-only probing method for s390
+ - added WWPN, FCP LUN for s390 SCSI devices
+ - updated X11 data
+
+4/3/2004: v8.15
+ - s390: added LCSS info to ccw_t
+ - link libhd against libsysfs
+ - added hw item for quick DASD rescanning
+ - updated digital camera ids.
+ - pci from sysfs finished
+ - network interfaces from sysfs
+
+1/3/2004: v8.14
+ - fix smp detection on ia32e (#34742)
+ - store some new fields in unique-id files
+ - better error logging for vbios init
+ - disable all BIOS related things on ia64 (#34550)
+ - updated X11 data
+ - use sysfs for pci data (not default)
+
+24/2/2004: v8.13
+ - include x86emu into libhd.so
+ - don't segfault if we couldn't get a shared memory segment
+
+23/2/2004: v8.12
+ - fixed Makefile
+
+23/2/2004: v8.11
+ - added '--version' (#31925)
+
+23/2/2004: v8.10
+ - check for hyperthreading on amd64 (#34742)
+ - removed last references to ataraid from hardware db
+ - added new x86 emulator (#34545)
+ - return MacRISC<n> (#34591)
+
+17/2/2004: v8.09
+ - handle '-' vs. '_' in module names
+
+17/2/2004: v8.08
+ - isdn database optional read from /usr/share/hwinfo/ISDN.CDB.hwdb
+ - mk_isdnhwdb tool to convert CDB data to ISDN.CDB.hwdb
+ - fixed Makefile
+
+16/2/2004: v8.07
+ - fixed ia64 unaligned access (#32396)
+ - use modprobe for tulip (#32911)
+
+11/2/2004: v8.06
+ - fixed segfault on s390*
+ - removed special ia64 hardware data: new kernel, new game
+
+9/2/2004: v8.05
+ - nvnet -> forcedeth (#25531)
+ - sata module data updated
+ - moved psaux mice to input/mice
+ - make convert_hd understand modules.alias files
+
+6/2/2004: v8.04
+ - sysfs includes moved
+ - usb modules renamed
+ - really basic udev & sysfs support for block devs
+
+4/12/2003: v8.03
+ - proper multichannel device detection (finally...)
+ - identify virtual reader/punch/printer
+
+2/12/2003: v8.02
+ - build with "-pipe"
+ - accommodated to changes in format of /proc/dasd/devices
+ - ditched storage subclass dasd, introduced s390disk prog_if instead
+ - ditched fake CTC controller generation
+ - deal with unsorted bus trees in multichannel device detection
+
+18/11/2003: v8.01
+ - converted s390 HW detection to sysfs
+ - moved CU/device models to separate data structure
+ - added more s390 devices
+ - rewrote parsing of SMBIOS data structures
+
+28/10/2003: v8.00
+ - get pci config type from kernel log (#30704)
+ - add new flag 'cpuemu' to use cpu emulation on i386
+
+22/9/2003: v7.30
+ - updated usb scanner & webcam data
+ - updated X11 data
+ - hwbootscan: split 'hwscan --pci --disk' call to avoid
+ wrong unique ids for some pci devices (#31545)
+
+21/9/2003: v7.29
+ - updated X11 data
+
+18/9/2003: v7.28
+ - set ATA RAID bus type to 'RAID' (#31235)
+
+17/9/2003: v7.27
+ - don't make every parport into a printer (#31161)
+ - some driver data updated
+
+16/9/2003: v7.26
+ - default to 'printer' if a class tag is missing in parport
+ autoprobe data (#30982)
+ - fixed serial console detection (#30936)
+
+15/9/2003: v7.25
+ - pcmcia data update
+
+15/9/2003: v7.24
+ - report pci modems (#30887)
+ - don't get fooled by removed pcmcia cards
+ - wlan data update (#30886, #30823, #30501)
+ - driver data update (#30384, #29468, #30745)
+
+15/9/2003: v7.23
+ - ignore alternative usb interface settings
+
+11/9/2003: v7.22
+ - updated X11 data
+ - don't read from cd drives that don't exist (#23248)
+
+10/9/2003: v7.21
+ - fixed monitor data interpretation bug (#29718)
+
+9/9/2003: v7.20
+ - more ltmodem ids
+ - uli: implementation of S/390 hardware detection
+
+8/9/2003: v7.19
+ - updated driver info (#25457, #29481, #25531)
+ - updated X11 data
+ - added --combine option to check_hd to assist in creating
+ driver data
+ - fixed minor typos
+
+6/9/2003: v7.18
+ - updated usb mouse data (#29719)
+ - better touch pad/track point reporting for notebooks
+ - fork() for serial mouse & modem detection (#25843, #26513)
+ - fixed hwbootscan (#29959)
+ - don't load imm.o module (#14175)
+
+2/9/2003: v7.17
+ - catch more vm86() faults (#28381)
+ - added 'active' status flag (not modified by libhd)
+
+1/9/2003: v7.16
+ - update ISDN CDB data
+ - catch faults inside vm86() code (#29571)
+ - give wlan cards their own subclass (#29506)
+ - updated X11 data
+
+28/8/2003: v7.15
+ - iopl() may fail even if we're root (#29494)
+
+27/8/2003: v7.14
+ - probe for multiple hardware classes at a time
+
+26/8/2003: v7.13
+ - default ISDN data for all ARCH
+ - update ISDN CDB data
+
+26/8/2003: v7.12
+ - updated X11 data (#29316)
+ - add ISDN database for ia64
+ - fix minor warnings
+
+25/8/2003: v7.11
+ - don't try BIOS things on SGI Altix (#28663)
+
+25/8/2003: v7.10
+ - added lots of new camera ids.
+ - new isdn data taken from cdb
+ - updated X11 data
+
+18/8/2003: v7.09
+ - add ChildIDs field (reverse of ParentID)
+
+12/8/2003: v7.08
+ - better internal hwclass handling
+
+11/8/2003: v7.07
+ - define HARDWARE_DIR in hd.h
+
+8/8/2003: v7.06
+ - use modprobe instead of insmod for scsi modules
+
+5/8/2003: v7.05
+ - ltmodem is back
+ - parent id, again
+
+5/8/2003: v7.04
+ - hp officejet scanner gets package info & own subclass
+
+1/8/2003: v7.03
+ - reworked usb things
+
+18/7/2003: v7.02
+ - changed disk size reading for 2.6
+ - more 2.6 header fixes
+
+17/7/2003: v7.01
+ - store parent id (#27508) and hotplug field
+ - new attempt to work around broken cciss_ioctl.h inclue file
+
+16/7/2003: v7.00
+ - detect pcmcia cards
+ - updated x11 data
+
+16/4/2003: v6.20
+ - fixed megaraid info (#26325)
+
+27/3/2003: v6.19
+ - scan for partitions
+
+13/3/2003: v6.18
+ - ltmodem stuff makes trouble, removed (#25309)
+
+13/3/2003: v6.17
+ - updated X11 data (#25217)
+
+12/3/2003: v6.16
+ - be more careful when joining feature flags of
+ ide-scsi handled devices (#25169)
+
+12/3/2003: v6.15
+ - limit the maximum amount of data we expect looking
+ for serial mice (#25153)
+
+11/3/2003: v6.14
+ - updated ide raid info (#25010)
+
+10/3/2003: v6.13
+ - added more notebook data
+
+8/3/2003: v6.12
+ - fixed ide-scsi detection bug (device names mixed up if more than
+ one device is handled by ide-scsi)
+
+8/3/2003: v6.11
+ - updated data from pci utils
+
+8/3/2003: v6.10
+ - detect wlan cards (#23491)
+
+7/3/2003: v6.09
+ - usb multiple interfaces again: only for HID devices (#24824)
+ - add monitor vendor & device name
+ - allow hwscan to be disabled at boot time via 'hwprobe=-scan'
+
+6/3/2003: v6.08
+ - updated X11 data
+ - added '--dsl' option to hwscan
+
+6/3/2003: v6.07
+ - write ff to /dev/lp0 if imm.o didn't load (#14175)
+ - probe for scsi cache even in fast mode, else we miss scsi cd writers
+ - better Epson scanner detection (#20837)
+ - fixed stupid '\0'-missing-at-end-of-buffer bug
+ - added '--slient' option to hwscan (don't show ids)
+ - cleaned up notebook lcd detection and added more data
+
+4/3/2003: v6.06
+ - fixed floppy detection (#24283)
+
+4/3/2003: v6.05
+ - fixed ataraid detection (format of /proc/ide/ide?/config
+ changed, #23057, #24528)
+
+3/3/2003: v6.04
+ - bcm instead of tg3 (request by ak)
+ - reenable mouse probing, but without serial mice and no dialog (#20309)
+ - support some winmodems
+ - updated X11 data
+
+26/2/2003: v6.03
+ - better ZIP drive handling
+ - handle usb devices with multiple interfaces (#21487, #22223, #22843)
+ - removed 'Looking for braille...' line
+ - fixed multi-CDROM bug (#24280)
+ - save/restore feature flags (#23364)
+ - keep feature flags for ide-scsi handled drives (#23550)
+
+25/2/2003: v6.02
+ - fixed 64 bit int -> pointer gcc warnings
+ - fixed minor database lookup bug
+ - database parser logs to logfile, not stderr
+ - support serial mice with really strange vendor ids (#24137)
+
+24/2/2003: v6.01
+ - add fibre channel adapters to storage controller list (#23686)
+
+24/2/2003: v6.00
+ - fixed gcc warnings
+ - updated module info
+ - increased major version
+
+18/2/2003: v5.55
+ - added pppoe detection
+ - updated X11 data
+
+18/2/2003: v5.54
+ - removed experimental code causing segfault on compaq machines
+
+10/2/2003: v5.53
+ - remove mouse probing from hwbootscan, it sometimes
+ hangs and takes too long.
+ - add --fast to --cdrom probe, so the cdrom is not opened.
+ - updated X11 data
+
+4/2/2003: v5.52
+ - fixed pci base addresses on 64bit archs (#21075)
+
+20/1/2003: v5.51
+ - detection of more Microcom modems
+ - updated the pcmcia controllers fallback list
+ - added a minimal man page
+ - add AVM Fritz!Card DSL USB
+ - updated X11 data
+
+13/1/2003: v5.50
+ - added Myrinet support (#21130)
+ - make it compile on !(x86_64 & ia64) again
+
+9/1/2003: v5.49
+ - fixed some network card names (#22795)
+ - added wheel mouse data (#22797)
+ - make it compile on x86_64 & ia64 again
+
+13/12/2002: v5.48
+ - cdrom feature list (dvd, cdr, etc)
+
+27/11/2002: v5.47
+ - changed tg3/bcm* on ia64 (#21984)
+ - one ncr53c8xx vs. sym53c8xx issue (#21984)
+ - cleanup ISDN ids, remove unsupported protocols (#22179)
+
+25/11/2002: v5.46
+ - rewrote assignment of BIOS driver numbers
+ - slight cleanup of int10 code
+
+19/11/2002: v5.45
+ - use eepro100 instead of e100 on ia64 (#21055)
+
+18/11/2002: v5.44
+ - fixed qla* module info (#21567)
+
+6/11/2002: v5.43
+ - joined with 8.1 branch
+
+4/11/2002: v5.42
+ - check for REDIRECT in hwscan init script (in case it gets called
+ from the commandline). #17773
+
+4/11/2002: v5.41
+ - do some consistency checks on legacy data from BIOS area (#21462)
+
+17/10/2002: v5.40
+ - updated megaraid info (#21043)
+
+10/10/2002: v5.39
+ - updated tg3/bcm5700 driver info (#19913)
+
+7/10/2002: v5.38
+ - added aacraid driver info (#20592)
+ - don't run yast if no keyboard is attached (#19768)
+
+30/9/2002: v5.37
+ - add "Virtual" to veth description string (#20319)
+
+27/9/2002: v5.36
+ - fixed floppy detection (#20269)
+ - x11 data update (#20182)
+ - added IBM ServeRAID ids (#20268)
+
+23/9/2002: v5.35
+ - 'hwscan --pci' should add prom id (#19648)
+
+20/9/2002: v5.34
+ - ia64: switch back to reading ACPI tables for SMP detection.
+
+18/9/2002: v5.33
+ - fixed chksum call causing hwinfo to hang in some cases on ia64
+ - don't overwrite vga modelist
+
+10/9/2002: v5.32
+ - avoid alignment problems on ia64
+ - fixed usb-cdrom probing (#19407, #19440)
+ - removed '--fast' for disk probing; instead, fixed i2o & cciss
+
+10/9/2002: v5.31
+ - probe for cdrom & disk at boot (#19297)
+ - '--fast' option has effect on disk probing (no i2o & cciss)
+ - dmfe instead of tulip (#19271)
+ - convert_hd now understands XML properly
+ - removed outdated docs
+
+9/9/2002: v5.30
+ - probe also USB isdn controllers (#18830)
+ - added '--help' option to check_hd & convert_hd
+ - converted pci info to utf8
+
+7/9/2002: v5.29
+ - make sure usb floppies are reported as such (#12262)
+
+6/9/2002: v5.28
+ - new x11 data
+ - report s390x arch properly
+
+5/9/2002: v5.27
+ - added amd-8111 info
+ - fixed dpt info (#18914)
+ - always smp on s390* (#18990)
+ - changed pcnet32 description (#18892)
+
+4/9/2002: v5.26
+ - show boot catalog address in cd info
+
+4/9/2002: v5.25
+ - switched escon adapter from 0x70 to 0x8
+ - corrected number for CTC, IUCV, HSI and QETH
+ - fix usb isdn adapter detection (#18829)
+ - updated pci & usb data
+
+3/9/2002: v5.24
+ - fixed ata raid code
+ - new usb mouse (#18296)
+
+3/9/2002: v5.23
+ - updated x11 data
+
+02/9/2002: v5.22
+ - code for detekting configured CTC, IUCV, HSI and QETH
+ adapters on s390/s390x
+ - fixed iSeries network id
+
+29/8/2002: v5.21
+ - braille detection on sparc
+ - fixed script that reads CDB data
+ - log error messages from vm86 code
+ - better chipcard reader support
+ - use _exit instead of exit on some more places.
+ - prepared for uclibc
+ - save & restore resource data
+
+28/8/2002: v5.20
+ - got rid of gcc warning
+
+28/8/2002: v5.19
+ - added x86_64 x11 data
+
+27/8/2002: v5.18
+ - changed dasd.c to accept old and new format of /proc/dasd/devices
+ - better serial mouse detection (#18384)
+
+27/8/2002: v5.17
+ - msvec: detect some microcom modems (#15359)
+
+26/8/2002: v5.16
+ - use "reprobe" as yast2 argument, not (.reprobe)
+ - added some new hardware types
+ - fixed usb & ieee1394 controller detection
+
+22/8/2002: v5.15
+ - check cpuid for hyperthreading (#13532)
+ - add new bus id 'Virtual IO' for DASD (#18202)
+ - use grub on x86_64
+ - fixed s390 cpu detection
+
+20/8/2002: v5.14
+ - mls: x86 emu for BIOS calls on ia64
+
+19/8/2002: v5.13
+ - mls: x86 emu for BIOS calls on x86_64
+ - updated x11 data
+
+16/8/2002: v5.12
+ - changes in libhd interface
+
+15/8/2002: v5.11
+ - segfault in hwinfo, part 2
+ - fixed symbios module entry
+
+13/8/2002: v5.10
+ - get isdn model name from isdn database
+ - updated megaraid info
+ - make install creates /etc/init.d
+
+13/8/2002: v5.09
+ - added info for firewire module
+ - fixed convert_hd to work with perl 5.8
+
+12/8/2002: v5.08
+ - fixed evil segfault in hwinfo
+ - updated docs
+
+9/8/2002: v5.07
+ - moved unique key file to var/lib/hardware/unique-keys
+ - moved things from var/lib/libhd to var/lib/hardware
+ - added HD_VERSION #define to hd.h
+
+8/8/2002: v5.06
+ - extended isdn package info
+ - detect dvb cards
+ - fixed reading driver info
+ - updated driver info
+ - changed tv card detection code
+
+6/8/2002: v5.05
+ - minor libhd interface changes
+
+5/8/2002: v5.04
+ - gmac -> sungem
+ - don't source rc.config
+ - report cardbus cards
+ - _exit instead of exit to avoid calling QT destructors in Yast2
+ - activated new database code
+
+22/7/2002: v5.03
+ - updated x11 data
+
+22/7/2002: v5.02
+ - run hwbootscan rc script after "kbd" script
+ - don't _change_ config status in hwbootscan
+ - save %gs register around vm86() syscall (%gs may be used in glibc)
+ - isdn changes
+ - better handling of dasd devs
+ - grub instead of lilo on ix86
+
+13/6/2002: v5.01
+ - made ia64 cpu model entry more useful
+ - get bios led status
+
+6/6/2002: v5.00
+ - assign hardware added via 'hwprobe' a proper inital status
+ - added alsa driver info
+ - dropped old pnpdump() code
+
+24/4/2002: v4.26
+ - add x86-64 support
+
+27/3/2002: v4.25
+ - prevent doubled cdrom hardware items
+
+27/3/2002: v4.24
+ - fixed cdrom device detection (#15553)
+ - don't assign lp8 to nonexistent usb printers
+
+25/3/2002: v4.23
+ - updated help texts
+
+25/3/2002: v4.22
+ - recognize fibre channel controllers as storage controllers
+
+24/3/2002: v4.21
+ - read bios data in libhd_tiny (to allow vaio handling in linuxrc, #12075)
+ - read /etc/module.pcimap, too (it's there during installation)
+ - new x11 data
+ - de4x5.o vs. tulip.o issue (#15303)
+ - added Netgear WLAN-Card data (#14848)
+
+21/3/2002: v4.20
+ - remove /var/lib/hardware/LOCK in hwbootscan (#15217)
+ - updated X11 data
+ - prefer tg3 over bcm5700
+ - fixed broken framebuffer detection: reenabled & fixed pci setup code
+
+18/3/2002: v4.19
+ - fixed segfault in ide code
+
+16/3/2002: v4.18
+ - fixed bug that caused 'Processor' scsi devices to be treated
+ as disks (mentioned in #15007)
+
+14/3/2002: v4.17
+ - udated mptbase driver info (#14732)
+ - better handling of usb-storage devices
+ - add mouse info we got from smbios
+ - use info from modules.pcimap
+ - detect memory size > 4GB (#14287)
+
+9/3/2002: v4.16
+ - made hwbootscan an init script again, started after hotplug.
+ - do not delete the reconfig.needed files, but set configured=no
+ and needed=no to avoid problems with unsupported graphic cards.
+ - added usb ids from usbutils
+ - fixed network module info (#14529)
+ - improved smbios parser
+ - updated x11 driver info
+ - isdn: fix wrong names (AVM) and add more USB devices
+ - disabled pci setup code that caused infinite loops on
+ some systems with isa gfxcards
+
+4/3/2002: v4.15
+ - new isdn data
+ - look at /proc/apm, too
+ - updated network driver info
+ - detect fujitsu siemens notebook lcd
+ - updated x11 driver info
+ - updated pci device list
+ - check for isapnp devs in boot.hwscan, too
+
+1/3/2002: v4.14
+ - detect USB scanner by just looking if the module is usbscanner
+ - new scanner ids
+ - camera subclass ids were 1 off from enumeration
+ - added some new hardware classes: bios, bridge, hub, usb_ctrl
+ - added '--pci' and '--isapnp' options to hwscan
+ - fixed evil segfault caused by reading some hardware configs
+ - added '--fast' option to hwscan: don't check for tricky hardware
+ as serial mice or parport zips unless they had been found
+ previously
+ - boot.hwscan: probe for mice & pci hardware only (to be faster)
+ - don't try to access 'not available' devices
+
+25/2/2002: v4.13
+ - meissner: boot.hwscan:
+ probe for storage, network, tv, sound handware
+ - updated x11 data
+ - handle usb ehci controller
+ - added basic smbios parser
+
+21/2/2002: v4.12
+ - meissner: boot.hwscan: fixed confused curses output
+ - new isdn database
+ - update 'not available' state
+ - changed unique_id algorithm for usb devices
+
+18/2/2002: v4.11
+ - added new scanner
+ - updated x11 data
+ - experimental support for hpt3* ideraid
+
+12/2/2002: v4.10
+ - meissner: mouse probing is in choose_mouse
+ - meissner: added arguments for light probing '(.reprobe)' as suggested by tom
+
+11/2/2002: v4.09
+ - isdn database now in libhd, support for multiple isdn driver
+
+7/2/2002: v4.08
+ - renamed a function to avoid conflicts with linuxrc
+
+7/2/2002: v4.07
+ - fixed dac960 detection: we used to return just the 1st disk
+
+7/2/2002: v4.06
+ - first attempt to handle ide raid controller
+ - use /proc/partitions to find disks, too
+
+6/2/2002: v4.05
+ - make hd_list() work properly if LIBHD_TINY is defined
+ - added new braille display
+ - hwinfo accepts '--netcard' as alias to '--network_ctrl'
+
+4/2/2002: v4.04
+ - store a config string along with the config status
+
+4/2/2002: v4.03
+ - changed hd_change_status() prototype
+
+20/1/2002: v4.02
+ - fixed bug that prevented hwprobe env var to work in some cases
+
+28/1/2002: v4.01
+ - hwscan: touch /var/lib/hardware/.update if things have changed
+ - meissner: added boot scripts
+
+21/1/2001: v4.00
+ - increased major version number, as we're incompatible to v3 meanwhile
+ - added function to set hardware config status data directly
+
+20/1/2002: v3.40
+ - updated hwscan so it does something useful
+ - updated x11 data
+
+14/1/2002: v3.39
+ - next try with dietlibc on sparc
+
+14/1/2002: v3.38
+ - olh: assume veth always present
+ - make it work with dietlibc on sparc
+ - new class: hw_usb_ctrl
+
+4/1/2002: v3.37
+ - reimplemented iSeries veth device detection (#12680)
+
+14/12/2001: v3.36
+ - create version for linking against dietlibc
+ - mls: continue even if some vbe calls fail
+
+26/11/2001: v3.35
+ - prepare for arm
+
+22/11/2001: v3.34
+ - call cpu probe for keyboard query
+ - reduced libhd_tiny size
+
+2/11/2001:. v3.33
+ - read country code from usb devices
+
+30/10/2001: v3.32
+ - handle iSeries network and storage devices
+ return ppc64 when uname -m returns it
+
+18/10/2001: v3.31
+ - gmac controllers are powered off when unconfigured, so
+ we have to provide the class id ourself (#11733)
+
+15/10/2001: v3.30
+ - don't load parport modules on pmac (#11743)
+ - provide monitor sync data if they are missing
+
+10/10/2001: v3.29
+ - more apple monitor fixes
+
+9/10/2001: v3.28
+ - work around incorrect iMac monitor data
+
+8/10/2001: v3.27
+ - ppc: detect swim3 floppy (#11643)
+ - ppc: pr_prom needs pr_pci in some cases
+ - add monitor entry based on fbdev data, if we have
+ nothing better (#11344)
+
+5/10/2001: v3.26
+ - fix the check for active framebuffer (ppc)
+ the current one is a hack and doesnt work in all cases
+ - use pc104 instead of powerpcps2 (ppc)
+ - longer timeouts in modem detection (#11432)
+ - don't merge pci and proc data on ppc (#10435)
+ - pci data are inconsistent on ppc, remove consistency check (#11551)
+ - new x11 data (ppc)
+
+24/9/2001: v3.25
+ - updated X11 data
+ - no longer default to XF3 for installation on ppc (#11260)
+
+24/9/2001: v3.24
+ - added LSIFC9xx/LSI409xx Fibre Channel (#11251)
+
+24/9/2001: v3.23
+ - use aic7xxx_old one some controllers (#11202)
+ - use de4x5 instead of tulip for one card (#11093)
+ - updated X11 data
+
+20/9/2001: v3.22
+ - make AIPTEK tablet a mouse again
+ - added old_unique_id field
+ - updated driver info
+
+19/9/2001: v3.21
+ - new sound card
+ - new x11 data
+
+18/9/2001: v3.20
+ - rewrote floppy detection to make it work on non-i386 archs
+ - new x11 data
+
+11/9/2001: v3.19
+ - updated X11 data
+ - get current video mode
+
+10/9/2001: v3.18
+ - updated X11 data
+ - make it work with diet-libc
+ - should correctly report vmware cards now
+
+4/9/2001: v3.17
+ - changed unique_id calculation (#10139)
+ - introduced arch_ppc64, CHRP64 -> CHRP
+ - new X11 data
+
+3/9/2001: v3.16
+ - usb printer device names have changed
+ - new x11 data
+ - fixed segfault bug in ide-scsi handling
+
+29/8/2001: v3.15
+ - new x11 data
+ - ignore obviously broken ddc info
+
+27/8/2001: v3.14
+ - new qlogic driver info (#9868)
+ - completely new x11 data
+
+23/8/2001: v3.13
+ - fixed to work with the new cpqarray driver
+ - fixed evil database bug (#9798)
+
+20/8/2001: v3.12
+ - removed usb network module info
+ - added iSeries disks
+
+17/8/2001: v3.11
+ - added usb network data
+
+17/8/2001: v3.10
+ - install in $DESTDIR
+ - handle ide-scsi drives
+ - fix segfault bug in apm detection
+
+9/8/2001: v3.09
+ - fixed some drivers.audio entries
+
+6/8/2001: v3.08
+ - added sungem
+ - fixed qlogicfc entry
+ - fixed tv card detection
+
+1/8/2001: v3.07
+ - fixed typo in short model name calculation
+
+31/7/2001: v3.06
+ - make now builds shared version per default
+
+30/7/2001: v3.05
+ - integrated hwscan
+
+27/7/2001: v3.04
+ - added chipcard reader support
+ - added camera (webcam) support
+ - added framebuffer support (currently: VESA)
+
+26/7/2001: v3.03
+ - support (usb) joysticks
+
+25/7/2001: v3.02
+ - added access functions for /var/lib/hardware/ to libhd
+ - hwinfo: no progress info if output is redirected
+ - hwinfo: multiple arguments allowed
+ - assign a hw_class
+
+24/7/2001: v3.01
+ - report smp capability only if >1 processors are active
+
+23/7/2001: v3.00
+ - SMP code can now handle empty MP tables
+ - support module lists in driver info
+ - new 'manual' flag indicating hardware that was not
+ detected but entered manually
+ - report usb capability only if the controller has an irq assigned
+
+27/6/2001: v2.22
+ - added usb scanner detection
+ - set gpm protocol to imps2 for wheel mice
+ - bios based monitor detection enabled per default
+ - made usb module loading default
+
+25/6/2001: v2.21
+ - sndirsch: corrected 3D info for geforce3 cards
+
+21/6/2001: v2.20
+ - updated driver info for new gdth.o
+
+19/6/2001: v2.19
+ - fixed for s390x
+
+13/6/2001: v2.18
+ - schwab: don't dereference free'd pointer
+ - prefer e100.o over eepro100.o (#8797)
+ - fixed framebuffer mode detection bug (#8620)
+
+7/6/2001: v2.17
+ - fixed keyboard detection on sparc
+
+22/5/2001: v2.16
+ - dan: fix usb modem bug (#8490)
+ - remove 3d & xf_v3 driver info for ia64
+
+14/5/2001: v2.15
+ - use isapnp_reset=0 for loading isa-pnp.o
+
+11/5/2001: v2.14
+ - new driver data for 3c509
+ - X11 data updated
+ - have i2o cards listed as storage controllers (#6335)
+
+10/5/2001: v2.13
+ - increase /dev/psaux timeout
+ - adapted missing keyboard detection for kernel 2.4
+
+10/5/2001: v2.12
+ - less things in libhd_tiny.a
+ - read block 0 from disks _before_ going to look for the boot device
+ - vmware detection clobbers %ebx; fixed
+ - completely new monitor data base (#7536)
+
+7/5/2001: v2.11
+ - preserve %ebx in i10_v86.c::vm86_rep
+
+7/5/2001: v2.10
+ - rewrote isapnp detection for 2.4 kernel
+ - updated driver info data
+ - added "Baum" braille display detection
+
+3/5/2001: v2.09
+ - support vbe bios calls to get monitor data (default: disabled)
+ - added more usb wheel mice
+
+3/5/2001: v2.08
+ - added vmware check
+ - don't do scsi write cache detection in vmware
+ - added ia64 smp detection
+ - ia64 x11 data added
+ - use tulip instead of de4x5 (#7317)
+
+30/4/2001: v2.07
+ - updated x11 data
+ - fixed multi-head display handling
+ - adapted compaq smart array detection for kernel 2.4
+
+25/4/2001: v2.06
+ - parport detection updated for kernel 2.4
+ - add scsi hostadapter info to debug output
+ - usb-storage again
+ - boot_ia64 -> boot_elilo
+
+24/4/2001: v2.05
+ - worked on usb-storage support
+ - no isa-pnp probing in linuxrc
+
+20/4/2001: v2.04
+ - better usb-storage support
+
+19/4/2001: v2.03
+ - reworked floppy detection
+ - identify devices with removable media
+ - zip drives are always reported as floppies
+
+18/4/2001: v2.02
+ - reworked ps/2 mouse code
+ - provide number of buttons/wheels for mice
+ - X11 data updated (ia32)
+
+7/4/2001: v2.01
+ - new output format for support tool
+ - more options for hwinfo
+ - include pcmcia/cardbus cards in device lists
+
+5/4/2001: v2.00
+ - new major version due to incompatible interface changes
+ - integrated experimental changes (split was after v1.90)
+
+3/4/2001: v1.99
+ - fixed segfault bug in alpha smp code
+
+26/3/2001: v1.98
+ - unique id format changed
+
+21/3/2001: v1.97
+ - fixed src/ids/Makefile for axp
+ - slightly changed display detection code on axp
+
+20/3/2001: v1.96
+ - new axp x11 data
+
+28/2/2001: v1.95
+ - stepan: removed ISDN on alpha
+ - avoid trigraphs while generating the data base
+
+22/2/2001: v1.94
+ - fixed hd_copy() segfault bug (ppc)
+
+21/2/2001: v1.93
+ - implemented SMP detection on ppc
+
+20/2/2001: v1.92
+ - backport of new SMP detection code (ia32)
+ - get console speed from kernel command line (ppc)
+
+15/2/2001: v1.91
+ - fixed evil scsi device detection bug
+ (missing scsi devices under some strange circumstances)
+ - don't probe physical scsi geometry
+
+12/2/2001: v1.90
+ - changed display adapter detection code to prefer sbus cards
+
+9/2/2001: v1.89
+ - kkaempf: "ld -shared" is forbidden, changed to "gcc"
+
+7/2/2001: v1.88
+ - new x11 data (sparc)
+
+31/1/2001: v1.87
+ - mls: new oem stuff
+
+30/1/2001: v1.86
+ - new x11 data (sparc)
+
+29/1/2001: v1.85
+ - kukuk: sparc keyboard patches
+
+23/1/2001: v1.84
+ - mls: added '--packages' option to hwinfo
+
+21/1/2001: v1.83
+ - new x11 data (sparc)
+
+19/1/2001: v1.82
+ - ncr*.o instead of sym*.o for 53c895a
+ - new x11 data (ia32)
+
+18/1/2001: v1.81
+ - fixed ISAPnP device name handling
+ - back to ncr*.o for 53c875 [devid 0xf] (#5816)
+ - added new tulip card
+
+17/1/2001: v1.80
+ - updated dac960 driver info
+
+17/1/2001: v1.79
+ - new x11 data
+ - added '--help' option to hwinfo
+ - implemented a basic getopt-style hwinfo interface
+ - activate pr_bios if pr_misc is set
+
+16/1/2001: v1.78
+ - updated driver info (starfire/qla2x00)
+
+16/1/2001: v1.77
+ - back to old version scheme to avoid update problems
+
+15/1/2001: v1.0.76
+ - updated scsi driver info
+
+15/1/2001: v1.0.75
+ - new x11 data
+ - make XF 4 default if no X11 info is found (ia32 only)
+ - fixed serial line detection bug
+
+14/1/2001: v1.0.74
+ - updated pci name list
+ - updated scsi/network driver info
+
+12/1/2001: v1.0.73
+ - new x11 data
+ - sym*.o instead of ncr*.o for 53C875
+ - quick fix for Wacom tablets
+
+12/1/2001: v1.0.72
+ - fix minor bug in printer detection
+ - fix bios disk number detection
+
+11/1/2001: v1.0.71
+ - arvin: made res_pppd_option work
+ - arvin: fixed detection of terminal adapters
+ - sped up new modem stuff if no modem is connected
+
+11/1/2001: v1.0.70:
+ - new x11 data (sparc)
+
+10/1/2001: v1.0.69
+ - introduced res_pppd_option
+ - new x11 data (ia32)
+
+9/1/2001: v1.0.68
+ - smid@suse.cz: improved modem init string code
+
+8/1/2001: v1.0.67
+ - fixed color depth handling
+ - fixed multi-soundcard bug
+ - new x11 data
+
+7/1/2001: v1.0.66
+ - kendy@suse.cz: use BIOS port info for parport
+ - new x11 data for all archs
+ - 8139too instead of rtl8139 whenever possible
+
+20/12/2000: v1.0.65
+ - added modem init string patch from smid@suse.cz
+
+19/12/2000: v1.0.64
+ - added cciss stuff
+ - updated x11 data
+
+18/12/2000: v1.0.63
+ - BIOS lba stuff now works
+
+18/12/2000: v1.0.62
+ - updated x11 data
+
+14/12/2000: v1.0.61
+ - updated x11 data
+ - build pnpdump only on i386 and alpha
+ - hwinfo can now update x11 info in install.inf
+
+13/12/2000: v1.0.60
+ - hwinfo can now update braille info in install.inf
+ - activate alva braille detection
+
+13/12/2000: v1.0.59
+ - updated x11 data
+
+12/12/2000: v1.0.58
+ - new version number scheme (due to shared lib)
+ - create shared libhd
+ - report BIOS lba extension support
+ - rearranged building libhd_tiny a bit
+
+12/12/2000: v1.57
+ - fixed isapnp segfault bug
+ - updated x11 data
+
+8/12/200: v1.56
+ - new alva detection code
+ - added cd-r/dvd detection
+ - read "el torito" boot info
+ - updated x11 info
+
+7/12/2000: v1.55
+ - fixed evil hddb bug
+ - added 3d script field
+
+9/11/2000: v1.54
+ - started work on hddb fix
+ - renamed timeout -> hd_timeout
+
+27/10/2000: v1.53
+ - remove memory leaks, part 2 (ppc)
+
+26/10/2000: v1.52
+ - add CD-RW detection (and DVD)
+
+25/10/2000: v1.51
+ - remove memory leaks, part 1
+
+10/10/2000: v1.50
+ - distinguish between chrp & chrp64
+
+10/10/2000: v1.49
+ - provide a unique key for every hardware item
+
+10/10/2000: v1.48
+ - cpu/smp detection code improved
+
+28/9/2000: v1.47
+ - sparc: new x11 info
+
+22/9/2000: v1.46
+ - ppc: fixed serial line & modem detection
+
+21/9/2000: v1.45
+ - provide CHPID on s390
+
+20/9/2000: v1.44
+ - added missing closedir()
+
+18/9/2000: v1.43
+ - improved /proc/interrupt parsing
+ - ppc: always return a ps/2 mouse for PreP & CHRP
+ - skip serial device detection for console & yast2ser /proc/cmdline
+ entries
+ - ids updated
+
+18/9/2000: v1.42
+ - now *really* disabled braille except on ia32
+
+15/9/2000: v1.41
+ - ppc: changed some ids
+
+13/9/2000: v1.40
+ - serial console detection for ppc
+
+13/9/2000: v1.39
+ - ppc x11 driver info
+ - ppc serial console
+ - braille only on ia32
+ - fixed scsi segfault bug
+
+8/9/2000: v1.38
+ - updated device ids
+ - added basic i2o support
+ - disabled isapnp on ppc
+
+7/9/2000: v1.37
+ - fixed modem segfault bug
+ - fixed Zip device detection
+
+6/9/2000: v1.36
+ - s390 network devices
+
+5/9/2000: v1.35
+ - s390: finds disks
+ - ppc: better sound detection
+
+25/8/2000: v1.34
+ - new platform cpu entry on alpha
+
+24/8/2000: v1.33
+ - better monitor & display detection on ppc
+
+23/8/2000: v1.32
+ - made libhd at least to compile on s390
+
+23/8/2000: v1.31
+ - slightly changed memory detection
+ - ADB mice: /dev/input/mice
+
+15/8/2000: v1.30
+ - added monitor detection on ppc
+ - fixed iso9660 info reading
+
+14/8/2000: v1.29
+ - added PROM parser for ppc; currently handles
+ SCSI, network, sound & floppy devices
+
+9/8/2000: v1.28
+ - added pr_misc to hw_isdn
+ - fixed memory size detection
+ - added 'generation' to system entry (for ppc)
+ - new scsi detection code
+ - kukuk: PS/2 keyboard detection on UltraSPARC
+
+28/7/2000: v1.27
+ - fixed 'x11' parameter parsing
+
+27/7/2000: v1.26
+ - added '--special' option to hwinfo (needed for live CD)
+ - updated x11 data
+
+24/7/2000: v1.25
+ - SMP detection: look for 'apic' flag
+ - updated x11 data
+
+20/7/2000: v1.24
+ - fixed Vaio detection
+ - updated special ide chipset list
+ - included more functions in LIBHD_TINY
+ - updated x11 data
+
+19/7/2000: v1.23
+ - updated x11 data
+
+18/7/2000: v1.22
+ - dropped alva probing
+ - updated x11 data
+
+15/7/2000: v1.21
+ - fixed isapnp isdn probing bug
+ - updated x11 data
+
+14/7/2000: v1.20
+ - fixed stupid printer probing bug
+ - updated x11 data
+
+13/7/2000: v1.19
+ - fixed bootdevice detection bug
+ - detect PowerBooks
+
+12/7/2000: v1.18
+ - updated alsa driver info
+ - updated minicdb id data
+ - fixed missing isapnp sound cards bug
+
+11/7/2000: v1.17
+ - added Sony Vaio detection
+ - changed lance driver entry
+ - fixed isdn/network card bug
+ - updated id data
+
+10/7/2000: v1.16
+ - pnpdump: start port scanning at port 0x20b, not 0x203
+ (skips potential game port)
+ - get ids directly from minicdb
+
+7/7/2000: v1.15
+ - fixed hw_sys/hw_tv probing bug
+
+6/7/2000: v1.14
+ - new 'system' hw entry
+ - sparc smp detection: active -> probed
+
+5/7/2000: v1.13
+ - added parallel Zip drive detection
+
+3/7/2000: v1.12
+ - don't list cardbus/pcmcia devs in hd_list()
+ - add multimedia/video boards to display adapters
+
+27/6/2000: v1.11
+ - increased timeout in fhp detection
+
+27/6/2000: v1.10
+ - fixed bug in braille detection
+
+26/6/2000: v1.09
+ - updated README
+ - fixed bug in 'hwprobe' handling
+
+26/6/2000: v1.08
+ - new usb mouse devices
+
+22/6/2000: v1.07
+ - activated serial line scanning in linuxrc
+ - extendend 'hwprobe=' features
+
+21/6/2000: v1.06
+ - fhp_old braille detection implemented
+ - alva & ht braille stuff added
+
+21/6/2000: v1.05
+ - changed (driver_info_x11_t).x11.raw to str_list_t
+
+21/6/2000: v1.04
+ - added 'x11' kernel cmdline param
+
+20/6/2000: v1.03
+ - fixed mk_ids (used to drop all non-x11 ids)
+ - improved 'hwprobe=' functionality
+ - fhp braille detection implemented
+
+20/6/2000: v1.02
+ - updated pciutils & sax/sax2 data
+ - added fire gl1
+ - added 'hwprobe' env resp. kernel cmdline param
+
+13/6/2000: v1.01
+ - new module info
+ - fix old VGA entries
+ - hw_tv now functional
+
+9/6/2000: v1.00
+ - added hw_monitor, hw_printer, hw_tv, hw_scanner
+ [hw_tv, hw_scanner still non-funcional]
+ - improved ddc parsing (new syslinux!)
+
+7/6/2000: v0.99
+ - added hd_list() function
+
+6//6/2000: v0.98
+ - hd_display_list() function
+ - new SaX[2] data
+ - changed mk_ids to provide 3d *and* non-3d x11 entries
+
+31/5/2000: v0.97
+ - provides info about bios disk ids
+
+30/5/2000: v0.96
+ - extended X11 driver info (for XF86 4.0)
+ - added Thorsten's small SPARC patch
+ - extended serial line info
+ - note: v0.95 was a ppc quick-hack only version needed for 6.4;
+ it will not be integrated into the main tree
+
+24/5/2000: v0.94
+ - fixed tmp file security hole
+ - added hd_{mouse/keyboard/floppy}_list() functions
+
+15/5/2000: v0.93
+ - integrated Thorsten Kukuk's patches (mostly SPARC stuff)
+ - some minor other fixes
+
+17/4/2000: v0.92
+ - ADB mouse driver info extended
+ - color code stuff updated
+
+11/4/2000: v0.91
+ - fixed XkbModel typo on intel/axp
+ - ia64 patches from Andreas
+ - new Mac color code
+
+31/3/2000: v0.89
+ - changed XkbModel to "powerpcps2" on chrp machines
+ - more iMac colors
+
+24/3/2000: v0.88
+ - read color code on macs
+
+21/3/2000: v0.87
+ - added Netfinity graphics card fix
+ - 3com net card driver adjustments
+ - ISDN info fix
+ - SPARC keyboard code
+ - added keyboard driver info
+
+14/3/2000: v0.86
+ - flush serial buffer before close()
+
+8/3/2000: v0.85
+ - some minor bug fixes
+
+8/3/2000: v0.84
+ - changed display adapter probing to include bc_multimedia
+
+8/3/2000: v0.83
+ - pci cards are attached to their resp. bridges
+ - card bus cards not listed by probe_by_class
+
+6/3/2000: v0.82
+ - X server list fixes
+
+5/3/2000: v0.81
+ - some monitor data
+
+4/3/2000: v0.80
+ - new probing flag pr_scsi_geo: defaults to off due to
+ problems on scsi-Zip's
+
+3/3/2000: v0.79
+ - tuned probing flags
+ - renamed drivers file
+ - added "Belinea 10 20 20" data (ddc info lies about supported modes!)
+
+29/2/2000: v0.78
+ - new graphics cards
+
+28/2/2000: v0.77
+ - modem fix: give default name if none could be determined
+ - added 3Com Robotics recognition
+ - added physical SCSI geometry
+
+28/2/2000: v0.76
+ - automatic usb module loading
+ - rewrite of the probing flags stuff; new probing flags
+ - new hd_display() function
+
+26/2/2000: v0.75
+ - pcmcia detection now looks at class ids
+ - fixed pcmcia detection bug
+ - added usb detection function
+
+26/2/2000: v0.74
+ - added alsa isapnp sound cards
+
+25/2/2000: v0.73
+ - sparc & baud rate fix
+ - new libihw
+ - minor usb improvements
+ - better keyboard detection
+ - ressource management for irqs
+ - isdn fixes/improvements
+ - added some sound cards
+
+24/2/2000: v0.72
+ - libihw used only on ix86 & axp
+ - pc keyboard detection
+
+23/2/2000: v0.71
+ - isdn stuff
+
+22/2/2000: v0.70
+ - changed x11/3d driver info
+
+18/2/2000: v0.69
+ - mouse code now resets serial lines
+
+18/2/2000: v0.68
+ - new try at AGP detection
+ - improved mylex code
+ - added compaq smart raid detection
+ - improved scsi code
+
+17/2/2000: v0.67
+ - improved CPU code on axp & ppc
+ - changed serial line code: use non-blocking open
+
+16/2/2000: v0.66
+ - new ids
+ - added Mylex detection (dac960)
+
+15/2/2000: v0.65
+ - a lot of driver info
+ - timeout problem opening serial devs?
+
+12/2/2000: v0.64
+ - added some ids
+ - added Zoom modem detection
+
+11/2/2000: v0.63
+ - fixed isapnp for ppc
+
+11/2/2000: v0.62
+ - Makefile now knows about sparc64
+ - driver info: 3c90x vs. 3c59x; see comment in drivers.SuSE
+ - worked on ISDN stuff
+
+10/2/2000: v0.61
+ - added peliminary usb storage device handling
+ - added ISA-PnP memory range decoding
+ - added ISDN probing for ISA cards (*very* preliminary)
+
+8/2/2000: v0.60
+ - added UMAX USB scanner ids
+ - small modem fix (open fds)
+ - determines boot device
+
+5/2/2000: v0.59
+ - improved boot floppy: now with usb support
+ - changed hw behavior: no listing on console if a logfile is used
+ - fixed missing baud defines on SPARC
+ - added 3d graphics card info
+ - changed internal mouse ids from PnP ids --> special ids
+ - some 64 bit pci fixes
+ - pci devices with missing class info: get class info from data base
+ - added more usb ids
+
+4/2/2000: v0.58
+ - added generic ne2000 info
+ - improved printing of modules.conf entries
+ - moved ID handling macros (MAKE_ID, etc) to hd.h
+
+3/2/2000: v0.57
+ - added lp-devices to mk_floppy
+ - added usb vendor list
+ - NOTE: hd_class_list() interface slightly changed!!!
+ - USB support complete rewritten
+ - modem fix: avoid selecting a device twice!
+ - driver info: take compatible devices into account
+
+2/2/2000: v0.56
+ - more driver info
+ - added hd_smp_support()
+
+1/2/2000: v0.55
+ - made hd_module_is_active() global
+ - added pcnet32 info
+ - added 'static' target
+ - fixed ddc string parser
+ - fixed monitor driver info parser
+ - added tiny target: -> libhd_tiny.a is minimum version for linuxrc
+
+27/10/2000: v0.54
+ - rescan == 3 --> return new entries since last call with rescan == 2
+
+27/10/2000: v0.53
+ - fixed driver entries with modules.conf lines
+ - fixed internal handling of modules.conf entries
+ - added new feature to hd_*_list() functions:
+ rescan == 2 --> return only new entries
+
+25/10/2000: v0.52
+ - started this log :-)
+ - modem code now handles non-pnp modems
+ - added a baud resource to modem entries: holds the modem's max.
+ port speed
+ - added some modem ids
+ - updated docu (interface.html)
--- /dev/null
+TOPDIR = $(CURDIR)
+SUBDIRS = src
+TARGETS = hwinfo hwscan hwscand hwscanqueue
+CLEANFILES = hwinfo hwinfo.static hwscan hwscan.static hwscand hwscanqueue doc/libhd doc/*~
+LIBDIR = /lib
+ULIBDIR = /usr$(LIBDIR)
+LIBS = -lhd
+SLIBS = -lhd -lsysfs
+TLIBS = -lhd_tiny -lsysfs
+SO_LIBS = -lsysfs
+TSO_LIBS = -lsysfs
+
+export SO_LIBS
+
+include Makefile.common
+
+SHARED_FLAGS =
+OBJS_NO_TINY = names.o parallel.o modem.o
+
+.PHONY: fullstatic static shared tiny doc diet tinydiet uc tinyuc
+
+hwscan: hwscan.o $(LIBHD)
+ $(CC) hwscan.o $(LDFLAGS) $(LIBS) -o $@
+
+hwinfo: hwinfo.o $(LIBHD)
+ $(CC) hwinfo.o $(LDFLAGS) $(LIBS) -o $@
+
+hwscand: hwscand.o
+ $(CC) $< $(LDFLAGS) -o $@
+
+hwscanqueue: hwscanqueue.o
+ $(CC) $< $(LDFLAGS) -o $@
+
+# kept for compatibility
+shared:
+ @make
+
+tiny:
+ @make EXTRA_FLAGS=-DLIBHD_TINY LIBHD_BASE=libhd_tiny LIBS="$(TLIBS)" SO_LIBS="$(TSO_LIBS)"
+
+tinyinstall:
+ @make EXTRA_FLAGS=-DLIBHD_TINY LIBHD_BASE=libhd_tiny LIBS="$(TLIBS)" SO_LIBS="$(TSO_LIBS)" install
+
+tinystatic:
+ @make EXTRA_FLAGS=-DLIBHD_TINY LIBHD_BASE=libhd_tiny SHARED_FLAGS= LIBS="$(TLIBS)" SO_LIBS="$(TSO_LIBS)"
+
+tinystaticinstall:
+ @make EXTRA_FLAGS=-DLIBHD_TINY LIBHD_BASE=libhd_tiny SHARED_FLAGS= LIBS="$(TLIBS)" SO_LIBS="$(TSO_LIBS)" install
+
+diet:
+ @make CC="diet gcc" EXTRA_FLAGS="-fno-pic -DDIET" SHARED_FLAGS= LIBS="$(SLIBS)"
+
+tinydiet:
+ @make CC="diet gcc" EXTRA_FLAGS="-fno-pic -DLIBHD_TINY -DDIET" SHARED_FLAGS= LIBS="$(SLIBS)"
+
+uc:
+ @make CC="/opt/i386-linux-uclibc/bin/i386-uclibc-gcc" EXTRA_FLAGS="-fno-pic -DUCLIBC" SHARED_FLAGS= LIBS="$(SLIBS)"
+
+tinyuc:
+ @make CC="/opt/i386-linux-uclibc/usr/bin/gcc" EXTRA_FLAGS="-fno-pic -DLIBHD_TINY -DUCLIBC" SHARED_FLAGS= LIBS="$(SLIBS)"
+
+static:
+ make SHARED_FLAGS= LIBS="$(SLIBS)"
+
+fullstatic: static
+ $(CC) -static hwinfo.o $(LDFLAGS) $(SLIBS) -o hwinfo.static
+ $(CC) -static hwscan.o $(LDFLAGS) $(SLIBS) -o hwscan.static
+ strip -R .note -R .comment hwinfo.static
+ strip -R .note -R .comment hwscan.static
+
+doc:
+ @cd doc ; doxygen libhd.doxy
+
+install:
+ install -d -m 755 $(DESTDIR)/sbin $(DESTDIR)/usr/sbin $(DESTDIR)$(LIBDIR) $(DESTDIR)$(ULIBDIR)\
+ $(DESTDIR)/usr/include $(DESTDIR)/etc/init.d
+ install -m 755 hwinfo $(DESTDIR)/usr/sbin
+ install -m 755 hwscan hwscand hwscanqueue $(DESTDIR)/sbin
+ install -m 755 -s src/ids/check_hd $(DESTDIR)/usr/sbin
+ install -m 755 src/ids/convert_hd $(DESTDIR)/usr/sbin
+ if [ -f $(LIBHD_SO) ] ; then \
+ install $(LIBHD_SO) $(DESTDIR)$(LIBDIR) ; \
+ ln -snf $(LIBHD_NAME) $(DESTDIR)$(LIBDIR)/$(LIBHD_SONAME) ; \
+ ln -snf $(LIBDIR)/$(LIBHD_SONAME) $(DESTDIR)$(ULIBDIR)/$(LIBHD_BASE).so ; \
+ else \
+ install -m 644 $(LIBHD) $(DESTDIR)$(ULIBDIR) ; \
+ fi
+ install -m 644 src/hd/hd.h $(DESTDIR)/usr/include
+ install -m 755 hwbootscan getsysinfo gen-hwcfg-disk.sh $(DESTDIR)/usr/sbin
+ install -m 755 hwbootscan.rc $(DESTDIR)/etc/init.d/hwscan
+ install -m 755 src/isdn/cdb/mk_isdnhwdb $(DESTDIR)/usr/sbin
+ install -d -m 755 $(DESTDIR)/usr/share/hwinfo
+ install -m 644 src/isdn/cdb/ISDN.CDB.txt $(DESTDIR)/usr/share/hwinfo
+ install -m 644 src/isdn/cdb/ISDN.CDB.hwdb $(DESTDIR)/usr/share/hwinfo
+
--- /dev/null
+# libhd/Makefile.common
+
+ARCH := $(shell uname -m)
+ifeq "$(ARCH)" "i486"
+ARCH := i386
+endif
+ifeq "$(ARCH)" "i586"
+ARCH := i386
+endif
+ifeq "$(ARCH)" "i686"
+ARCH := i386
+endif
+ifeq "$(ARCH)" "parisc"
+EXTRA_FLAGS := -fPIC $(EXTRA_FLAGS)
+endif
+
+LIBHD_VERSION := $(shell cat $(TOPDIR)/VERSION)
+LIBHD_MINOR_VERSION := $(shell cut -d . -f 2 $(TOPDIR)/VERSION)
+LIBHD_MAJOR_VERSION := $(shell cut -d . -f 1 $(TOPDIR)/VERSION)
+
+CC = gcc
+LD = ld
+CFLAGS = -Wall -O2 -pipe -g $(SHARED_FLAGS) $(EXTRA_FLAGS) -I/opt/i586-uClibc/include -I/opt/i586-uClibc/usr/include -I$(TOPDIR)/src/hd
+SHARED_FLAGS = -fPIC
+
+LDFLAGS = -Lsrc
+
+CFILES = $(wildcard *.c)
+OBJS = $(CFILES:.c=.o)
+LIBHD_BASE = libhd
+LIBHD = $(TOPDIR)/src/$(LIBHD_BASE).a
+LIBHD_SONAME = $(LIBHD_BASE).so.$(LIBHD_MAJOR_VERSION)
+LIBHD_NAME = $(LIBHD_BASE).so.$(LIBHD_VERSION)
+LIBHD_SO = $(TOPDIR)/src/$(LIBHD_NAME)
+LIBHD_D = $(TOPDIR)/src/.lib
+
+export CC TOPDIR CFLAGS LIBHD ARCH
+
+.PHONY: all distclean clean install subdirs
+
+%.o: %.c
+ $(CC) -c $(CFLAGS) $<
+
+all: subdirs $(TARGETS)
+
+install: all
+
+ifneq "$(SUBDIRS)" ""
+subdirs:
+ @for i in $(SUBDIRS) ; do make -C $$i $(MAKECMDGOALS) || exit ; done
+endif
+
+clean: subdirs
+ @rm -rf $(OBJS) .depend $(CLEANFILES) *~
+
+distclean: subdirs
+ @rm -rf $(OBJS) .depend $(CLEANFILES) $(DISTCLEANFILES) *~
+
+ifneq "$(CFILES)" ""
+ifeq ($(findstring $(MAKECMDGOALS), clean distclean),)
+.depend: $(CFILES)
+ @$(CC) -MG -MM $(CFLAGS) $(CFILES) >$@
+
+-include .depend
+endif
+endif
--- /dev/null
+1. Usage
+========
+
+ hwinfo [debug=deb_flag] [log=log_file] [list[+]=hw_item] [[+|-]probe_option1] [[+|-]probe_option2] ...
+
+Examples:
+
+ hwinfo
+ - probes for nearly everything
+
+ hwinfo +all
+ - probes for everything
+
+ hwinfo log=hw_log
+ - default probing, output is written to hw_log
+ *** Please don't use "hwinfo >some_log 2>&1" to store the output into a
+ log file! ***
+
+ hwinfo -all +ide
+ - probe for ide drives only
+
+ hwinfo +all -isapnp -floppy
+ - probe for everything *except* isapnp and floppies
+
+Some probing flags do not stand for complete modules but enable additional
+features; e.g. "pci.range" or "cdrom.info".
+
+Example:
+ hwinfo -all +cdrom
+ gives a list of all cdrom's
+
+ hwinfo -all +cdrom.info
+ additionally reads the iso9660 info
+
+To get a list of all supported probing flags, call 'hwinfo -all'.
+
+
+2. Environment variables/kernel cmdline parameters
+==================================================
+
+You can control the hardware probing using the environment variable
+"hwprobe" and the kernel cmdline parameters "hwprobe" & "x11".
+
+If "hwprobe" is set on the kernel cmdline, the environment variable
+"hwprobe" is ignored. Otherwise, the meaning of both is exactly the same.
+
+ x11
+ - Controls the X server/X version to prefer. It is either "3" or "4" or the
+ name of the X server/X server module to use (XF3: server name without
+ the leading "XF86_", XF4: the server module name).
+
+ Examples:
+ x11=3
+ o prefer XFree86 3.x over 4.x (if possible)
+
+ x11=SVGA
+ o use the XF86_SVGA server (*** Even if the server does not
+ support the card! ***)
+
+ x11=nv
+ o use the XF4 nv_drv.o driver (*** Even if the module does not
+ support the card! ***)
+
+ hwprobe
+ - Controls which probing flags should *always* be set/cleared. (These
+ settings *cannot* be overridden by command line switches.)
+
+ Examples:
+ hwprobe=-isapnp
+ o *never* do any isapnp probing
+
+ hwprobe=-braille,-modem
+ o don't look for braille displays & modems
+
+ - Allows you to add and remove hardware from the probing results. In this case
+ the syntax is (-: remove, +: add at end of list, <nothing>: add at begin of
+ list):
+ hwprobe=[+-]<device_class>:<vendor_id>:<device_id>[:<unix_device_file>]
+
+ <device_class>, <vendor_id> and <device_id> are device ids as used by libhd.
+ See the output of hwinfo for examples. In connection with "-", you can use
+ "*" as a placeholder that matches every id.
+
+ Note: <unix_device_file> is optional.
+
+ Note2: you cannot usefully *add* hardware that needs more info than that
+ given by the hwprobe entry. Disks & floppies are notable examples.
+ (But you can *remove* them.)
+
+ Here is a typical hwinfo output for a mouse, with the relevant ids
+ underlined (<device_class> is the combined base_class & sub_class),
+ [see 1st example below]:
+
+ 14: PS/2 00.0: 10500 PS/2 Mouse
+ ^^^^^ --> <device_class>
+ [Created at mouse.110]
+ Vendor: s0200 "Unknown"
+ ^^^^^ --> <vendor_id>
+ Model: 0002 "Generic PS/2 Mouse"
+ ^^^^ --> <device_id>
+ Device File: /dev/psaux
+ ^^^^^^^^^^ --> <unix_device_file>
+ Driver Info #0:
+ XFree86 Protocol: ps/2
+ GPM Protocol: ps2
+ Attached to: #8 (PS/2 Controller)
+
+
+ Examples:
+ hwprobe=+10500:s200:2:/dev/psaux
+ o add a ps/2 mouse [at the end of the hardware list]
+
+ hwprobe=10500:s200:2:/dev/psaux
+ o add a ps/2 mouse [at the start of the hardware list, so it
+ is our default mouse]
+
+ hwprobe=+10b00:s5001:0:/dev/ttyS0
+ o add a braille display connected to /dev/ttyS0
+
+ hwprobe=-10500:s200:2:/dev/psaux
+ o remove ps/2 mice attached to /dev/psaux
+
+ hwprobe=-10500:s200:2
+ o remove all ps/2 mice
+
+ hwprobe=-10500:*:*
+ o remove all ps/2 mice
+
+ hwprobe=-*:*:*:/dev/hdc
+ o remove /dev/hdc
+
+ hwprobe=+401:1274:5000
+ o add an ensoniq sound card
+
+ Grafics cards are are slightly trickier:
+
+ hwprobe=+300:1014:b7
+ o add a Fire GL1 card
+ Note: this way you'll get a multihead config. You'll probably
+ rather want the following example.
+
+ hwprobe=-300:*:*,+300:1014:b7
+ o remove all graphics cards; then add a Fire GL1 card
+
+ hwprobe=+400:121a:1
+ o add a 3fx voodoo card (Note the class "400", not "300"!)
+
+ - for more ids, see "src/ids/names.*" and "src/ids/drivers.*"
+
--- /dev/null
+#include <stdio.h>
+#include <stdlib.h>
+
+#include <hd.h>
+
+int main(int argc, char **argv)
+{
+ hd_data_t *hd_data;
+ hd_t *hd;
+
+ hd_data = calloc(1, sizeof *hd_data);
+
+ hd = hd_list(hd_data, hw_scsi, 1, NULL);
+
+ for(; hd; hd = hd->next) {
+ hd_dump_entry(hd_data, hd, stdout)
+ }
+
+ hd_free_hd_list(hd); /* free it */
+ hd_free_hd_data(hd_data);
+
+ free(hd_data);
+
+ return 0;
+}
+
--- /dev/null
+#include <stdio.h>
+#include <stdlib.h>
+
+#include <hd.h>
+
+int main(int argc, char **argv)
+{
+ hd_data_t *hd_data;
+ hd_t *hd;
+ unsigned display_idx;
+
+ hd_data = calloc(1, sizeof *hd_data);
+
+ hd = hd_list(hd_data, hw_display, 1, NULL);
+ display_idx = hd_display_adapter(hd_data);
+
+ hd_dump_entry(hd_data, hd_get_device_by_idx(hd_data, display_idx), stdout)
+
+ hd_free_hd_list(hd);
+ hd_free_hd_data(hd_data);
+
+ free(hd_data);
+
+ return 0;
+}
+
--- /dev/null
+</body></html>
--- /dev/null
+.\" Michal Svec <msvec@suse.cz>
+.\"
+.\" Process this file with
+.\" groff -man -Tascii foo.1
+.\"
+.\"
+.TH HWINFO 8 "January 2003" "hwinfo" "System configuration"
+.\"
+.\"
+.SH NAME
+hwinfo \- probe for hardware
+.\"
+.\"
+.SH SYNOPSIS
+.B hwinfo [
+.I options
+.B ]
+.\"
+.\"
+.SH DESCRIPTION
+.B hwinfo
+is used to probe for the hardware present in the system. It can be used
+to generate a system overview log which can be later used for support.
+.\"
+.\"
+.SH OPTIONS
+.\"
+.TP
+.BI --debug " " level
+Set debug
+.B level.
+The debug info is shown only in the log file. If you specify a log file,
+the debug level is implicitly set to a reasonable value.
+.\"
+.TP
+.BI --dump-db " " n
+Dump hardware data base,
+.B n
+is either
+.B 0
+for the external data base, or
+.B 1
+for the internal data base.
+.\"
+.TP
+.BI --help
+Print a usage and exit.
+.\"
+.TP
+.BI --log " " logfile
+Write info to
+.B logfile.
+.\"
+.TP
+.BI --short
+Just a short listing.
+.\"
+.TP
+.BI --version
+Show libhd version.
+.\"
+.TP
+.BI --<hwitem>
+Probe for the particular hardware item. Available hardware items are:
+.B all, bios, block, bluetooth, braille, bridge, camera, cdrom, chipcard, cpu,
+.B disk, dsl, dvb, floppy, framebuffer, gfxcard, hub, ide, isapnp, isdn,
+.B joystick, keyboard, memory, modem, monitor, mouse, netcard, network,
+.B partition, pci, pcmcia, pcmcia-ctrl, pppoe, printer, scanner, scsi, smp,
+.B sound, storage-ctrl, sys, tape, tv, usb, usb-ctrl, vbe, wlan,
+and
+.B zip.
+.\"
+.\"
+.SH FILES
+.B /var/lib/hardware/*
+.\"
+.\"
+.SH BUGS
+Not all hardware can be detected.
+.\"
+.\"
+.SH AUTHOR
+.nf
+Steffen Winterfeldt <snwint@suse.de> - hwinfo
+Michal Svec <msvec@suse.cz> - manual page
+.fi
+.\"
+.\"
+.SH "SEE ALSO"
+Documentation in /usr/share/doc/packages/hwinfo.
+.\"
+.\" EOF
--- /dev/null
+/*! \mainpage libhd documentation
+
+<h2>Introduction</h2>
+
+libhd is a hardware detection lib.
+
+<h2>Changes</h2>
+
+\ref libhd_5_12
+
+<h2>Examples</h2>
+
+\ref example1
+
+\ref example2
+
+*/
+
+
+/*! \page examples Examples
+
+\ref example1
+
+\ref example2
+
+<hr>
+
+\subsection example1 Get list of SCSI controllers
+
+\include example1.c
+
+<hr>
+
+\subsection example2 Get primary display controller
+
+\include example2.c
+
+*/
+
+/*! \page changes Changes
+
+\ref libhd_5_12
+
+<hr>
+
+\subsection libhd_5_12 libhd-5.12
+
+<ul>
+
+ <li>changes in \ref hd_t
+
+ <ul>
+
+ <li>\ref hd_t::bus "bus" is now a struct, use \ref hd_t::bus "bus.id" instead.
+
+ <li>\ref hd_t::base_class "base_class" is now a struct, use \ref hd_t::base_class "base_class.id" instead.
+
+ <li>\ref hd_t::sub_class "sub_class" is now a struct, use \ref hd_t::sub_class "sub_class.id" instead.
+
+ <li>\ref hd_t::prog_if "prog_if" is now a struct, use \ref hd_t::prog_if "prog_if.id" instead.
+
+ <li>\ref hd_t::vendor "vendor" is a struct replacing vend and vend_name.
+ Use \ref hd_t::vendor "vendor.id" and \ref hd_t::vendor "vendor.name" now.
+
+ <li>\ref hd_t::device "device" is a struct replacing dev and dev_name.
+ Use \ref hd_t::device "device.id" and \ref hd_t::device "device.name" now.
+
+ <li>\ref hd_t::sub_vendor "sub_vendor" is a struct replacing sub_vend and sub_vend_name.
+ Use \ref hd_t::sub_vendor "sub_vendor.id" and \ref hd_t::sub_vendor "sub_vendor.name" now.
+
+ <li>\ref hd_t::sub_device "sub_device" is a struct replacing sub_dev and sub_dev_name.
+ Use \ref hd_t::sub_device "sub_device.id" and \ref hd_t::sub_device "sub_device.name" now.
+
+ <li>\ref hd_t::revision "revision" is a struct replacing rev and rev_name.
+ Use \ref hd_t::revision "revision.id" and \ref hd_t::revision "revision.name" now.
+
+ <li>\ref hd_t::compat_vendor "compat_vendor" is a struct replacing compat_vend.
+ Use \ref hd_t::compat_vendor "compat_vendor.id" now.
+
+ <li>\ref hd_t::compat_device "compat_device" is a struct replacing compat_dev.
+ Use \ref hd_t::compat_device "compat_device.id" now.
+
+ </ul>
+
+ <li>interface functions removed
+
+ <ul>
+
+ <li>hd_bus_name is gone. Use \ref hd_t::bus "bus.name" instead.
+
+ <li>hd_class_name is gone. Use \ref hd_t::base_class "base_class.name",
+ \ref hd_t::sub_class "sub_class.name" or \ref hd_t::prog_if "prog_if.name" instead.
+
+ <li>hd_vendor_name is gone. Use \ref hd_t::vendor "vendor.name" instead.
+
+ <li>hd_device_name is gone. Use \ref hd_t::device "device.name" instead.
+
+ <li>hd_sub_device_name is gone. Use \ref hd_t::sub_device "sub_device.name" instead.
+
+ <li>hd_find_device_by_name is gone.
+
+ </ul>
+
+</ul>
+
+<hr>
+
+*/
+
--- /dev/null
+# Doxyfile 1.2.13.1
+
+# This file describes the settings to be used by the documentation system
+# doxygen (www.doxygen.org) for a project
+#
+# All text after a hash (#) is considered a comment and will be ignored
+# The format is:
+# TAG = value [value, ...]
+# For lists items can also be appended using:
+# TAG += value [value, ...]
+# Values that contain spaces should be placed between quotes (" ")
+
+#---------------------------------------------------------------------------
+# General configuration options
+#---------------------------------------------------------------------------
+
+# The PROJECT_NAME tag is a single word (or a sequence of words surrounded
+# by quotes) that should identify the project.
+
+PROJECT_NAME = libhd
+
+# The PROJECT_NUMBER tag can be used to enter a project or revision number.
+# This could be handy for archiving the generated documentation or
+# if some version control system is used.
+
+PROJECT_NUMBER = 5.0
+
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
+# base path where the generated documentation will be put.
+# If a relative path is entered, it will be relative to the location
+# where doxygen was started. If left blank the current directory will be used.
+
+OUTPUT_DIRECTORY = libhd
+
+# The OUTPUT_LANGUAGE tag is used to specify the language in which all
+# documentation generated by doxygen is written. Doxygen will use this
+# information to generate all constant output in the proper language.
+# The default language is English, other supported languages are:
+# Brazilian, Chinese, Croatian, Czech, Danish, Dutch, Finnish, French,
+# German, Greek, Hungarian, Italian, Japanese, Korean, Norwegian, Polish,
+# Portuguese, Romanian, Russian, Slovak, Slovene, Spanish and Swedish.
+
+OUTPUT_LANGUAGE = English
+
+# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in
+# documentation are documented, even if no documentation was available.
+# Private class members and static file members will be hidden unless
+# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
+
+EXTRACT_ALL = YES
+
+# If the EXTRACT_PRIVATE tag is set to YES all private members of a class
+# will be included in the documentation.
+
+EXTRACT_PRIVATE = NO
+
+# If the EXTRACT_STATIC tag is set to YES all static members of a file
+# will be included in the documentation.
+
+EXTRACT_STATIC = YES
+
+# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs)
+# defined locally in source files will be included in the documentation.
+# If set to NO only classes defined in header files are included.
+
+EXTRACT_LOCAL_CLASSES = YES
+
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all
+# undocumented members of documented classes, files or namespaces.
+# If set to NO (the default) these members will be included in the
+# various overviews, but no documentation section is generated.
+# This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_MEMBERS = NO
+
+# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all
+# undocumented classes that are normally visible in the class hierarchy.
+# If set to NO (the default) these class will be included in the various
+# overviews. This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_CLASSES = NO
+
+# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will
+# include brief member descriptions after the members that are listed in
+# the file and class documentation (similar to JavaDoc).
+# Set to NO to disable this.
+
+BRIEF_MEMBER_DESC = YES
+
+# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend
+# the brief description of a member or function before the detailed description.
+# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
+# brief descriptions will be completely suppressed.
+
+REPEAT_BRIEF = YES
+
+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
+# Doxygen will generate a detailed section even if there is only a brief
+# description.
+
+ALWAYS_DETAILED_SEC = NO
+
+# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all inherited
+# members of a class in the documentation of that class as if those members were
+# ordinary class members. Constructors, destructors and assignment operators of
+# the base classes will not be shown.
+
+INLINE_INHERITED_MEMB = NO
+
+# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full
+# path before files name in the file list and in the header files. If set
+# to NO the shortest path that makes the file name unique will be used.
+
+FULL_PATH_NAMES = NO
+
+# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag
+# can be used to strip a user defined part of the path. Stripping is
+# only done if one of the specified strings matches the left-hand part of
+# the path. It is allowed to use relative paths in the argument list.
+
+STRIP_FROM_PATH =
+
+# The INTERNAL_DOCS tag determines if documentation
+# that is typed after a \internal command is included. If the tag is set
+# to NO (the default) then the documentation will be excluded.
+# Set it to YES to include the internal documentation.
+
+INTERNAL_DOCS = NO
+
+# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct
+# doxygen to hide any special comment blocks from generated source code
+# fragments. Normal C and C++ comments will always remain visible.
+
+STRIP_CODE_COMMENTS = YES
+
+# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate
+# file names in lower case letters. If set to YES upper case letters are also
+# allowed. This is useful if you have classes or files whose names only differ
+# in case and if your file system supports case sensitive file names. Windows
+# users are adviced to set this option to NO.
+
+CASE_SENSE_NAMES = YES
+
+# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter
+# (but less readable) file names. This can be useful is your file systems
+# doesn't support long names like on DOS, Mac, or CD-ROM.
+
+SHORT_NAMES = NO
+
+# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen
+# will show members with their full class and namespace scopes in the
+# documentation. If set to YES the scope will be hidden.
+
+HIDE_SCOPE_NAMES = NO
+
+# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen
+# will generate a verbatim copy of the header file for each class for
+# which an include is specified. Set to NO to disable this.
+
+VERBATIM_HEADERS = YES
+
+# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen
+# will put list of the files that are included by a file in the documentation
+# of that file.
+
+SHOW_INCLUDE_FILES = YES
+
+# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen
+# will interpret the first line (until the first dot) of a JavaDoc-style
+# comment as the brief description. If set to NO, the JavaDoc
+# comments will behave just like the Qt-style comments (thus requiring an
+# explict @brief command for a brief description.
+
+JAVADOC_AUTOBRIEF = YES
+
+# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented
+# member inherits the documentation from any documented member that it
+# reimplements.
+
+INHERIT_DOCS = YES
+
+# If the INLINE_INFO tag is set to YES (the default) then a tag [inline]
+# is inserted in the documentation for inline members.
+
+INLINE_INFO = YES
+
+# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen
+# will sort the (detailed) documentation of file and class members
+# alphabetically by member name. If set to NO the members will appear in
+# declaration order.
+
+SORT_MEMBER_DOCS = YES
+
+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
+# tag is set to YES, then doxygen will reuse the documentation of the first
+# member in the group (if any) for the other members of the group. By default
+# all members of a group must be documented explicitly.
+
+DISTRIBUTE_GROUP_DOC = NO
+
+# The TAB_SIZE tag can be used to set the number of spaces in a tab.
+# Doxygen uses this value to replace tabs by spaces in code fragments.
+
+TAB_SIZE = 8
+
+# The GENERATE_TODOLIST tag can be used to enable (YES) or
+# disable (NO) the todo list. This list is created by putting \todo
+# commands in the documentation.
+
+GENERATE_TODOLIST = YES
+
+# The GENERATE_TESTLIST tag can be used to enable (YES) or
+# disable (NO) the test list. This list is created by putting \test
+# commands in the documentation.
+
+GENERATE_TESTLIST = YES
+
+# The GENERATE_BUGLIST tag can be used to enable (YES) or
+# disable (NO) the bug list. This list is created by putting \bug
+# commands in the documentation.
+
+GENERATE_BUGLIST = YES
+
+# This tag can be used to specify a number of aliases that acts
+# as commands in the documentation. An alias has the form "name=value".
+# For example adding "sideeffect=\par Side Effects:\n" will allow you to
+# put the command \sideeffect (or @sideeffect) in the documentation, which
+# will result in a user defined paragraph with heading "Side Effects:".
+# You can put \n's in the value part of an alias to insert newlines.
+
+ALIASES =
+
+# The ENABLED_SECTIONS tag can be used to enable conditional
+# documentation sections, marked by \if sectionname ... \endif.
+
+ENABLED_SECTIONS =
+
+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines
+# the initial value of a variable or define consist of for it to appear in
+# the documentation. If the initializer consists of more lines than specified
+# here it will be hidden. Use a value of 0 to hide initializers completely.
+# The appearance of the initializer of individual variables and defines in the
+# documentation can be controlled using \showinitializer or \hideinitializer
+# command in the documentation regardless of this setting.
+
+MAX_INITIALIZER_LINES = 30
+
+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources
+# only. Doxygen will then generate output that is more tailored for C.
+# For instance some of the names that are used will be different. The list
+# of all members will be omitted, etc.
+
+OPTIMIZE_OUTPUT_FOR_C = YES
+
+# Set the SHOW_USED_FILES tag to NO to disable the list of files generated
+# at the bottom of the documentation of classes and structs. If set to YES the
+# list will mention the files that were used to generate the documentation.
+
+SHOW_USED_FILES = YES
+
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+
+# The QUIET tag can be used to turn on/off the messages that are generated
+# by doxygen. Possible values are YES and NO. If left blank NO is used.
+
+QUIET = NO
+
+# The WARNINGS tag can be used to turn on/off the warning messages that are
+# generated by doxygen. Possible values are YES and NO. If left blank
+# NO is used.
+
+WARNINGS = YES
+
+# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings
+# for undocumented members. If EXTRACT_ALL is set to YES then this flag will
+# automatically be disabled.
+
+WARN_IF_UNDOCUMENTED = YES
+
+# The WARN_FORMAT tag determines the format of the warning messages that
+# doxygen can produce. The string should contain the $file, $line, and $text
+# tags, which will be replaced by the file and line number from which the
+# warning originated and the warning text.
+
+WARN_FORMAT =
+
+# The WARN_LOGFILE tag can be used to specify a file to which warning
+# and error messages should be written. If left blank the output is written
+# to stderr.
+
+WARN_LOGFILE =
+
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+
+# The INPUT tag can be used to specify the files and/or directories that contain
+# documented source files. You may enter file names like "myfile.cpp" or
+# directories like "/usr/src/myproject". Separate the files or directories
+# with spaces.
+
+INPUT = libhd.doc ../src
+
+# If the value of the INPUT tag contains directories, you can use the
+# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
+# and *.h) to filter out the source-files in the directories. If left
+# blank the following patterns are tested:
+# *.c *.cc *.cxx *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx *.hpp
+# *.h++ *.idl
+
+FILE_PATTERNS = *.c *.h
+
+# The RECURSIVE tag can be used to turn specify whether or not subdirectories
+# should be searched for input files as well. Possible values are YES and NO.
+# If left blank NO is used.
+
+RECURSIVE = YES
+
+# The EXCLUDE tag can be used to specify files and/or directories that should
+# excluded from the INPUT source files. This way you can easily exclude a
+# subdirectory from a directory tree whose root is specified with the INPUT tag.
+
+EXCLUDE = ../src/ids
+
+# If the value of the INPUT tag contains directories, you can use the
+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
+# certain files from those directories.
+
+EXCLUDE_PATTERNS =
+
+# The EXAMPLE_PATH tag can be used to specify one or more files or
+# directories that contain example code fragments that are included (see
+# the \include command).
+
+EXAMPLE_PATH = .
+
+# If the value of the EXAMPLE_PATH tag contains directories, you can use the
+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
+# and *.h) to filter out the source-files in the directories. If left
+# blank all files are included.
+
+EXAMPLE_PATTERNS = *.c
+
+# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
+# searched for input files to be used with the \include or \dontinclude
+# commands irrespective of the value of the RECURSIVE tag.
+# Possible values are YES and NO. If left blank NO is used.
+
+EXAMPLE_RECURSIVE = NO
+
+# The IMAGE_PATH tag can be used to specify one or more files or
+# directories that contain image that are included in the documentation (see
+# the \image command).
+
+IMAGE_PATH =
+
+# The INPUT_FILTER tag can be used to specify a program that doxygen should
+# invoke to filter for each input file. Doxygen will invoke the filter program
+# by executing (via popen()) the command <filter> <input-file>, where <filter>
+# is the value of the INPUT_FILTER tag, and <input-file> is the name of an
+# input file. Doxygen will then use the output that the filter program writes
+# to standard output.
+
+INPUT_FILTER =
+
+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
+# INPUT_FILTER) will be used to filter the input files when producing source
+# files to browse.
+
+FILTER_SOURCE_FILES = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+
+# If the SOURCE_BROWSER tag is set to YES then a list of source files will
+# be generated. Documented entities will be cross-referenced with these sources.
+
+SOURCE_BROWSER = NO
+
+# Setting the INLINE_SOURCES tag to YES will include the body
+# of functions and classes directly in the documentation.
+
+INLINE_SOURCES = NO
+
+# If the REFERENCED_BY_RELATION tag is set to YES (the default)
+# then for each documented function all documented
+# functions referencing it will be listed.
+
+REFERENCED_BY_RELATION = YES
+
+# If the REFERENCES_RELATION tag is set to YES (the default)
+# then for each documented function all documented entities
+# called/used by that function will be listed.
+
+REFERENCES_RELATION = YES
+
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+
+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index
+# of all compounds will be generated. Enable this if the project
+# contains a lot of classes, structs, unions or interfaces.
+
+ALPHABETICAL_INDEX = NO
+
+# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then
+# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns
+# in which this list will be split (can be a number in the range [1..20])
+
+COLS_IN_ALPHA_INDEX = 5
+
+# In case all classes in a project start with a common prefix, all
+# classes will be put under the same header in the alphabetical index.
+# The IGNORE_PREFIX tag can be used to specify one or more prefixes that
+# should be ignored while generating the index headers.
+
+IGNORE_PREFIX =
+
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_HTML tag is set to YES (the default) Doxygen will
+# generate HTML output.
+
+GENERATE_HTML = YES
+
+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `html' will be used as the default path.
+
+HTML_OUTPUT =
+
+# The HTML_HEADER tag can be used to specify a personal HTML header for
+# each generated HTML page. If it is left blank doxygen will generate a
+# standard header.
+
+HTML_HEADER =
+
+# The HTML_FOOTER tag can be used to specify a personal HTML footer for
+# each generated HTML page. If it is left blank doxygen will generate a
+# standard footer.
+
+HTML_FOOTER = footer.html
+
+# The HTML_STYLESHEET tag can be used to specify a user defined cascading
+# style sheet that is used by each HTML page. It can be used to
+# fine-tune the look of the HTML output. If the tag is left blank doxygen
+# will generate a default style sheet
+
+HTML_STYLESHEET =
+
+# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes,
+# files or namespaces will be aligned in HTML using tables. If set to
+# NO a bullet list will be used.
+
+HTML_ALIGN_MEMBERS = YES
+
+# If the GENERATE_HTMLHELP tag is set to YES, additional index files
+# will be generated that can be used as input for tools like the
+# Microsoft HTML help workshop to generate a compressed HTML help file (.chm)
+# of the generated HTML documentation.
+
+GENERATE_HTMLHELP = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag
+# controls if a separate .chi index file is generated (YES) or that
+# it should be included in the master .chm file (NO).
+
+GENERATE_CHI = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag
+# controls whether a binary table of contents is generated (YES) or a
+# normal table of contents (NO) in the .chm file.
+
+BINARY_TOC = NO
+
+# The TOC_EXPAND flag can be set to YES to add extra items for group members
+# to the contents of the Html help documentation and to the tree view.
+
+TOC_EXPAND = NO
+
+# The DISABLE_INDEX tag can be used to turn on/off the condensed index at
+# top of each HTML page. The value NO (the default) enables the index and
+# the value YES disables it.
+
+DISABLE_INDEX = NO
+
+# This tag can be used to set the number of enum values (range [1..20])
+# that doxygen will group on one line in the generated HTML documentation.
+
+ENUM_VALUES_PER_LINE = 4
+
+# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be
+# generated containing a tree-like index structure (just like the one that
+# is generated for HTML Help). For this to work a browser that supports
+# JavaScript and frames is required (for instance Mozilla, Netscape 4.0+,
+# or Internet explorer 4.0+). Note that for large projects the tree generation
+# can take a very long time. In such cases it is better to disable this feature.
+# Windows users are probably better off using the HTML help feature.
+
+GENERATE_TREEVIEW = NO
+
+# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be
+# used to set the initial width (in pixels) of the frame in which the tree
+# is shown.
+
+TREEVIEW_WIDTH = 250
+
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will
+# generate Latex output.
+
+GENERATE_LATEX = YES
+
+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `latex' will be used as the default path.
+
+LATEX_OUTPUT =
+
+# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact
+# LaTeX documents. This may be useful for small projects and may help to
+# save some trees in general.
+
+COMPACT_LATEX = NO
+
+# The PAPER_TYPE tag can be used to set the paper type that is used
+# by the printer. Possible values are: a4, a4wide, letter, legal and
+# executive. If left blank a4wide will be used.
+
+PAPER_TYPE = a4wide
+
+# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX
+# packages that should be included in the LaTeX output.
+
+EXTRA_PACKAGES =
+
+# The LATEX_HEADER tag can be used to specify a personal LaTeX header for
+# the generated latex document. The header should contain everything until
+# the first chapter. If it is left blank doxygen will generate a
+# standard header. Notice: only use this tag if you know what you are doing!
+
+LATEX_HEADER =
+
+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated
+# is prepared for conversion to pdf (using ps2pdf). The pdf file will
+# contain links (just like the HTML output) instead of page references
+# This makes the output suitable for online browsing using a pdf viewer.
+
+PDF_HYPERLINKS = NO
+
+# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of
+# plain latex in the generated Makefile. Set this option to YES to get a
+# higher quality PDF documentation.
+
+USE_PDFLATEX = NO
+
+# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode.
+# command to the generated LaTeX files. This will instruct LaTeX to keep
+# running if errors occur, instead of asking the user for help.
+# This option is also used when generating formulas in HTML.
+
+LATEX_BATCHMODE = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output
+# The RTF output is optimised for Word 97 and may not look very pretty with
+# other RTF readers or editors.
+
+GENERATE_RTF = NO
+
+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `rtf' will be used as the default path.
+
+RTF_OUTPUT =
+
+# If the COMPACT_RTF tag is set to YES Doxygen generates more compact
+# RTF documents. This may be useful for small projects and may help to
+# save some trees in general.
+
+COMPACT_RTF = NO
+
+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated
+# will contain hyperlink fields. The RTF file will
+# contain links (just like the HTML output) instead of page references.
+# This makes the output suitable for online browsing using WORD or other
+# programs which support those fields.
+# Note: wordpad (write) and others do not support links.
+
+RTF_HYPERLINKS = NO
+
+# Load stylesheet definitions from file. Syntax is similar to doxygen's
+# config file, i.e. a series of assigments. You only have to provide
+# replacements, missing definitions are set to their default value.
+
+RTF_STYLESHEET_FILE =
+
+# Set optional variables used in the generation of an rtf document.
+# Syntax is similar to doxygen's config file.
+
+RTF_EXTENSIONS_FILE =
+
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_MAN tag is set to YES (the default) Doxygen will
+# generate man pages
+
+GENERATE_MAN = NO
+
+# The MAN_OUTPUT tag is used to specify where the man pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `man' will be used as the default path.
+
+MAN_OUTPUT =
+
+# The MAN_EXTENSION tag determines the extension that is added to
+# the generated man pages (default is the subroutine's section .3)
+
+MAN_EXTENSION =
+
+# If the MAN_LINKS tag is set to YES and Doxygen generates man output,
+# then it will generate one additional man file for each entity
+# documented in the real man page(s). These additional files
+# only source the real man page, but without them the man command
+# would be unable to find the correct page. The default is NO.
+
+MAN_LINKS = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_XML tag is set to YES Doxygen will
+# generate an XML file that captures the structure of
+# the code including all documentation. Note that this
+# feature is still experimental and incomplete at the
+# moment.
+
+GENERATE_XML = NO
+
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will
+# generate an AutoGen Definitions (see autogen.sf.net) file
+# that captures the structure of the code including all
+# documentation. Note that this feature is still experimental
+# and incomplete at the moment.
+
+GENERATE_AUTOGEN_DEF = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+
+# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will
+# evaluate all C-preprocessor directives found in the sources and include
+# files.
+
+ENABLE_PREPROCESSING = YES
+
+# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro
+# names in the source code. If set to NO (the default) only conditional
+# compilation will be performed. Macro expansion can be done in a controlled
+# way by setting EXPAND_ONLY_PREDEF to YES.
+
+MACRO_EXPANSION = NO
+
+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES
+# then the macro expansion is limited to the macros specified with the
+# PREDEFINED and EXPAND_AS_PREDEFINED tags.
+
+EXPAND_ONLY_PREDEF = NO
+
+# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files
+# in the INCLUDE_PATH (see below) will be search if a #include is found.
+
+SEARCH_INCLUDES = YES
+
+# The INCLUDE_PATH tag can be used to specify one or more directories that
+# contain include files that are not input files but should be processed by
+# the preprocessor.
+
+INCLUDE_PATH =
+
+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
+# patterns (like *.h and *.hpp) to filter out the header-files in the
+# directories. If left blank, the patterns specified with FILE_PATTERNS will
+# be used.
+
+INCLUDE_FILE_PATTERNS =
+
+# The PREDEFINED tag can be used to specify one or more macro names that
+# are defined before the preprocessor is started (similar to the -D option of
+# gcc). The argument of the tag is a list of macros of the form: name
+# or name=definition (no spaces). If the definition and the = are
+# omitted =1 is assumed.
+
+PREDEFINED =
+
+# If the MACRO_EXPANSION and EXPAND_PREDEF_ONLY tags are set to YES then
+# this tag can be used to specify a list of macro names that should be expanded.
+# The macro definition that is found in the sources will be used.
+# Use the PREDEFINED tag if you want to use a different macro definition.
+
+EXPAND_AS_DEFINED =
+
+# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then
+# doxygen's preprocessor will remove all function-like macros that are alone
+# on a line and do not end with a semicolon. Such function macros are typically
+# used for boiler-plate code, and will confuse the parser if not removed.
+
+SKIP_FUNCTION_MACROS = YES
+
+#---------------------------------------------------------------------------
+# Configuration::addtions related to external references
+#---------------------------------------------------------------------------
+
+# The TAGFILES tag can be used to specify one or more tagfiles.
+
+TAGFILES =
+
+# When a file name is specified after GENERATE_TAGFILE, doxygen will create
+# a tag file that is based on the input files it reads.
+
+GENERATE_TAGFILE =
+
+# If the ALLEXTERNALS tag is set to YES all external classes will be listed
+# in the class index. If set to NO only the inherited external classes
+# will be listed.
+
+ALLEXTERNALS = NO
+
+# The PERL_PATH should be the absolute path and name of the perl script
+# interpreter (i.e. the result of `which perl').
+
+PERL_PATH =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+
+# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will
+# generate a inheritance diagram (in Html, RTF and LaTeX) for classes with base or
+# super classes. Setting the tag to NO turns the diagrams off. Note that this
+# option is superceded by the HAVE_DOT option below. This is only a fallback. It is
+# recommended to install and use dot, since it yield more powerful graphs.
+
+CLASS_DIAGRAMS = YES
+
+# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
+# available from the path. This tool is part of Graphviz, a graph visualization
+# toolkit from AT&T and Lucent Bell Labs. The other options in this section
+# have no effect if this option is set to NO (the default)
+
+HAVE_DOT = NO
+
+# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for each documented class showing the direct and
+# indirect inheritance relations. Setting this tag to YES will force the
+# the CLASS_DIAGRAMS tag to NO.
+
+CLASS_GRAPH = YES
+
+# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for each documented class showing the direct and
+# indirect implementation dependencies (inheritance, containment, and
+# class references variables) of the class with other documented classes.
+
+COLLABORATION_GRAPH = YES
+
+# If set to YES, the inheritance and collaboration graphs will show the
+# relations between templates and their instances.
+
+TEMPLATE_RELATIONS = YES
+
+# If set to YES, the inheritance and collaboration graphs will hide
+# inheritance and usage relations if the target is undocumented
+# or is not a class.
+
+HIDE_UNDOC_RELATIONS = YES
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT
+# tags are set to YES then doxygen will generate a graph for each documented
+# file showing the direct and indirect include dependencies of the file with
+# other documented files.
+
+INCLUDE_GRAPH = YES
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and
+# HAVE_DOT tags are set to YES then doxygen will generate a graph for each
+# documented header file showing the documented files that directly or
+# indirectly include this file.
+
+INCLUDED_BY_GRAPH = YES
+
+# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen
+# will graphical hierarchy of all classes instead of a textual one.
+
+GRAPHICAL_HIERARCHY = YES
+
+# The tag DOT_PATH can be used to specify the path where the dot tool can be
+# found. If left blank, it is assumed the dot tool can be found on the path.
+
+DOT_PATH =
+
+# The DOTFILE_DIRS tag can be used to specify one or more directories that
+# contain dot files that are included in the documentation (see the
+# \dotfile command).
+
+DOTFILE_DIRS =
+
+# The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width
+# (in pixels) of the graphs generated by dot. If a graph becomes larger than
+# this value, doxygen will try to truncate the graph, so that it fits within
+# the specified constraint. Beware that most browsers cannot cope with very
+# large images.
+
+MAX_DOT_GRAPH_WIDTH = 1024
+
+# The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height
+# (in pixels) of the graphs generated by dot. If a graph becomes larger than
+# this value, doxygen will try to truncate the graph, so that it fits within
+# the specified constraint. Beware that most browsers cannot cope with very
+# large images.
+
+MAX_DOT_GRAPH_HEIGHT = 1024
+
+# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will
+# generate a legend page explaining the meaning of the various boxes and
+# arrows in the dot generated graphs.
+
+GENERATE_LEGEND = YES
+
+# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will
+# remove the intermedate dot files that are used to generate
+# the various graphs.
+
+DOT_CLEANUP = YES
+
+#---------------------------------------------------------------------------
+# Configuration::addtions related to the search engine
+#---------------------------------------------------------------------------
+
+# The SEARCHENGINE tag specifies whether or not a search engine should be
+# used. If set to NO the values of all tags below this one will be ignored.
+
+SEARCHENGINE = NO
+
+# The CGI_NAME tag should be the name of the CGI script that
+# starts the search engine (doxysearch) with the correct parameters.
+# A script with this name will be generated by doxygen.
+
+CGI_NAME =
+
+# The CGI_URL tag should be the absolute URL to the directory where the
+# cgi binaries are located. See the documentation of your http daemon for
+# details.
+
+CGI_URL =
+
+# The DOC_URL tag should be the absolute URL to the directory where the
+# documentation is located. If left blank the absolute path to the
+# documentation, with file:// prepended to it, will be used.
+
+DOC_URL =
+
+# The DOC_ABSPATH tag should be the absolute path to the directory where the
+# documentation is located. If left blank the directory on the local machine
+# will be used.
+
+DOC_ABSPATH =
+
+# The BIN_ABSPATH tag must point to the directory where the doxysearch binary
+# is installed.
+
+BIN_ABSPATH =
+
+# The EXT_DOC_PATHS tag can be used to specify one or more paths to
+# documentation generated for other projects. This allows doxysearch to search
+# the documentation for these projects as well.
+
+EXT_DOC_PATHS =
--- /dev/null
+#!/bin/bash
+#
+# gen-hwcfg-disk.sh
+#
+# Generates hwcfg file for all configured disks
+#
+
+if [ -x /sbin/ata_identify ]; then
+ ATA_ID=/sbin/ata_identify
+elif [ -x /lib/klibc/bin/ata_identify ]; then
+ ATA_ID=/lib/klibc/bin/ata_identify
+else
+ echo "ata_identify not found, please install udev"
+ exit 1
+fi
+
+hwcfg=/etc/sysconfig/hardware
+
+if [ ! -d "$hwcfg" ]; then
+ echo "No hardware configuration directory found"
+ exit 1
+fi
+
+# IDE disks first
+for ifname in /sys/block/hd*; do
+ id=$($ATA_ID /dev/${ifname##*/} 2> /dev/null)
+ if [ $? -eq 0 ]; then
+ filename="SATA_$id"
+ echo "Generate hwcfg file for $filename"
+ echo "DEVICE=${ifname##*/}" > ${hwcfg}/hwcfg-disk-id-${filename}
+ fi
+done
+
+# SCSI disks next
+for ifname in /sys/block/sd*; do
+ if [ -d $ifname/device ]; then
+ read vendor < $ifname/device/vendor
+ if [ "$vendor" = "ATA" ]; then
+ # We need page 0x80 to get the serial number
+ page="-p 0x80"
+ else
+ page=
+ fi
+ scsi_id -g $page -s ${ifname#/sys} 2> /dev/null | while read vendor model serial; do
+ filename="${vendor}_${model}_${serial}"
+ echo "Generate hwcfg file for $filename"
+ echo "DEVICE=${ifname##*/}" > ${hwcfg}/hwcfg-disk-id-${filename}
+ done
+ fi
+done
--- /dev/null
+#! /bin/sh
+
+if [ "$1" ] ; then
+ cat <<EOF
+Usage: getsysinfo
+Collect some system data that are useful for debugging
+hardware detection bugs.
+EOF
+ exit 0
+fi
+
+# collect some system data
+
+dir=`mktemp -d /tmp/getsysinfo.XXXXXXXXXX`
+
+[ -d "$dir" ] || exit 1
+
+host=`hostname`
+[ "$host" ] || host=xxx
+
+mkdir -p "$dir/$host"
+
+for i in \
+ /proc/bus/input \
+ /proc/cpuinfo \
+ /proc/device-tree \
+ /proc/devices \
+ /proc/dma \
+ /proc/driver/nvram \
+ /proc/fb \
+ /proc/iSeries \
+ /proc/ide \
+ /proc/interrupts \
+ /proc/iomem \
+ /proc/ioports \
+ /proc/meminfo \
+ /proc/modules \
+ /proc/net/dev \
+ /proc/partitions \
+ /proc/scsi \
+ /proc/sys/dev/cdrom/info \
+ /proc/sys/dev/parport \
+ /proc/tty \
+ /proc/version \
+ /sys \
+ /var/log/boot.msg
+do
+ if [ -e "$i" ] ; then
+ echo "$i"
+ cp -a --parents "$i" "$dir/$host" 2>/dev/null
+ chmod -R u+w,a+r,a+X "$dir/$host"
+ fi
+done
+
+echo /proc/mounts
+cp --parents /proc/mounts "$dir/$host"
+
+echo -e "\n------ dmesg start ------\n" >>"$dir/$host/var/log/boot.msg"
+dmesg >>"$dir/$host/var/log/boot.msg"
+
+file="$host.tar.gz"
+tar -C "$dir" -zcf "$dir/$file" "$host"
+
+rm -f "/tmp/$file"
+
+if [ -e "/tmp/$file" ] ; then
+ echo "Warning: /tmp/$file exists, no info written"\!
+ rm -rf "$dir"
+ exit 1
+fi
+
+ln -nf "$dir/$file" "/tmp/$file"
+
+rm -rf "$dir"
+
+echo -e "\nSystem data written to: /tmp/$file"
+
--- /dev/null
+#!/bin/bash
+
+rm -f /var/lib/hardware/LOCK
+
+/sbin/hwscan --silent --boot --fast --isapnp --pci --block --floppy --mouse
+
+#
+# create icons for static drives
+#
+if [ -e /etc/hotplug/hotplug.subfs.functions ]; then
+ . /etc/hotplug/hotplug.subfs.functions
+ coldplug_create_subfs
+fi
+
+exit 0
--- /dev/null
+#! /bin/sh
+# Copyright (c) 2002 SuSE GmbH Nuernberg, Germany. All rights reserved.
+#
+# Author: Marcus Meissner <meissner@suse.de>
+#
+# /etc/init.d/hwscan
+#
+# System startup script for boot hw probing and reconfiguration
+#
+### BEGIN INIT INFO
+# Provides: hwscan
+# Required-Start:
+# X-UnitedLinux-Should-Start: hotplug kbd
+# Required-Stop:
+# Default-Start: 2 3 5
+# Default-Stop:
+# Description: Hardware scan and reconfiguration on boot.
+### END INIT INFO
+
+HWBOOTSCAN_BIN=/usr/sbin/hwbootscan
+test -x $HWBOOTSCAN_BIN || exit 5
+
+# Shell functions sourced from /etc/rc.status:
+# rc_check check and set local and overall rc status
+# rc_status check and set local and overall rc status
+# rc_status -v ditto but be verbose in local rc status
+# rc_status -v -r ditto and clear the local rc status
+# rc_failed set local and overall rc status to failed
+# rc_reset clear local rc status (overall remains)
+# rc_exit exit appropriate to overall rc status
+. /etc/rc.status
+
+# First reset status of this service
+rc_reset
+
+# Return values acc. to LSB for all commands but status:
+# 0 - success
+# 1 - misc error
+# 2 - invalid or excess args
+# 3 - unimplemented feature (e.g. reload)
+# 4 - insufficient privilege
+# 5 - program not installed
+# 6 - program not configured
+# 7 - program is not running
+#
+# Note that starting an already running service, stopping
+# or restarting a not-running service as well as the restart
+# with force-reload (in case signalling is not supported) are
+# considered a success.
+
+case "$1" in
+ start)
+ echo -n "Starting hardware scan on boot"
+ rc_splash "YaST"
+ [ -n "$REDIRECT" ] && exec 0<> $REDIRECT 1>&0 2>&0
+ $HWBOOTSCAN_BIN
+ rc_check
+ rc_status -v
+ ;;
+ stop)
+ rc_check
+ ;;
+ restart)
+ ## Stop the service and regardless of whether it was
+ ## running or not, start it again.
+ # Remember status and be quiet
+ rc_check
+ ;;
+ force-reload)
+ ## Signal the daemon to reload its config. Most daemons
+ ## do this on signal 1 (SIGHUP).
+ ## If it does not support it, restart.
+ # Remember status and be quiet
+ rc_check
+ ;;
+ reload)
+ ## Like force-reload, but if daemon does not support
+ ## signalling, do nothing (!)
+
+ # If it supports signalling:
+ rc_reset
+ ;;
+ status)
+ ## Check status with checkproc(8), if process is running
+ ## checkproc will return with exit status 0.
+
+ # Status has a slightly different for the status command:
+ # 0 - service running
+ # 1 - service dead, but /var/run/ pid file exists
+ # 2 - service dead, but /var/lock/ lock file exists
+ # 3 - service not running
+
+ rc_reset
+ ;;
+ *)
+ echo "Usage: $0 {start|stop|restart|force-reload|reload|status}"
+ exit 1
+ ;;
+esac
+rc_exit
+
--- /dev/null
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <getopt.h>
+#include <errno.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#include "hd.h"
+#include "hd_int.h"
+
+static int get_probe_flags(int, char **, hd_data_t *);
+static void progress2(char *, char *);
+
+// ##### temporary solution, fix it later!
+str_list_t *read_file(char *file_name, unsigned start_line, unsigned lines);
+str_list_t *search_str_list(str_list_t *sl, char *str);
+str_list_t *add_str_list(str_list_t **sl, char *str);
+char *new_str(const char *);
+
+static unsigned deb = 0;
+static char *log_file = "";
+static char *list = NULL;
+static int listplus = 0;
+
+static int test = 0;
+static int is_short = 0;
+
+static char *showconfig = NULL;
+static char *saveconfig = NULL;
+static hd_hw_item_t hw_item[100] = { };
+static int hw_items = 0;
+
+int braille_install_info(hd_data_t *hd_data);
+int x11_install_info(hd_data_t *hd_data);
+int oem_install_info(hd_data_t *hd_data);
+void dump_packages(hd_data_t *hd_data);
+
+void do_hw(hd_data_t *hd_data, FILE *f, hd_hw_item_t hw_item);
+void do_hw_multi(hd_data_t *hd_data, FILE *f, hd_hw_item_t *hw_items);
+void do_short(hd_data_t *hd_data, hd_t *hd, FILE *f);
+void do_test(hd_data_t *hd_data);
+void help(void);
+void dump_db_raw(hd_data_t *hd_data);
+void dump_db(hd_data_t *hd_data);
+void do_chroot(hd_data_t *hd_data, char *dir);
+void ask_db(hd_data_t *hd_data, char *query);
+void get_mapping(hd_data_t *hd_data);
+
+
+struct {
+ unsigned db_idx;
+ unsigned separate:1;
+ char *root;
+} opt;
+
+struct option options[] = {
+ { "special", 1, NULL, 1 },
+ { "help", 0, NULL, 'h' },
+ { "debug", 1, NULL, 'd' },
+ { "version", 0, NULL, 400 },
+ { "log", 1, NULL, 'l' },
+ { "packages", 0, NULL, 'p' },
+ { "test", 0, NULL, 300 },
+ { "format", 1, NULL, 301 },
+ { "show-config", 1, NULL, 302 },
+ { "save-config", 1, NULL, 303 },
+ { "short", 0, NULL, 304 },
+ { "fast", 0, NULL, 305 },
+ { "dump-db", 1, NULL, 306 },
+ { "dump-db-raw", 1, NULL, 307 },
+ { "separate", 0, NULL, 308 },
+ { "root", 1, NULL, 309 },
+ { "db", 1, NULL, 310 },
+ { "only", 1, NULL, 311 },
+ { "listmd", 0, NULL, 312 },
+ { "map", 0, NULL, 313 },
+ { "kernel-version", 1, NULL, 314 },
+ { "cdrom", 0, NULL, 1000 + hw_cdrom },
+ { "floppy", 0, NULL, 1000 + hw_floppy },
+ { "disk", 0, NULL, 1000 + hw_disk },
+ { "network", 0, NULL, 1000 + hw_network },
+ { "display", 0, NULL, 1000 + hw_display },
+ { "gfxcard", 0, NULL, 1000 + hw_display },
+ { "framebuffer", 0, NULL, 1000 + hw_framebuffer },
+ { "monitor", 0, NULL, 1000 + hw_monitor },
+ { "camera", 0, NULL, 1000 + hw_camera },
+ { "mouse", 0, NULL, 1000 + hw_mouse },
+ { "joystick", 0, NULL, 1000 + hw_joystick },
+ { "keyboard", 0, NULL, 1000 + hw_keyboard },
+ { "chipcard", 0, NULL, 1000 + hw_chipcard },
+ { "sound", 0, NULL, 1000 + hw_sound },
+ { "isdn", 0, NULL, 1000 + hw_isdn },
+ { "modem", 0, NULL, 1000 + hw_modem },
+ { "storage-ctrl", 0, NULL, 1000 + hw_storage_ctrl },
+ { "storage_ctrl", 0, NULL, 1000 + hw_storage_ctrl },
+ { "netcard", 0, NULL, 1000 + hw_network_ctrl },
+ { "netcards", 0, NULL, 1000 + hw_network_ctrl }, // outdated, just kept for comaptibility
+ { "network-ctrl", 0, NULL, 1000 + hw_network_ctrl },
+ { "network_ctrl", 0, NULL, 1000 + hw_network_ctrl },
+ { "printer", 0, NULL, 1000 + hw_printer },
+ { "tv", 0, NULL, 1000 + hw_tv },
+ { "dvb", 0, NULL, 1000 + hw_dvb },
+ { "scanner", 0, NULL, 1000 + hw_scanner },
+ { "braille", 0, NULL, 1000 + hw_braille },
+ { "sys", 0, NULL, 1000 + hw_sys },
+ { "bios", 0, NULL, 1000 + hw_bios },
+ { "cpu", 0, NULL, 1000 + hw_cpu },
+ { "partition", 0, NULL, 1000 + hw_partition },
+ { "usb-ctrl", 0, NULL, 1000 + hw_usb_ctrl },
+ { "usb_ctrl", 0, NULL, 1000 + hw_usb_ctrl },
+ { "usb", 0, NULL, 1000 + hw_usb },
+ { "pci", 0, NULL, 1000 + hw_pci },
+ { "isapnp", 0, NULL, 1000 + hw_isapnp },
+ { "scsi", 0, NULL, 1000 + hw_scsi },
+ { "ide", 0, NULL, 1000 + hw_ide },
+ { "bridge", 0, NULL, 1000 + hw_bridge },
+ { "hub", 0, NULL, 1000 + hw_hub },
+ { "memory", 0, NULL, 1000 + hw_memory },
+ { "manual", 0, NULL, 1000 + hw_manual },
+ { "pcmcia", 0, NULL, 1000 + hw_pcmcia },
+ { "pcmcia_ctrl", 0, NULL, 1000 + hw_pcmcia_ctrl },
+ { "ieee1394", 0, NULL, 1000 + hw_ieee1394 },
+ { "ieee1394_ctrl", 0, NULL, 1000 + hw_ieee1394_ctrl },
+ { "firewire", 0, NULL, 1000 + hw_ieee1394 },
+ { "firewire_ctrl", 0, NULL, 1000 + hw_ieee1394_ctrl },
+ { "hotplug", 0, NULL, 1000 + hw_hotplug },
+ { "hotplug_ctrl", 0, NULL, 1000 + hw_hotplug_ctrl },
+ { "zip", 0, NULL, 1000 + hw_zip },
+ { "pppoe", 0, NULL, 1000 + hw_pppoe },
+ { "dsl", 0, NULL, 1000 + hw_dsl },
+ { "wlan", 0, NULL, 1000 + hw_wlan },
+ { "redasd", 0, NULL, 1000 + hw_redasd },
+ { "block", 0, NULL, 1000 + hw_block },
+ { "tape", 0, NULL, 1000 + hw_tape },
+ { "vbe", 0, NULL, 1000 + hw_vbe },
+ { "bluetooth", 0, NULL, 1000 + hw_bluetooth },
+ { "all", 0, NULL, 2000 },
+ { "reallyall", 0, NULL, 2001 },
+ { "smp", 0, NULL, 2002 },
+ { "arch", 0, NULL, 2003 },
+ { "uml", 0, NULL, 2004 },
+ { }
+};
+
+
+/*
+ * Just scan the hardware and dump all info.
+ */
+int main(int argc, char **argv)
+{
+ hd_data_t *hd_data;
+ hd_t *hd;
+ FILE *f = NULL;
+ int i;
+ unsigned first_probe = 1;
+
+ hd_data = calloc(1, sizeof *hd_data);
+ hd_data->progress = isatty(1) ? progress2 : NULL;
+ hd_data->debug=~(HD_DEB_DRIVER_INFO | HD_DEB_HDDB);
+
+ for(i = 0; i < argc; i++) {
+ if(strstr(argv[i], "--") == argv[i]) break;
+ }
+
+ if(i != argc) {
+ /* new style interface */
+
+ opterr = 0;
+
+ while((i = getopt_long(argc, argv, "hd:l:p", options, NULL)) != -1) {
+ switch(i) {
+ case 1:
+ if(!strcmp(optarg, "braille")) {
+ braille_install_info(hd_data);
+ }
+ else if(!strcmp(optarg, "x11")) {
+ x11_install_info(hd_data);
+ }
+ else if(!strcmp(optarg, "oem")) {
+ oem_install_info(hd_data);
+ }
+ else {
+ help();
+ return 1;
+ }
+ break;
+
+ case 'd':
+ hd_data->debug = strtol(optarg, NULL, 0);
+ break;
+
+ case 'l':
+ log_file = optarg;
+ break;
+
+ case 'p':
+ dump_packages(hd_data);
+ break;
+
+ case 300:
+ do_test(hd_data);
+ break;
+
+ case 301:
+ hd_data->flags.dformat = strtol(optarg, NULL, 0);
+ break;
+
+ case 302:
+ showconfig = optarg;
+ break;
+
+ case 303:
+ saveconfig = optarg;
+ break;
+
+ case 304:
+ is_short = 1;
+ break;
+
+ case 305:
+ hd_data->flags.fast = 1;
+ break;
+
+ case 306:
+ opt.db_idx = strtoul(optarg, NULL, 0);
+ dump_db(hd_data);
+ break;
+
+ case 307:
+ opt.db_idx = strtoul(optarg, NULL, 0);
+ dump_db_raw(hd_data);
+ break;
+
+ case 308:
+ /* basically for debugging */
+ opt.separate = 1;
+ break;
+
+ case 309:
+ opt.root = optarg;
+ break;
+
+ case 310:
+ ask_db(hd_data, optarg);
+ break;
+
+ case 311:
+ if(*optarg) add_str_list(&hd_data->only, optarg);
+ break;
+
+ case 312:
+ hd_data->flags.list_md = 1;
+ break;
+
+ case 313:
+ get_mapping(hd_data);
+ break;
+
+ case 314:
+ if(*optarg) setenv("LIBHD_KERNELVERSION", optarg, 1);
+ break;
+
+ case 400:
+ printf("%s\n", hd_version());
+ break;
+
+ case 1000 ... 1100:
+ if(hw_items < (int) (sizeof hw_item / sizeof *hw_item) - 1)
+ hw_item[hw_items++] = i - 1000;
+ break;
+
+ case 2000:
+ case 2001:
+ case 2002:
+ case 2003:
+ case 2004:
+ if(hw_items < (int) (sizeof hw_item / sizeof *hw_item) - 1)
+ hw_item[hw_items++] = i;
+ break;
+
+ default:
+ help();
+ return 0;
+ }
+ }
+
+ if(!hw_items && is_short) hw_item[hw_items++] = 2000; /* all */
+
+ if(hw_items >= 0 || showconfig || saveconfig) {
+ if(*log_file) {
+ if(!strcmp(log_file, "-")) {
+ f = fdopen(1, "w");
+ }
+ else {
+ f = fopen(log_file, "w+");
+ }
+ }
+
+ if(opt.root) do_chroot(hd_data, opt.root);
+
+ if(opt.separate || hw_items <= 1) {
+ for(i = 0; i < hw_items; i++) {
+ if(i) fputc('\n', f ? f : stdout);
+ do_hw(hd_data, f, hw_item[i]);
+ }
+ }
+ else {
+ hw_item[hw_items] = 0;
+ do_hw_multi(hd_data, f, hw_item);
+ }
+
+#ifndef LIBHD_TINY
+ if(showconfig) {
+ hd = hd_read_config(hd_data, showconfig);
+ if(hd) {
+ hd_dump_entry(hd_data, hd, f ? f : stdout);
+ hd = hd_free_hd_list(hd);
+ }
+ else {
+ fprintf(f ? f : stdout, "No config data: %s\n", showconfig);
+ }
+ }
+
+ if(saveconfig) {
+ for(hd = hd_data->hd; hd; hd = hd->next) {
+ if(!strcmp(hd->unique_id, saveconfig)) {
+ i = hd_write_config(hd_data, hd);
+ fprintf(f ? f : stdout, "%s: %s\n",
+ saveconfig,
+ i ? "Error writing config data" : "config saved"
+ );
+ break;
+ }
+ }
+ if(!hd) {
+ fprintf(f ? f : stdout, "No such hardware: %s\n", saveconfig);
+ }
+ }
+#endif
+
+ if(f) fclose(f);
+ }
+
+ hd_free_hd_data(hd_data);
+ free(hd_data);
+
+ return 0;
+ }
+
+ /* old style interface */
+
+ argc--; argv++;
+
+ if(argc == 1 && !strcmp(*argv, "-h")) {
+ help();
+ return 0;
+ }
+
+ do {
+ if(first_probe) /* only for the 1st probing */
+ hd_set_probe_feature(hd_data, pr_default);
+ else {
+ hd_clear_probe_feature(hd_data, pr_all);
+ }
+
+ if((i = get_probe_flags(argc, argv, hd_data)) < 0) return 1;
+ deb = hd_data->debug;
+ argc -= i; argv += i;
+
+ if(opt.root && first_probe) do_chroot(hd_data, opt.root);
+
+ hd_scan(hd_data);
+ if(hd_data->progress) printf("\r%64s\r", "");
+
+ first_probe = 0;
+ } while(argc);
+
+ if(*log_file) {
+ if(!strcmp(log_file, "-")) {
+ f = fdopen(1, "w");
+ }
+ else {
+ f = fopen(log_file, "w+");
+ }
+ }
+
+ if((hd_data->debug & HD_DEB_SHOW_LOG) && hd_data->log) {
+ if(*log_file) {
+ fprintf(f ? f : stdout,
+ "============ start hardware log ============\n"
+ );
+ }
+ fprintf(f ? f : stdout,
+ "============ start debug info ============\n%s=========== end debug info ============\n",
+ hd_data->log
+ );
+ }
+
+ for(hd = hd_data->hd; hd; hd = hd->next) {
+ hd_dump_entry(hd_data, hd, f ? f : stdout);
+ }
+
+ if(*log_file) {
+ fprintf(f ? f : stdout,
+ "============ end hardware log ============\n"
+ );
+ }
+
+ i = -1;
+ if(list) {
+ if(!strcmp(list, "cdrom")) i = hw_cdrom;
+ if(!strcmp(list, "disk")) i = hw_disk;
+ if(!strcmp(list, "floppy")) i = hw_floppy;
+ if(!strcmp(list, "network")) i = hw_network;
+ if(!strcmp(list, "display")) i = hw_display;
+ if(!strcmp(list, "monitor")) i = hw_monitor;
+ if(!strcmp(list, "mouse")) i = hw_mouse;
+ if(!strcmp(list, "keyboard")) i = hw_keyboard;
+ if(!strcmp(list, "sound")) i = hw_sound;
+ if(!strcmp(list, "isdn")) i = hw_isdn;
+ if(!strcmp(list, "dsl")) i = hw_dsl;
+ if(!strcmp(list, "modem")) i = hw_modem;
+ if(!strcmp(list, "storage_ctrl")) i = hw_storage_ctrl;
+ if(!strcmp(list, "network_ctrl")) i = hw_network_ctrl;
+ if(!strcmp(list, "netcards")) i = hw_network_ctrl;
+ if(!strcmp(list, "printer")) i = hw_printer;
+ if(!strcmp(list, "tv")) i = hw_tv;
+ if(!strcmp(list, "scanner")) i = hw_scanner;
+ if(!strcmp(list, "braille")) i = hw_braille;
+ if(!strcmp(list, "sys")) i = hw_sys;
+ if(!strcmp(list, "cpu")) i = hw_cpu;
+
+ if(i >= 0) {
+ hd = hd_list(hd_data, i, listplus, NULL);
+ printf("\n");
+ printf("-- %s list --\n", list);
+ for(; hd; hd = hd->next) hd_dump_entry(hd_data, hd, stdout);
+ printf("-- %s list end --\n", list);
+ hd = hd_free_hd_list(hd);
+ }
+ }
+
+ if(f) fclose(f);
+
+ hd_free_hd_data(hd_data);
+ free(hd_data);
+
+ return 0;
+}
+
+
+void do_hw(hd_data_t *hd_data, FILE *f, hd_hw_item_t hw_item)
+{
+ hd_t *hd, *hd0;
+ int smp = -1, uml = 0, i;
+ char *s, *t;
+ enum boot_arch b_arch;
+ enum cpu_arch c_arch;
+
+ hd0 = NULL;
+
+ switch(hw_item) {
+ case 2002:
+ smp = hd_smp_support(hd_data);
+ break;
+
+ case 2000:
+ case 2001:
+ case 2003:
+ i = -1;
+ switch((int) hw_item) {
+ case 2000: i = pr_default; break;
+ case 2001: i = pr_all; break;
+ case 2003: i = pr_cpu; break;
+ }
+ if(i != -1) {
+ hd_clear_probe_feature(hd_data, pr_all);
+ hd_set_probe_feature(hd_data, i);
+ hd_scan(hd_data);
+ hd0 = hd_data->hd;
+ }
+ break;
+
+ case 2004:
+ uml = hd_is_uml(hd_data);
+ break;
+
+ default:
+ hd0 = hd_list(hd_data, hw_item, 1, NULL);
+ }
+
+ if(hd_data->progress) {
+ printf("\r%64s\r", "");
+ fflush(stdout);
+ }
+
+ if(f) {
+ if((hd_data->debug & HD_DEB_SHOW_LOG) && hd_data->log) {
+ fprintf(f,
+ "============ start hardware log ============\n"
+ );
+ fprintf(f,
+ "============ start debug info ============\n%s=========== end debug info ============\n",
+ hd_data->log
+ );
+ }
+
+ for(hd = hd_data->hd; hd; hd = hd->next) {
+ hd_dump_entry(hd_data, hd, f);
+ }
+
+ fprintf(f,
+ "============ end hardware log ============\n"
+ );
+ }
+
+ if(hw_item == 2002) {
+ fprintf(f ? f : stdout,
+ "SMP support: %s",
+ smp < 0 ? "unknown" : smp > 0 ? "yes" : "no"
+ );
+ if(smp > 0) fprintf(f ? f : stdout, " (%u cpus)", smp);
+ fprintf(f ? f : stdout, "\n");
+ }
+ else if(hw_item == 2003) {
+ c_arch = hd_cpu_arch(hd_data);
+ b_arch = hd_boot_arch(hd_data);
+
+ s = t = "Unknown";
+ switch(c_arch) {
+ case arch_unknown:
+ break;
+ case arch_intel:
+ s = "X86 (32)";
+ break;
+ case arch_alpha:
+ s = "Alpha";
+ break;
+ case arch_sparc:
+ s = "Sparc (32)";
+ break;
+ case arch_sparc64:
+ s = "UltraSparc (64)";
+ break;
+ case arch_ppc:
+ s = "PowerPC";
+ break;
+ case arch_ppc64:
+ s = "PowerPC (64)";
+ break;
+ case arch_68k:
+ s = "68k";
+ break;
+ case arch_ia64:
+ s = "IA-64";
+ break;
+ case arch_s390:
+ s = "S390";
+ break;
+ case arch_s390x:
+ s = "S390x";
+ break;
+ case arch_arm:
+ s = "ARM";
+ break;
+ case arch_mips:
+ s = "MIPS";
+ break;
+ case arch_x86_64:
+ s = "X86_64";
+ break;
+ }
+
+ switch(b_arch) {
+ case boot_unknown:
+ break;
+ case boot_lilo:
+ t = "lilo";
+ break;
+ case boot_milo:
+ t = "milo";
+ break;
+ case boot_aboot:
+ t = "aboot";
+ break;
+ case boot_silo:
+ t = "silo";
+ break;
+ case boot_ppc:
+ t = "ppc";
+ break;
+ case boot_elilo:
+ t = "elilo";
+ break;
+ case boot_s390:
+ t = "s390";
+ break;
+ case boot_mips:
+ t = "mips";
+ break;
+ case boot_grub:
+ t = "grub";
+ break;
+ }
+
+ fprintf(f ? f : stdout, "Arch: %s/%s\n", s, t);
+ }
+ else if(hw_item == 2004) {
+ fprintf(f ? f : stdout, "UML: %s\n", uml ? "yes" : "no");
+ }
+ else {
+ if(is_short) {
+ /* always to stdout */
+ do_short(hd_data, hd0, stdout);
+ if(f) do_short(hd_data, hd0, f);
+ }
+ else {
+ for(hd = hd0; hd; hd = hd->next) {
+ hd_dump_entry(hd_data, hd, f ? f : stdout);
+ }
+ }
+ }
+
+ if(hw_item == hw_display && hd0) {
+ fprintf(f ? f : stdout, "\nPrimary display adapter: #%u\n", hd_display_adapter(hd_data));
+ }
+
+ if(hd0 != hd_data->hd) hd_free_hd_list(hd0);
+}
+
+
+void do_hw_multi(hd_data_t *hd_data, FILE *f, hd_hw_item_t *hw_items)
+{
+ hd_t *hd, *hd0;
+
+ hd0 = hd_list2(hd_data, hw_items, 1);
+
+ if(hd_data->progress) {
+ printf("\r%64s\r", "");
+ fflush(stdout);
+ }
+
+ if(f) {
+ if((hd_data->debug & HD_DEB_SHOW_LOG) && hd_data->log) {
+ fprintf(f,
+ "============ start hardware log ============\n"
+ );
+ fprintf(f,
+ "============ start debug info ============\n%s=========== end debug info ============\n",
+ hd_data->log
+ );
+ }
+
+ for(hd = hd_data->hd; hd; hd = hd->next) {
+ hd_dump_entry(hd_data, hd, f);
+ }
+
+ fprintf(f,
+ "============ end hardware log ============\n"
+ );
+ }
+
+ if(is_short) {
+ /* always to stdout */
+ do_short(hd_data, hd0, stdout);
+ if(f) do_short(hd_data, hd0, f);
+ }
+ else {
+ for(hd = hd0; hd; hd = hd->next) {
+ hd_dump_entry(hd_data, hd, f ? f : stdout);
+ }
+ }
+
+ hd_free_hd_list(hd0);
+}
+
+
+void do_short(hd_data_t *hd_data, hd_t *hd, FILE *f)
+{
+#ifndef LIBHD_TINY
+ hd_hw_item_t item;
+ hd_t *hd1;
+ int i;
+ char *s;
+
+ for(item = 1; item < hw_all; item++) {
+ i = 0;
+ s = hd_hw_item_name(item);
+ if(!s) continue;
+
+ if(item == hw_sys) continue;
+
+ for(hd1 = hd; hd1; hd1 = hd1->next) {
+ if(hd1->hw_class == item) {
+ if(!i++) fprintf(f, "%s:\n", s);
+ fprintf(f, " %-20s %s\n",
+ hd1->unix_dev_name ? hd1->unix_dev_name : "",
+ hd1->model ? hd1->model : "???"
+ );
+ }
+ }
+ }
+#endif
+}
+
+
+#if 0
+typedef struct {
+ char *vendor, *model, *driver;
+} scanner_t;
+
+static scanner_t scanner_data[] = {
+ { "Abaton", "SCAN 300/GS", "abaton" },
+ { "Abaton", "SCAN 300/S", "abaton" },
+ { "Acer", "300f", "SnapScan" },
+ { "Acer", "310s", "SnapScan" },
+ { "Acer", "610plus", "SnapScan" },
+ { "Acer", "610s", "SnapScan" },
+ { "Acer", "Prisa 1240", "SnapScan" },
+ { "Acer", "Prisa 3300", "SnapScan" },
+ { "Acer", "Prisa 4300", "SnapScan" },
+ { "Acer", "Prisa 5300", "SnapScan" },
+ { "Acer", "Prisa 620s", "SnapScan" },
+ { "Acer", "Prisa 620u", "SnapScan" },
+ { "Acer", "Prisa 620ut", "SnapScan" },
+ { "Acer", "Prisa 640bu", "SnapScan" },
+ { "Acer", "Prisa 640u", "SnapScan" },
+ { "Agfa", "Arcus II", "microtek" },
+ { "Agfa", "DuoScan", "microtek" },
+ { "Agfa", "FOCUS COLOR", "agfafocus" },
+ { "Agfa", "FOCUS GS SCANNER", "agfafocus" },
+ { "Agfa", "FOCUS II", "agfafocus" },
+ { "Agfa", "FOCUS LINEART SCANNER", "agfafocus" },
+ { "Agfa", "SnapScan 1212u", "SnapScan" },
+ { "Agfa", "SnapScan 1236s", "SnapScan" },
+ { "Agfa", "SnapScan 1236u", "SnapScan" },
+ { "Agfa", "SnapScan 300", "SnapScan" },
+ { "Agfa", "SnapScan 310", "SnapScan" },
+ { "Agfa", "SnapScan 600", "SnapScan" },
+ { "Agfa", "SnapScan e20", "SnapScan" },
+ { "Agfa", "SnapScan e25", "SnapScan" },
+ { "Agfa", "SnapScan e40", "SnapScan" },
+ { "Agfa", "SnapScan e50", "SnapScan" },
+ { "Agfa", "SnapScan e60", "SnapScan" },
+ { "Agfa", "StudioScan", "microtek" },
+ { "Agfa", "StudioScan II", "microtek" },
+ { "Agfa", "StudioScan IIsi", "microtek" },
+ { "Apple", "APPLE SCANNER", "apple" },
+ { "Apple", "COLORONESCANNER", "apple" },
+ { "Apple", "ONESCANNER", "apple" },
+ { "Artec", "A6000C", "artec" },
+ { "Artec", "A6000C PLUS", "artec" },
+ { "Artec", "AM12S", "artec" },
+ { "Artec", "AT12", "artec" },
+ { "Artec", "AT3", "artec" },
+ { "Artec", "AT6", "artec" },
+ { "Artec", "ColorOneScanner", "artec" },
+ { "Avision", "AV 620 CS", "avision" },
+ { "Avision", "AV 6240", "avision" },
+ { "Avision", "AV 630 CS", "avision" },
+ { "B&H SCSI", "COPISCAN II 2135", "bh" },
+ { "B&H SCSI", "COPISCAN II 2137", "bh" },
+ { "B&H SCSI", "COPISCAN II 2137A", "bh" },
+ { "B&H SCSI", "COPISCAN II 2138A", "bh" },
+ { "B&H SCSI", "COPISCAN II 3238", "bh" },
+ { "B&H SCSI", "COPISCAN II 3338", "bh" },
+ { "B&H SCSI", "COPISCAN II 6338", "bh" },
+ { "BlackWidow", "BW4800SP", "artec" },
+ { "Canon", "CANOSCAN 2700F", "canon" },
+ { "Canon", "CANOSCAN 300", "canon" },
+ { "Canon", "CANOSCAN 600", "canon" },
+ { "Devcom", "9636PRO", "pie" },
+ { "Devcom", "9636S", "pie" },
+ { "EDGE", "KTX-9600US", "umax" },
+ { "Epson", "ES-8500", "epson" },
+ { "Epson", "EXPRESSION 1600", "epson" },
+ { "Epson", "EXPRESSION 1680", "epson" },
+ { "Epson", "EXPRESSION 636", "epson" },
+ { "Epson", "EXPRESSION 800", "epson" },
+ { "Epson", "FILMSCAN 200", "epson" },
+ { "Epson", "GT-5500", "epson" },
+ { "Epson", "GT-7000", "epson" },
+ { "Epson", "GT-8000", "epson" },
+ { "Epson", "PERFECTION 1200PHOTO", "epson" },
+ { "Epson", "PERFECTION 1200S", "epson" },
+ { "Epson", "PERFECTION 1200U", "epson" },
+ { "Epson", "PERFECTION 1240", "epson" },
+ { "Epson", "PERFECTION 1640", "epson" },
+ { "Epson", "PERFECTION 1650", "epson" },
+ { "Epson", "PERFECTION 610", "epson" },
+ { "Epson", "PERFECTION 636S", "epson" },
+ { "Epson", "PERFECTION 636U", "epson" },
+ { "Epson", "PERFECTION 640", "epson" },
+ { "Epson", "PERFECTION1200", "epson" },
+ { "Epson", "Perfection 600", "umax" },
+ { "Escom", "Image Scanner 256", "umax" },
+ { "Escort", "Galleria 600", "umax" },
+ { "Fujitsu", "M3091DCD", "m3091" },
+ { "Fujitsu", "M3096G", "m3096g" },
+ { "Fujitsu", "SP15C", "sp15c" },
+ { "Genius", "ColorPage-HR5 Pro", "umax" },
+ { "Guillemot", "Maxi Scan A4 Deluxe", "SnapScan" },
+ { "HP", "HP OFFICEJET K SERIES", "hp" },
+ { "HP", "HP OFFICEJET V SERIES", "hp" },
+ { "HP", "HP PHOTOSMART PHOTOSCANNER", "hp" },
+ { "HP", "HP PSC 700 SERIES", "hp" },
+ { "HP", "HP PSC 900 SERIES", "hp" },
+ { "HP", "HP SCANJET 3C", "hp" },
+ { "HP", "HP SCANJET 3P", "hp" },
+ { "HP", "HP SCANJET 4100C", "hp" },
+ { "HP", "HP SCANJET 4C", "hp" },
+ { "HP", "HP SCANJET 4P", "hp" },
+ { "HP", "HP SCANJET 5200C", "hp" },
+ { "HP", "HP SCANJET 6100C", "hp" },
+ { "HP", "HP SCANJET 6200C", "hp" },
+ { "HP", "HP SCANJET 6250C", "hp" },
+ { "HP", "HP SCANJET 6300C", "hp" },
+ { "HP", "HP SCANJET 6350C", "hp" },
+ { "HP", "HP SCANJET 6390C", "hp" },
+ { "HP", "HP SCANJET IIC", "hp" },
+ { "HP", "HP SCANJET IICX", "hp" },
+ { "HP", "HP SCANJET IIP", "hp" },
+ { "HP", "HP ScanJet 5p", "hp" },
+ { "HP", "HP4200", "hp4200" },
+ { "Highscreen", "Scanboostar Premium", "umax" },
+ { "Linotype Hell", "Jade", "umax" },
+ { "Linotype Hell", "Jade2", "umax" },
+ { "Linotype Hell", "Linoscan 1400", "umax" },
+ { "Linotype Hell", "Opal", "umax" },
+ { "Linotype Hell", "Opal Ultra", "umax" },
+ { "Linotype Hell", "Saphir", "umax" },
+ { "Linotype Hell", "Saphir HiRes", "umax" },
+ { "Linotype Hell", "Saphir Ultra", "umax" },
+ { "Linotype Hell", "Saphir Ultra II", "umax" },
+ { "Linotype Hell", "Saphir2", "umax" },
+ { "Microtek", "Phantom 636", "microtek2" },
+ { "Microtek", "ScanMaker 330", "microtek2" },
+ { "Microtek", "ScanMaker 3600", "sm3600" },
+ { "Microtek", "ScanMaker 630", "microtek2" },
+ { "Microtek", "ScanMaker 636", "microtek2" },
+ { "Microtek", "ScanMaker 9600XL", "microtek2" },
+ { "Microtek", "ScanMaker E3plus", "microtek2" },
+ { "Microtek", "ScanMaker V300", "microtek2" },
+ { "Microtek", "ScanMaker V310", "microtek2" },
+ { "Microtek", "ScanMaker V600", "microtek2" },
+ { "Microtek", "ScanMaker V6USL", "microtek2" },
+ { "Microtek", "ScanMaker X6", "microtek2" },
+ { "Microtek", "ScanMaker X6EL", "microtek2" },
+ { "Microtek", "ScanMaker X6USB", "microtek2" },
+ { "Microtek", "Scanmaker 35", "microtek" },
+ { "Microtek", "Scanmaker 35t+", "microtek" },
+ { "Microtek", "Scanmaker 45t", "microtek" },
+ { "Microtek", "Scanmaker 600G", "microtek" },
+ { "Microtek", "Scanmaker 600G S", "microtek" },
+ { "Microtek", "Scanmaker 600GS", "microtek" },
+ { "Microtek", "Scanmaker 600S", "microtek" },
+ { "Microtek", "Scanmaker 600Z", "microtek" },
+ { "Microtek", "Scanmaker 600Z S", "microtek" },
+ { "Microtek", "Scanmaker 600ZS", "microtek" },
+ { "Microtek", "Scanmaker E2", "microtek" },
+ { "Microtek", "Scanmaker E3", "microtek" },
+ { "Microtek", "Scanmaker E6", "microtek" },
+ { "Microtek", "Scanmaker II", "microtek" },
+ { "Microtek", "Scanmaker IIG", "microtek" },
+ { "Microtek", "Scanmaker IIHR", "microtek" },
+ { "Microtek", "Scanmaker III", "microtek" },
+ { "Microtek", "Scanmaker IISP", "microtek" },
+ { "Microtek", "SlimScan C6", "microtek2" },
+ { "Mustek", "1200 CU", "mustek_usb" },
+ { "Mustek", "1200 CU Plus", "mustek_usb" },
+ { "Mustek", "1200 UB", "mustek_usb" },
+ { "Mustek", "600 CU", "mustek_usb" },
+ { "Mustek", "Paragon 1200 A3 Pro", "mustek" },
+ { "Mustek", "Paragon 1200 III SP", "mustek" },
+ { "Mustek", "Paragon 1200 LS", "mustek" },
+ { "Mustek", "Paragon 1200 SP Pro", "mustek" },
+ { "Mustek", "Paragon 600 II CD", "mustek" },
+ { "Mustek", "Paragon 800 II SP", "mustek" },
+ { "Mustek", "Paragon MFC-600S", "mustek" },
+ { "Mustek", "Paragon MFC-800S", "mustek" },
+ { "Mustek", "Paragon MFS-12000CX", "mustek" },
+ { "Mustek", "Paragon MFS-12000SP", "mustek" },
+ { "Mustek", "Paragon MFS-1200SP", "mustek" },
+ { "Mustek", "Paragon MFS-6000CX", "mustek" },
+ { "Mustek", "Paragon MFS-6000SP", "mustek" },
+ { "Mustek", "Paragon MFS-8000SP", "mustek" },
+ { "Mustek", "ScanExpress 12000SP", "mustek" },
+ { "Mustek", "ScanExpress 12000SP Plus", "mustek" },
+ { "Mustek", "ScanExpress 6000SP", "mustek" },
+ { "Mustek", "ScanExpress A3 SP", "mustek" },
+ { "Mustek", "ScanMagic 600 II SP", "mustek" },
+ { "Mustek", "ScanMagic 9636S", "mustek" },
+ { "Mustek", "ScanMagic 9636S Plus", "mustek" },
+ { "NEC", "PC-IN500/4C", "nec" },
+ { "Nikon", "AX-210", "umax" },
+ { "Nikon", "LS-1000", "coolscan" },
+ { "Nikon", "LS-20", "coolscan" },
+ { "Nikon", "LS-2000", "coolscan" },
+ { "Nikon", "LS-30", "coolscan" },
+ { "Pie", "9630S", "pie" },
+ { "Pie", "ScanAce 1230S", "pie" },
+ { "Pie", "ScanAce 1236S", "pie" },
+ { "Pie", "ScanAce 630S", "pie" },
+ { "Pie", "ScanAce 636S", "plustek" },
+ { "Pie", "ScanAce II", "pie" },
+ { "Pie", "ScanAce II Plus", "pie" },
+ { "Pie", "ScanAce III", "pie" },
+ { "Pie", "ScanAce III Plus", "pie" },
+ { "Pie", "ScanAce Plus", "pie" },
+ { "Pie", "ScanAce ScanMedia", "pie" },
+ { "Pie", "ScanAce ScanMedia II", "pie" },
+ { "Pie", "ScanAce V", "pie" },
+ { "Plustek", "OpticPro 19200S", "artec" },
+ { "Polaroid", "DMC", "dmc" },
+ { "Ricoh", "Ricoh IS50", "ricoh" },
+ { "Ricoh", "Ricoh IS60", "ricoh" },
+ { "Scanport", "SQ4836", "microtek2" },
+ { "Sharp", "9036 Flatbed scanner", "sharp" },
+ { "Sharp", "JX-250", "sharp" },
+ { "Sharp", "JX-320", "sharp" },
+ { "Sharp", "JX-330", "sharp" },
+ { "Sharp", "JX-350", "sharp" },
+ { "Sharp", "JX-610", "sharp" },
+ { "Siemens", "9036 Flatbed scanner", "s9036" },
+ { "Siemens", "FOCUS COLOR PLUS", "agfafocus" },
+ { "Siemens", "ST400", "st400" },
+ { "Siemens", "ST800", "st400" },
+ { "Tamarack", "Artiscan 12000C", "tamarack" },
+ { "Tamarack", "Artiscan 6000C", "tamarack" },
+ { "Tamarack", "Artiscan 8000C", "tamarack" },
+ { "Trust", "Compact Scan USB 19200", "mustek_usb" },
+ { "Trust", "Imagery 1200 SP", "mustek" },
+ { "Trust", "Imagery 4800 SP", "mustek" },
+ { "Trust", "SCSI Connect 19200", "mustek" },
+ { "Trust", "SCSI excellence series 19200", "mustek" },
+ { "UMAX", "Astra 1200S", "umax" },
+ { "UMAX", "Astra 1220S", "umax" },
+ { "UMAX", "Astra 2100S", "umax" },
+ { "UMAX", "Astra 2200", "umax" },
+ { "UMAX", "Astra 2200 S", "umax" },
+ { "UMAX", "Astra 2200 U", "umax" },
+ { "UMAX", "Astra 2400S", "umax" },
+ { "UMAX", "Astra 600S", "umax" },
+ { "UMAX", "Astra 610S", "umax" },
+ { "UMAX", "Gemini D-16", "umax" },
+ { "UMAX", "Mirage D-16L", "umax" },
+ { "UMAX", "Mirage II", "umax" },
+ { "UMAX", "Mirage IIse", "umax" },
+ { "UMAX", "PL-II", "umax" },
+ { "UMAX", "PSD", "umax" },
+ { "UMAX", "PowerLook", "umax" },
+ { "UMAX", "PowerLook 2000", "umax" },
+ { "UMAX", "PowerLook 3000", "umax" },
+ { "UMAX", "PowerLook III", "umax" },
+ { "UMAX", "Supervista S-12", "umax" },
+ { "UMAX", "UC 1200S", "umax" },
+ { "UMAX", "UC 1200SE", "umax" },
+ { "UMAX", "UC 1260", "umax" },
+ { "UMAX", "UC 630", "umax" },
+ { "UMAX", "UC 840", "umax" },
+ { "UMAX", "UG 630", "umax" },
+ { "UMAX", "UG 80", "umax" },
+ { "UMAX", "UMAX S-12", "umax" },
+ { "UMAX", "UMAX S-12G", "umax" },
+ { "UMAX", "UMAX S-6E", "umax" },
+ { "UMAX", "UMAX S-6EG", "umax" },
+ { "UMAX", "UMAX VT600", "umax" },
+ { "UMAX", "Vista S6", "umax" },
+ { "UMAX", "Vista S6E", "umax" },
+ { "UMAX", "Vista-S8", "umax" },
+ { "UMAX", "Vista-T630", "umax" },
+ { "Ultima", "A6000C", "artec" },
+ { "Ultima", "A6000C PLUS", "artec" },
+ { "Ultima", "AM12S", "artec" },
+ { "Ultima", "AT12", "artec" },
+ { "Ultima", "AT3", "artec" },
+ { "Ultima", "AT6", "artec" },
+ { "Ultima", "ColorOneScanner", "artec" },
+ { "Vobis", "HighScan", "microtek2" },
+ { "Vobis", "Scanboostar Premium", "umax" },
+ { "Vuego", "Close SnapScan 310 compatible.", "SnapScan" }
+};
+
+static char *scanner_info(hd_t *hd)
+{
+ int i;
+
+ if(!hd->vendor.name || !hd->device.name) return NULL;
+
+ for(i = 0; (unsigned) i < sizeof scanner_data / sizeof *scanner_data; i++) {
+ if(
+ !strcasecmp(scanner_data[i].vendor, hd->vendor.name) &&
+ !strcasecmp(scanner_data[i].model, hd->device.name)
+ ) {
+ return scanner_data[i].driver;
+ }
+ }
+
+ return NULL;
+}
+
+#endif
+
+void do_test(hd_data_t *hd_data)
+{
+#if 0
+ hd_t *hd, *hd0;
+ hd_res_t *res;
+ driver_info_t *di;
+ FILE *f;
+ int i, wheels, buttons;
+ unsigned u;
+ uint64_t ul;
+ char *s, *s1;
+ hd_hw_item_t item, items[] = {
+ hw_display, hw_monitor, hw_tv, hw_sound, hw_mouse, hw_disk, hw_cdrom,
+ hw_floppy, hw_modem, hw_isdn, hw_scanner, hw_camera
+ };
+
+ hd_set_probe_feature(hd_data, pr_default);
+ hd_scan(hd_data);
+
+ f = fopen("/tmp/hw_overview.log", "w");
+
+ for(i = 0; (unsigned) i < sizeof items / sizeof *items; i++) {
+ item = items[i];
+ hd0 = hd_list(hd_data, item, 0, NULL);
+
+ if(!hd0) continue;
+
+ switch(item) {
+ case hw_disk:
+ fprintf(f, "Disk\n");
+ for(hd = hd0; hd; hd = hd->next) {
+ u = 0;
+ for(res = hd->res; res; res = res->next) {
+ if(res->any.type == res_size && res->size.unit == size_unit_sectors) {
+ ul = (uint64_t) res->size.val1 * (res->size.val2 ?: 0x200);
+ u = ((ul >> 29) + 1) >> 1;
+ }
+ }
+ s = hd->bus.name;
+ fprintf(f, " %s", hd->model);
+ if(u) {
+ fprintf(f, " (");
+ if(s) fprintf(f, "%s, ", s);
+ fprintf(f, "%u GB)", u);
+ }
+ fprintf(f, "\n");
+ }
+ fprintf(f, "\n");
+ break;
+
+ case hw_cdrom:
+ fprintf(f, "CD-ROM\n");
+ for(hd = hd0; hd; hd = hd->next) {
+ s = hd->bus.name;
+ fprintf(f, " %s (", hd->model);
+ if(s) fprintf(f, "%s, ", s);
+ fprintf(f, "%s)", hd->prog_if.name ?: "CD-ROM");
+ fprintf(f, "\n");
+ }
+ fprintf(f, "\n");
+ break;
+
+ case hw_monitor:
+ fprintf(f, "Monitor\n");
+ for(hd = hd0; hd; hd = hd->next) {
+ s = hd->model;
+ if(!strcmp(hd->unique_id, "rdCR.EY_qmtb9YY0")) s = "not detected";
+ fprintf(f, " %s\n", s);
+ }
+ fprintf(f, "\n");
+ break;
+
+ case hw_display:
+ fprintf(f, "GFX Card\n");
+ for(hd = hd0; hd; hd = hd->next) {
+ u = 0;
+ s1 = NULL;
+ for(di = hd->driver_info; di; di = di->next) {
+ if(di->any.type == di_x11) {
+ if(!s1) s1 = di->x11.server;
+ if(di->x11.x3d && !u) {
+ s1 = di->x11.server;
+ u = 1;
+ }
+ }
+ }
+ if(!s1) {
+ s1 = "not supported";
+ u = 0;
+ }
+ fprintf(f, " %s (%s", hd->model, s1);
+ if(u) fprintf(f, ", 3D support");
+ fprintf(f, ")");
+ fprintf(f, "\n");
+ }
+ fprintf(f, "\n");
+ break;
+
+ case hw_mouse:
+ fprintf(f, "Mouse\n");
+ for(hd = hd0; hd; hd = hd->next) {
+ buttons = wheels = -1; // make gcc happy
+ s = NULL;
+ for(di = hd->driver_info; di; di = di->next) {
+ if(di->any.type == di_mouse) {
+ buttons = di->mouse.buttons;
+ wheels = di->mouse.wheels;
+ s = di->mouse.xf86;
+ break;
+ }
+ }
+ if(!s) {
+ s = "not supported";
+ buttons = wheels = -1;
+ }
+ fprintf(f, " %s (%s", hd->model, s);
+ if(buttons >= 0) fprintf(f, ", %d buttons", buttons);
+ if(wheels >= 0) fprintf(f, ", %d wheels", wheels);
+ fprintf(f, ")");
+ fprintf(f, "\n");
+ }
+ fprintf(f, "\n");
+ break;
+
+ case hw_tv:
+ fprintf(f, "TV Card\n");
+ for(hd = hd0; hd; hd = hd->next) {
+ s = NULL;
+ for(di = hd->driver_info; di; di = di->next) {
+ if(
+ (di->any.type == di_any || di->any.type == di_module) &&
+ di->any.hddb0 &&
+ di->any.hddb0->str
+ ) {
+ s = di->any.hddb0->str;
+ break;
+ }
+ }
+ if(!s) {
+ s = "not supported";
+ }
+ fprintf(f, " %s (%s)\n", hd->model, s);
+ }
+ fprintf(f, "\n");
+ break;
+
+ case hw_sound:
+ fprintf(f, "Sound Card\n");
+ for(hd = hd0; hd; hd = hd->next) {
+ s = NULL;
+ for(di = hd->driver_info; di; di = di->next) {
+ if(
+ (di->any.type == di_any || di->any.type == di_module) &&
+ di->any.hddb0 &&
+ di->any.hddb0->str
+ ) {
+ s = di->any.hddb0->str;
+ break;
+ }
+ }
+ if(!s) {
+ s = "not supported";
+ }
+ fprintf(f, " %s (%s)\n", hd->model, s);
+ }
+ fprintf(f, "\n");
+ break;
+
+ case hw_camera:
+ fprintf(f, "Digital Camera/WebCam\n");
+ for(hd = hd0; hd; hd = hd->next) {
+ fprintf(f, " %s\n", hd->model);
+ }
+ fprintf(f, "\n");
+ break;
+
+ case hw_floppy:
+ fprintf(f, "Floppy/Zip Drive\n");
+ for(hd = hd0; hd; hd = hd->next) {
+ fprintf(f, " %s\n", hd->model);
+ }
+ fprintf(f, "\n");
+ break;
+
+ case hw_modem:
+ fprintf(f, "Modem\n");
+ for(hd = hd0; hd; hd = hd->next) {
+ fprintf(f, " %s\n", hd->model);
+ }
+ fprintf(f, "\n");
+ break;
+
+ case hw_isdn:
+ fprintf(f, "ISDN\n");
+ for(hd = hd0; hd; hd = hd->next) {
+ fprintf(f, " %s (%ssupported)\n", hd->model, hd->driver_info ? "" : "not ");
+ }
+ fprintf(f, "\n");
+ break;
+
+ case hw_scanner:
+ fprintf(f, "Scanner\n");
+ for(hd = hd0; hd; hd = hd->next) {
+ s = scanner_info(hd);
+ if(!s) s = "not supported";
+ fprintf(f, " %s (%s)\n", hd->model, s);
+ }
+ fprintf(f, "\n");
+ break;
+
+ default:
+ break;
+ }
+
+ hd_free_hd_list(hd0);
+
+ }
+
+ fclose(f);
+
+ f = fopen("/tmp/hw_detail.log", "w");
+
+ if(hd_data->log) {
+ fprintf(f,
+ "============ start detailed hardware log ============\n"
+ );
+ fprintf(f,
+ "============ start debug info ============\n%s=========== end debug info ============\n",
+ hd_data->log
+ );
+ }
+
+ for(hd = hd_data->hd; hd; hd = hd->next) {
+ hd_dump_entry(hd_data, hd, f);
+ }
+
+ fprintf(f,
+ "============ end detailed hardware log ============\n"
+ );
+
+ fclose(f);
+
+ fprintf(stderr, "\n");
+
+#endif
+
+#if 0
+ hd_t *hd;
+ hd_t *hd0 = NULL;
+
+ for(hd = hd_list(hd_data, hw_cdrom, 1, hd0); hd; hd = hd->next) {
+ fprintf(stderr, "cdrom: %s, %s\n", hd->unix_dev_name, hd->model);
+ }
+
+ for(hd = hd_list(hd_data, hw_cdrom, 1, hd0); hd; hd = hd->next) {
+ fprintf(stderr, "cdrom: %s, %s\n", hd->unix_dev_name, hd->model);
+ }
+#endif
+
+#if 0
+ hd_t *hd;
+
+ hd = hd_list(hd_data, hw_disk, 1, NULL);
+ hd_free_hd_list(hd);
+ hd_free_hd_data(hd_data);
+
+ hd = hd_list(hd_data, hw_cdrom, 1, NULL);
+ hd_free_hd_list(hd);
+ hd_free_hd_data(hd_data);
+
+ hd = hd_list(hd_data, hw_storage_ctrl, 1, NULL);
+ hd_free_hd_list(hd);
+ hd_free_hd_data(hd_data);
+
+ hd = hd_list(hd_data, hw_display, 1, NULL);
+ hd_free_hd_list(hd);
+ hd_free_hd_data(hd_data);
+
+#if 0
+ for(hd = hd_data->hd; hd; hd = hd->next) {
+ hd_dump_entry(hd_data, hd, stdout);
+ }
+
+ printf("%s\n", hd_data->log);
+#endif
+
+#endif
+
+#if 0
+ hd_t *hd, *hd0;
+
+ hd0 = hd_list(hd_data, hw_sound, 1, NULL);
+ hd0 = hd_list(hd_data, hw_sound, 1, NULL);
+
+ for(hd = hd0; hd; hd = hd->next) {
+ hd_dump_entry(hd_data, hd, stdout);
+ }
+
+#if 0
+ hd_data->log = free_mem(hd_data->log);
+ dump_hddb_data(hd_data, hd_data->hddb_dev, "hddb_dev, final");
+ if(hd_data->log) printf("%s", hd_data->log);
+#endif
+
+#endif
+
+#if 0
+ hd_t *hd;
+ driver_info_t *di;
+ str_list_t *sl;
+
+ hd = hd_list(hd_data, hw_sys, 1, NULL);
+
+ for(di = hd->driver_info; di; di = di->next) {
+ if(di->any.type == di_module) {
+ for(sl = di->module.names; sl; sl = sl->next) printf("%s\n", sl->str);
+ }
+ }
+
+#endif
+}
+
+
+void help()
+{
+ fprintf(stderr,
+ "Usage: hwinfo [options]\n"
+ "Probe for hardware.\n"
+ " --short just a short listing\n"
+ " --log logfile write info to logfile\n"
+ " --debug level set debuglevel\n"
+ " --version show libhd version\n"
+ " --dump-db n dump hardware data base, 0: external, 1: internal\n"
+ " --hw_item probe for hw_item\n"
+ " hw_item is one of:\n"
+ " all, bios, block, bluetooth, braille, bridge, camera, cdrom, chipcard, cpu,\n"
+ " disk, dsl, dvb, floppy, framebuffer, gfxcard, hub, ide, isapnp, isdn,\n"
+ " joystick, keyboard, memory, modem, monitor, mouse, netcard, network,\n"
+ " partition, pci, pcmcia, pcmcia-ctrl, pppoe, printer, scanner, scsi, smp,\n"
+ " sound, storage-ctrl, sys, tape, tv, usb, usb-ctrl, vbe, wlan, zip\n\n"
+ " Note: debug info is shown only in the log file. (If you specify a\n"
+ " log file the debug level is implicitly set to a reasonable value.)\n"
+ );
+}
+
+
+/*
+ * Parse command line options.
+ */
+int get_probe_flags(int argc, char **argv, hd_data_t *hd_data)
+{
+ int i, j, k;
+ char *s, *t;
+ for(i = 0; i < argc; i++) {
+ s = argv[i];
+
+ if(!strcmp(s, ".")) {
+ return i + 1;
+ }
+
+ t = "debug=";
+ if(!strncmp(s, t, strlen(t))) {
+ hd_data->debug = strtol(s + strlen(t), NULL, 0);
+ continue;
+ }
+
+ t = "list=";
+ if(!strncmp(s, t, strlen(t))) {
+ list = s + strlen(t);
+ continue;
+ }
+
+ t = "list+=";
+ if(!strncmp(s, t, strlen(t))) {
+ list = s + strlen(t);
+ listplus = 1;
+ continue;
+ }
+
+ t = "log=";
+ if(!strncmp(s, t, strlen(t))) {
+ log_file = s + strlen(t);
+ continue;
+ }
+
+ t = "only=";
+ if(!strncmp(s, t, strlen(t))) {
+ add_str_list(&hd_data->only, s + strlen(t));
+ continue;
+ }
+
+ t = "root=";
+ if(!strncmp(s, t, strlen(t))) {
+ opt.root = s + strlen(t);
+ continue;
+ }
+
+ k = 1;
+ if(*s == '+')
+ s++;
+ else if(*s == '-')
+ k = 0, s++;
+
+ if((j = hd_probe_feature_by_name(s))) {
+ if(k)
+ hd_set_probe_feature(hd_data, j);
+ else
+ hd_clear_probe_feature(hd_data, j);
+ continue;
+ }
+
+ fprintf(stderr, "oops: don't know what to do with \"%s\"\n", s);
+ return -1;
+ }
+
+ return argc;
+}
+
+/*
+ * A simple progress function.
+ */
+void progress2(char *pos, char *msg)
+{
+ if(!test) printf("\r%64s\r", "");
+ printf("> %s: %s", pos, msg);
+ if(test) printf("\n");
+ fflush(stdout);
+}
+
+
+#define INSTALL_INF "/etc/install.inf"
+
+int braille_install_info(hd_data_t *hd_data)
+{
+ hd_t *hd;
+ int ok = 0;
+ char *braille = NULL;
+ char *braille_dev = NULL;
+ str_list_t *sl0, *sl;
+ FILE *f;
+
+ hd = hd_list(hd_data, hw_braille, 1, NULL);
+
+ if(hd_data->progress) {
+ printf("\r%64s\r", "");
+ fflush(stdout);
+ }
+
+ for(; hd; hd = hd->next) {
+ if(
+ hd->base_class.id == bc_braille && /* is a braille display */
+ hd->unix_dev_name && /* and has a device name */
+ (braille = hd->device.name)
+ ) {
+ braille_dev = hd->unix_dev_name;
+ ok = 1;
+ break;
+ }
+ }
+
+ if(!ok) return 1;
+
+ printf("found a %s at %s\n", braille, braille_dev);
+
+ sl0 = read_file(INSTALL_INF, 0, 0);
+ f = fopen(INSTALL_INF, "w");
+ if(!f) {
+ perror(INSTALL_INF);
+ return 1;
+ }
+
+ for(sl = sl0; sl; sl = sl->next) {
+ if(
+ strstr(sl->str, "Braille:") != sl->str &&
+ strstr(sl->str, "Brailledevice:") != sl->str
+ ) {
+ fprintf(f, "%s", sl->str);
+ }
+ }
+
+ fprintf(f, "Braille: %s\n", braille);
+ fprintf(f, "Brailledevice: %s\n", braille_dev);
+
+ fclose(f);
+
+ return 0;
+}
+
+
+/*
+ * get VGA parameter from /proc/cmdline
+ */
+int get_fb_mode()
+{
+#ifndef __PPC__
+ FILE *f;
+ char buf[256], *s, *t;
+ int i, fb_mode = 0;
+
+ if((f = fopen("/proc/cmdline", "r"))) {
+ if(fgets(buf, sizeof buf, f)) {
+ t = buf;
+ while((s = strsep(&t, " "))) {
+ if(sscanf(s, "vga=%i", &i) == 1) fb_mode = i;
+ if(strstr(s, "vga=normal") == s) fb_mode = 0;
+ }
+ }
+ fclose(f);
+ }
+
+ return fb_mode > 0x10 ? fb_mode : 0;
+#else /* __PPC__ */
+ /* this is the only valid test for active framebuffer ... */
+ FILE *f = NULL;
+ int fb_mode = 0;
+ if((f = fopen("/dev/fb", "r"))) {
+ fb_mode++;
+ fclose(f);
+ }
+
+ return fb_mode;
+#endif
+}
+
+
+/*
+ * read "x11i=" entry from /proc/cmdline
+ */
+char *get_x11i()
+{
+ FILE *f;
+ char buf[256], *s, *t;
+ static char x11i[64] = { };
+
+ if(*x11i) return x11i;
+
+ if((f = fopen("/proc/cmdline", "r"))) {
+ if(fgets(buf, sizeof buf, f)) {
+ t = buf;
+ while((s = strsep(&t, " "))) {
+ if(sscanf(s, "x11i=%60s", x11i) == 1) break;
+ }
+ }
+ fclose(f);
+ }
+
+ return x11i;
+}
+
+
+/*
+ * Assumes xf86_ver to be either "3" or "4" (or empty).
+ */
+char *get_xserver(hd_data_t *hd_data, char **version, char **busid, driver_info_t **x11_driver)
+{
+ static char display[16];
+ static char xf86_ver[2];
+ static char id[32];
+ char c, *x11i = get_x11i();
+ driver_info_t *di;
+ hd_t *hd;
+
+ *x11_driver = NULL;
+
+ *display = *xf86_ver = *id = c = 0;
+ *version = xf86_ver;
+ *busid = id;
+
+ if(x11i) {
+ if(*x11i == '3' || *x11i == '4') {
+ c = *x11i;
+ }
+ else {
+ if(*x11i >= 'A' && *x11i <= 'Z') {
+ c = '3';
+ }
+ if(*x11i >= 'a' && *x11i <= 'z') {
+ c = '4';
+ }
+ if(c) {
+ strncpy(display, x11i, sizeof display - 1);
+ display[sizeof display - 1] = 0;
+ }
+ }
+ }
+
+ if(c) { xf86_ver[0] = c; xf86_ver[1] = 0; }
+
+ hd = hd_get_device_by_idx(hd_data, hd_display_adapter(hd_data));
+
+ if(hd && hd->bus.id == bus_pci)
+ sprintf(id, "%d:%d:%d", hd->slot >> 8, hd->slot & 0xff, hd->func);
+
+ if(!hd || *display) return display;
+
+ for(di = hd->driver_info; di; di = di->next) {
+ if(di->any.type == di_x11 && di->x11.server && di->x11.xf86_ver && !di->x11.x3d) {
+ if(c == 0 || c == di->x11.xf86_ver[0]) {
+ xf86_ver[0] = di->x11.xf86_ver[0];
+ xf86_ver[1] = 0;
+ strncpy(display, di->x11.server, sizeof display - 1);
+ display[sizeof display - 1] = 0;
+ *x11_driver = di;
+ break;
+ }
+ }
+ }
+
+ if(*display) return display;
+
+ if(c == 0) c = '4'; /* default to XF 4, if nothing else is known */
+
+ xf86_ver[0] = c;
+ xf86_ver[1] = 0;
+ strcpy(display, c == '3' ? "FBDev" : "fbdev");
+
+ return display;
+}
+
+int x11_install_info(hd_data_t *hd_data)
+{
+ hd_t *hd;
+ driver_info_t *di;
+ char *x11i;
+ int fb_mode, kbd_ok = 0;
+ unsigned yast2_color = 0;
+ char *xkbrules = NULL, *xkbmodel = NULL, *xkblayout = NULL;
+ char *xserver, *version, *busid;
+ driver_info_t *x11_driver;
+ str_list_t *sl0, *sl;
+ FILE *f;
+
+ /* get color info */
+ hd_set_probe_feature(hd_data, pr_cpu);
+ hd_set_probe_feature(hd_data, pr_prom);
+ hd_scan(hd_data);
+
+ x11i = get_x11i();
+ fb_mode = get_fb_mode();
+
+ hd_list(hd_data, hw_display, 1, NULL);
+
+ for(hd = hd_list(hd_data, hw_keyboard, 1, NULL); hd; hd = hd->next) {
+ kbd_ok = 1;
+ di = hd->driver_info;
+ if(di && di->any.type == di_kbd) {
+ xkbrules = di->kbd.XkbRules;
+ xkbmodel = di->kbd.XkbModel;
+ xkblayout = di->kbd.XkbLayout;
+ break;
+ }
+ /* don't free di */
+ }
+
+ xserver = get_xserver(hd_data, &version, &busid, &x11_driver);
+
+ switch(hd_mac_color(hd_data)) {
+ case 0x01:
+ yast2_color = 0x5a4add;
+ break;
+ case 0x04:
+ yast2_color = 0x32cd32;
+ break;
+ case 0x05:
+ yast2_color = 0xff7f50;
+ break;
+ case 0x07:
+ yast2_color = 0x000000;
+ break;
+ case 0xff:
+ yast2_color = 0x7f7f7f;
+ break;
+ }
+
+ if(hd_data->progress) {
+ printf("\r%64s\r", "");
+ fflush(stdout);
+ }
+
+ sl0 = read_file(INSTALL_INF, 0, 0);
+ f = fopen(INSTALL_INF, "w");
+ if(!f) {
+ perror(INSTALL_INF);
+ return 1;
+ }
+
+ for(sl = sl0; sl; sl = sl->next) {
+ if(
+ strstr(sl->str, "Framebuffer:") != sl->str &&
+ strstr(sl->str, "XServer:") != sl->str &&
+ strstr(sl->str, "XVersion:") != sl->str &&
+ strstr(sl->str, "XBusID:") != sl->str &&
+ strstr(sl->str, "X11i:") != sl->str &&
+ strstr(sl->str, "Keyboard:") != sl->str &&
+ strstr(sl->str, "XkbRules:") != sl->str &&
+ strstr(sl->str, "XkbModel:") != sl->str &&
+ strstr(sl->str, "XkbLayout:") != sl->str &&
+ strstr(sl->str, "XF86Ext:") != sl->str &&
+ strstr(sl->str, "XF86Raw:") != sl->str
+ ) {
+ fprintf(f, "%s", sl->str);
+ }
+ }
+
+ fprintf(f, "Keyboard: %d\n", kbd_ok);
+ if(fb_mode) fprintf(f, "Framebuffer: 0x%04x\n", fb_mode);
+ if(x11i) fprintf(f, "X11i: %s\n", x11i);
+ if(xserver && *xserver) {
+ fprintf(f, "XServer: %s\n", xserver);
+ if(*version) fprintf(f, "XVersion: %s\n", version);
+ if(*busid) fprintf(f, "XBusID: %s\n", busid);
+ }
+ if(xkbrules && *xkbrules) fprintf(f, "XkbRules: %s\n", xkbrules);
+ if(xkbmodel && *xkbmodel) fprintf(f, "XkbModel: %s\n", xkbmodel);
+ if(xkblayout && *xkblayout) fprintf(f, "XkbLayout: %s\n", xkblayout);
+
+ if(x11_driver) {
+ for(sl = x11_driver->x11.extensions; sl; sl = sl->next) {
+ if(*sl->str) fprintf(f, "XF86Ext: Load\t\t\"%s\"\n", sl->str);
+ }
+ for(sl = x11_driver->x11.options; sl; sl = sl->next) {
+ if(*sl->str) fprintf(f, "XF86Raw: Option\t\"%s\"\n", sl->str);
+ }
+ for(sl = x11_driver->x11.raw; sl; sl = sl->next) {
+ if(*sl->str) fprintf(f, "XF86Raw: %s\n", sl->str);
+ }
+ }
+
+ fclose(f);
+
+ return 0;
+}
+
+
+char *xserver3map[] =
+{
+#ifdef __i386__
+ "VGA16", "xvga16",
+ "RUSH", "xrush",
+#endif
+#if defined(__i386__) || defined(__alpha__) || defined(__ia64__)
+ "SVGA", "xsvga",
+ "3DLABS", "xglint",
+#endif
+#if defined(__i386__) || defined(__alpha__)
+ "MACH64", "xmach64",
+ "P9000", "xp9k",
+ "S3", "xs3",
+#endif
+#ifdef __alpha__
+ "TGA", "xtga",
+#endif
+#ifdef __sparc__
+ "SUNMONO", "xsunmono",
+ "SUN", "xsun",
+ "SUN24", "xsun24",
+#endif
+#if 0
+ "VMWARE", "xvmware",
+#endif
+ 0, 0
+};
+
+
+void dump_packages(hd_data_t *hd_data)
+{
+ str_list_t *sl;
+ int i;
+
+ hd_data->progress = NULL;
+ hd_scan(hd_data);
+
+ sl = get_hddb_packages(hd_data);
+
+ for(i = 0; xserver3map[i]; i += 2) {
+ if (!search_str_list(sl, xserver3map[i + 1]))
+ add_str_list(&sl, new_str(xserver3map[i + 1]));
+ }
+
+ for(; sl; sl = sl->next) {
+ printf("%s\n", sl->str);
+ }
+}
+
+
+struct x11pack {
+ struct x11pack *next;
+ char *pack;
+};
+
+int oem_install_info(hd_data_t *hd_data)
+{
+ hd_t *hd;
+ str_list_t *str;
+ str_list_t *x11packs = 0;
+ str_list_t *sl0, *sl;
+ FILE *f;
+ int pcmcia, i;
+
+ driver_info_x11_t *di, *drvinfo;
+
+ hd_set_probe_feature(hd_data, pr_pci);
+ hd_scan(hd_data);
+ pcmcia = hd_has_pcmcia(hd_data);
+
+ for(hd = hd_list(hd_data, hw_display, 1, NULL); hd; hd = hd->next) {
+ for(str = hd->requires; str; str = str->next) {
+ if(!search_str_list(x11packs, str->str)) {
+ add_str_list(&x11packs, str->str);
+ }
+ }
+ drvinfo = (driver_info_x11_t *) hd->driver_info;
+ for (di = drvinfo; di; di = (driver_info_x11_t *)di->next) {
+ if (di->type != di_x11)
+ continue;
+ if (di->xf86_ver[0] == '3') {
+ char *server = di->server;
+ if (server) {
+ for (i = 0; xserver3map[i]; i += 2)
+ if (!strcmp(xserver3map[i], server))
+ break;
+ if (xserver3map[i])
+ if (!search_str_list(x11packs, xserver3map[i + 1]))
+ add_str_list(&x11packs, xserver3map[i + 1]);
+ }
+ }
+ }
+ }
+
+ if(hd_data->progress) {
+ printf("\r%64s\r", "");
+ fflush(stdout);
+ }
+
+ sl0 = read_file(INSTALL_INF, 0, 0);
+ f = fopen(INSTALL_INF, "w");
+ if(!f) {
+ perror(INSTALL_INF);
+ return 1;
+ }
+ for(sl = sl0; sl; sl = sl->next) {
+ if(
+ strstr(sl->str, "X11Packages:") != sl->str &&
+ strstr(sl->str, "Pcmcia:") != sl->str
+ ) {
+ fprintf(f, "%s", sl->str);
+ }
+ }
+ if (x11packs) {
+ fprintf(f, "X11Packages: ");
+ for (sl = x11packs; sl; sl = sl->next) {
+ if (sl != x11packs)
+ fputc(',', f);
+ fprintf(f, "%s", sl->str);
+ }
+ fputc('\n', f);
+ }
+ if (pcmcia)
+ fprintf(f, "Pcmcia: %d\n", pcmcia);
+ fclose(f);
+ return 0;
+}
+
+
+void dump_db_raw(hd_data_t *hd_data)
+{
+ hd_data->progress = NULL;
+ hd_clear_probe_feature(hd_data, pr_all);
+ hd_scan(hd_data);
+
+ if(opt.db_idx >= sizeof hd_data->hddb2 / sizeof *hd_data->hddb2) return;
+
+ hddb_dump_raw(hd_data->hddb2[opt.db_idx], stdout);
+}
+
+
+void dump_db(hd_data_t *hd_data)
+{
+ hd_data->progress = NULL;
+ hd_clear_probe_feature(hd_data, pr_all);
+ hd_scan(hd_data);
+
+ if(opt.db_idx >= sizeof hd_data->hddb2 / sizeof *hd_data->hddb2) return;
+
+ hddb_dump(hd_data->hddb2[opt.db_idx], stdout);
+}
+
+
+void do_chroot(hd_data_t *hd_data, char *dir)
+{
+ int i;
+
+ i = chroot(dir);
+ ADD2LOG("chroot %s: %s\n", dir, i ? strerror(errno) : "ok");
+
+ if(!i) chdir("/");
+}
+
+
+void ask_db(hd_data_t *hd_data, char *query)
+{
+ hd_t *hd;
+ driver_info_t *di;
+ str_list_t *sl, *query_sl;
+ unsigned tag = 0, u, cnt;
+ char buf[256];
+
+ setenv("hwprobe", "-all", 1);
+ hd_scan(hd_data);
+
+ hd = add_hd_entry(hd_data, __LINE__, 0);
+
+ query_sl = hd_split(' ', query);
+
+ for(sl = query_sl; sl; sl = sl->next) {
+ if(!strcmp(sl->str, "pci")) { tag = TAG_PCI; continue; }
+ if(!strcmp(sl->str, "usb")) { tag = TAG_USB; continue; }
+ if(!strcmp(sl->str, "pnp")) { tag = TAG_EISA; continue; }
+ if(!strcmp(sl->str, "isapnp")) { tag = TAG_EISA; continue; }
+ if(!strcmp(sl->str, "special")) { tag = TAG_SPECIAL; continue; }
+ if(!strcmp(sl->str, "pcmcia")) { tag = TAG_PCMCIA; continue; }
+
+ if(sscanf(sl->str, "class=%i%n", &u, &cnt) >= 1 && !sl->str[cnt]) {
+ hd->base_class.id = u >> 16;
+ hd->sub_class.id = (u >> 8) & 0xff;
+ hd->prog_if.id = u & 0xff;
+ continue;
+ }
+
+ if(sscanf(sl->str, "vendor=%i%n", &u, &cnt) >= 1 && !sl->str[cnt]) {
+ hd->vendor.id = MAKE_ID(tag, u);
+ continue;
+ }
+
+ if(sscanf(sl->str, "vendor=%3s%n", buf, &cnt) >= 1 && !sl->str[cnt]) {
+ u = name2eisa_id(buf);
+ if(u) hd->vendor.id = u;
+ tag = TAG_EISA;
+ continue;
+ }
+
+ if(sscanf(sl->str, "device=%i%n", &u, &cnt) >= 1 && !sl->str[cnt]) {
+ hd->device.id = MAKE_ID(tag, u);
+ continue;
+ }
+
+ if(sscanf(sl->str, "subvendor=%i%n", &u, &cnt) >= 1 && !sl->str[cnt]) {
+ hd->sub_vendor.id = MAKE_ID(tag, u);
+ continue;
+ }
+
+ if(sscanf(sl->str, "subvendor=%3s%n", buf, &cnt) >= 1 && !sl->str[cnt]) {
+ u = name2eisa_id(buf);
+ if(u) hd->sub_vendor.id = u;
+ tag = TAG_EISA;
+ continue;
+ }
+
+ if(sscanf(sl->str, "subdevice=%i%n", &u, &cnt) >= 1 && !sl->str[cnt]) {
+ hd->sub_device.id = MAKE_ID(tag, u);
+ continue;
+ }
+
+ if(sscanf(sl->str, "revision=%i%n", &u, &cnt) >= 1 && !sl->str[cnt]) {
+ hd->revision.id = u;
+ continue;
+ }
+
+ if(sscanf(sl->str, "serial=%255s%n", buf, &cnt) >= 1 && !sl->str[cnt]) {
+ hd->serial = new_str(buf);
+ continue;
+ }
+
+ }
+
+ free_str_list(query_sl);
+
+ hddb_add_info(hd_data, hd);
+
+ for(di = hd->driver_info; di; di = di->next) {
+ if(di->any.type == di_module && di->module.modprobe) {
+ for(sl = di->module.names; sl; sl = sl->next) {
+ printf("%s%c", sl->str, sl->next ? ' ' : '\n');
+ }
+ }
+ }
+}
+
+
+int is_same_block_dev(hd_t *hd1, hd_t *hd2)
+{
+ if(!hd1 || !hd2 || hd1 == hd2) return 0;
+
+ if(
+ hd1->base_class.id != hd2->base_class.id ||
+ hd1->sub_class.id != hd2->sub_class.id
+ ) return 0;
+
+ if(
+ !hd1->model ||
+ !hd2->model ||
+ strcmp(hd1->model, hd2->model)
+ ) return 0;
+
+ if(hd1->revision.name || hd2->revision.name) {
+ if(
+ !hd1->revision.name ||
+ !hd2->revision.name ||
+ strcmp(hd1->revision.name, hd2->revision.name)
+ ) return 0;
+ }
+
+ if(hd1->serial || hd2->serial) {
+ if(
+ !hd1->serial ||
+ !hd2->serial ||
+ strcmp(hd1->serial, hd2->serial)
+ ) return 0;
+ }
+
+ return 1;
+}
+
+
+hd_t *get_same_block_dev(hd_t *hd_list, hd_t *hd, hd_status_value_t status)
+{
+ for(; hd_list; hd_list = hd_list->next) {
+ if(hd_list->status.available != status) continue;
+ if(is_same_block_dev(hd_list, hd)) return hd_list;
+ }
+
+ return NULL;
+}
+
+
+void get_mapping(hd_data_t *hd_data)
+{
+ hd_t *hd_manual, *hd, *hd2;
+ struct {
+ hd_t *hd;
+ unsigned unknown:1;
+ } map[256] = { };
+ unsigned maps = 0, u;
+ int broken, first;
+ hd_hw_item_t hw_items[] = { hw_disk, hw_cdrom, 0 };
+
+ hd_data->progress = NULL;
+
+ hd_data->flags.list_all = 1;
+
+ hd_manual = hd_list2(hd_data, hw_items, 1);
+ for(hd = hd_manual; hd && maps < sizeof map / sizeof *map; hd = hd->next) {
+ if(!hd->unix_dev_name) continue;
+
+ if(hd->status.available == status_yes) {
+ /* check if we already have an active device with the same name */
+ for(broken = u = 0; u < maps; u++) {
+ if(!strcmp(map[u].hd->unix_dev_name, hd->unix_dev_name)) {
+ map[u].unknown = 1;
+ broken = 1;
+ }
+ }
+ if(broken) continue;
+
+ /* ensure we really can tell different devices apart */
+ if(get_same_block_dev(hd_manual, hd, status_yes)) {
+ map[maps].hd = hd;
+ map[maps].unknown = 1;
+ }
+ else {
+ map[maps].hd = hd;
+ }
+ maps++;
+ }
+ }
+
+ /* ok, we have a list of all new devs */
+
+ for(u = 0; u < maps; u++) {
+ if(map[u].unknown) {
+ printf("%s\n", map[u].hd->unix_dev_name);
+ }
+ else {
+ first = 1;
+ for(hd2 = hd_manual; (hd2 = get_same_block_dev(hd2, map[u].hd, status_no)); hd2 = hd2->next) {
+ if(hd2->unix_dev_name && strcmp(map[u].hd->unix_dev_name, hd2->unix_dev_name)) {
+ printf("%s\t%s", first ? map[u].hd->unix_dev_name : "", hd2->unix_dev_name);
+ first = 0;
+ }
+ }
+ if(!first) printf("\n");
+ }
+
+ }
+
+}
+
--- /dev/null
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <getopt.h>
+
+#include "hd.h"
+#include "hd_int.h"
+
+struct option options[] = {
+ { "help", 0, NULL, 'h' },
+ { "verbose", 0, NULL, 'v' },
+ { "version", 0, NULL, 400 },
+ { "show", 1, NULL, 500 },
+ { "list", 0, NULL, 501 },
+ { "cfg", 1, NULL, 502 },
+ { "avail", 1, NULL, 503 },
+ { "need", 1, NULL, 504 },
+ { "new", 0, NULL, 505 },
+ { "fast", 0, NULL, 506 },
+ { "silent", 0, NULL, 507 },
+ { "boot", 0, NULL, 508 },
+ { "active", 1, NULL, 509 },
+ { "only", 1, NULL, 510 },
+ { "sys", 0, NULL, 1000 + hw_sys },
+ { "cpu", 0, NULL, 1000 + hw_cpu },
+ { "keyboard", 0, NULL, 1000 + hw_keyboard },
+ { "braille", 0, NULL, 1000 + hw_braille },
+ { "mouse", 0, NULL, 1000 + hw_mouse },
+ { "joystick", 0, NULL, 1000 + hw_joystick },
+ { "printer", 0, NULL, 1000 + hw_printer },
+ { "scanner", 0, NULL, 1000 + hw_scanner },
+ { "chipcard", 0, NULL, 1000 + hw_chipcard },
+ { "monitor", 0, NULL, 1000 + hw_monitor },
+ { "tv", 0, NULL, 1000 + hw_tv },
+ { "gfxcard", 0, NULL, 1000 + hw_display },
+ { "framebuffer", 0, NULL, 1000 + hw_framebuffer },
+ { "camera", 0, NULL, 1000 + hw_camera },
+ { "sound", 0, NULL, 1000 + hw_sound },
+ { "storage-ctrl", 0, NULL, 1000 + hw_storage_ctrl },
+ { "storage_ctrl", 0, NULL, 1000 + hw_storage_ctrl },
+ { "netcard", 0, NULL, 1000 + hw_network_ctrl },
+ { "network-ctrl", 0, NULL, 1000 + hw_network_ctrl },
+ { "network_ctrl", 0, NULL, 1000 + hw_network_ctrl },
+ { "isdn", 0, NULL, 1000 + hw_isdn },
+ { "modem", 0, NULL, 1000 + hw_modem },
+ { "network", 0, NULL, 1000 + hw_network },
+ { "disk", 0, NULL, 1000 + hw_disk },
+ { "partition", 0, NULL, 1000 + hw_partition },
+ { "cdrom", 0, NULL, 1000 + hw_cdrom },
+ { "floppy", 0, NULL, 1000 + hw_floppy },
+ { "update", 0, NULL, 1000 + hw_manual },
+ { "usb-ctrl", 0, NULL, 1000 + hw_usb_ctrl },
+ { "usb_ctrl", 0, NULL, 1000 + hw_usb_ctrl },
+ { "usb", 0, NULL, 1000 + hw_usb },
+ { "bios", 0, NULL, 1000 + hw_bios },
+ { "pci", 0, NULL, 1000 + hw_pci },
+ { "isapnp", 0, NULL, 1000 + hw_isapnp },
+ { "bridge", 0, NULL, 1000 + hw_bridge },
+ { "hub", 0, NULL, 1000 + hw_hub },
+ { "scsi", 0, NULL, 1000 + hw_scsi },
+ { "ide", 0, NULL, 1000 + hw_ide },
+ { "memory", 0, NULL, 1000 + hw_memory },
+ { "dvb", 0, NULL, 1000 + hw_dvb },
+ { "pcmcia", 0, NULL, 1000 + hw_pcmcia },
+ { "pcmcia_ctrl", 0, NULL, 1000 + hw_pcmcia_ctrl },
+ { "ieee1394", 0, NULL, 1000 + hw_ieee1394 },
+ { "firewire", 0, NULL, 1000 + hw_ieee1394 },
+ { "ieee1394_ctrl", 0, NULL, 1000 + hw_ieee1394_ctrl },
+ { "firewire_ctrl", 0, NULL, 1000 + hw_ieee1394_ctrl },
+ { "hotplug", 0, NULL, 1000 + hw_hotplug },
+ { "hotplug_ctrl", 0, NULL, 1000 + hw_hotplug_ctrl },
+ { "zip", 0, NULL, 1000 + hw_zip },
+ { "pppoe", 0, NULL, 1000 + hw_pppoe },
+ { "dsl", 0, NULL, 1000 + hw_dsl },
+ { "wlan", 0, NULL, 1000 + hw_wlan },
+ { "block", 0, NULL, 1000 + hw_block },
+ { "tape", 0, NULL, 1000 + hw_tape },
+ { "vbe", 0, NULL, 1000 + hw_vbe },
+ { "bluetooth", 0, NULL, 1000 + hw_bluetooth },
+ { "all", 0, NULL, 1000 + hw_all },
+ { }
+};
+
+int verbose = 0;
+hd_hw_item_t scan_item[100] = { };
+unsigned scan_items = 0;
+int found_items = 0;
+
+struct {
+ unsigned show:1;
+ unsigned scan:1;
+ unsigned list:1;
+ unsigned config_cfg:1;
+ unsigned config_avail:1;
+ unsigned config_need:1;
+ unsigned config_active:1;
+ unsigned new:1;
+ unsigned fast:1;
+ unsigned silent:1;
+ unsigned boot:1;
+ str_list_t *only;
+} opt;
+
+void help(void);
+int do_scan(hd_hw_item_t *items);
+int do_show(char *id);
+int do_list(hd_hw_item_t *items);
+int do_config(int type, char *val, char *id);
+int fast_ok(hd_hw_item_t *items);
+int has_item(hd_hw_item_t *items, hd_hw_item_t item);
+int has_hw_class(hd_t *hd, hd_hw_item_t *items);
+
+
+int main(int argc, char **argv)
+{
+ int rc = 0;
+
+#ifndef LIBHD_TINY
+
+ char *id = NULL;
+ char *config_cfg = NULL;
+ char *config_avail = NULL;
+ char *config_need = NULL;
+ char *config_active = NULL;
+ int i;
+ int ok = 0;
+ FILE *f;
+
+ opterr = 0;
+
+ while((i = getopt_long(argc, argv, "hv", options, NULL)) != -1) {
+ switch(i) {
+ case 'v':
+ verbose++;
+ break;
+
+ case 400:
+ printf("%s\n", hd_version());
+ ok = 1;
+ break;
+
+ case 500:
+ opt.show = 1;
+ id = optarg;
+ break;
+
+ case 501:
+ opt.list = 1;
+ break;
+
+ case 502:
+ opt.config_cfg = 1;
+ config_cfg = optarg;
+ break;
+
+ case 503:
+ opt.config_avail = 1;
+ config_avail = optarg;
+ break;
+
+ case 504:
+ opt.config_need = 1;
+ config_need = optarg;
+ break;
+
+ case 505:
+ opt.new = 1;
+ break;
+
+ case 506:
+ opt.fast = 1;
+ break;
+
+ case 507:
+ opt.silent = 1;
+ break;
+
+ case 508:
+ opt.boot = 1;
+ break;
+
+ case 509:
+ opt.config_active = 1;
+ config_active = optarg;
+ break;
+
+ case 510:
+ if(*optarg) add_str_list(&opt.only, optarg);
+ break;
+
+ case 1000 ... 1100:
+ opt.scan = 1;
+ if(scan_items + 1 < sizeof scan_item / sizeof *scan_item) {
+ scan_item[scan_items++] = i - 1000;
+ }
+ break;
+
+ default:
+ help();
+ return 1;
+ }
+ }
+
+ scan_item[scan_items] = 0;
+
+ if(opt.scan && !opt.list) {
+ if(argv[optind] || !scan_items) return help(), 1;
+ rc = do_scan(scan_item);
+ if(found_items) {
+ unlink(HARDWARE_DIR "/.update"); /* the old file */
+ unlink(HARDWARE_UNIQUE_KEYS "/.update"); /* so we trigger a rescan */
+ if((f = fopen(HARDWARE_UNIQUE_KEYS "/.update", "a"))) fclose(f);
+ }
+ ok = 1;
+ }
+
+ if(opt.show) {
+ do_show(id);
+ ok = 1;
+ }
+
+ if(opt.list) {
+ do_list(scan_item);
+ ok = 1;
+ }
+
+ if(opt.config_cfg) {
+ if(!argv[optind]) return help(), 1;
+ do_config(1, config_cfg, argv[optind]);
+ ok = 1;
+ }
+
+ if(opt.config_avail) {
+ if(!argv[optind]) return help(), 1;
+ do_config(2, config_avail, argv[optind]);
+ ok = 1;
+ }
+
+ if(opt.config_need) {
+ if(!argv[optind]) return help(), 1;
+ do_config(3, config_need, argv[optind]);
+ ok = 1;
+ }
+
+ if(opt.config_active) {
+ if(!argv[optind]) return help(), 1;
+ do_config(4, config_active, argv[optind]);
+ ok = 1;
+ }
+
+ if(!ok) help();
+
+#endif /* !defined(LIBHD_TINY) */
+
+ return rc;
+}
+
+void help()
+{
+ fprintf(stderr,
+ "Usage: hwscan [options]\n"
+ "Show information about currently known hardware.\n"
+ " --list show list of known hardware\n"
+ " --version show libhd version\n"
+ " --silent don't show hardware config changes\n"
+ " --boot run only if we haven't been disabled via 'hwprobe=-scan'\n"
+ " --cfg=state id change 'configured' status; id is one of the\n"
+ " ids from 'hwscan --list'\n"
+ " state is one of new, no, yes\n"
+ " --avail=state id change 'available' status\n"
+ " --need=state id change 'needed' status\n"
+ " --active=state id change 'active' status\n"
+ " --hw_item probe for hw_item and update status info\n"
+ " hw_item is one of:\n"
+ " all, bios, block, bluetooth, braille, bridge, camera, cdrom, chipcard, cpu,\n"
+ " disk, dsl, dvb, floppy, framebuffer, gfxcard, hub, ide, isapnp, isdn,\n"
+ " joystick, keyboard, memory, modem, monitor, mouse, netcard, network,\n"
+ " partition, pci, pcmcia, pcmcia-ctrl, pppoe, printer, scanner, scsi, smp,\n"
+ " sound, storage-ctrl, sys, tape, tv, usb, usb-ctrl, vbe, wlan, zip\n"
+ );
+}
+
+#ifndef LIBHD_TINY
+
+int do_scan(hd_hw_item_t *items)
+{
+ int run_config = 0;
+ hd_status_t status = { };
+ hd_data_t *hd_data;
+ hd_t *hd, *hd1;
+ int err = 0;
+
+ if(opt.fast) opt.fast = fast_ok(items);
+
+ hd_data = calloc(1, sizeof *hd_data);
+
+ if(opt.boot) {
+ /* look if we have been disabled */
+ hd_clear_probe_feature(hd_data, pr_all);
+ hd_scan(hd_data);
+ hd_set_probe_feature(hd_data, pr_scan);
+ if(!hd_probe_feature(hd_data, pr_scan)) {
+ hd_free_hd_data(hd_data);
+ free(hd_data);
+ return 0;
+ }
+ }
+
+ hd_data->only = opt.only;
+ opt.only = NULL;
+
+ hd_data->flags.list_all = 1;
+ hd_data->flags.fast = opt.fast;
+
+ hd = hd_list2(hd_data, items, 1);
+
+ if(hd) found_items = 1;
+
+ for(hd1 = hd; hd1; hd1 = hd1->next) {
+ err = hd_write_config(hd_data, hd1);
+ if(verbose >= 2) {
+ printf(
+ "write=%d %s: (cfg=%s, avail=%s, need=%s, active=%s",
+ err,
+ hd1->unique_id,
+ hd_status_value_name(hd1->status.configured),
+ hd_status_value_name(hd1->status.available),
+ hd_status_value_name(hd1->status.needed),
+ hd_status_value_name(hd1->status.active)
+ );
+ if(hd1->unix_dev_name) {
+ printf(", dev=%s", hd1->unix_dev_name);
+ }
+ printf(
+ ") %s\n",
+ hd1->model
+ );
+
+ }
+ if(err) break;
+ }
+
+ if(err) {
+ fprintf(stderr,
+ "Error writing configuration for %s (%s)\n",
+ hd1->unique_id,
+ hd1->model
+ );
+ exit(1);
+ }
+
+ hd = hd_free_hd_list(hd);
+
+ if(opt.new) {
+ status.configured = status_new;
+ }
+ else {
+ status.reconfig = status_yes;
+ }
+
+ hd = hd_list_with_status2(hd_data, items, status);
+ if(hd) run_config = 1;
+
+ if(verbose) {
+ for(hd1 = hd; hd1; hd1 = hd1->next) {
+ printf(
+ "%s: (cfg=%s, avail=%s, need=%s, active=%s",
+ hd1->unique_id,
+ hd_status_value_name(hd1->status.configured),
+ hd_status_value_name(hd1->status.available),
+ hd_status_value_name(hd1->status.needed),
+ hd_status_value_name(hd1->status.active)
+ );
+ if(hd1->unix_dev_name) {
+ printf(", dev=%s", hd1->unix_dev_name);
+ }
+ printf(
+ ") %s\n",
+ hd1->model
+ );
+ }
+ }
+ else if(!opt.silent) {
+ for(hd1 = hd; hd1; hd1 = hd1->next) printf("%s\n", hd1->unique_id);
+ }
+
+ hd = hd_free_hd_list(hd);
+
+ hd_free_hd_data(hd_data);
+ free(hd_data);
+
+ return run_config ^ 1;
+}
+
+
+int do_show(char *id)
+{
+ hd_data_t *hd_data;
+ hd_t *hd;
+
+ hd_data = calloc(1, sizeof *hd_data);
+
+ if ( id[0] == '/' ){
+ int nr=0;
+ char *_id = 0;
+ hd_t *hd_manual;
+
+ hd_manual = hd_list(hd_data, hw_manual, 1, NULL);
+ for(hd = hd_manual; hd; hd = hd->next) {
+ if(hd->status.available != status_yes) continue;
+ if(!search_str_list(hd->unix_dev_names, id)) continue;
+ _id = hd->unique_id;
+ nr++;
+ }
+
+ if ( nr == 1 ) /* > 1 means our database is not okay */
+ hd = hd_read_config(hd_data, _id);
+ }else
+ hd = hd_read_config(hd_data, id);
+
+ if(hd) {
+ hd_data->debug = -1;
+ hd_dump_entry(hd_data, hd, stdout);
+ hd = hd_free_hd_list(hd);
+ }
+ else {
+ printf("no such hardware item: %s\n", id);
+ }
+
+ hd_free_hd_data(hd_data);
+ free(hd_data);
+
+ return 0;
+}
+
+
+int do_list(hd_hw_item_t *items)
+{
+ hd_data_t *hd_data;
+ hd_t *hd, *hd_manual;
+ char *s;
+ char status[64];
+ int i;
+
+ hd_data = calloc(1, sizeof *hd_data);
+
+ hd_manual = hd_list(hd_data, hw_manual, 1, NULL);
+
+ for(hd = hd_manual; hd; hd = hd->next) {
+ if(opt.scan && ! has_hw_class(hd, items)) continue;
+
+ strcpy(status, "(");
+
+ i = 0;
+ if(hd->status.configured && (s = hd_status_value_name(hd->status.configured))) {
+ sprintf(status + strlen(status), "%scfg=%s", i ? ", " : "", s);
+ i++;
+ }
+
+ if(hd->status.available && (s = hd_status_value_name(hd->status.available))) {
+ sprintf(status + strlen(status), "%savail=%s", i ? ", " : "", s);
+ i++;
+ }
+
+ if(hd->status.needed && (s = hd_status_value_name(hd->status.needed))) {
+ sprintf(status + strlen(status), "%sneed=%s", i ? ", " : "", s);
+ i++;
+ }
+
+ if(hd->status.active && (s = hd_status_value_name(hd->status.active))) {
+ sprintf(status + strlen(status), "%sactive=%s", i ? ", " : "", s);
+ i++;
+ }
+
+ strcat(status, ")");
+
+ s = hd_hw_item_name(hd->hw_class);
+ if(!s) s = "???";
+
+ printf("%s: %-32s %-16s %s\n", hd->unique_id, status, s, hd->model);
+ if(hd->config_string) {
+ printf(" configured as: \"%s\"\n", hd->config_string);
+ }
+ }
+
+ hd_free_hd_list(hd_manual);
+
+ hd_free_hd_data(hd_data);
+ free(hd_data);
+
+ return 0;
+}
+
+
+int do_config(int type, char *val, char *id)
+{
+ hd_data_t *hd_data;
+ hd_t *hd;
+ hd_status_value_t status = 0;
+ int i;
+ char *s;
+
+ hd_data = calloc(1, sizeof *hd_data);
+
+ if ( id[0] == '/' ){
+ int nr=0;
+ char *_id = 0;
+ hd_t *hd_manual;
+
+ hd_manual = hd_list(hd_data, hw_manual, 1, NULL);
+ for(hd = hd_manual; hd; hd = hd->next) {
+ if(hd->status.available != status_yes) continue;
+ if(!search_str_list(hd->unix_dev_names, id)) continue;
+ _id = hd->unique_id;
+ nr++;
+ }
+ if ( nr == 1 )
+ hd = hd_read_config(hd_data, _id);
+ }else
+ hd = hd_read_config(hd_data, id);
+
+ if(hd) {
+ for(i = 1; i < 8; i++) {
+ s = hd_status_value_name(i);
+ if(s && !strcmp(val, s)) {
+ status = i;
+ break;
+ }
+ }
+ if(!status) {
+ printf("invalid status: %s\n", val);
+ }
+ else {
+ switch(type) {
+ case 1:
+ hd->status.configured = status;
+ break;
+
+ case 2:
+ hd->status.available = status;
+ break;
+
+ case 3:
+ hd->status.needed = status;
+ break;
+
+ case 4:
+ hd->status.active = status;
+ break;
+ }
+ hd_write_config(hd_data, hd);
+ }
+ hd = hd_free_hd_list(hd);
+ }
+ else {
+ printf("no such hardware item: %s\n", id);
+ }
+
+ hd_free_hd_data(hd_data);
+ free(hd_data);
+
+ return 0;
+}
+
+
+/*
+ * Check whether a 'fast' scan would suffice to re-check the presence
+ * of all known hardware.
+ */
+int fast_ok(hd_hw_item_t *items)
+{
+ hd_data_t *hd_data;
+ hd_t *hd, *hd1;
+ int ok = 1;
+
+ if(!has_item(items, hw_mouse) && !has_item(items, hw_storage_ctrl)) {
+ return 1;
+ }
+
+ hd_data = calloc(1, sizeof *hd_data);
+
+ hd_data->flags.list_all = 1;
+
+ hd = hd_list(hd_data, hw_manual, 1, NULL);
+
+ for(hd1 = hd; hd1; hd1 = hd1->next) {
+ /* serial mice */
+ if(hd1->hw_class == hw_mouse && hd1->bus.id == bus_serial) {
+ ok = 0;
+ break;
+ }
+ /* parallel zip */
+ if(hd1->hw_class == hw_storage_ctrl && hd1->bus.id == bus_parallel) {
+ ok = 0;
+ break;
+ }
+ }
+
+ hd_free_hd_data(hd_data);
+ free(hd_data);
+
+ return ok;
+}
+
+
+/* check if item is in items */
+int has_item(hd_hw_item_t *items, hd_hw_item_t item)
+{
+ while(*items) if(*items++ == item) return 1;
+
+ return 0;
+}
+
+
+/* check if one of items is in hw_class */
+int has_hw_class(hd_t *hd, hd_hw_item_t *items)
+{
+ while(*items) if(hd_is_hw_class(hd, *items++)) return 1;
+
+ return 0;
+}
+
+
+#endif /* !defined(LIBHD_TINY) */
--- /dev/null
+
+/* hwscan front end
+ Copyright 2004 by SUSE (<adrian@suse.de>) */
+
+#include <sys/types.h>
+#include <sys/ipc.h>
+#include <sys/msg.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <time.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+
+#include "init_message.h"
+
+#define TIMEOUT 2
+#define LONG_TIMEOUT 0
+#define BUFFERS 1024
+
+int main( int argc, char **argv )
+{
+ int ret, i;
+ key_t key = KEY;
+ int msgid;
+ int mode = 0;
+ int dev_nr = 0;
+ int lines = 0;
+ int block, usb, firewire, pci;
+ int dev_last_state[BUFFERS];
+ int dev_counter[BUFFERS];
+ char * command_device[NR_COMMANDS][BUFFERS];
+ time_t command_device_last[NR_COMMANDS][BUFFERS];
+ time_t last;
+ char **commands;
+ char **devices;
+ char buffer[32];
+ message m;
+
+ // are we running already, maybe ?
+ {
+ do {
+ ssize_t r;
+ char b[1024];
+ char link[1024];
+ int fd = open( PID_FILE, O_RDONLY );
+ if ( fd >= 0 && (r=read(fd,b,1023)) > 0 ){
+ close(fd);
+ b[r]='\0';
+ snprintf(link, 1023, "/proc/%s/exe", b);
+ if ( (r=readlink( link, b, 1023 )) > 0 ){
+ b[r]='\0';
+ if ( r<8 )
+ unlink(PID_FILE);
+ else if ( strcmp("/hwscand", b+strlen(b)-8) )
+ unlink(PID_FILE);
+ else
+ exit(1);
+ }else
+ unlink(PID_FILE);
+ }else if ( fd >= 0 )
+ unlink(PID_FILE);
+ } while ( 0 > (ret = open( PID_FILE, O_WRONLY|O_CREAT|O_EXCL, S_IRUSR|S_IWUSR ) ) );
+ sprintf(buffer, "%d", getpid());
+ if ( ret < 0 || write(ret,buffer,strlen(buffer)) <= 0 ){
+ perror("hwscand: unable to write pid file "PID_FILE);
+ exit(1);
+ }
+ close(ret);
+ }
+
+ // initialize ...
+ for ( i=0; i<NR_COMMANDS; i++ ){
+ command_device[i][0] = 0;
+ command_device_last[i][0] = 1;
+ }
+
+ last=block=usb=firewire=pci=0;
+ commands = (char**) malloc( BUFFERS * sizeof(char*) );
+ devices = (char**) malloc( BUFFERS * sizeof(char*) );
+
+ msgid = msgget(key, IPC_CREAT | 0600);
+ if (msgid < 0) {
+ perror("msgget");
+ exit(1);
+ }
+
+ while (1) {
+ if ( last || dev_nr )
+ mode = IPC_NOWAIT;
+ else
+ mode = 0;
+
+ if( msgrcv(msgid, &m, MESSAGE_BUFFER, 1, mode) >= 0 ){
+ char *p = m.mtext;
+
+ if ( p == 0 ){
+ fprintf( stderr, "hwscand: error, zero sized message\n" );
+ }else{
+ if ( p[0] == 'S' && strlen(p) > 1 ){
+ // scan calls
+ char z[2];
+ int c;
+ z[0] = *(p+1);
+ z[1] = '\0';
+ c = atoi(z);
+ if ( c < NR_COMMANDS ){
+ if ( ! command_with_device[c] ){
+ last = time(0L);
+ if ( LONG_TIMEOUT+command_device_last[c][0] < time(0L) )
+ command_device_last[c][0] = 0;
+ }else
+ for ( i=0; i<BUFFERS; i++ ){
+ if ( !command_device[c][i] ){
+ last = time(0L);
+ command_device[c][i] = strdup(p+2);
+ command_device[c][i+1] = 0;
+ command_device_last[c][i] = 0;
+ break;
+ }else if ( !strcmp(command_device[c][i], p+2) ){
+ last = time(0L);
+ if ( LONG_TIMEOUT+command_device_last[c][i] < time(0L) )
+ command_device_last[c][i] = 0;
+ break;
+ }
+ }
+ }
+ }
+ if ( p[0] == 'C' && lines < BUFFERS ){
+ last = time(0L);
+ // config calls
+ commands[lines] = strdup(p+1);
+ lines++;
+ }
+ if ( p[0] == 'A' && dev_nr < BUFFERS ){
+ // add scan devices
+ devices[dev_nr] = strdup(p+1);
+ dev_last_state[dev_nr] = 0;
+ dev_counter[dev_nr] = 0;
+ dev_nr++;
+ }
+ if ( p[0] == 'R' && dev_nr < BUFFERS ){
+ for ( i=0; i<dev_nr; i++ ){
+ if ( !strcmp(p+1, devices[i]) ){
+ int j;
+ free(devices[i]);
+ for ( j=i; j+1<dev_nr; j++ ){
+ devices[j] = devices[j+1];
+ dev_last_state[j] = dev_last_state[j+1];
+ dev_counter[j] = dev_counter[j+1];
+ }
+ dev_nr--;
+ }
+ }
+ }
+ }
+#if DEBUG
+ printf("CALL RECEIVED %s\n", p);
+#endif
+ }else{
+ // we do this only in scanning mode ...
+
+ sleep(1);
+ for ( i=0; i<dev_nr; i++ ){
+ if (dev_counter[i]<0) continue;
+ dev_counter[i]++;
+ if ( dev_counter[i] > 5 ){
+ int fd;
+ char buf[MESSAGE_BUFFER];
+ dev_counter[i] = 0;
+ fd = open( devices[i], O_RDONLY );
+ strcpy( buf, "/sbin/hwscan --fast --partition --only=");
+ strcat( buf, devices[i] );
+ if ( fd < 0 ){
+ if ( dev_last_state[i] )
+ system(buf);
+ dev_last_state[i] = 0;
+ }else{
+ if ( dev_last_state[i] == 0)
+ system(buf);
+ dev_last_state[i] = 1;
+ close(fd);
+ }
+ }
+ }
+ }
+
+ if ( last && (last+TIMEOUT <= time(0L)) ){
+ char buf[MESSAGE_BUFFER * NR_COMMANDS];
+ int run_really = 0;
+
+ last=0;
+ strcpy( buf, "/sbin/hwscan --fast --boot --silent" );
+ for ( i=0; i<NR_COMMANDS; i++ ){
+ if ( command_with_device[i] == 0 &&
+ command_device_last[i][0] == 0 ){
+ command_device_last[i][0] = time(0L);
+ strcat( buf, " --");
+ strcat( buf, command_args[i] );
+ run_really = 1;
+ } else {
+ int j;
+ int commappended = 0;
+
+ for ( j=0; j<BUFFERS; j++ ){
+ if ( !command_device[i][j] )
+ break;
+ if ( command_device_last[i][j] == 0 ){
+ if (!commappended) {
+ strcat( buf, " --");
+ strcat( buf, command_args[i] );
+ commappended = 1;
+ }
+ strcat( buf, " --only=" );
+ strcat( buf, command_device[i][j] );
+ command_device_last[i][j] = time(0L);
+ run_really = 1;
+ if (strlen(buf) > sizeof(buf) - MESSAGE_BUFFER)
+ break;
+ }
+ }
+ }
+ if (strlen(buf) > sizeof(buf) - MESSAGE_BUFFER) {
+ last = time(0L); /* call me again */
+ break;
+ }
+ }
+
+ if ( run_really ){
+#if DEBUG
+ printf("RUN %s\n", buf);
+#endif
+ system(buf);
+#if DEBUG
+ printf("RUN quit %s\n", buf);
+#endif
+ }
+ if ( lines ){
+ for (i=0; i<lines; i++){
+#if DEBUG
+ printf("CALL DIRECT %s\n", commands[i]);
+#endif
+ system(commands[i]);
+#if DEBUG
+ printf("CALL quit %s\n", commands[i]);
+#endif
+ free(commands[i]);
+ }
+ lines=0;
+ }
+ }
+ }
+
+ return 0;
+}
--- /dev/null
+
+/* hwscan front end
+ Copyright 2004 by SUSE (<adrian@suse.de>) */
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/ipc.h>
+#include <sys/msg.h>
+#include <signal.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+
+#include "init_message.h"
+
+int main( int argc, char **argv )
+{
+ int ret;
+ unsigned short i;
+ key_t key = KEY;
+ int msgid;
+ message m;
+ char *device = argv[2];
+
+ if ( argc < 2 ){
+ fprintf( stderr, "help: hwscanqueue hwscan-commands\n" );
+ fprintf( stderr, "help: commands:\n" );
+ for ( i=0; i<NR_COMMANDS; i++ ){
+ fprintf( stderr, " --%s", command_args[i] );
+ if ( command_with_device[i] )
+ fprintf( stderr, " device" );
+ fprintf( stderr, "\n");
+ }
+ fprintf( stderr, " --avail=yes/no id\n" );
+ fprintf( stderr, " --scan=device\n" );
+ fprintf( stderr, " --stop=device\n" );
+ exit(1);
+ }
+
+ if ( !strncmp("--cfg=", argv[1], 6) && argc>2 )
+ snprintf( m.mtext, MESSAGE_BUFFER, "C/sbin/hwscan %s %s", argv[1], argv[2] );
+ else if ( !strncmp("--avail=", argv[1], 8) && argc>2 )
+ snprintf( m.mtext, MESSAGE_BUFFER, "C/sbin/hwscan %s %s", argv[1], argv[2] );
+ else if ( !strncmp("--scan=", argv[1], 7) )
+ snprintf( m.mtext, MESSAGE_BUFFER, "A%s", argv[1]+7 );
+ else if ( !strncmp("--stop=", argv[1], 7) )
+ snprintf( m.mtext, MESSAGE_BUFFER, "R%s", argv[1]+7 );
+ else if ( !strncmp("--", argv[1], 2) ){
+ for ( i=0; i<NR_COMMANDS; i++ ){
+ if ( !strcmp(argv[1]+2,command_args[i]) ){
+#if DEBUG
+ printf("COMMAND %s\n", command_args[i] );
+#endif
+ snprintf( m.mtext, MESSAGE_BUFFER, "S%d", i );
+ if (command_with_device[i]){
+ if ( !device ){
+ fprintf(stderr, "need a device for this command\n");
+ exit(1);
+ }
+ strncat( m.mtext, device, MESSAGE_BUFFER-3 );
+ }
+ break;
+ }
+ }
+ if ( i>=NR_COMMANDS ){
+ fprintf(stderr, "unknown command\n");
+ exit(1);
+ }
+ }else
+ exit(1);
+
+ if ( (msgid = msgget(key, IPC_CREAT | 0600)) < 0 ){
+ perror("unable to init.");
+ exit(1);
+ }
+ m.mtype = 1;
+ ret = msgsnd( msgid, &m, MESSAGE_BUFFER, IPC_NOWAIT);
+#if DEBUG
+ printf("SEND %s, return %d\n", m.mtext, ret );
+#endif
+
+ if ( ret < 0 )
+ perror("message send failed");
+ else{
+ // success ... start hwscand, if it is not yet running
+ ssize_t r;
+ char buffer[1024];
+ char link[1024];
+ int fd = open( PID_FILE, O_RDONLY );
+ if ( fd >= 0 && (r=read(fd,buffer,1023)) > 0 ){
+ close(fd);
+ buffer[r]='\0';
+ snprintf(link, 1023, "/proc/%s/exe", buffer);
+ if ( (r=readlink( link, buffer, 1023 )) > 0 ){
+ buffer[r]='\0';
+ if ( r<8 )
+ fd=-1;
+ else if ( strcmp("/hwscand", buffer+strlen(buffer)-8) )
+ fd=-1;
+ }else
+ fd=-1;
+ }else
+ fd=-1;
+
+ if ( fd < 0 ){
+ pid_t pid;
+ signal(SIGCHLD,SIG_IGN);
+ pid=fork();
+ if (pid==0){
+ /* Change directory to allow clean shut-down */
+ chdir("/");
+ /* Close std fds */
+ close(0);
+ close(1);
+ close(2);
+ /* Start hwscand */
+ execve("/sbin/hwscand", 0, 0);
+ }
+ }
+ }
+
+ exit(ret);
+}
+
--- /dev/null
+#define MESSAGE_BUFFER 1024
+#define KEY 8024;
+#define PID_FILE "/var/run/hwscand.pid"
+
+// WARNING NEEDS TO BE <= 9
+#define NR_COMMANDS 7
+// WARNING NEEDS TO BE <= 9
+static const char *command_args[] = { "block", "partition", "usb", "firewire", "pci", "pcmcia", "bluetooth" };
+static const int command_with_device[] = { 1, 1, 0, 0, 0, 0, 0 };
+
+typedef struct msgbuf {
+ long mtype;
+ char mtext[MESSAGE_BUFFER+1];
+} message;
+
+#define DEBUG 0
+
--- /dev/null
+#! /usr/bin/perl
+
+sub addr2line;
+
+$list = shift;
+$bin = shift;
+$ofs = shift;
+
+die "usage: mci data_file binary\n" unless -f($list);
+
+open F, $list;
+
+while(<F>) {
+ if(/^;\s*(.+?)\s*$/) {
+ @i = split ' ', $1;
+ $i[0] = sprintf "%-24s", $i[0];
+ $i[1] = addr2line $i[1];
+ print "; ", join("\t", @i), "\n";
+ next
+ }
+ @i = split;
+
+ die "oops, format error" if @i > 3;
+
+ if(@i == 1) {
+ if($i[0] =~ /^>(\S+)/) {
+ unshift @funcs, $1;
+ }
+ elsif($i[0] =~ /<(\S+)/) {
+ if($funcs[0] eq $1) {
+ shift @funcs
+ }
+ else {
+ die "oops, strange data (line $.)\n"
+ }
+ }
+ else {
+ die "oops, format error"
+ }
+ }
+ else {
+ $func = $i[0];
+ $addr = $i[1];
+ $size = undef;
+ $size = @i == 2 ? undef : $i[2];
+
+ if(defined $size) {
+ if(exists $mem{$addr}) {
+ $x = addr2line $func;
+ $y = addr2line ${$mem{$addr}}[1];
+ print "malloc oops (line $.): mem $addr; old: $y, size ${$mem{$addr}}[0]; new: $x, size $size\n";
+ }
+ $mem{$addr} = [ $size, $func, @funcs ];
+ delete $lfree{$addr};
+ }
+ else {
+ if(!exists $mem{$addr}) {
+ $xx = "";
+ $first = 1;
+ for $f ($func, @funcs) {
+ $xx .= "<-" unless $first;
+ $first = 0;
+ $xx .= addr2line $f;
+ }
+ print "free oops (line $.): $addr ($xx) [last free: line $lfree{$addr}]\n";
+ }
+ delete $mem{$addr};
+ $lfree{$addr} .= " $.";
+ }
+ }
+}
+
+for (sort keys %mem) {
+ $total += oct(${$mem{$_}}[0]);
+ $cnt++;
+
+# $x = `addr2line -s -e $bin ${$mem{$_}}[1]`;
+# chomp $x;
+# $x = $x =~ /\?{2}/ ? undef : "$x ";
+ $x = addr2line ${$mem{$_}}[1];
+
+ print "$_\t${$mem{$_}}[0]\t";
+ $first = 1;
+ for $f (@{$mem{$_}}[1..$#{$mem{$_}}]) {
+ print "<-" unless $first;
+ $first = 0;
+ print addr2line $f;
+ }
+ print "\n"
+}
+
+printf "total: %u bytes in %u blocks\n", $total, $cnt;
+
+
+sub addr2line
+{
+ my ($x, $y);
+
+ return $_[0] unless $bin;
+
+ $y = sprintf "0x%x", oct($_[0]) + $ofs;
+
+ return $addr_cache{$y} if exists $addr_cache{$y};
+
+ $x = `addr2line -s -e $bin $y`;
+ chomp $x;
+ $x = $x =~ /\?{2}/ ? $_[0] : $x;
+
+ $addr_cache{$y} = $x;
+
+ return $x;
+}
+
--- /dev/null
+TOPDIR = ..
+SUBDIRS = hd isdn ids
+TARGETS = touch $(LIBHD) $(LIBHD_SO)
+CLEANFILES = $(LIBHD) $(LIBHD_D) $(LIBHD_SO) *.so *.so.* *.a
+
+.PHONY: touch
+
+include $(TOPDIR)/Makefile.common
+
+ifneq "$(findstring $(ARCH), i386 x86_64 ia64)" ""
+ifneq ($(LIBHD_BASE), libhd_tiny)
+SUBDIRS += x86emu int10
+endif
+endif
+
+#ifeq "$(findstring $(ARCH), i386 alpha)" ""
+#SUBDIRS := $(filter-out pnpdump, $(SUBDIRS))
+#endif
+
+$(LIBHD): $(OBJS)
+ ar r $@ $?
+ @rm -f $(LIBHD_D)
+
+ifdef SHARED_FLAGS
+$(LIBHD_SO): $(LIBHD)
+ $(CC) -shared $(SO_LIBS) -Wl,--whole-archive $(LIBHD) -Wl,--no-whole-archive \
+ -Wl,-soname=$(LIBHD_SONAME) \
+ -o $(LIBHD_SO)
+ ln -snf $(LIBHD_NAME) $(LIBHD_SONAME)
+ ln -snf $(LIBHD_SONAME) $(LIBHD_BASE).so
+else
+$(LIBHD_SO):
+endif
+
+subdirs: touch
+
+touch:
+ @touch -r $(LIBHD) $(LIBHD_D) 2>/dev/null || true
--- /dev/null
+TOPDIR = ../..
+TARGETS = $(LIBHD_D)
+CLEANFILES = version.h
+
+include $(TOPDIR)/Makefile.common
+
+version.h: $(TOPDIR)/VERSION
+ @echo "#define HD_VERSION_STRING \"`cat $(TOPDIR)/VERSION`\"" >$@
+
+hd.h: $(TOPDIR)/VERSION
+ @perl -pi -e "s/define\s+HD_VERSION\s+\d+/define HD_VERSION\t$(LIBHD_MAJOR_VERSION)/" $@
+
+$(LIBHD_D): $(OBJS)
+ ar r $(LIBHD) $?
--- /dev/null
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <termios.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <sys/time.h>
+#include <sys/ioctl.h>
+
+#include "hd.h"
+#include "hd_int.h"
+#include "adb.h"
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ * adb info
+ *
+ * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ */
+
+#ifdef __PPC__
+
+void hd_scan_adb(hd_data_t *hd_data)
+{
+ int i;
+ unsigned u, adr = 0;
+ hd_t *hd;
+ str_list_t *sl;
+
+ if(!hd_probe_feature(hd_data, pr_adb)) return;
+
+ hd_data->module = mod_adb;
+
+ /* some clean-up */
+ remove_hd_entries(hd_data);
+
+ PROGRESS(1, 0, "get info");
+
+ for(sl = hd_data->klog; sl; sl = sl->next) {
+ if(sscanf(sl->str, "<4>ADB mouse at %u, %*[a-z ] %i", &u, &i) == 2 && u < 32) {
+ /* u: max 15 actually, but who cares... */
+ if(!(adr & (1 << u))) {
+ adr |= 1 << u;
+ hd = add_hd_entry(hd_data, __LINE__, 0);
+ hd->base_class.id = bc_mouse;
+ hd->sub_class.id = sc_mou_bus;
+ hd->bus.id = bus_adb;
+ hd->slot = u;
+// hd->func = i;
+ hd->unix_dev_name = new_str(DEV_MICE);
+
+ hd->vendor.id = MAKE_ID(TAG_SPECIAL, 0x0100);
+ hd->device.id = MAKE_ID(TAG_SPECIAL, 0x0300 + i);
+ }
+ }
+
+ if(sscanf(sl->str, "<4>ADB keyboard at %u, %*[a-z ] %i", &u, &i) == 2 && u < 32) {
+ /* u: max 15 actually, but who cares... */
+ if(!(adr & (1 << u))) {
+ adr |= 1 << u;
+ hd = add_hd_entry(hd_data, __LINE__, 0);
+ hd->base_class.id = bc_keyboard;
+ hd->sub_class.id = 0;
+ hd->bus.id = bus_adb;
+ hd->slot = u;
+// hd->func = i;
+// hd->unix_dev_name = new_str(DEV_ADBMOUSE);
+
+ hd->vendor.id = MAKE_ID(TAG_SPECIAL, 0x0100);
+ hd->device.id = MAKE_ID(TAG_SPECIAL, 0x0200+i);
+ }
+ }
+ }
+}
+
+#endif /* __PPC__ */
--- /dev/null
+void hd_scan_adb(hd_data_t *hd_data);
--- /dev/null
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <byteswap.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#if defined(__i386__) || defined (__x86_64__) || defined(__ia64__)
+#include <sys/io.h>
+#endif
+typedef unsigned long kernel_ulong_t;
+#include <linux/types.h>
+#ifdef __UCLIBC__
+#include <linux/pci.h>
+#else
+#include <sys/pci.h>
+#endif
+
+#include "hd.h"
+#include "hd_int.h"
+#include "bios.h"
+#include "smbios.h"
+#include "klog.h"
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ * bios info
+ *
+ * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ */
+
+#if defined(__i386__) || defined (__x86_64__) || defined (__ia64__)
+
+static struct {
+ int width;
+ int height;
+ char *vendor;
+ char *name;
+ char *version;
+} panel_data[] = {
+ { 800, 600, "Fujitsu Siemens", "LiteLine", "LF6" },
+ { 1024, 768, "ASUSTEK", "L2000D", NULL },
+ { 1024, 768, "ASUSTeK Computer Inc.", "L8400C series Notebook PC", NULL },
+ { 1024, 768, "ASUSTeK Computer Inc.", "S5N", NULL },
+ { 1024, 768, "Acer", "TravelMate 720", NULL },
+ { 1024, 768, "COMPAL", "N30T5", NULL },
+ { 1024, 768, "Dell Computer Corporation", "Inspiron 5000", NULL },
+ { 1024, 768, "Dell Computer Corporation", "Latitude C400", NULL },
+ { 1024, 768, "Dell Computer Corporation", "Latitude C600", NULL },
+ { 1024, 768, "Dell Computer Corporation", "Latitude CPt C400GT", NULL },
+ { 1024, 768, "Hewlett-Packard", "HP OmniBook PC", "HP OmniBook 4150 B" },
+ { 1280, 800, "Hewlett-Packard", "hp compaq nx9105 (DU367T#ABD)", "03" },
+ { 1280, 800, "Hewlett-Packard", "Pavilion zv5000 (PA456EA#ABD)", "F.11" },
+#include "ibm-notebooks.h"
+ { 1400, 1050, "IBM", "73geu99", NULL },
+ { 1024, 768, "KDST", "KDS6KSUMO", NULL },
+ { 1024, 768, "Sony Corporation", "PCG-F370(UC)", NULL },
+ { 1024, 768, "Sony Corporation", "PCG-N505SN", NULL },
+ { 1024, 768, "TOSHIBA", "S2400-103", NULL },
+ { 1280, 800, "Acer", "Aspire 1520", NULL },
+ { 1400, 1050, "Acer", "TravelMate 660", NULL },
+ { 1400, 1050, "Dell Computer Corporation", "Inspiron 8000", NULL },
+ { 1600, 1200, "Dell Computer Corporation", "Inspiron 8200", NULL },
+ { 1600, 1200, "Dell Computer Corporation", "Latitude C840", NULL }
+};
+
+#define BIOS_TEST
+
+typedef struct {
+ unsigned eax, ebx, ecx, edx, esi, edi, eip, es, iret, cli;
+} bios32_regs_t;
+
+static void read_memory(hd_data_t *hd_data, memory_range_t *mem);
+static void dump_memory(hd_data_t *hd_data, memory_range_t *mem, int sparse, char *label);
+static void get_pnp_support_status(memory_range_t *mem, bios_info_t *bt);
+static void smbios_get_info(hd_data_t *hd_data, memory_range_t *mem, bios_info_t *bt);
+static void get_fsc_info(hd_data_t *hd_data, memory_range_t *mem, bios_info_t *bt);
+static void add_panel_info(hd_data_t *hd_data, bios_info_t *bt);
+static void add_mouse_info(hd_data_t *hd_data, bios_info_t *bt);
+static unsigned char crc(unsigned char *mem, unsigned len);
+static int get_smp_info(hd_data_t *hd_data, memory_range_t *mem, smp_info_t *smp);
+static void parse_mpconfig(hd_data_t *hd_data, memory_range_t *mem, smp_info_t *smp);
+static int get_bios32_info(hd_data_t *hd_data, memory_range_t *mem, bios32_info_t *bios32);
+
+int detect_smp_bios(hd_data_t *hd_data)
+{
+ bios_info_t *bt;
+ hd_smbios_t *sm;
+ hd_t *hd;
+ int cpus;
+
+ if(!hd_data->bios_ram.data) return -1; /* hd_scan_bios() not called */
+
+ for(bt = NULL, hd = hd_data->hd; hd; hd = hd->next) {
+ if(
+ hd->base_class.id == bc_internal &&
+ hd->sub_class.id == sc_int_bios &&
+ hd->detail &&
+ hd->detail->type == hd_detail_bios &&
+ (bt = hd->detail->bios.data)
+ ) {
+ break;
+ }
+ }
+
+ if(!bt) return -1;
+
+ cpus = 0;
+
+ /* look at smbios data in case there's no mp table */
+ if(hd_data->smbios) {
+ for(sm = hd_data->smbios; sm; sm = sm->next) {
+ if(
+ sm->any.type == sm_processor &&
+ sm->processor.pr_type.id == 3 && /* cpu */
+ sm->processor.cpu_status.id == 1 /* enabled */
+ ) {
+ cpus++;
+ }
+ }
+ ADD2LOG(" smp detect: mp %d cpus, smbios %d cpus\n", bt->smp.ok ? bt->smp.cpus_en : 0, cpus);
+ }
+
+ if(bt->smp.ok && bt->smp.cpus_en) cpus = bt->smp.cpus_en;
+
+ return cpus;
+}
+
+
+void hd_scan_bios(hd_data_t *hd_data)
+{
+ hd_t *hd;
+ bios_info_t *bt;
+ char *s;
+ unsigned char *bios_ram;
+ unsigned u, u1;
+ memory_range_t mem;
+ unsigned smp_ok;
+#ifndef LIBHD_TINY
+ vbe_info_t *vbe;
+ vbe_mode_info_t *mi;
+ hd_res_t *res;
+ str_list_t *sl;
+#endif
+
+ if(!hd_probe_feature(hd_data, pr_bios)) return;
+
+ /* we better do nothing on a SGI Altix machine */
+ if(hd_is_sgi_altix(hd_data)) return;
+
+ hd_data->module = mod_bios;
+
+ /* some clean-up */
+ remove_hd_entries(hd_data);
+
+ PROGRESS(1, 0, "cmdline");
+
+ hd = add_hd_entry(hd_data, __LINE__, 0);
+ hd->base_class.id = bc_internal;
+ hd->sub_class.id = sc_int_bios;
+ hd->detail = new_mem(sizeof *hd->detail);
+ hd->detail->type = hd_detail_bios;
+ hd->detail->bios.data = bt = new_mem(sizeof *bt);
+
+ /*
+ * first, look for APM support
+ */
+ if((s = get_cmd_param(hd_data, 1))) {
+ if(strlen(s) >= 10) {
+ bt->apm_supported = 1;
+ bt->apm_ver = hex(s, 1);
+ bt->apm_subver = hex(s + 1, 1);
+ bt->apm_bios_flags = hex(s + 2, 2);
+ /*
+ * Bitfields for APM flags (from Ralf Brown's list):
+ * Bit(s) Description
+ * 0 16-bit protected mode interface supported
+ * 1 32-bit protected mode interface supported
+ * 2 CPU idle call reduces processor speed
+ * 3 BIOS power management disabled
+ * 4 BIOS power management disengaged (APM v1.1)
+ * 5-7 reserved
+ */
+ bt->apm_enabled = (bt->apm_bios_flags & 8) ? 0 : 1;
+
+ bt->vbe_ver = hex(s + 4, 2);
+ bt->vbe_ver = (((bt->vbe_ver >> 4) & 0xf) << 8) + (bt->vbe_ver & 0xf);
+ bt->vbe_video_mem = hex(s + 6, 4) << 16;
+ }
+
+ s = free_mem(s);
+ }
+
+ if((s = get_cmd_param(hd_data, 2))) {
+ if(strlen(s) > 8) {
+ if(s[8] == '.') bt->lba_support = 1;
+ }
+
+ s = free_mem(s);
+ }
+
+ PROGRESS(1, 1, "apm");
+
+ if(!bt->apm_ver) {
+ str_list_t *sl0, *sl;
+
+ sl0 = read_file(PROC_APM, 0, 0);
+ if(sl0) {
+ bt->apm_supported = 1;
+ bt->apm_enabled = 1;
+ ADD2LOG("----- %s -----\n", PROC_APM);
+ for(sl = sl0; sl; sl = sl->next) {
+ ADD2LOG(" %s", sl->str);
+ }
+ ADD2LOG("----- %s end -----\n", PROC_APM);
+ }
+ free_str_list(sl0);
+ }
+
+ /*
+ * get the i/o ports for the parallel & serial interfaces from the BIOS
+ * memory area starting at 0x40:0
+ */
+ PROGRESS(2, 0, "ram");
+
+ hd_data->bios_ram.start = BIOS_RAM_START;
+ hd_data->bios_ram.size = BIOS_RAM_SIZE;
+ read_memory(hd_data, &hd_data->bios_ram);
+
+ hd_data->bios_rom.start = BIOS_ROM_START;
+ hd_data->bios_rom.size = BIOS_ROM_SIZE;
+ read_memory(hd_data, &hd_data->bios_rom);
+
+ if(hd_data->bios_ram.data) {
+ bios_ram = hd_data->bios_ram.data;
+
+ bt->ser_port0 = (bios_ram[1] << 8) + bios_ram[0];
+ bt->ser_port1 = (bios_ram[3] << 8) + bios_ram[2];
+ bt->ser_port2 = (bios_ram[5] << 8) + bios_ram[4];
+ bt->ser_port3 = (bios_ram[7] << 8) + bios_ram[6];
+
+ bt->par_port0 = (bios_ram[ 9] << 8) + bios_ram[ 8];
+ bt->par_port1 = (bios_ram[0xb] << 8) + bios_ram[0xa];
+ bt->par_port2 = (bios_ram[0xd] << 8) + bios_ram[0xc];
+
+ bt->led.scroll_lock = bios_ram[0x97] & 1;
+ bt->led.num_lock = (bios_ram[0x97] >> 1) & 1;
+ bt->led.caps_lock = (bios_ram[0x97] >> 2) & 1;
+ bt->led.ok = 1;
+
+ /*
+ * do some consistency checks:
+ *
+ * ports must be < 0x1000 and not appear twice
+ */
+ if(bt->ser_port0 >= 0x1000) bt->ser_port0 = 0;
+
+ if(
+ bt->ser_port1 >= 0x1000 ||
+ bt->ser_port1 == bt->ser_port0
+ ) bt->ser_port1 = 0;
+
+ if(
+ bt->ser_port2 >= 0x1000 ||
+ bt->ser_port2 == bt->ser_port0 ||
+ bt->ser_port2 == bt->ser_port1
+ ) bt->ser_port2 = 0;
+
+ if(
+ bt->ser_port3 >= 0x1000 ||
+ bt->ser_port3 == bt->ser_port0 ||
+ bt->ser_port3 == bt->ser_port1 ||
+ bt->ser_port3 == bt->ser_port2
+ ) bt->ser_port3 = 0;
+
+ if(bt->par_port0 >= 0x1000) bt->par_port0 = 0;
+
+ if(
+ bt->par_port1 >= 0x1000 ||
+ bt->par_port1 == bt->par_port0
+ ) bt->par_port1 = 0;
+
+ if(
+ bt->par_port2 >= 0x1000 ||
+ bt->par_port2 == bt->par_port0 ||
+ bt->par_port2 == bt->par_port1
+ ) bt->par_port2 = 0;
+
+ ADD2LOG(" bios: %u disks\n", bios_ram[0x75]);
+
+ bt->low_mem_size = ((bios_ram[0x14] << 8) + bios_ram[0x13]) << 10;
+
+ if(bt->low_mem_size) {
+ ADD2LOG(" bios: %uk low mem\n", bt->low_mem_size >> 10);
+ }
+
+ /* too unusual */
+ if(bt->low_mem_size >= (768 << 10) || bt->low_mem_size < (384 << 10)) {
+ bt->low_mem_size = 0;
+ }
+
+ hd_data->bios_ebda.start = hd_data->bios_ebda.size = 0;
+ hd_data->bios_ebda.data = free_mem(hd_data->bios_ebda.data);
+ u = ((bios_ram[0x0f] << 8) + bios_ram[0x0e]) << 4;
+ if(u) {
+ hd_data->bios_ebda.start = u;
+ hd_data->bios_ebda.size = 1; /* just one byte */
+ read_memory(hd_data, &hd_data->bios_ebda);
+ if(hd_data->bios_ebda.data) {
+ u1 = hd_data->bios_ebda.data[0];
+ if(u1 > 0 && u1 <= 64) { /* be sensible, typically only 1k */
+ u1 <<= 10;
+ if(u + u1 <= (1 << 20)) {
+ hd_data->bios_ebda.size = u1;
+ read_memory(hd_data, &hd_data->bios_ebda);
+ }
+ }
+ }
+ }
+
+ if(hd_data->bios_ebda.data) {
+ ADD2LOG(
+ " bios: EBDA 0x%05x bytes at 0x%05x\n",
+ hd_data->bios_ebda.size, hd_data->bios_ebda.start
+ );
+ }
+ }
+
+ /*
+ * read the bios rom and look for useful things there...
+ */
+ PROGRESS(2, 0, "rom");
+
+ if(hd_data->bios_rom.data) {
+ get_pnp_support_status(&hd_data->bios_rom, bt);
+ smbios_get_info(hd_data, &hd_data->bios_rom, bt);
+ get_fsc_info(hd_data, &hd_data->bios_rom, bt);
+ add_panel_info(hd_data, bt);
+ add_mouse_info(hd_data, bt);
+ }
+
+ PROGRESS(3, 0, "smp");
+
+ smp_ok = 0;
+
+ mem = hd_data->bios_ebda;
+ smp_ok = get_smp_info(hd_data, &mem, &bt->smp);
+
+ if(!smp_ok) {
+ mem = hd_data->bios_rom;
+ if(mem.data) {
+ mem.size -= 0xf0000 - mem.start;
+ mem.data += 0xf0000 - mem.start;
+ mem.start = 0xf0000;
+ if(mem.size < (1 << 20)) smp_ok = get_smp_info(hd_data, &mem, &bt->smp);
+ }
+ }
+
+ if(!smp_ok) {
+ mem.size = 1 << 10;
+ mem.start = 639 << 10;
+ mem.data = NULL;
+ read_memory(hd_data, &mem);
+ if(mem.data) smp_ok = get_smp_info(hd_data, &mem, &bt->smp);
+ mem.data = free_mem(mem.data);
+ }
+
+ if(bt->smp.ok && bt->smp.mpconfig) {
+ mem.start = bt->smp.mpconfig;
+ mem.size = 1 << 16;
+ mem.data = NULL;
+ read_memory(hd_data, &mem);
+ parse_mpconfig(hd_data, &mem, &bt->smp);
+ mem.data = free_mem(mem.data);
+ }
+
+ if((hd_data->debug & HD_DEB_BIOS)) {
+ dump_memory(hd_data, &hd_data->bios_ram, 0, "BIOS data");
+ dump_memory(hd_data, &hd_data->bios_ebda, hd_data->bios_ebda.size <= (8 << 10) ? 0 : 1, "EBDA");
+ // dump_memory(hd_data, &hd_data->bios_rom, 1, "BIOS ROM");
+
+ if(bt->smp.ok && bt->smp.mpfp) {
+ mem.start = bt->smp.mpfp;
+ mem.size = 0x10;
+ mem.data = NULL;
+ read_memory(hd_data, &mem);
+ dump_memory(hd_data, &mem, 0, "MP FP");
+ mem.data = free_mem(mem.data);
+ }
+
+ if(bt->smp.ok && bt->smp.mpconfig && bt->smp.mpconfig_size) {
+ mem.start = bt->smp.mpconfig;
+ mem.size = bt->smp.mpconfig_size;
+ mem.data = NULL;
+ read_memory(hd_data, &mem);
+ dump_memory(hd_data, &mem, 0, "MP config table");
+ mem.data = free_mem(mem.data);
+ }
+ }
+
+#ifndef LIBHD_TINY
+ if(hd_probe_feature(hd_data, pr_bios_vesa)) {
+ PROGRESS(4, 0, "vbe");
+
+ vbe = &bt->vbe;
+ vbe->ok = 0;
+
+ if(!hd_data->klog) read_klog(hd_data);
+ for(sl = hd_data->klog; sl; sl = sl->next) {
+ if(sscanf(sl->str, "<6>PCI: Using configuration type %u", &u) == 1) {
+ hd_data->pci_config_type = u;
+ ADD2LOG(" klog: pci config type %u\n", hd_data->pci_config_type);
+ }
+ }
+
+ get_vbe_info(hd_data, vbe);
+
+ if(vbe->ok) {
+ bt->vbe_ver = vbe->version;
+ }
+
+ if(vbe->ok && vbe->fb_start) {
+ hd = add_hd_entry(hd_data, __LINE__, 0);
+ hd->base_class.id = bc_framebuffer;
+ hd->sub_class.id = sc_fb_vesa;
+
+ hd_set_hw_class(hd, hw_vbe);
+
+#if 0
+ hd->detail = new_mem(sizeof *hd->detail);
+ hd->detail->type = hd_detail_bios;
+ hd->detail->bios.data = bt = new_mem(sizeof *bt);
+#endif
+
+ hd->vendor.name = new_str(vbe->vendor_name);
+ hd->device.name = new_str(vbe->product_name);
+ hd->sub_vendor.name = new_str(vbe->oem_name);
+ hd->revision.name = new_str(vbe->product_revision);
+
+ res = add_res_entry(&hd->res, new_mem(sizeof *res));
+ res->phys_mem.type = res_phys_mem;
+ res->phys_mem.range = vbe->memory;
+
+ res = add_res_entry(&hd->res, new_mem(sizeof *res));
+ res->mem.type = res_mem;
+ res->mem.base = vbe->fb_start;
+ res->mem.range = vbe->memory;
+ res->mem.access = acc_rw;
+ res->mem.enabled = 1;
+
+ if(vbe->mode) {
+ for(u = 0; u < vbe->modes; u++) {
+ mi = vbe->mode + u;
+ if(
+ (mi->attributes & 1) && /* mode supported */
+ mi->fb_start &&
+ mi->pixel_size != -1u /* text mode */
+ ) {
+ res = add_res_entry(&hd->res, new_mem(sizeof *res));
+ res->framebuffer.type = res_framebuffer;
+ res->framebuffer.width = mi->width;
+ res->framebuffer.bytes_p_line = mi->bytes_p_line;
+ res->framebuffer.height = mi->height;
+ res->framebuffer.colorbits = mi->pixel_size;
+ res->framebuffer.mode = mi->number + 0x200;
+ }
+ }
+ }
+
+#if 0
+ if(
+ hd->vend_name &&
+ !strcmp(hd->vend_name, "Matrox") &&
+ hd->device.name &&
+ (
+ strstr(hd->dev_name, "G200") ||
+ strstr(hd->dev_name, "G400") ||
+ strstr(hd->dev_name, "G450")
+ )
+ ) {
+ hd->broken = 1;
+ }
+#endif
+
+ }
+ }
+#endif /* LIBHD_TINY */
+
+ PROGRESS(5, 0, "32");
+
+ mem = hd_data->bios_rom;
+ if(mem.data) {
+ mem.size -= 0xe0000 - mem.start;
+ mem.data += 0xe0000 - mem.start;
+ mem.start = 0xe0000;
+ if(mem.size < (1 << 20)) get_bios32_info(hd_data, &mem, &bt->bios32);
+ }
+
+ if(bt->bios32.ok) {
+ mem = hd_data->bios_rom;
+
+ if(
+ mem.start <= 0xfffea &&
+ mem.start + mem.size >= 0xfffea + 6 &&
+ !memcmp(mem.data + 0xfffea - mem.start, "COMPAQ", 6)
+ ) {
+ bt->bios32.compaq = 1;
+ ADD2LOG(" bios32: compaq machine\n");
+ }
+ }
+
+}
+
+
+void read_memory(hd_data_t *hd_data, memory_range_t *mem)
+{
+#ifdef BIOS_TEST
+ char *s = getenv("LIBHD_MEM");
+#endif
+
+#ifdef LIBHD_MEMCHECK
+ {
+ if(libhd_log) fprintf(libhd_log, ">%p\n", CALLED_FROM(read_memory, mem));
+ }
+#endif
+
+ if(mem->data) free_mem(mem->data);
+ mem->data = new_mem(mem->size);
+#ifdef BIOS_TEST
+ hd_read_mmap(hd_data, s ?: DEV_MEM, mem->data, mem->start, mem->size);
+#else
+ hd_read_mmap(hd_data, DEV_MEM, mem->data, mem->start, mem->size);
+#endif
+
+#ifdef LIBHD_MEMCHECK
+ {
+ if(libhd_log) fprintf(libhd_log, "<%p\n", CALLED_FROM(read_memory, mem));
+ }
+#endif
+}
+
+
+void dump_memory(hd_data_t *hd_data, memory_range_t *mem, int sparse, char *label)
+{
+ unsigned u, step;
+
+ if(!mem->size || !mem->data) return;
+
+#if 1
+ step = sparse ? 0x1000 : 0x10;
+#else
+ step = 0x10;
+#endif
+
+ ADD2LOG("----- %s 0x%05x - 0x%05x -----\n", label, mem->start, mem->start + mem->size - 1);
+ for(u = 0; u < mem->size; u += step) {
+ ADD2LOG(" %03x ", u + mem->start);
+ hexdump(&hd_data->log, 1, mem->size - u > 0x10 ? 0x10 : mem->size - u, mem->data + u);
+ ADD2LOG("\n");
+ }
+ ADD2LOG("----- %s end -----\n", label);
+}
+
+
+void get_pnp_support_status(memory_range_t *mem, bios_info_t *bt)
+{
+ int i;
+ unsigned char pnp[4] = { '$', 'P', 'n', 'P' };
+ unsigned char *t;
+ unsigned l, cs;
+
+ if(!mem->data) return;
+
+ for(i = 0xf0000 - mem->start; (unsigned) i < mem->size; i += 0x10) {
+ t = mem->data + i;
+ if(t[0] == pnp[0] && t[1] == pnp[1] && t[2] == pnp[2] && t[3] == pnp[3]) {
+ for(l = cs = 0; l < t[5]; l++) { cs += t[l]; }
+ if((cs & 0xff) == 0) { // checksum ok
+ bt->is_pnp_bios = 1;
+// printf("0x%x bytes at 0x%x, cs = 0x%x\n", t[5], i, cs);
+ bt->pnp_id = t[0x17] + (t[0x18] << 8) + (t[0x19] << 16) + (t[0x20] << 24);
+ }
+ }
+ }
+}
+
+unsigned char crc(unsigned char *mem, unsigned len)
+{
+ unsigned char uc = 0;
+
+ while(len--) uc += *mem++;
+
+ return uc;
+}
+
+
+void smbios_get_info(hd_data_t *hd_data, memory_range_t *mem, bios_info_t *bt)
+{
+ unsigned u, u1, u2, ok, hlen = 0, ofs;
+ unsigned addr = 0, len = 0, scnt;
+ unsigned structs = 0, type, slen;
+ char *s;
+ memory_range_t memory;
+ hd_smbios_t *sm;
+
+ if(!mem->data || mem->size < 0x100) return;
+
+ for(u = ok = 0; u <= mem->size - 0x100; u += 0x10) {
+ if(*(unsigned *) (mem->data + u) == 0x5f4d535f) { /* "_SM_" */
+ hlen = mem->data[u + 5];
+ addr = *(unsigned *) (mem->data + u + 0x18);
+ len = *(unsigned short *) (mem->data + u + 0x16);
+ structs = *(unsigned short *) (mem->data + u + 0x1c);
+ if(hlen < 0x1e) continue;
+ ok = crc(mem->data + u, hlen) == 0 && addr < (1 << 20) && len;
+ if(ok) break;
+ }
+ }
+
+ if(!ok) return;
+
+ bt->smbios_ver = (mem->data[u + 6] << 8) + mem->data[u + 7];
+
+ hd_data->smbios = smbios_free(hd_data->smbios);
+
+ memory.start = mem->start + u;
+ memory.size = hlen;
+ memory.data = mem->data + u;
+ dump_memory(hd_data, &memory, 0, "SMBIOS Entry Point");
+
+ memory.start = addr;
+ memory.size = len;
+ memory.data = NULL;
+ read_memory(hd_data, &memory);
+ if(len >= 0x4000) {
+ ADD2LOG(
+ " SMBIOS Structure Table at 0x%05x (size 0x%x)\n",
+ addr, len
+ );
+ }
+ else {
+ dump_memory(hd_data, &memory, 0, "SMBIOS Structure Table");
+ }
+
+ for(type = 0, u = 0, ofs = 0; u < structs && ofs + 3 < len; u++) {
+ type = memory.data[ofs];
+ slen = memory.data[ofs + 1];
+ if(ofs + slen > len || slen < 4) break;
+ sm = smbios_add_entry(&hd_data->smbios, new_mem(sizeof *sm));
+ sm->any.type = type;
+ sm->any.data_len = slen;
+ sm->any.data = new_mem(slen);
+ memcpy(sm->any.data, memory.data + ofs, slen);
+ sm->any.handle = memory.data[ofs + 2] + (memory.data[ofs + 3] << 8);
+ ADD2LOG(" type 0x%02x [0x%04x]: ", type, sm->any.handle);
+ if(slen) hexdump(&hd_data->log, 0, slen, sm->any.data);
+ ADD2LOG("\n");
+ if(type == sm_end) break;
+ ofs += slen;
+ u1 = ofs;
+ u2 = 1;
+ scnt = 0;
+ while(ofs + 1 < len) {
+ if(!memory.data[ofs]) {
+ if(ofs > u1) {
+ s = canon_str(memory.data + u1, strlen(memory.data + u1));
+ add_str_list(&sm->any.strings, s);
+ scnt++;
+ if(*s) ADD2LOG(" str%d: \"%s\"\n", scnt, s);
+ free_mem(s);
+ u1 = ofs + 1;
+ u2++;
+ }
+ if(!memory.data[ofs + 1]) {
+ ofs += 2;
+ break;
+ }
+ }
+ ofs++;
+ }
+ }
+
+ if(u != structs) {
+ if(type == sm_end) {
+ ADD2LOG(" smbios: stopped at end tag\n");
+ }
+ else {
+ ADD2LOG(" smbios oops: only %d of %d structs found\n", u, structs);
+ }
+ }
+
+ memory.data = free_mem(memory.data);
+
+ smbios_parse(hd_data);
+}
+
+
+void get_fsc_info(hd_data_t *hd_data, memory_range_t *mem, bios_info_t *bt)
+{
+ unsigned u, mtype, fsc_id;
+ unsigned x, y;
+ hd_smbios_t *sm;
+ char *vendor = NULL;
+
+ if(!mem->data || mem->size < 0x20) return;
+
+ for(sm = hd_data->smbios; sm; sm = sm->next) {
+ if(sm->any.type == sm_sysinfo) {
+ vendor = sm->sysinfo.manuf;
+ break;
+ }
+ }
+
+ vendor = vendor && !strcasecmp(vendor, "Fujitsu") ? "Fujitsu" : "Fujitsu Siemens";
+
+ for(u = 0; u <= mem->size - 0x20; u += 0x10) {
+ if(
+ *(unsigned *) (mem->data + u) == 0x696a7546 &&
+ *(unsigned *) (mem->data + u + 4) == 0x20757374
+ ) {
+ mtype = *(unsigned *) (mem->data + u + 0x14);
+ if(!crc(mem->data + u, 0x20) && !(mtype & 0xf0000000)) {
+ fsc_id = (mtype >> 12) & 0xf;
+
+ switch(fsc_id) {
+ case 1:
+ x = 640; y = 480;
+ break;
+
+ case 2:
+ x = 800; y = 600;
+ break;
+
+ case 3:
+ x = 1024; y = 768;
+ break;
+
+ case 4:
+ x = 1280; y = 1024;
+ break;
+
+ case 5:
+ x = 1400; y = 1050;
+ break;
+
+ case 6:
+ x = 1024; y = 512;
+ break;
+
+ case 7:
+ x = 1280; y = 600;
+ break;
+
+ case 8:
+ x = 1600; y = 1200;
+ break;
+
+ default:
+ x = 0; y = 0;
+ }
+
+ if(x) {
+ bt->lcd.vendor = new_str(vendor);
+ bt->lcd.name = new_str("Notebook LCD");
+ bt->lcd.width = x;
+ bt->lcd.height = y;
+ }
+
+ ADD2LOG(" found FSC LCD: %d (%ux%u)\n", fsc_id, x, y);
+ break;
+ }
+ }
+ }
+}
+
+
+void add_panel_info(hd_data_t *hd_data, bios_info_t *bt)
+{
+ unsigned width, height;
+ char *vendor, *name, *version;
+ hd_smbios_t *sm;
+ unsigned u;
+
+ if(bt->lcd.width || !hd_data->smbios) return;
+
+ vendor = name = version = NULL;
+ width = height = 0;
+
+ for(sm = hd_data->smbios; sm; sm = sm->next) {
+ if(sm->any.type == sm_sysinfo) {
+ vendor = sm->sysinfo.manuf;
+ name = sm->sysinfo.product;
+ version = sm->sysinfo.version;
+ break;
+ }
+ }
+
+ if(!vendor || !name) return;
+
+ for(u = 0; u < sizeof panel_data / sizeof *panel_data; u++) {
+ if(
+ !strcmp(vendor, panel_data[u].vendor) &&
+ !strcmp(name, panel_data[u].name) &&
+ (version || !panel_data[u].version) &&
+ (!version || !panel_data[u].version || !strcmp(version, panel_data[u].version))
+ ) {
+ bt->lcd.vendor = new_str(vendor);
+ bt->lcd.name = new_str("Notebook LCD");
+ bt->lcd.width = panel_data[u].width;
+ bt->lcd.height = panel_data[u].height;
+ break;
+ }
+ }
+}
+
+
+void add_mouse_info(hd_data_t *hd_data, bios_info_t *bt)
+{
+ unsigned compat_vend, compat_dev, bus;
+ char *vendor, *name, *type;
+ hd_smbios_t *sm;
+
+ if(bt->mouse.compat_vend || !hd_data->smbios) return;
+
+ vendor = name = type = NULL;
+ compat_vend = compat_dev = bus = 0;
+
+ for(sm = hd_data->smbios; sm; sm = sm->next) {
+ if(sm->any.type == sm_sysinfo) {
+ vendor = sm->sysinfo.manuf;
+ name = sm->sysinfo.product;
+ }
+ if(
+ sm->any.type == sm_mouse &&
+ !compat_vend /* take the first entry */
+ ) {
+ compat_vend = compat_dev = bus = 0;
+ type = NULL;
+
+ switch(sm->mouse.interface.id) {
+ case 4: /* ps/2 */
+ case 7: /* bus mouse (dell notebooks report this) */
+ bus = bus_ps2;
+ compat_vend = MAKE_ID(TAG_SPECIAL, 0x0200);
+ compat_dev = MAKE_ID(TAG_SPECIAL, sm->mouse.buttons == 3 ? 0x0007 : 0x0006);
+ break;
+ }
+ type = sm->mouse.mtype.name;
+ if(sm->mouse.mtype.id == 1) type = "Touch Pad"; /* Why??? */
+ if(sm->mouse.mtype.id == 2) type = NULL; /* "Other" */
+ }
+ }
+
+ if(!vendor || !name) return;
+
+ if(!type) {
+ if(!strcmp(vendor, "Sony Corporation") && strstr(name, "PCG-") == name) {
+ bus = bus_ps2;
+ type = "Touch Pad";
+ compat_vend = MAKE_ID(TAG_SPECIAL, 0x0200);
+ compat_dev = MAKE_ID(TAG_SPECIAL, 0x0006);
+ }
+ }
+
+ if(!type) return;
+
+ bt->mouse.vendor = new_str(vendor);
+ bt->mouse.type = new_str(type);
+ bt->mouse.bus = bus;
+ bt->mouse.compat_vend = compat_vend;
+ bt->mouse.compat_dev = compat_dev;
+}
+
+
+int get_smp_info(hd_data_t *hd_data, memory_range_t *mem, smp_info_t *smp)
+{
+#ifndef __ia64__
+ unsigned u, ok;
+ unsigned addr = 0, len;
+
+ if(mem->size < 0x10) return 0;
+
+ for(u = ok = 0; u <= mem->size - 0x10; u++) {
+ if(*(unsigned *) (mem->data + u) == 0x5f504d5f) { /* "_MP_" */
+ addr = *(unsigned *) (mem->data + u + 4);
+ len = mem->data[u + 8];
+ ok = len == 1 && crc(mem->data + u, 0x10) == 0 && addr < (1 << 20) ? 1 : 0;
+ ADD2LOG(
+ " smp: %svalid MP FP at 0x%05x (size 0x%x, rev %u), MP config at 0x%05x\n",
+ ok ? "" : "in", u + mem->start, len << 4, mem->data[u + 9], addr
+ );
+ if(ok) break;
+ }
+ }
+
+ if(ok) {
+ smp->ok = 1;
+ smp->mpfp = mem->start + u;
+ smp->rev = mem->data[u + 9];
+ smp->mpconfig = addr;
+ memcpy(smp->feature, mem->data + u + 11, 5);
+ }
+
+ return ok;
+#else
+ return 0;
+#endif
+}
+
+
+void parse_mpconfig(hd_data_t *hd_data, memory_range_t *mem, smp_info_t *smp)
+{
+ unsigned cfg_len, xcfg_len;
+ unsigned char u0, ux0;
+ unsigned u, type, len, entries, entry_cnt;
+ char *s;
+
+ cfg_len = xcfg_len = 0;
+
+ if(*(unsigned *) (mem->data) == 0x504d4350) { /* "PCMP" */
+ cfg_len = mem->data[0x04] + (mem->data[0x05] << 8);
+ smp->mpconfig_size = cfg_len;
+ u0 = crc(mem->data, cfg_len);
+ if(u0) return;
+ smp->mpconfig_ok = 1;
+ smp->cpus = smp->cpus_en = 0;
+ xcfg_len = mem->data[0x28] + (mem->data[0x29] << 8);
+ ux0 = crc(mem->data + cfg_len, xcfg_len) + mem->data[0x2a];
+ if(!ux0) {
+ smp->mpconfig_size += xcfg_len;
+ }
+ else {
+ xcfg_len = 0;
+ }
+ }
+
+ if(cfg_len) {
+ s = canon_str(mem->data + 8, 8);
+ strcpy(smp->oem_id, s);
+ free_mem(s);
+ s = canon_str(mem->data + 0x10, 12);
+ strcpy(smp->prod_id, s);
+ s = free_mem(s);
+
+ entries = mem->data[0x22] + (mem->data[0x23] << 8);
+ ADD2LOG(" base MP config table (%u entries):\n", entries);
+ entry_cnt = 0;
+ for(u = 0x2c; u < cfg_len - 1; u += len, entry_cnt++) {
+ type = mem->data[u];
+ len = type == 0 ? 20 : type <= 4 ? 8 : 16;
+ ADD2LOG(" %stype %u, len %u\n ", type > 4 ? "unknown ": "", type, len);
+ if(len + u > cfg_len) len = cfg_len - u;
+ hexdump(&hd_data->log, 1, len, mem->data + u);
+ ADD2LOG("\n");
+ if(type > 4) break;
+ if(type == 0) {
+ smp->cpus++;
+ if((mem->data[u + 3] & 1)) smp->cpus_en++;
+ }
+ }
+ if(entry_cnt != entries) {
+ ADD2LOG(" oops: %u entries instead of %u found\n", entry_cnt, entries);
+ }
+ }
+
+ if(xcfg_len) {
+ ADD2LOG(" extended MP config table:\n");
+ for(u = 0; u < xcfg_len - 2; u += len) {
+ type = mem->data[u + cfg_len];
+ len = mem->data[u + cfg_len + 1];
+ ADD2LOG(" type %u, len %u\n ", type, len);
+ if(len + u > xcfg_len) len = xcfg_len - u;
+ hexdump(&hd_data->log, 1, len, mem->data + cfg_len + u);
+ ADD2LOG("\n");
+ if(len < 2) {
+ ADD2LOG(" oops: invalid record lenght\n");
+ break;
+ }
+ }
+ }
+}
+
+
+int get_bios32_info(hd_data_t *hd_data, memory_range_t *mem, bios32_info_t *bios32)
+{
+ unsigned u, ok;
+ unsigned addr = 0, len;
+
+ if(mem->size < 0x10) return 0;
+
+ for(u = ok = 0; u <= mem->size - 0x10; u += 0x10) {
+ if(*(unsigned *) (mem->data + u) == 0x5f32335f) { /* "_32_" */
+ addr = *(unsigned *) (mem->data + u + 4);
+ len = mem->data[u + 9];
+ ok = len == 1 && crc(mem->data + u, 0x10) == 0 && addr < (1 << 20) ? 1 : 0;
+ ADD2LOG(
+ " bios32: %svalid SD header at 0x%05x (size 0x%x, rev %u), SD at 0x%05x\n",
+ ok ? "" : "in", u + mem->start, len << 4, mem->data[u + 8], addr
+ );
+ if(ok) break;
+ }
+ }
+
+ if(ok) {
+ bios32->ok = 1;
+ bios32->entry = addr;
+ }
+
+ return ok;
+}
+
+
+#endif /* defined(__i386__) || defined (__x86_64__) */
+
--- /dev/null
+#define BIOS_ROM_START 0xc0000
+#define BIOS_ROM_SIZE 0x40000
+
+#define BIOS_RAM_START 0x400
+#define BIOS_RAM_SIZE 0x100
+
+void hd_scan_bios(hd_data_t *hd_data);
+void get_vbe_info(hd_data_t *hd_data, vbe_info_t *vbe);
--- /dev/null
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <ctype.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <sys/ioctl.h>
+#include <linux/iso_fs.h>
+#include <scsi/sg.h>
+
+#include "hd.h"
+#include "hd_int.h"
+#include "hddb.h"
+#include "block.h"
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ * block device stuff
+ *
+ * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ */
+
+static void get_block_devs(hd_data_t *hd_data);
+static void add_partitions(hd_data_t *hd_data, hd_t *hd, char *path);
+static void add_cdrom_info(hd_data_t *hd_data, hd_t *hd);
+static void add_other_sysfs_info(hd_data_t *hd_data, hd_t *hd, struct sysfs_device *sf_dev);
+static void add_ide_sysfs_info(hd_data_t *hd_data, hd_t *hd, struct sysfs_device *sf_dev);
+static void add_scsi_sysfs_info(hd_data_t *hd_data, hd_t *hd, struct sysfs_device *sf_dev);
+static void read_partitions(hd_data_t *hd_data);
+static void read_cdroms(hd_data_t *hd_data);
+static cdrom_info_t *new_cdrom_entry(cdrom_info_t **ci);
+static cdrom_info_t *get_cdrom_entry(cdrom_info_t *ci, int n);
+static void get_scsi_tape(hd_data_t *hd_data);
+static void get_generic_scsi_devs(hd_data_t *hd_data);
+static void add_disk_size(hd_data_t *hd_data, hd_t *hd);
+
+
+void hd_scan_sysfs_block(hd_data_t *hd_data)
+{
+ if(!hd_probe_feature(hd_data, pr_block)) return;
+
+ hd_data->module = mod_block;
+
+ /* some clean-up */
+ remove_hd_entries(hd_data);
+
+ hd_data->disks = free_str_list(hd_data->disks);
+ hd_data->partitions = free_str_list(hd_data->partitions);
+ hd_data->cdroms = free_str_list(hd_data->cdroms);
+
+ if(hd_probe_feature(hd_data, pr_block_mods)) {
+ PROGRESS(1, 0, "block modules");
+ load_module(hd_data, "ide_cd");
+ load_module(hd_data, "sr_mod");
+ load_module(hd_data, "sd_mod");
+ load_module(hd_data, "st");
+ }
+
+ PROGRESS(2, 0, "sysfs drivers");
+
+ hd_sysfs_driver_list(hd_data);
+
+ PROGRESS(3, 0, "cdrom");
+
+ read_cdroms(hd_data);
+
+ PROGRESS(4, 0, "partition");
+
+ read_partitions(hd_data);
+
+ PROGRESS(5, 0, "get sysfs block dev data");
+
+ get_block_devs(hd_data);
+
+ if(hd_data->cdrom) {
+ ADD2LOG("oops: cdrom list not empty\n");
+ }
+}
+
+
+void get_block_devs(hd_data_t *hd_data)
+{
+ str_list_t *sl;
+ char *s, *t;
+ unsigned u1, u2, u3;
+ uint64_t ul0;
+ hd_t *hd, *hd1;
+ hd_dev_num_t dev_num;
+
+ struct sysfs_bus *sf_bus;
+ struct sysfs_class *sf_class;
+ struct sysfs_class_device *sf_cdev;
+ struct sysfs_device *sf_dev;
+ struct dlist *sf_cdev_list;
+ struct dlist *sf_ide_list = NULL;
+ struct sysfs_device *sf_ide;
+
+ sf_bus = sysfs_open_bus("ide");
+ if(sf_bus) {
+ sf_ide_list = sysfs_get_bus_devices(sf_bus);
+ if(sf_ide_list) dlist_for_each_data(sf_ide_list, sf_ide, struct sysfs_device) {
+ ADD2LOG(
+ " ide: bus_id = %s path = %s\n",
+ sf_ide->bus_id,
+ hd_sysfs_id(sf_ide->path)
+ );
+ }
+ }
+
+ sf_class = sysfs_open_class("block");
+
+ if(!sf_class) {
+ ADD2LOG("sysfs: no such class: block\n");
+ return;
+ }
+
+ sf_cdev_list = sysfs_get_class_devices(sf_class);
+ if(sf_cdev_list) dlist_for_each_data(sf_cdev_list, sf_cdev, struct sysfs_class_device) {
+ ADD2LOG(
+ " block: name = %s, path = %s\n",
+ sf_cdev->name,
+ hd_sysfs_id(sf_cdev->path)
+ );
+
+ memset(&dev_num, 0, sizeof dev_num);
+
+ if((s = hd_attr_str(sysfs_get_classdev_attr(sf_cdev, "dev")))) {
+ if(sscanf(s, "%u:%u", &u1, &u2) == 2) {
+ dev_num.type = 'b';
+ dev_num.major = u1;
+ dev_num.minor = u2;
+ dev_num.range = 1;
+ }
+ ADD2LOG(" dev = %u:%u\n", u1, u2);
+ }
+
+ if(hd_attr_uint(sysfs_get_classdev_attr(sf_cdev, "range"), &ul0, 0)) {
+ dev_num.range = ul0;
+ ADD2LOG(" range = %u\n", dev_num.range);
+ }
+
+ sf_dev = sysfs_get_classdev_device(sf_cdev);
+ if(sf_dev) {
+ ADD2LOG(
+ " block device: bus = %s, bus_id = %s driver = %s\n path = %s\n",
+ sf_dev->bus,
+ sf_dev->bus_id,
+ sf_dev->driver_name,
+ hd_sysfs_id(sf_dev->path)
+ );
+ }
+
+ hd = NULL;
+
+ /* check if disk is DASD and has already been found by s390.c */
+ if(sf_dev && sf_dev->driver_name && strstr(sf_dev->driver_name,"dasd"))
+ {
+ char bid[9];
+ hd_res_t* res;
+ //fprintf(stderr,"dn %s bi %s\n",sf_dev->driver_name,sf_dev->bus_id);
+ for(hd=hd_data->hd;hd;hd=hd->next)
+ {
+ //fprintf(stderr,"bcid %d\n",hd->base_class.id);
+ if(hd->base_class.id == bc_storage_device
+ && hd->detail
+ && hd->detail->ccw.type == hd_detail_ccw)
+ {
+ for(res=hd->res;res;res=res->next)
+ {
+ if(res->io.type==res_io)
+ {
+ sprintf(bid,"%01x.%01x.%04x",
+ hd->detail->ccw.data->lcss >> 8,
+ hd->detail->ccw.data->lcss & 0xff,
+ (unsigned short)res->io.base);
+ //fprintf(stderr,"bid %s\n",bid);
+ if (strcmp(bid,sf_dev->bus_id)==0) goto out;
+ }
+ }
+ }
+ }
+ hd=NULL;
+ out:;
+ }
+ else if((sl = search_str_list(hd_data->disks, hd_sysfs_name2_dev(sf_cdev->name)))) {
+ hd = add_hd_entry(hd_data, __LINE__, 0);
+ hd->sub_class.id = sc_sdev_disk;
+ }
+ else if((sl = search_str_list(hd_data->cdroms, hd_sysfs_name2_dev(sf_cdev->name)))) {
+ hd = add_hd_entry(hd_data, __LINE__, 0);
+ hd->sub_class.id = sc_sdev_cdrom;
+ }
+ else if(
+ sf_dev &&
+ sf_dev->bus &&
+ (!strcmp(sf_dev->bus, "scsi") || !strcmp(sf_dev->bus, "ide"))
+ ) {
+ hd = add_hd_entry(hd_data, __LINE__, 0);
+ hd->sub_class.id = sc_sdev_other;
+ }
+
+ if(hd) {
+ str_printf(&hd->unix_dev_name, 0, "/dev/%s", hd_sysfs_name2_dev(sf_cdev->name));
+
+ hd->base_class.id = bc_storage_device;
+
+ hd->sysfs_id = new_str(hd_sysfs_id(sf_cdev->path));
+
+ if(sf_dev) hd->sysfs_device_link = new_str(hd_sysfs_id(sf_dev->path));
+
+ hd->unix_dev_num = dev_num;
+
+ hd->bus.id = bus_none;
+
+ if(sf_dev) {
+ if(sf_dev->bus) {
+ if(!strcmp(sf_dev->bus, "ide")) hd->bus.id = bus_ide;
+ else if(!strcmp(sf_dev->bus, "scsi")) hd->bus.id = bus_scsi;
+ }
+ hd->sysfs_bus_id = new_str(sf_dev->bus_id);
+ }
+
+ if(sf_dev && (s = hd_sysfs_id(sf_dev->path))) {
+
+ /* parent has longest matching sysfs id */
+ u2 = strlen(s);
+ for(u3 = 0, hd1 = hd_data->hd; hd1; hd1 = hd1->next) {
+ if(hd1->sysfs_id) {
+ u1 = strlen(hd1->sysfs_id);
+ if(u1 > u3 && u1 <= u2 && !strncmp(s, hd1->sysfs_id, u1)) {
+ u3 = u1;
+ hd->attached_to = hd1->idx;
+ }
+ }
+ }
+
+ /* find longest matching sysfs id we have a driver for */
+ s = new_str(s);
+ t = strrchr(s, '/');
+ if(t) *t = 0;
+ t = hd_sysfs_find_driver(hd_data, s, 0);
+ if(t) {
+ add_str_list(&hd->drivers, t);
+ }
+ s = free_mem(s);
+
+ /* look for ide-scsi handled devices */
+ if(hd->bus.id == bus_scsi) {
+ if(sf_ide_list) dlist_for_each_data(sf_ide_list, sf_ide, struct sysfs_device) {
+ if(
+ strcmp(sf_dev->path, sf_ide->path) &&
+ !strncmp(sf_dev->path, sf_ide->path, strlen(sf_ide->path)) &&
+ sscanf(sf_ide->bus_id, "%u.%u", &u1, &u2) == 2
+ ) {
+ str_printf(&hd->unix_dev_name2, 0, "/dev/hd%c", 'a' + (u1 << 1) + u2);
+ }
+ }
+ }
+ }
+
+ /*
+ * set hd->drivers before calling any of add_xxx_sysfs_info()
+ */
+ if(
+ sf_dev &&
+ sf_dev->driver_name &&
+ *sf_dev->driver_name &&
+ strcmp(sf_dev->driver_name, "unknown")
+ ) {
+ add_str_list(&hd->drivers, sf_dev->driver_name);
+ }
+
+ if(hd->bus.id == bus_ide) {
+ add_ide_sysfs_info(hd_data, hd, sf_dev);
+ }
+ else if(hd->bus.id == bus_scsi) {
+ add_scsi_sysfs_info(hd_data, hd, sf_dev);
+ }
+ else {
+ add_other_sysfs_info(hd_data, hd, sf_dev);
+ }
+
+
+ if(hd->sub_class.id == sc_sdev_cdrom) {
+ add_cdrom_info(hd_data, hd);
+ }
+
+ if(
+ hd->sub_class.id == sc_sdev_disk &&
+ hd_probe_feature(hd_data, pr_block_part)
+ ) {
+ add_partitions(hd_data, hd, sf_cdev->path);
+ }
+
+ }
+
+ }
+
+ sysfs_close_class(sf_class);
+
+ sysfs_close_bus(sf_bus);
+}
+
+
+/*
+ * Find driver for sysfs_id.
+ *
+ * Return driver for id (exact = 1) or longest matching id (exact = 0).
+ */
+char *hd_sysfs_find_driver(hd_data_t *hd_data, char *sysfs_id, int exact)
+{
+ hd_sysfsdrv_t *sf;
+ char *t;
+ unsigned u1, u2, u3;
+
+ if(!sysfs_id || !*sysfs_id) return NULL;
+
+ t = NULL;
+
+ if(exact) {
+ for(sf = hd_data->sysfsdrv; sf; sf = sf->next) {
+ if(!strcmp(sysfs_id, sf->device)) {
+ t = sf->driver;
+ break;
+ }
+ }
+ }
+ else {
+ u2 = strlen(sysfs_id);
+ u3 = 0;
+ for(sf = hd_data->sysfsdrv; sf; sf = sf->next) {
+ u1 = strlen(sf->device);
+ if(u1 > u3 && u1 <= u2 && !strncmp(sysfs_id, sf->device, u1)) {
+ u3 = u1;
+ t = sf->driver;
+ }
+ }
+ }
+
+ return t;
+}
+
+
+void add_partitions(hd_data_t *hd_data, hd_t *hd, char *path)
+{
+ hd_t *hd1;
+ str_list_t *sl;
+ char *s;
+ size_t len;
+
+ s = hd->unix_dev_name + sizeof "/dev/" - 1;
+ len = strlen(s);
+ for(sl = hd_data->partitions; sl; sl = sl->next) {
+ if(!strncmp(sl->str, s, len)) {
+ hd1 = add_hd_entry(hd_data, __LINE__, 0);
+ hd1->base_class.id = bc_partition;
+ str_printf(&hd1->unix_dev_name, 0, "/dev/%s", sl->str);
+ hd1->attached_to = hd->idx;
+
+ str_printf(&hd1->sysfs_id, 0, "%s/%s", hd->sysfs_id, hd_sysfs_dev2_name(sl->str));
+ }
+ }
+}
+
+
+void add_cdrom_info(hd_data_t *hd_data, hd_t *hd)
+{
+ cdrom_info_t *ci, **prev;
+
+ hd->detail = free_hd_detail(hd->detail);
+ hd->detail = new_mem(sizeof *hd->detail);
+ hd->detail->type = hd_detail_cdrom;
+
+ for(ci = *(prev = &hd_data->cdrom); ci; ci = *(prev = &ci->next)) {
+ if(!strcmp(hd->unix_dev_name + sizeof "/dev/" - 1, ci->name)) {
+ hd->detail->cdrom.data = ci;
+ *prev = ci->next;
+ hd->detail->cdrom.data->next = NULL;
+ break;
+ }
+ }
+
+ if((ci = hd->detail->cdrom.data)) {
+ /* update prog_if: cdr, cdrw, ... */
+ if(
+ /* ###### FIXME: dosn't work anyway: ide-scsi doesn't support sysfs */
+ hd->bus.id == bus_scsi &&
+ !search_str_list(hd->drivers, "ide-scsi") /* could be ide, though */
+ ) {
+ /* scsi devs lie */
+ if(ci->dvd && (ci->cdrw || ci->dvdr || ci->dvdram)) {
+ ci->dvd = ci->dvdr = ci->dvdram = 0;
+ }
+ ci->dvdr = ci->dvdram = 0;
+ ci->cdr = ci->cdrw = 0;
+ if(hd->prog_if.id == pif_cdr) ci->cdr = 1;
+ }
+
+ /* trust ide info */
+ if(ci->dvd) {
+ hd->is.dvd = 1;
+ hd->prog_if.id = pif_dvd;
+ }
+ if(ci->cdr) {
+ hd->is.cdr = 1;
+ hd->prog_if.id = pif_cdr;
+ }
+ if(ci->cdrw) {
+ hd->is.cdrw = 1;
+ hd->prog_if.id = pif_cdrw;
+ }
+ if(ci->dvdr) {
+ hd->is.dvdr = 1;
+ hd->prog_if.id = pif_dvdr;
+ }
+ if(ci->dvdram) {
+ hd->is.dvdram = 1;
+ hd->prog_if.id = pif_dvdram;
+ }
+ }
+
+ if(
+ hd_probe_feature(hd_data, pr_block_cdrom) &&
+ hd_report_this(hd_data, hd)
+ ) {
+ hd_read_cdrom_info(hd_data, hd);
+ }
+}
+
+
+void add_other_sysfs_info(hd_data_t *hd_data, hd_t *hd, struct sysfs_device *sf_dev)
+{
+ unsigned u0, u1;
+ char c;
+
+ if(hd->sysfs_id) {
+ if(
+ sscanf(hd->sysfs_id, "/block/cciss!c%ud%u", &u0, &u1) == 2
+ ) {
+ hd->slot = (u0 << 8) + u1;
+ str_printf(&hd->device.name, 0, "CCISS disk %u/%u", u0, u1);
+ }
+ else if(
+ sscanf(hd->sysfs_id, "/block/ida!c%ud%u", &u0, &u1) == 2
+ ) {
+ hd->slot = (u0 << 8) + u1;
+ str_printf(&hd->device.name, 0, "SMART Array %u/%u", u0, u1);
+ }
+ else if(
+ sscanf(hd->sysfs_id, "/block/rd!c%ud%u", &u0, &u1) == 2
+ ) {
+ hd->slot = (u0 << 8) + u1;
+ str_printf(&hd->device.name, 0, "DAC960 RAID Array %u/%u", u0, u1);
+ }
+ else if(
+ sscanf(hd->sysfs_id, "/block/i2o!hd%c", &c) == 1 &&
+ c >= 'a'
+ ) {
+ hd->slot = c - 'a';
+ str_printf(&hd->device.name, 0, "I2O disk %u", hd->slot);
+ }
+ else if(
+ sscanf(hd->sysfs_id, "/block/dasd%c", &c) == 1 &&
+ c >= 'a'
+ ) {
+ hd->slot = c - 'a';
+ hd->device.name = new_str("S390 Disk");
+ }
+ }
+
+ add_disk_size(hd_data, hd);
+}
+
+
+void add_ide_sysfs_info(hd_data_t *hd_data, hd_t *hd, struct sysfs_device *sf_dev)
+{
+ char *fname = NULL, buf[256], *dev_name, *s;
+ unsigned u0, u1, u2, size = 0;
+ str_list_t *sl, *sl0;
+ hd_res_t *res;
+ FILE *f;
+
+ if(!hd_report_this(hd_data, hd)) return;
+
+ if(hd->sysfs_bus_id && sscanf(hd->sysfs_bus_id, "%u.%u", &u0, &u1) == 2) {
+ /* host.master/slave */
+ hd->slot = (u0 << 1) + u1;
+ }
+
+ if(
+ hd->unix_dev_name &&
+ strlen(hd->unix_dev_name) > 5
+ ) {
+ dev_name = hd->unix_dev_name + 5;
+
+ str_printf(&fname, 0, PROC_IDE "/%s/media", dev_name);
+ if((sl = read_file(fname, 0, 1))) {
+
+ if(strstr(sl->str, "floppy"))
+ hd->sub_class.id = sc_sdev_floppy;
+ else if(strstr(sl->str, "cdrom"))
+ hd->sub_class.id = sc_sdev_cdrom;
+ else if(strstr(sl->str, "tape"))
+ hd->sub_class.id = sc_sdev_tape;
+
+ free_str_list(sl);
+ }
+
+ str_printf(&fname, 0, PROC_IDE "/%s/model", dev_name);
+ if((sl = read_file(fname, 0, 1))) {
+ hd->vendor.name = canon_str(sl->str, strlen(sl->str));
+ if((s = strchr(hd->vendor.name, ' '))) {
+ hd->device.name = canon_str(s, strlen(s));
+ if(*hd->device.name) {
+ *s = 0;
+ }
+ else {
+ hd->device.name = free_mem(hd->device.name);
+ }
+ }
+ if(!hd->device.name) {
+ hd->device.name = hd->vendor.name;
+ hd->vendor.name = NULL;
+ }
+
+ free_str_list(sl);
+ }
+
+ str_printf(&fname, 0, PROC_IDE "/%s/driver", dev_name);
+ if((sl = read_file(fname, 0, 1))) {
+ if((s = strchr(sl->str, ' '))) *s = 0;
+ s = canon_str(sl->str, strlen(sl->str));
+ add_str_list(&hd->drivers, s);
+ s = free_mem(s);
+ free_str_list(sl);
+ }
+
+ str_printf(&fname, 0, PROC_IDE "/%s/capacity", dev_name);
+ if((sl = read_file(fname, 0, 1))) {
+ if(sscanf(sl->str, "%u", &u0) == 1 && u0 != 0x7fffffff) {
+ res = add_res_entry(&hd->res, new_mem(sizeof *res));
+ res->size.type = res_size;
+ res->size.unit = size_unit_sectors;
+ res->size.val1 = size = u0;
+ res->size.val2 = 512; // ####### FIXME: sector size?
+ }
+ free_str_list(sl);
+ }
+
+ str_printf(&fname, 0, PROC_IDE "/%s/geometry", dev_name);
+ if((sl0 = read_file(fname, 0, 2))) {
+ for(sl = sl0; sl; sl = sl->next) {
+ if(sscanf(sl->str, " physical %u / %u / %u", &u0, &u1, &u2) == 3) {
+ if(u0 || u1 || u2) {
+ if(size && u1 && u2) {
+ u0 = size / (u1 * u2);
+ }
+ res = add_res_entry(&hd->res, new_mem(sizeof *res));
+ res->disk_geo.type = res_disk_geo;
+ res->disk_geo.cyls = u0;
+ res->disk_geo.heads = u1;
+ res->disk_geo.sectors = u2;
+ res->disk_geo.geotype = geo_physical;
+ }
+ continue;
+ }
+
+ if(sscanf(sl->str, " logical %u / %u / %u", &u0, &u1, &u2) == 3) {
+ if(size && u1 && u2) {
+ u0 = size / (u1 * u2);
+ }
+ res = add_res_entry(&hd->res, new_mem(sizeof *res));
+ res->disk_geo.type = res_disk_geo;
+ res->disk_geo.cyls = u0;
+ res->disk_geo.heads = u1;
+ res->disk_geo.sectors = u2;
+ res->disk_geo.geotype = geo_logical;
+ }
+ }
+ free_str_list(sl0);
+ }
+
+ str_printf(&fname, 0, PROC_IDE "/%s/cache", dev_name);
+ if((sl = read_file(fname, 0, 1))) {
+ if(sscanf(sl->str, "%u", &u0) == 1 && u0) {
+ res = add_res_entry(&hd->res, new_mem(sizeof *res));
+ res->cache.type = res_cache;
+ res->cache.size = u0;
+ }
+ free_str_list(sl);
+ }
+
+ str_printf(&fname, 0, PROC_IDE "/%s/identify", dev_name);
+ if((f = fopen(fname, "r"))) {
+ u1 = 0;
+ memset(buf, sizeof buf, 0);
+ while(u1 < sizeof buf - 1 && fscanf(f, "%x", &u0) == 1) {
+ buf[u1++] = u0 >> 8; buf[u1++] = u0;
+ }
+ fclose(f);
+
+ /* ok, we now have the ATA/ATAPI ident block */
+
+ if(buf[0x14] || buf[0x15]) { /* has serial id */
+ hd->serial = canon_str(buf + 0x14, 20);
+ }
+ if(buf[0x2e] || buf[0x2f]) { /* has revision id */
+ hd->revision.name = canon_str(buf + 0x2e, 8);
+ }
+ }
+
+ free_mem(fname);
+ }
+
+ if(!size) add_disk_size(hd_data, hd);
+}
+
+
+/*
+ * assumes hd->drivers aleady includes scsi device drivers (like 'sd')
+ */
+void add_scsi_sysfs_info(hd_data_t *hd_data, hd_t *hd, struct sysfs_device *sf_dev)
+{
+ hd_t *hd1;
+ char *s, *t, *cs, *pr_str;
+ unsigned u0, u1, u2, u3;
+ int fd, k;
+ unsigned char scsi_cmd_buf[0x300];
+ struct sg_io_hdr hdr;
+ unsigned char *uc;
+ scsi_t *scsi;
+ hd_res_t *geo, *size;
+ uint64_t ul0;
+
+ if(!hd_report_this(hd_data, hd)) return;
+
+ hd->detail = new_mem(sizeof *hd->detail);
+ hd->detail->type = hd_detail_scsi;
+ hd->detail->scsi.data = scsi = new_mem(sizeof *scsi);
+
+ if(hd->sysfs_bus_id && sscanf(hd->sysfs_bus_id, "%u:%u:%u:%u", &u0, &u1, &u2, &u3) == 4) {
+ /* host:channel:id:lun */
+ hd->slot = (u0 << 8) + (u1 << 4) + u2;
+ hd->func = u3;
+ }
+
+ if((s = hd_attr_str(sysfs_get_device_attr(sf_dev, "vendor")))) {
+ cs = canon_str(s, strlen(s));
+ ADD2LOG(" vendor = %s\n", cs);
+ if(*cs) {
+ hd->vendor.name = cs;
+ }
+ else {
+ free_mem(cs);
+ }
+ }
+
+ if((s = hd_attr_str(sysfs_get_device_attr(sf_dev, "model")))) {
+ cs = canon_str(s, strlen(s));
+ ADD2LOG(" model = %s\n", cs);
+ if(*cs) {
+ hd->device.name = cs;
+ }
+ else {
+ free_mem(cs);
+ }
+
+ /* sata entries are somewhat strange... */
+ if(
+ hd->vendor.name &&
+ !strcmp(hd->vendor.name, "ATA") &&
+ hd->device.name
+ ) {
+ hd->bus.id = bus_ide;
+
+ if((cs = strchr(hd->device.name, ' '))) {
+ t = canon_str(cs, strlen(cs));
+ if(*t) {
+ *cs = 0;
+ free_mem(hd->vendor.name);
+ hd->vendor.name = hd->device.name;
+ hd->device.name = t;
+ }
+ else {
+ t = free_mem(t);
+ }
+ }
+
+ if(!strcmp(hd->vendor.name, "ATA")) {
+ hd->vendor.name = free_mem(hd->vendor.name);
+ }
+ }
+ }
+
+ if((s = hd_attr_str(sysfs_get_device_attr(sf_dev, "rev")))) {
+ cs = canon_str(s, strlen(s));
+ ADD2LOG(" rev = %s\n", cs);
+ if(*cs) {
+ hd->revision.name = cs;
+ }
+ else {
+ free_mem(cs);
+ }
+ }
+
+ if(hd_attr_uint(sysfs_get_device_attr(sf_dev, "type"), &ul0, 0)) {
+ ADD2LOG(" type = %u\n", (unsigned) ul0);
+ if(ul0 == 6 /* scanner */) {
+ hd->sub_class.id = sc_sdev_scanner;
+ }
+ else if(ul0 == 3 /* processor */ && hd->vendor.name) {
+ if(
+ !strncmp(hd->vendor.name, "HP", sizeof "HP" - 1) ||
+ !strncmp(hd->vendor.name, "EPSON", sizeof "EPSON" - 1)
+ ) {
+ hd->sub_class.id = sc_sdev_scanner;
+ }
+ }
+
+ /*
+ * typically needed for usb card readers (unused slots)
+ */
+ if(
+ hd->base_class.id == bc_storage_device &&
+ hd->sub_class.id == sc_sdev_other
+ ) {
+ switch(ul0) {
+ case 0:
+ if(search_str_list(hd->drivers, "sd")) {
+ hd->sub_class.id = sc_sdev_disk;
+ }
+ break;
+
+ case 5:
+ if(search_str_list(hd->drivers, "sr")) {
+ hd->sub_class.id = sc_sdev_cdrom;
+ }
+ break;
+ }
+ }
+
+ }
+
+ /* s390: wwpn & fcp lun */
+ if(hd_attr_uint(sysfs_get_device_attr(sf_dev, "wwpn"), &ul0, 0)) {
+ ADD2LOG(" wwpn = 0x%016"PRIx64"\n", ul0);
+ scsi->wwpn = ul0;
+
+ /* it's a bit of a hack, actually */
+ t = new_str(hd_sysfs_id(sf_dev->path));
+ if(t) {
+ if((s = strrchr(t, '/'))) *s = 0;
+ if((s = strrchr(t, '/'))) *s = 0;
+ if((s = strrchr(t, '/'))) {
+ scsi->controller_id = new_str(s + 1);
+ }
+ }
+ t = free_mem(t);
+ }
+
+ if(hd_attr_uint(sysfs_get_device_attr(sf_dev, "fcp_lun"), &ul0, 0)) {
+ ADD2LOG(" fcp_lun = 0x%016"PRIx64"\n", ul0);
+ scsi->fcp_lun = ul0;
+ }
+
+ /* ppc: get rom id */
+ if((hd1 = hd_get_device_by_idx(hd_data, hd->attached_to)) && hd1->rom_id) {
+ str_printf(&hd->rom_id, 0, "%s/@%u", hd1->rom_id, (hd->slot & 0xf));
+ }
+
+ pr_str = NULL;
+
+ if(
+ hd_report_this(hd_data, hd) &&
+ hd->unix_dev_name &&
+ hd->sub_class.id == sc_sdev_cdrom &&
+ hd_data->in_vmware != 1 /* VMWare doesn't like it */
+ ) {
+ PROGRESS(5, 0, hd->unix_dev_name);
+ fd = open(hd->unix_dev_name, O_RDONLY | O_NONBLOCK);
+ if(fd >= 0) {
+
+ str_printf(&pr_str, 0, "%s cache", hd->unix_dev_name);
+ PROGRESS(5, 1, pr_str);
+
+ memset(scsi_cmd_buf, 0, sizeof scsi_cmd_buf);
+ memset(&hdr, 0, sizeof(hdr));
+
+ hdr.interface_id = 'S';
+ hdr.cmd_len = 6;
+ hdr.dxfer_direction = SG_DXFER_FROM_DEV;
+ hdr.dxferp = scsi_cmd_buf + 8 + 6;
+ hdr.dxfer_len = 0xff;
+ hdr.cmdp = scsi_cmd_buf + 8;
+ hdr.cmdp[0] = 0x1a;
+ hdr.cmdp[2] = 0x08;
+ hdr.cmdp[4] = 0xff;
+
+ k = ioctl(fd, SG_IO, &hdr);
+
+ if(k) {
+ ADD2LOG("%s status(0x1a:8) 0x%x\n", hd->unix_dev_name, k);
+ }
+ else {
+ unsigned char *ptr = hdr.dxferp;
+
+ uc = ptr + 4 + ptr[3] + 2;
+ scsi->cache = uc[0];
+ ADD2LOG(" scsi cache: 0x%02x\n", uc[0]);
+
+ if((scsi->cache & 4)) {
+ hd->prog_if.id = pif_cdr;
+ }
+ }
+
+ close(fd);
+ }
+ }
+
+
+ if(
+ hd_report_this(hd_data, hd) &&
+ hd->unix_dev_name &&
+ hd->sub_class.id == sc_sdev_disk &&
+ !hd_probe_feature(hd_data, pr_scsi_noserial)
+ ) {
+ PROGRESS(5, 0, hd->unix_dev_name);
+ fd = open(hd->unix_dev_name, O_RDONLY | O_NONBLOCK);
+ if(fd >= 0) {
+
+ str_printf(&pr_str, 0, "%s geo", hd->unix_dev_name);
+ PROGRESS(5, 1, pr_str);
+
+ if(hd_getdisksize(hd_data, hd->unix_dev_name, fd, &geo, &size) == 1) {
+ /* (low-level) unformatted disk */
+ hd->is.notready = 1;
+ }
+
+ if(geo) add_res_entry(&hd->res, geo);
+ if(size) add_res_entry(&hd->res, size);
+
+ str_printf(&pr_str, 0, "%s serial", hd->unix_dev_name);
+ PROGRESS(5, 2, pr_str);
+
+ memset(scsi_cmd_buf, 0, sizeof scsi_cmd_buf);
+ memset(&hdr, 0, sizeof(hdr));
+
+ hdr.interface_id = 'S';
+ hdr.cmd_len = 6;
+ hdr.dxfer_direction = SG_DXFER_FROM_DEV;
+ hdr.dxferp = scsi_cmd_buf + 8 + 6;
+ hdr.dxfer_len = 0x24;
+ hdr.cmdp = scsi_cmd_buf + 8;
+ hdr.cmdp[0] = 0x12;
+ hdr.cmdp[1] = 0x01;
+ hdr.cmdp[2] = 0x80;
+ hdr.cmdp[4] = 0x24;
+
+ k = ioctl(fd, SG_IO, &hdr);
+
+ if(k) {
+ ADD2LOG("%s status(0x12) 0x%x\n", scsi->dev_name, k);
+ }
+ else {
+ unsigned char *ptr = hdr.dxferp;
+
+ ADD2LOG(" serial id len: %u\n", ptr[3]);
+
+ if((hd->serial = canon_str(ptr + 4, ptr[3]))) {
+ if(!*hd->serial) hd->serial = free_mem(hd->serial);
+ }
+ }
+
+ close(fd);
+ }
+ }
+
+ pr_str = free_mem(pr_str);
+
+
+ if(
+ hd->base_class.id == bc_storage_device &&
+ hd->sub_class.id == sc_sdev_scanner
+ ) {
+ hd->base_class.id = bc_scanner;
+ }
+
+ // ###### FIXME: usb-storage: disk vs. floppy?
+
+}
+
+
+void read_partitions(hd_data_t *hd_data)
+{
+ str_list_t *sl, *sl0, *pl0 = NULL;
+ char buf[256], *s1, *name, *base;
+ char *last_base = new_str(" ");
+ char *last_name = new_str(" ");
+ int l, is_disk;
+
+ if(!(sl0 = read_file(PROC_PARTITIONS, 2, 0))) return;
+
+ if(hd_data->debug) {
+ ADD2LOG("----- "PROC_PARTITIONS" -----\n");
+ for(sl = sl0; sl; sl = sl->next) {
+ ADD2LOG(" %s", sl->str);
+ }
+ ADD2LOG("----- "PROC_PARTITIONS" end -----\n");
+ }
+
+ for(sl = sl0; sl; sl = sl->next) {
+ *buf = 0;
+ if(sscanf(sl->str, "%*s %*s %*s %255s", buf) > 0) {
+ if(*buf) add_str_list(&pl0, buf);
+ }
+ }
+
+ free_str_list(sl0);
+
+ for(is_disk = 1, sl = pl0; sl; sl = sl->next) {
+ base = sl->str;
+ l = strlen(base);
+ if(!l) continue;
+
+ s1 = base + l - 1;
+ while(isdigit(*s1) && s1 > base) s1--;
+ if(s1 == base) continue;
+
+ name = new_str(base);
+ s1[1] = 0;
+
+ if(!strcmp(last_base, base)) {
+ if(!strcmp(last_name, base)) is_disk = 0;
+ }
+ else {
+ is_disk = strncmp(last_name, base, strlen(last_name)) ? 1 : 0;
+ }
+
+ if(!search_str_list(hd_data->cdroms, name)) {
+ if(
+ strncmp(name, "loop", sizeof "loop" - 1) &&
+ (
+ hd_data->flags.list_md ||
+ (
+ strncmp(name, "md", sizeof "md" - 1) &&
+ strncmp(name, "dm-", sizeof "dm-" - 1)
+ )
+ )
+ ) {
+ add_str_list(is_disk ? &hd_data->disks : &hd_data->partitions, name);
+ }
+ }
+ free_mem(last_base);
+ free_mem(last_name);
+
+ last_base = new_str(base);
+ last_name = name; name = NULL;
+ }
+
+ free_mem(last_base);
+ free_mem(last_name);
+
+ free_str_list(pl0);
+
+ if(hd_data->debug) {
+ ADD2LOG("disks:\n");
+ for(sl = hd_data->disks; sl; sl = sl->next) ADD2LOG(" %s\n", sl->str);
+ ADD2LOG("partitions:\n");
+ for(sl = hd_data->partitions; sl; sl = sl->next) ADD2LOG(" %s\n", sl->str);
+ }
+}
+
+
+/*
+ * Read iso9660/el torito info, if there is a CD inserted.
+ * Returns NULL if nothing was found
+ */
+cdrom_info_t *hd_read_cdrom_info(hd_data_t *hd_data, hd_t *hd)
+{
+ int fd;
+ char *s;
+ cdrom_info_t *ci;
+ struct iso_primary_descriptor iso_desc;
+ unsigned char sector[0x800];
+ unsigned et;
+ unsigned u0, u1, u2;
+
+#ifdef LIBHD_MEMCHECK
+ {
+ if(libhd_log)
+ fprintf(libhd_log, "; %s\t%p\t%p\n", __FUNCTION__, CALLED_FROM(hd_read_cdrom_info, hd_data), hd_data);
+ }
+#endif
+
+ /* free existing entry */
+ if(hd->detail && hd->detail->type != hd_detail_cdrom) {
+ hd->detail = free_hd_detail(hd->detail);
+ }
+
+ if(!hd->detail) {
+ hd->detail = new_mem(sizeof *hd->detail);
+ hd->detail->type = hd_detail_cdrom;
+ hd->detail->cdrom.data = new_mem(sizeof *hd->detail->cdrom.data);
+ }
+
+ ci = hd->detail->cdrom.data;
+
+ hd->is.notready = 0;
+
+ if((fd = open(hd->unix_dev_name, O_RDONLY)) < 0) {
+ /* we are here if there is no CD in the drive */
+ hd->is.notready = 1;
+ return NULL;
+ }
+
+ ci->iso9660.ok = 0;
+ if(
+ lseek(fd, 0x8000, SEEK_SET) >= 0 &&
+ read(fd, &iso_desc, sizeof iso_desc) == sizeof iso_desc
+ ) {
+ ci->cdrom = 1;
+ if(!memcmp(iso_desc.id, "CD001", 5)) {
+ ci->iso9660.ok = 1;
+ /* now, fill in the fields */
+ s = canon_str(iso_desc.volume_id, sizeof iso_desc.volume_id);
+ if(!*s) s = free_mem(s);
+ ci->iso9660.volume = s;
+
+ s = canon_str(iso_desc.publisher_id, sizeof iso_desc.publisher_id);
+ if(!*s) s = free_mem(s);
+ ci->iso9660.publisher = s;
+
+ s = canon_str(iso_desc.preparer_id, sizeof iso_desc.preparer_id);
+ if(!*s) s = free_mem(s);
+ ci->iso9660.preparer = s;
+
+ s = canon_str(iso_desc.application_id, sizeof iso_desc.application_id);
+ if(!*s) s = free_mem(s);
+ ci->iso9660.application = s;
+
+ s = canon_str(iso_desc.creation_date, sizeof iso_desc.creation_date);
+ if(!*s) s = free_mem(s);
+ ci->iso9660.creation_date = s;
+ }
+ }
+
+ if(
+ ci->iso9660.ok &&
+ lseek(fd, 0x8800, SEEK_SET) >= 0 &&
+ read(fd, §or, sizeof sector) == sizeof sector
+ ) {
+ if(
+ sector[0] == 0 && sector[6] == 1 &&
+ !memcmp(sector + 1, "CD001", 5) &&
+ !memcmp(sector + 7, "EL TORITO SPECIFICATION", 23)
+ ) {
+ et = sector[0x47] + (sector[0x48] << 8) + (sector[0x49] << 16) + (sector[0x4a] << 24);
+ ADD2LOG(" %s: el torito boot catalog at 0x%04x\n", ci->name, et);
+ if(
+ lseek(fd, et * 0x800, SEEK_SET) >= 0 &&
+ read(fd, §or, sizeof sector) == sizeof sector &&
+ sector[0] == 1
+ ) {
+ ci->el_torito.ok = 1;
+ ci->el_torito.catalog = et;
+ ci->el_torito.platform = sector[1];
+ s = canon_str(sector + 4, 24);
+ if(!*s) s = free_mem(s);
+ ci->el_torito.id_string = s;
+ ci->el_torito.bootable = sector[0x20] == 0x88 ? 1 : 0;
+ ci->el_torito.media_type = sector[0x21];
+ ADD2LOG(" media type: %u\n", ci->el_torito.media_type);
+ ci->el_torito.load_address = (sector[0x22] + (sector[0x23] << 8)) << 4;
+ ADD2LOG(" load address: 0x%04x\n", ci->el_torito.load_address);
+#if 0
+ if(ci->el_torito.platform == 0 && ci->el_torito.load_address == 0)
+ ci->el_torito.load_address = 0x7c00;
+#endif
+ ci->el_torito.load_count = sector[0x26] + (sector[0x27] << 8);
+ ci->el_torito.start = sector[0x28] + (sector[0x29] << 8) + (sector[0x2a] << 16) + (sector[0x2b] << 24);
+ if(ci->el_torito.media_type >= 1 && ci->el_torito.media_type <= 3) {
+ ci->el_torito.geo.c = 80;
+ ci->el_torito.geo.h = 2;
+ }
+ switch(ci->el_torito.media_type) {
+ case 1:
+ ci->el_torito.geo.s = 15;
+ break;
+ case 2:
+ ci->el_torito.geo.s = 18;
+ break;
+ case 3:
+ ci->el_torito.geo.s = 36;
+ break;
+ }
+ if(
+ lseek(fd, ci->el_torito.start * 0x800, SEEK_SET) >= 0 &&
+ read(fd, §or, sizeof sector) == sizeof sector
+ ) {
+ if(ci->el_torito.media_type == 4) {
+ /* ##### we should go on and read the 1st partition sector in this case... */
+ ci->el_torito.geo.h = (unsigned) sector[0x1be + 5] + 1;
+ ci->el_torito.geo.s = sector[0x1be + 6] & 0x3f;
+ ci->el_torito.geo.c = sector[0x1be + 7] + (((unsigned) sector[0x1be + 6] >> 6) << 8);
+ }
+ if(
+ sector[0x1fe] == 0x55 && sector[0x1ff] == 0xaa &&
+ sector[0x0b] == 0 && sector[0x0c] == 2 &&
+ sector[0x0e] == 1 && sector[0x0f] == 0
+ ) {
+ u0 = sector[0x13] + (sector[0x14] << 8); /* partition size */
+ u1 = sector[0x18] + (sector[0x19] << 8); /* sectors per track */
+ u2 = sector[0x1a] + (sector[0x1b] << 8); /* heads */
+ u0 = u0 ? u0 : sector[0x20] + (sector[0x21] << 8) + (sector[0x22] << 16) + ((unsigned) sector[0x23] << 24);
+ if(sector[0x26] == 0x29) {
+ s = canon_str(sector + 0x2b, 11);
+ if(!*s) s = free_mem(s);
+ ci->el_torito.label = s;
+ }
+ if(!ci->el_torito.label) {
+ s = canon_str(sector + 3, 8);
+ if(!*s) s = free_mem(s);
+ ci->el_torito.label = s;
+ }
+ if(
+ (ci->el_torito.media_type == 0 || ci->el_torito.media_type > 3) &&
+ u0 && u1 && u2
+ ) {
+ ci->el_torito.geo.h = u2;
+ ci->el_torito.geo.s = u1;
+ ci->el_torito.geo.size = u0;
+ ci->el_torito.geo.c = ci->el_torito.geo.size / (u1 * u2);
+ }
+ }
+ }
+
+ ci->el_torito.geo.size = ci->el_torito.geo.s * ci->el_torito.geo.c * ci->el_torito.geo.h;
+ }
+ }
+ }
+
+ close(fd);
+
+ return ci;
+}
+
+
+/*
+ * Read the list of CDROM devices known to the kernel. The info is taken
+ * from /proc/sys/dev/cdrom/info.
+ */
+void read_cdroms(hd_data_t *hd_data)
+{
+ char *s, *t, *v;
+ str_list_t *sl, *sl0;
+ cdrom_info_t *ci;
+ int i, line, entries = 0;
+ unsigned val;
+
+ if(!(sl0 = read_file(PROC_CDROM_INFO, 2, 0))) return;
+
+ if((hd_data->debug & HD_DEB_CDROM)) {
+ ADD2LOG("----- "PROC_CDROM_INFO" -----\n");
+ for(sl = sl0; sl; sl = sl->next) {
+ if(*sl->str != '\n') ADD2LOG("%s", sl->str);
+ }
+ ADD2LOG("----- "PROC_CDROM_INFO" end -----\n");
+ }
+
+ for(sl = sl0; sl; sl = sl->next) {
+ if(
+ (line = 0, strstr(sl->str, "drive name:") == sl->str) ||
+ (line++, strstr(sl->str, "drive speed:") == sl->str) ||
+ (line++, strstr(sl->str, "Can write CD-R:") == sl->str) ||
+ (line++, strstr(sl->str, "Can write CD-RW:") == sl->str) ||
+ (line++, strstr(sl->str, "Can read DVD:") == sl->str) ||
+ (line++, strstr(sl->str, "Can write DVD-R:") == sl->str) ||
+ (line++, strstr(sl->str, "Can write DVD-RAM:") == sl->str)
+ ) {
+ s = strchr(sl->str, ':') + 1;
+ i = 0;
+ while((t = strsep(&s, " \t\n"))) {
+ if(!*t) continue;
+ i++;
+ switch(line) {
+ case 0: /* drive name */
+ ci = new_cdrom_entry(&hd_data->cdrom);
+ entries++;
+ add_str_list(&hd_data->cdroms, t);
+ ci->name = new_str(t);
+ break;
+
+ case 1: /* drive speed */
+ case 2: /* Can write CD-R */
+ case 3: /* Can write CD-RW */
+ case 4: /* Can read DVD */
+ case 5: /* Can write DVD-R */
+ case 6: /* Can write DVD-RAM */
+ ci = get_cdrom_entry(hd_data->cdrom, entries - i);
+ if(ci) {
+ val = strtoul(t, &v, 10);
+ if(!*v) {
+ switch(line) {
+ case 1:
+ ci->speed = val;
+ break;
+ case 2:
+ ci->cdr = val;
+ break;
+ case 3:
+ ci->cdrw = val;
+ break;
+ case 4:
+ ci->dvd = val;
+ break;
+ case 5:
+ ci->dvdr = val;
+ break;
+ case 6:
+ ci->dvdram = val;
+ break;
+ }
+ }
+ }
+ break;
+ }
+ }
+ }
+ }
+
+ free_str_list(sl0);
+}
+
+
+/* add new entries at the _start_ of the list */
+cdrom_info_t *new_cdrom_entry(cdrom_info_t **ci)
+{
+ cdrom_info_t *new_ci = new_mem(sizeof *new_ci);
+
+ new_ci->next = *ci;
+ return *ci = new_ci;
+}
+
+
+/* return nth entry */
+cdrom_info_t *get_cdrom_entry(cdrom_info_t *ci, int n)
+{
+ if(n < 0) return NULL;
+
+ while(n--) {
+ if(!ci) return NULL;
+ ci = ci->next;
+ }
+
+ return ci;
+}
+
+
+/*
+ * Add generic scsi devs.
+ */
+void hd_scan_sysfs_scsi(hd_data_t *hd_data)
+{
+ if(!hd_probe_feature(hd_data, pr_scsi)) return;
+
+ hd_data->module = mod_scsi;
+
+ /* some clean-up */
+ remove_hd_entries(hd_data);
+
+ PROGRESS(1, 0, "scsi modules");
+
+ load_module(hd_data, "sg");
+
+ PROGRESS(2, 0, "scsi tape");
+
+ get_scsi_tape(hd_data);
+
+ PROGRESS(3, 0, "scsi generic");
+
+ get_generic_scsi_devs(hd_data);
+}
+
+
+void get_scsi_tape(hd_data_t *hd_data)
+{
+ char *s, *t;
+ unsigned u1, u2, u3;
+ uint64_t ul0;
+ hd_t *hd, *hd1;
+ hd_dev_num_t dev_num;
+
+ struct sysfs_class *sf_class;
+ struct sysfs_class_device *sf_cdev;
+ struct sysfs_device *sf_dev;
+ struct dlist *sf_cdev_list;
+
+ sf_class = sysfs_open_class("scsi_tape");
+
+ if(!sf_class) {
+ ADD2LOG("sysfs: no such class: scsi_tape\n");
+ return;
+ }
+
+ sf_cdev_list = sysfs_get_class_devices(sf_class);
+ if(sf_cdev_list) dlist_for_each_data(sf_cdev_list, sf_cdev, struct sysfs_class_device) {
+ ADD2LOG(
+ " scsi tape: name = %s, path = %s\n",
+ sf_cdev->name,
+ hd_sysfs_id(sf_cdev->path)
+ );
+
+ memset(&dev_num, 0, sizeof dev_num);
+
+ if((s = hd_attr_str(sysfs_get_classdev_attr(sf_cdev, "dev")))) {
+ if(sscanf(s, "%u:%u", &u1, &u2) == 2) {
+ dev_num.type = 'c';
+ dev_num.major = u1;
+ dev_num.minor = u2;
+ dev_num.range = 1;
+ }
+ ADD2LOG(" dev = %u:%u\n", u1, u2);
+ }
+
+ if(hd_attr_uint(sysfs_get_classdev_attr(sf_cdev, "range"), &ul0, 0)) {
+ dev_num.range = ul0;
+ ADD2LOG(" range = %u\n", dev_num.range);
+ }
+
+ sf_dev = sysfs_get_classdev_device(sf_cdev);
+ if(sf_dev) {
+ s = hd_sysfs_id(sf_dev->path);
+ ADD2LOG(
+ " scsi device: bus = %s, bus_id = %s driver = %s\n path = %s\n",
+ sf_dev->bus,
+ sf_dev->bus_id,
+ sf_dev->driver_name,
+ s
+ );
+
+ for(hd = hd_data->hd; hd; hd = hd->next) {
+ if(
+ hd->module == hd_data->module &&
+ hd->sysfs_device_link &&
+ hd->base_class.id == bc_storage_device &&
+ hd->sub_class.id == sc_sdev_tape &&
+ s &&
+ !strcmp(hd->sysfs_device_link, s)
+ ) break;
+ }
+
+ if(!hd) {
+ hd = add_hd_entry(hd_data, __LINE__, 0);
+ hd->base_class.id = bc_storage_device;
+ hd->sub_class.id = sc_sdev_tape;
+
+ hd->bus.id = bus_scsi;
+
+ hd->sysfs_device_link = new_str(s);
+
+ hd->sysfs_bus_id = new_str(sf_dev->bus_id);
+
+ /* parent has longest matching sysfs id */
+ u2 = strlen(s);
+ for(u3 = 0, hd1 = hd_data->hd; hd1; hd1 = hd1->next) {
+ if(hd1->sysfs_id) {
+ u1 = strlen(hd1->sysfs_id);
+ if(u1 > u3 && u1 <= u2 && !strncmp(s, hd1->sysfs_id, u1)) {
+ u3 = u1;
+ hd->attached_to = hd1->idx;
+ }
+ }
+ }
+
+ /* find longest matching sysfs id we have a driver for */
+ s = new_str(s);
+ t = strrchr(s, '/');
+ if(t) *t = 0;
+ t = hd_sysfs_find_driver(hd_data, s, 0);
+ if(t) {
+ add_str_list(&hd->drivers, t);
+ }
+ s = free_mem(s);
+
+ if(
+ sf_dev->driver_name &&
+ *sf_dev->driver_name &&
+ strcmp(sf_dev->driver_name, "unknown")
+ ) {
+ add_str_list(&hd->drivers, sf_dev->driver_name);
+ }
+
+ add_scsi_sysfs_info(hd_data, hd, sf_dev);
+ }
+
+ s = hd_sysfs_name2_dev(sf_cdev->name);
+
+ if(!hd->unix_dev_name || strlen(s) + sizeof "/dev/" - 1 < strlen(hd->unix_dev_name)) {
+ str_printf(&hd->unix_dev_name, 0, "/dev/%s", s);
+ hd->unix_dev_num = dev_num;
+ free_mem(hd->sysfs_id);
+ hd->sysfs_id = new_str(hd_sysfs_id(sf_cdev->path));
+ }
+ }
+ }
+
+ sysfs_close_class(sf_class);
+}
+
+
+void get_generic_scsi_devs(hd_data_t *hd_data)
+{
+ char *s, *t;
+ unsigned u1, u2, u3;
+ uint64_t ul0;
+ hd_t *hd, *hd1;
+ hd_dev_num_t dev_num;
+
+ struct sysfs_class *sf_class;
+ struct sysfs_class_device *sf_cdev;
+ struct sysfs_device *sf_dev;
+ struct dlist *sf_cdev_list;
+
+ sf_class = sysfs_open_class("scsi_generic");
+
+ if(!sf_class) {
+ ADD2LOG("sysfs: no such class: scsi_generic\n");
+ return;
+ }
+
+ sf_cdev_list = sysfs_get_class_devices(sf_class);
+ if(sf_cdev_list) dlist_for_each_data(sf_cdev_list, sf_cdev, struct sysfs_class_device) {
+ ADD2LOG(
+ " scsi: name = %s, path = %s\n",
+ sf_cdev->name,
+ hd_sysfs_id(sf_cdev->path)
+ );
+
+ memset(&dev_num, 0, sizeof dev_num);
+
+ if((s = hd_attr_str(sysfs_get_classdev_attr(sf_cdev, "dev")))) {
+ if(sscanf(s, "%u:%u", &u1, &u2) == 2) {
+ dev_num.type = 'c';
+ dev_num.major = u1;
+ dev_num.minor = u2;
+ dev_num.range = 1;
+ }
+ ADD2LOG(" dev = %u:%u\n", u1, u2);
+ }
+
+ if(hd_attr_uint(sysfs_get_classdev_attr(sf_cdev, "range"), &ul0, 0)) {
+ dev_num.range = ul0;
+ ADD2LOG(" range = %u\n", dev_num.range);
+ }
+
+ sf_dev = sysfs_get_classdev_device(sf_cdev);
+ if(sf_dev) {
+ s = hd_sysfs_id(sf_dev->path);
+
+ ADD2LOG(
+ " scsi device: bus = %s, bus_id = %s driver = %s\n path = %s\n",
+ sf_dev->bus,
+ sf_dev->bus_id,
+ sf_dev->driver_name,
+ s
+ );
+ }
+
+ for(hd = hd_data->hd; hd; hd = hd->next) {
+ if(
+ hd->sysfs_device_link &&
+ hd->bus.id == bus_scsi &&
+ s &&
+ !strcmp(hd->sysfs_device_link, s)
+ ) break;
+ }
+
+ if(hd) {
+ if(!hd->unix_dev_name2) {
+ str_printf(&hd->unix_dev_name2, 0, "/dev/%s", hd_sysfs_name2_dev(sf_cdev->name));
+ hd->unix_dev_num2 = dev_num;
+ }
+ }
+
+ hd = NULL;
+
+ if(
+ sf_dev &&
+ sf_dev->driver_name &&
+ !strcmp(sf_dev->driver_name, "unknown")
+ ) {
+ hd = add_hd_entry(hd_data, __LINE__, 0);
+ hd->base_class.id = bc_storage_device;
+ hd->sub_class.id = sc_sdev_other;
+
+ str_printf(&hd->unix_dev_name, 0, "/dev/%s", hd_sysfs_name2_dev(sf_cdev->name));
+
+ hd->bus.id = bus_scsi;
+
+ hd->sysfs_id = new_str(hd_sysfs_id(sf_cdev->path));
+
+ hd->unix_dev_num = dev_num;
+
+ if(sf_dev) hd->sysfs_bus_id = new_str(sf_dev->bus_id);
+
+ if(sf_dev && (s = hd_sysfs_id(sf_dev->path))) {
+
+ /* parent has longest matching sysfs id */
+ u2 = strlen(s);
+ for(u3 = 0, hd1 = hd_data->hd; hd1; hd1 = hd1->next) {
+ if(hd1->sysfs_id) {
+ u1 = strlen(hd1->sysfs_id);
+ if(u1 > u3 && u1 <= u2 && !strncmp(s, hd1->sysfs_id, u1)) {
+ u3 = u1;
+ hd->attached_to = hd1->idx;
+ }
+ }
+ }
+
+ /* find longest matching sysfs id we have a driver for */
+ s = new_str(s);
+ t = strrchr(s, '/');
+ if(t) *t = 0;
+ t = hd_sysfs_find_driver(hd_data, s, 0);
+ if(t) {
+ add_str_list(&hd->drivers, t);
+ }
+ s = free_mem(s);
+
+ }
+
+ add_scsi_sysfs_info(hd_data, hd, sf_dev);
+
+ }
+
+ }
+
+ sysfs_close_class(sf_class);
+}
+
+
+void add_disk_size(hd_data_t *hd_data, hd_t *hd)
+{
+ hd_res_t *geo, *size;
+ int fd;
+ char *pr_str;
+
+ pr_str = NULL;
+
+ if(
+ hd->unix_dev_name &&
+ hd->sub_class.id == sc_sdev_disk
+ ) {
+ PROGRESS(5, 0, hd->unix_dev_name);
+ fd = open(hd->unix_dev_name, O_RDONLY | O_NONBLOCK);
+ if(fd >= 0) {
+
+ str_printf(&pr_str, 0, "%s geo", hd->unix_dev_name);
+ PROGRESS(5, 1, pr_str);
+
+ if(hd_getdisksize(hd_data, hd->unix_dev_name, fd, &geo, &size) == 1) {
+ /* (low-level) unformatted disk */
+ hd->is.notready = 1;
+ }
+
+ if(geo) add_res_entry(&hd->res, geo);
+ if(size) add_res_entry(&hd->res, size);
+
+ close(fd);
+ }
+ }
+
+ pr_str = free_mem(pr_str);
+}
+
+
--- /dev/null
+void hd_scan_sysfs_block(hd_data_t *hd_data);
+void hd_scan_sysfs_scsi(hd_data_t *hd_data);
--- /dev/null
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <termios.h>
+
+#include "hd.h"
+#include "hd_int.h"
+#include "braille.h"
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ * braille displays
+ *
+ * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ */
+
+#if !defined(LIBHD_TINY) && !defined(__sparc__)
+
+static unsigned do_alva(hd_data_t *hd_data, char *dev_name, int cnt);
+static unsigned do_fhp(hd_data_t *hd_data, char *dev_name, unsigned baud, int cnt);
+static unsigned do_ht(hd_data_t *hd_data, char *dev_name, int cnt);
+static unsigned do_baum(hd_data_t *hd_data, char *dev_name, int cnt);
+
+void hd_scan_braille(hd_data_t *hd_data)
+{
+ hd_t *hd, *hd_tmp;
+ int cnt = 0;
+ unsigned dev, vend;
+
+ if(!hd_probe_feature(hd_data, pr_braille)) return;
+
+ hd_data->module = mod_braille;
+
+ /* some clean-up */
+ remove_hd_entries(hd_data);
+
+ for(hd = hd_data->hd; hd; hd = hd->next) {
+ if(
+ hd->base_class.id == bc_comm &&
+ hd->sub_class.id == sc_com_ser &&
+ hd->unix_dev_name &&
+ !hd->tag.ser_skip &&
+ !has_something_attached(hd_data, hd)
+ ) {
+ cnt++;
+ dev = vend = 0;
+
+ if(hd_probe_feature(hd_data, pr_braille_alva)) {
+ PROGRESS(1, cnt, "alva");
+ vend = MAKE_ID(TAG_SPECIAL, 0x5001);
+ dev = do_alva(hd_data, hd->unix_dev_name, cnt);
+ }
+
+ if(!dev && hd_probe_feature(hd_data, pr_braille_fhp)) {
+ PROGRESS(1, cnt, "fhp_old");
+ vend = MAKE_ID(TAG_SPECIAL, 0x5002);
+ dev = do_fhp(hd_data, hd->unix_dev_name, B19200, cnt);
+ if(!dev) {
+ PROGRESS(1, cnt, "fhp_el");
+ dev = do_fhp(hd_data, hd->unix_dev_name, B38400, cnt);
+ }
+ }
+
+ if(!dev && hd_probe_feature(hd_data, pr_braille_ht)) {
+ PROGRESS(1, cnt, "ht");
+ vend = MAKE_ID(TAG_SPECIAL, 0x5003);
+ dev = do_ht(hd_data, hd->unix_dev_name, cnt);
+ }
+
+ if(!dev && hd_probe_feature(hd_data, pr_braille_baum)) {
+ PROGRESS(1, cnt, "baum");
+ vend = MAKE_ID(TAG_SPECIAL, 0x5004);
+ dev = do_baum(hd_data, hd->unix_dev_name, cnt);
+ }
+
+ if(dev) {
+ hd_tmp = add_hd_entry(hd_data, __LINE__, 0);
+ hd_tmp->base_class.id = bc_braille;
+ hd_tmp->bus.id = bus_serial;
+ hd_tmp->unix_dev_name = new_str(hd->unix_dev_name);
+ hd_tmp->attached_to = hd->idx;
+ hd_tmp->vendor.id = vend;
+ hd_tmp->device.id = dev;
+ }
+ }
+ }
+}
+
+
+/*
+ * autodetect for Alva Braille-displays
+ * Author: marco Skambraks <marco@suse.de>
+ * Suse GmbH Nuernberg
+ *
+ * This is free software, placed under the terms of the
+ * GNU General Public License, as published by the Free Software
+ * Foundation. Please see the file COPYING for details.
+*/
+
+/* Communication codes */
+#define BRL_ID "\033ID="
+
+
+#define WAIT_DTR 700000
+#define WAIT_FLUSH 200
+
+unsigned do_alva(hd_data_t *hd_data, char *dev_name, int cnt)
+{
+ int fd, i, timeout = 100;
+ struct termios oldtio, newtio; /* old & new terminal settings */
+ int model = -1;
+ unsigned char buffer[sizeof BRL_ID];
+ unsigned dev = 0;
+
+ PROGRESS(2, cnt, "alva open");
+
+ /* Open the Braille display device for random access */
+ fd = open(dev_name, O_RDWR | O_NOCTTY);
+ if(fd < 0) return 0;
+
+ tcgetattr(fd, &oldtio); /* save current settings */
+
+ /* Set flow control and 8n1, enable reading */
+ memset(&newtio, 0, sizeof newtio);
+ newtio.c_cflag = CRTSCTS | CS8 | CLOCAL | CREAD;
+ /* Ignore bytes with parity errors and make terminal raw and dumb */
+ newtio.c_iflag = IGNPAR;
+ newtio.c_oflag = 0; /* raw output */
+ newtio.c_lflag = 0; /* don't echo or generate signals */
+ newtio.c_cc[VMIN] = 0; /* set nonblocking read */
+ newtio.c_cc[VTIME] = 0;
+
+ PROGRESS(3, cnt, "alva init ok");
+
+ PROGRESS(4, cnt, "alva read data");
+
+ /* autodetecting ABT model */
+ /* to force DTR off */
+ cfsetispeed(&newtio, B0);
+ cfsetospeed(&newtio, B0);
+ tcsetattr(fd, TCSANOW, &newtio); /* activate new settings */
+ usleep(WAIT_DTR);
+
+ tcflush(fd, TCIOFLUSH); /* clean line */
+ usleep(WAIT_FLUSH);
+
+ /* DTR back on */
+ cfsetispeed(&newtio, B9600);
+ cfsetospeed(&newtio, B9600);
+ tcsetattr(fd, TCSANOW, &newtio); /* activate new settings */
+ usleep(WAIT_DTR); /* give time to send ID string */
+
+ if((i = read(fd, buffer, sizeof buffer)) == sizeof buffer) {
+ if(!strncmp(buffer, BRL_ID, sizeof BRL_ID - 1)) {
+ /* Find out which model we are connected to... */
+ switch(model = buffer[sizeof buffer - 1])
+ {
+ case 1:
+ case 2:
+ case 3:
+ case 4:
+ case 0x0b:
+ case 0x0d:
+ case 0x0e:
+ dev = MAKE_ID(TAG_SPECIAL, model);
+ break;
+ }
+ }
+ }
+ ADD2LOG("alva.%d@%s[%d]: ", timeout, dev_name, i);
+ if(i > 0) hexdump(&hd_data->log, 1, i, buffer);
+ ADD2LOG("\n");
+
+ PROGRESS(5, cnt, "alva read done");
+
+ /* reset serial lines */
+ tcflush(fd, TCIOFLUSH);
+ tcsetattr(fd, TCSAFLUSH, &oldtio);
+ close(fd);
+
+ return dev;
+}
+
+
+/*
+ * autodetect for Papenmeier Braille-displays
+ * Author: marco Skambraks <marco@suse.de>
+ * Suse GmbH Nuernberg
+ *
+ * This is free software, placed under the terms of the
+ * GNU General Public License, as published by the Free Software
+ * Foundation. Please see the file COPYING for details.
+ */
+
+unsigned do_fhp(hd_data_t *hd_data, char *dev_name, unsigned baud, int cnt)
+{
+ int fd, i;
+ char crash[] = { 2, 'S', 0, 0, 0, 0 };
+ unsigned char buf[10];
+ struct termios oldtio, newtio; /* old & new terminal settings */
+ unsigned dev;
+
+ PROGRESS(2, cnt, "fhp open");
+
+ /* Now open the Braille display device for random access */
+ fd = open(dev_name, O_RDWR | O_NOCTTY);
+ if(fd < 0) return 0;
+
+ tcgetattr(fd, &oldtio); /* save current settings */
+
+ /* Set bps, flow control and 8n1, enable reading */
+ memset(&newtio, 0, sizeof newtio);
+ newtio.c_cflag = baud | CS8 | CLOCAL | CREAD;
+
+ /* Ignore bytes with parity errors and make terminal raw and dumb */
+ newtio.c_iflag = IGNPAR;
+ newtio.c_oflag = 0; /* raw output */
+ newtio.c_lflag = 0; /* don't echo or generate signals */
+ newtio.c_cc[VMIN] = 0; /* set nonblocking read */
+ newtio.c_cc[VTIME] = 0;
+ tcflush(fd, TCIFLUSH); /* clean line */
+ tcsetattr(fd, TCSANOW, &newtio); /* activate new settings */
+
+ PROGRESS(3, cnt, "fhp init ok");
+
+ crash[2] = 0x200 >> 8;
+ crash[3] = 0x200 & 0xff;
+ crash[5] = (7+10) & 0xff;
+
+ write(fd, crash, sizeof crash);
+ write(fd, "1111111111",10);
+ write(fd, "\03", 1);
+
+ crash[2] = 0x0 >> 8;
+ crash[3] = 0x0 & 0xff;
+ crash[5] = 5 & 0xff;
+
+ write(fd, crash, sizeof crash);
+ write(fd, "1111111111", 10);
+ write(fd, "\03", 1);
+
+ usleep(500000); /* 100000 should be enough */
+
+ PROGRESS(4, cnt, "fhp write ok");
+
+ i = read(fd, &buf, 10);
+
+ PROGRESS(5, cnt, "fhp read done");
+
+ ADD2LOG("fhp@%s[%d]: ", dev_name, i);
+ if(i > 0) hexdump(&hd_data->log, 1, i, buf);
+ ADD2LOG("\n");
+
+ dev = 0;
+ if(i == 10 && buf[0] == 0x02 && buf[1] == 0x49) {
+ switch(buf[2]) {
+ case 1:
+ case 2:
+ case 3:
+ case 64:
+ case 65:
+ case 66:
+ case 67:
+ case 68:
+ dev = buf[2];
+ dev = MAKE_ID(TAG_SPECIAL, dev);
+ break;
+ }
+ }
+ if(!dev) ADD2LOG("no fhp display: 0x%02x\n", i >= 2 ? buf[2] : 0);
+
+ /* reset serial lines */
+ tcflush(fd, TCIOFLUSH);
+ tcsetattr(fd, TCSAFLUSH, &oldtio);
+ close(fd);
+
+ return dev;
+}
+
+
+/*
+ * autodetect for Handy Tech Braille-displays
+ * Author: marco Skambraks <marco@suse.de>
+ * Suse GmbH Nuernberg
+ *
+ * This is free software, placed under the terms of the
+ * GNU General Public License, as published by the Free Software
+ * Foundation. Please see the file COPYING for details.
+*/
+
+unsigned do_ht(hd_data_t *hd_data, char *dev_name, int cnt)
+{
+ int fd, i;
+ unsigned char code = 0xff, buf[2] = { 0, 0 };
+ struct termios oldtio, newtio;
+ unsigned dev = 0;
+
+ PROGRESS(2, cnt, "ht open");
+
+ fd = open(dev_name, O_RDWR | O_NOCTTY);
+ if(fd < 0) return 0;
+
+ tcgetattr(fd, &oldtio);
+
+ newtio = oldtio;
+ newtio.c_cflag = CLOCAL | PARODD | PARENB | CREAD | CS8;
+ newtio.c_iflag = IGNPAR;
+ newtio.c_oflag = 0;
+ newtio.c_lflag = 0;
+ newtio.c_cc[VMIN] = 0;
+ newtio.c_cc[VTIME] = 0;
+
+ i = 0;
+ /*
+ * Force down DTR, flush any pending data and then the port to what we
+ * want it to be
+ */
+ if(
+ !(
+ cfsetispeed(&newtio, B0) ||
+ cfsetospeed(&newtio, B0) ||
+ tcsetattr(fd, TCSANOW, &newtio) ||
+ tcflush(fd, TCIOFLUSH) ||
+ cfsetispeed(&newtio, B19200) ||
+ cfsetospeed(&newtio, B19200) ||
+ tcsetattr(fd, TCSANOW, &newtio)
+ )
+ ) {
+ /* Pause to let them take effect */
+ usleep(500);
+
+ PROGRESS(3, cnt, "ht init ok");
+
+ write(fd, &code, 1); /* reset brl */
+ usleep(5000); /* wait for reset */
+
+ PROGRESS(4, cnt, "ht write ok");
+
+ read(fd, buf, 1);
+ i = 1;
+
+ PROGRESS(5, cnt, "ht read done");
+
+ if(buf[0] == 0xfe) { /* resetok now read id */
+ usleep(5000);
+ read(fd, buf + 1, 1);
+ i = 2;
+
+ PROGRESS(6, cnt, "ht read done");
+
+ switch(buf[1]) {
+ case 0x05:
+ case 0x09:
+ case 0x44:
+ case 0x74:
+ case 0x80:
+ case 0x84:
+ case 0x88:
+ case 0x89:
+ dev = buf[1];
+ dev = MAKE_ID(TAG_SPECIAL, dev);
+ break;
+ }
+ }
+ }
+
+ ADD2LOG("ht@%s[%d]: ", dev_name, i);
+ if(i > 0) hexdump(&hd_data->log, 1, i, buf);
+ ADD2LOG("\n");
+
+ if(!dev) ADD2LOG("no ht display: 0x%02x\n", buf[1]);
+
+ /* reset serial lines */
+ tcflush(fd, TCIOFLUSH);
+ tcsetattr(fd, TCSAFLUSH, &oldtio);
+ close(fd);
+
+ return dev;
+}
+
+
+/*
+ * autodetect for Baum Braille-displays
+ * Author: marco Skambraks <marco@suse.de>
+ * Suse GmbH Nuernberg
+ *
+ * This is free software, placed under the terms of the
+ * GNU General Public License, as published by the Free Software
+ * Foundation. Please see the file COPYING for details.
+*/
+
+#define BAUDRATE B19200 /* But both run at 19k2 */
+#define MAXREAD 18
+
+unsigned do_baum(hd_data_t *hd_data, char *dev_name, int cnt)
+{
+ static char device_id[] = { 0x1b, 0x84 };
+ int fd;
+ struct termios oldtio, curtio;
+ unsigned char buf[MAXREAD + 1];
+ int i;
+
+ PROGRESS(2, cnt, "baum open");
+
+ fd = open(dev_name, O_RDWR | O_NOCTTY);
+ if(fd < 0) return 0;
+
+ tcgetattr(fd, &curtio);
+
+ oldtio = curtio;
+ cfmakeraw(&curtio);
+
+ /* no SIGTTOU to backgrounded processes */
+ curtio.c_lflag &= ~TOSTOP;
+ curtio.c_cflag = BAUDRATE | CS8 | CLOCAL | CREAD;
+ /* no input parity check, no XON/XOFF */
+ curtio.c_iflag &= ~(INPCK | ~IXOFF);
+
+ curtio.c_cc[VTIME] = 1; /* 0.1s timeout between chars on input */
+ curtio.c_cc[VMIN] = 0; /* no minimum input */
+
+ tcsetattr(fd, TCSAFLUSH, &curtio);
+
+ /* write ID-request */
+ write(fd, device_id, sizeof device_id);
+
+ /* wait for response */
+ usleep(100000);
+
+ PROGRESS(3, cnt, "baum write ok");
+
+ i = read(fd, buf, sizeof buf - 1);
+ buf[sizeof buf - 1] = 0;
+
+ PROGRESS(4, cnt, "baum read done");
+
+ ADD2LOG("baum@%s[%d]: ", dev_name, i);
+ if(i > 0) hexdump(&hd_data->log, 1, i, buf);
+ ADD2LOG("\n");
+
+ /* reset serial lines */
+ tcflush(fd, TCIOFLUSH);
+ tcsetattr(fd, TCSAFLUSH, &oldtio);
+ close(fd);
+
+ if(!strcmp(buf + 2, "Baum Vario40")) return 1;
+ if(!strcmp(buf + 2, "Baum Vario80")) return 2;
+
+ return 0;
+}
+
+
+#endif /* !defined(LIBHD_TINY) && !defined(__sparc__) */
+
--- /dev/null
+void hd_scan_braille(hd_data_t *hd_data);
--- /dev/null
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#ifdef __ia64__
+#include <fcntl.h>
+#include <errno.h>
+#include <stdint.h>
+#include <sys/mman.h>
+#endif
+
+#ifdef __powerpc__
+#include <sys/utsname.h>
+#endif
+
+#include "hd.h"
+#include "hd_int.h"
+#include "klog.h"
+#include "cpu.h"
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ * cpu info
+ *
+ * Note: on other architectures, entries differ (cf. Alpha)!!!
+ *
+ * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ */
+
+static void read_cpuinfo(hd_data_t *hd_data);
+static void dump_cpu_data(hd_data_t *hd_data);
+
+#if defined(__i386__) || defined(__x86_64__)
+static inline unsigned units_per_cpu();
+#endif
+#ifdef __ia64__
+static int ia64DetectSMP(hd_data_t *hd_data);
+#endif
+
+void hd_scan_cpu(hd_data_t *hd_data)
+{
+ hd_t *hd0, *hd;
+ int i, cpus;
+ unsigned u;
+
+ if(!hd_probe_feature(hd_data, pr_cpu)) return;
+
+ hd_data->module = mod_cpu;
+
+ /* some clean-up */
+ remove_hd_entries(hd_data);
+ hd_data->cpu = free_str_list(hd_data->cpu);
+
+ PROGRESS(1, 0, "cpuinfo");
+
+ read_cpuinfo(hd_data);
+
+ for(hd0 = hd_data->hd; hd0; hd0 = hd0->next) {
+ if(hd0->base_class.id == bc_internal && hd0->sub_class.id == sc_int_cpu) break;
+ }
+
+ if(!hd0 || hd0->next) return; /* 0 or > 1 entries */
+
+ /* only one entry, maybe UP kernel on SMP system */
+
+ cpus = 0;
+
+#ifdef __ia64__
+ cpus = ia64DetectSMP(hd_data);
+#endif
+
+ for(i = 1; i < cpus; i++) {
+ hd = add_hd_entry(hd_data, __LINE__, 0);
+ u = hd->idx;
+ hd_copy(hd, hd0);
+ hd->idx = u;
+ hd->slot = i;
+ }
+}
+
+
+void read_cpuinfo(hd_data_t *hd_data)
+{
+ hd_t *hd;
+ unsigned cpus = 0;
+ cpu_info_t *ct;
+ str_list_t *sl;
+
+#if defined(__i386__) || defined (__x86_64__)
+ char model_id[80], vendor_id[80], features[0x100];
+ unsigned bogo, mhz, cache, family, model, stepping;
+ char *t0, *t;
+#endif
+
+#ifdef __ia64__
+ char model_id[80], vendor_id[80], features[0x100];
+ unsigned mhz, stepping;
+ char *t0, *t;
+#endif
+
+#ifdef __alpha__
+ char model_id[80], system_id[80], serial_number[80], platform[80];
+ unsigned cpu_variation, cpu_revision, u, hz;
+ cpu_info_t *ct1;
+#endif
+
+#ifdef __PPC__
+ char model_id[80], vendor_id[80], motherboard[80];
+ unsigned bogo, mhz, cache, family, model, stepping;
+ struct utsname un;
+#endif
+
+#ifdef __sparc__
+ char cpu_id[80], fpu_id[80], promlib[80], prom[80], type[80], mmu[80];
+ unsigned u, bogo, cpus_active;
+#endif
+
+#if defined(__s390__) || defined(__s390x__)
+ char vendor_id[80];
+ unsigned bogo;
+ unsigned u0, u1, u2, u3;
+#endif
+
+ hd_data->cpu = read_file(PROC_CPUINFO, 0, 0);
+ if((hd_data->debug & HD_DEB_CPU)) dump_cpu_data(hd_data);
+ if(!hd_data->cpu) return;
+
+#ifdef __alpha__
+ *model_id = *system_id = *serial_number = *platform = 0;
+ cpu_variation = cpu_revision = hz = 0;
+
+ for(sl = hd_data->cpu; sl; sl = sl->next) {
+ if(sscanf(sl->str, "cpu model : %79[^\n]", model_id) == 1) continue;
+ if(sscanf(sl->str, "system type : %79[^\n]", system_id) == 1) continue;
+ if(sscanf(sl->str, "cpu variation : %u", &cpu_variation) == 1) continue;
+ if(sscanf(sl->str, "cpu revision : %u", &cpu_revision) == 1) continue;
+ if(sscanf(sl->str, "system serial number : %79[^\n]", serial_number) == 1) continue;
+ if(sscanf(sl->str, "cpus detected : %u", &cpus) == 1) continue;
+ if(sscanf(sl->str, "cycle frequency [Hz] : %u", &hz) == 1) continue;
+ if(sscanf(sl->str, "system variation : %79[^\n]", platform) == 1) continue;
+ }
+
+ if(*model_id || *system_id) { /* at least one of those */
+ ct = new_mem(sizeof *ct);
+ ct->architecture = arch_alpha;
+ if(model_id) ct->model_name = new_str(model_id);
+ if(system_id) ct->vend_name = new_str(system_id);
+ if(strncmp(serial_number, "MILO", 4) == 0)
+ hd_data->boot = boot_milo;
+ else
+ hd_data->boot = boot_aboot;
+
+ ct->family = cpu_variation;
+ ct->model = cpu_revision;
+ ct->stepping = 0;
+ ct->cache = 0;
+ ct->clock = (hz + 500000) / 1000000;
+
+ if(platform && strcmp(platform, "0")) {
+ ct->platform = new_str(platform);
+ }
+
+ if(!cpus) cpus = 1; /* at least 1 machine had a "cpus: 0" entry... */
+ for(u = 0; u < cpus; u++) {
+ hd = add_hd_entry(hd_data, __LINE__, 0);
+ hd->base_class.id = bc_internal;
+ hd->sub_class.id = sc_int_cpu;
+ hd->slot = u;
+ hd->detail = new_mem(sizeof *hd->detail);
+ hd->detail->type = hd_detail_cpu;
+ if(u) {
+ hd->detail->cpu.data = ct1 = new_mem(sizeof *ct);
+ *ct1 = *ct;
+ ct1->model_name = new_str(ct1->model_name);
+ ct1->vend_name = new_str(ct1->vend_name);
+ ct1->platform = new_str(ct1->platform);
+ }
+ else {
+ hd->detail->cpu.data = ct;
+ }
+ }
+
+ }
+#endif /* __alpha__ */
+
+
+#ifdef __sparc__
+ *cpu_id = *fpu_id = *promlib = *prom = *type = *mmu = 0;
+ cpus = cpus_active = bogo = 0;
+
+ for(sl = hd_data->cpu; sl; sl = sl->next) {
+ if(sscanf(sl->str, "cpu : %79[^\n]", cpu_id) == 1);
+ if(sscanf(sl->str, "fpu : %79[^\n]", fpu_id) == 1);
+ if(sscanf(sl->str, "promlib : %79[^\n]", promlib) == 1);
+ if(sscanf(sl->str, "prom : %79[^\n]", prom) == 1);
+ if(sscanf(sl->str, "type : %79[^\n]", type) == 1);
+ if(sscanf(sl->str, "ncpus probed : %u", &cpus) == 1);
+ if(sscanf(sl->str, "ncpus active : %u", &cpus_active) == 1);
+ if(sscanf(sl->str, "BogoMips : %u", &bogo) == 1);
+ if(sscanf(sl->str, "MMU Type : %79[^\n]", mmu) == 1);
+ }
+
+ if(*cpu_id) {
+ for(u = 0; u < cpus; u++) {
+ ct = new_mem(sizeof *ct);
+ ct->platform = new_str (type);
+ if(strcmp (type, "sun4u") == 0)
+ ct->architecture = arch_sparc64;
+ else
+ ct->architecture = arch_sparc;
+
+ ct->model_name = new_str(cpu_id);
+ hd_data->boot = boot_silo;
+
+ hd = add_hd_entry(hd_data, __LINE__, 0);
+ hd->base_class.id = bc_internal;
+ hd->sub_class.id = sc_int_cpu;
+ hd->slot = u;
+ hd->detail = new_mem(sizeof *hd->detail);
+ hd->detail->type = hd_detail_cpu;
+ hd->detail->cpu.data = ct;
+ }
+ }
+#endif /* sparc */
+
+
+#if defined(__i386__) || defined (__x86_64__)
+ *model_id = *vendor_id = *features = 0;
+ bogo = mhz = cache = family = model = stepping = 0;
+
+ for(sl = hd_data->cpu; sl; sl = sl->next) {
+ if(sscanf(sl->str, "model name : %79[^\n]", model_id) == 1);
+ if(sscanf(sl->str, "vendor_id : %79[^\n]", vendor_id) == 1);
+ if(sscanf(sl->str, "flags : %255[^\n]", features) == 1);
+ if(sscanf(sl->str, "bogomips : %u", &bogo) == 1);
+ if(sscanf(sl->str, "cpu MHz : %u", &mhz) == 1);
+ if(sscanf(sl->str, "cache size : %u KB", &cache) == 1);
+
+ if(sscanf(sl->str, "cpu family : %u", &family) == 1);
+ if(sscanf(sl->str, "model : %u", &model) == 1);
+ if(sscanf(sl->str, "stepping : %u", &stepping) == 1);
+
+ if(strstr(sl->str, "processor") == sl->str || !sl->next) { /* EOF */
+ if(*model_id || *vendor_id) { /* at least one of those */
+ ct = new_mem(sizeof *ct);
+#ifdef __i386__
+ ct->architecture = arch_intel;
+#endif
+#ifdef __x86_64__
+ ct->architecture = arch_x86_64;
+#endif
+ if(model_id) ct->model_name = new_str(model_id);
+ if(vendor_id) ct->vend_name = new_str(vendor_id);
+ ct->family = family;
+ ct->model = model;
+ ct->stepping = stepping;
+ ct->cache = cache;
+ hd_data->boot = boot_grub;
+
+ /* round clock to typical values */
+ if(mhz >= 38 && mhz <= 42)
+ mhz = 40;
+ else if(mhz >= 88 && mhz <= 92)
+ mhz = 90;
+ else {
+ unsigned u, v;
+
+ u = (mhz + 2) % 100;
+ v = (mhz + 2) / 100;
+ if(u <= 4)
+ u = 2;
+ else if(u >= 25 && u <= 29)
+ u = 25 + 2;
+ else if(u >= 33 && u <= 37)
+ u = 33 + 2;
+ else if(u >= 50 && u <= 54)
+ u = 50 + 2;
+ else if(u >= 66 && u <= 70)
+ u = 66 + 2;
+ else if(u >= 75 && u <= 79)
+ u = 75 + 2;
+ else if(u >= 80 && u <= 84) /* there are 180MHz PPros */
+ u = 80 + 2;
+ u -= 2;
+ mhz = v * 100 + u;
+ }
+
+ ct->clock = mhz;
+
+ hd = add_hd_entry(hd_data, __LINE__, 0);
+ hd->base_class.id = bc_internal;
+ hd->sub_class.id = sc_int_cpu;
+ hd->slot = cpus;
+ hd->detail = new_mem(sizeof *hd->detail);
+ hd->detail->type = hd_detail_cpu;
+ hd->detail->cpu.data = ct;
+
+ if(*features) {
+ for(t0 = features; (t = strsep(&t0, " ")); ) {
+ add_str_list(&ct->features, t);
+ if(!strcmp(t, "ht")) ct->units = units_per_cpu();
+ }
+ }
+
+ *model_id = *vendor_id = 0;
+ bogo = mhz = cache = family = model= 0;
+ cpus++;
+ }
+ }
+ }
+#endif /* __i386__ || __x86_64__ */
+
+
+#ifdef __PPC__
+ *model_id = *vendor_id = *motherboard = 0;
+ bogo = mhz = cache = family = model = stepping = 0;
+
+ for(sl = hd_data->cpu; sl; sl = sl->next) {
+ if(sscanf(sl->str, "machine : %79[^\n]", vendor_id) == 1);
+ }
+
+ for(sl = hd_data->cpu; sl; sl = sl->next) {
+ if(sscanf(sl->str, "cpu : %79[^\n]", model_id) == 1);
+ if(sscanf(sl->str, "motherboard : %79[^\n]", motherboard) == 1);
+ if(sscanf(sl->str, "bogomips : %u", &bogo) == 1);
+ if(sscanf(sl->str, "clock : %u", &mhz) == 1);
+ if(sscanf(sl->str, "L2 cache : %u KB", &cache) == 1);
+
+ if(strstr(sl->str, "processor") == sl->str || !sl->next) { /* EOF */
+ if(*model_id) { /* at least one of those */
+ ct = new_mem(sizeof *ct);
+ ct->architecture = arch_ppc;
+ if(model_id) {
+ ct->model_name = new_str(model_id);
+ }
+
+ if(!uname(&un))
+ if(strstr(un.machine,"ppc64"))
+ ct->architecture = arch_ppc64;
+
+ if(vendor_id) ct->vend_name = new_str(vendor_id);
+ if(motherboard) ct->platform = new_str(motherboard);
+ ct->family = family;
+ ct->model = model;
+ ct->stepping = stepping;
+ ct->cache = cache;
+ hd_data->boot = boot_ppc;
+ ct->clock = mhz;
+
+ hd = add_hd_entry(hd_data, __LINE__, 0);
+ hd->base_class.id = bc_internal;
+ hd->sub_class.id = sc_int_cpu;
+ hd->slot = cpus;
+ hd->detail = new_mem(sizeof *hd->detail);
+ hd->detail->type = hd_detail_cpu;
+ hd->detail->cpu.data = ct;
+
+ if(ct->vend_name && !strcmp(ct->vend_name, "PowerBook") && !hd_data->color_code) {
+ hd_data->color_code = 7; // black
+ }
+
+ *model_id = 0;
+ bogo = mhz = cache = family = model= 0;
+ cpus++;
+ }
+ }
+ }
+#endif /* __PPC__ */
+
+
+#ifdef __ia64__
+ *model_id = *vendor_id = *features = 0;
+ mhz = stepping = 0;
+
+ for(sl = hd_data->cpu; sl; sl = sl->next) {
+ if(sscanf(sl->str, "family : %79[^\n]", model_id) == 1);
+ if(sscanf(sl->str, "vendor : %79[^\n]", vendor_id) == 1);
+ if(sscanf(sl->str, "features : %255[^\n]", features) == 1);
+ if(sscanf(sl->str, "cpu MHz : %u", &mhz) == 1);
+ if(sscanf(sl->str, "revision : %u", &stepping) == 1);
+
+ if(strstr(sl->str, "processor") == sl->str || !sl->next) { /* EOF */
+ if(*model_id || *vendor_id) { /* at least one of those */
+ ct = new_mem(sizeof *ct);
+ ct->architecture = arch_ia64;
+ if(model_id) ct->model_name = new_str(model_id);
+ if(vendor_id) ct->vend_name = new_str(vendor_id);
+ ct->stepping = stepping;
+ hd_data->boot = boot_elilo;
+
+ /* round clock to typical values */
+ if(mhz >= 38 && mhz <= 42)
+ mhz = 40;
+ else if(mhz >= 88 && mhz <= 92)
+ mhz = 90;
+ else {
+ unsigned u, v;
+
+ u = (mhz + 2) % 100;
+ v = (mhz + 2) / 100;
+ if(u <= 4)
+ u = 2;
+ else if(u >= 25 && u <= 29)
+ u = 25 + 2;
+ else if(u >= 33 && u <= 37)
+ u = 33 + 2;
+ else if(u >= 50 && u <= 54)
+ u = 50 + 2;
+ else if(u >= 66 && u <= 70)
+ u = 66 + 2;
+ else if(u >= 75 && u <= 79)
+ u = 75 + 2;
+ else if(u >= 80 && u <= 84) /* there are 180MHz PPros */
+ u = 80 + 2;
+ u -= 2;
+ mhz = v * 100 + u;
+ }
+
+ ct->clock = mhz;
+
+ hd = add_hd_entry(hd_data, __LINE__, 0);
+ hd->base_class.id = bc_internal;
+ hd->sub_class.id = sc_int_cpu;
+ hd->slot = cpus;
+ hd->detail = new_mem(sizeof *hd->detail);
+ hd->detail->type = hd_detail_cpu;
+ hd->detail->cpu.data = ct;
+
+ if(*features) {
+ for(t0 = features; (t = strsep(&t0, " ")); ) {
+ add_str_list(&ct->features, t);
+ }
+ }
+
+ *model_id = *vendor_id = 0;
+ mhz = 0;
+ cpus++;
+ }
+ }
+ }
+
+#endif /* __ia64__ */
+
+
+#if defined(__s390__) || defined(__s390x__)
+ *vendor_id = 0;
+ bogo = 0;
+
+ for(sl = hd_data->cpu; sl; sl = sl->next) {
+ if(sscanf(sl->str, "vendor_id : %79[^\n]", vendor_id) == 1);
+ if(sscanf(sl->str, "bogomips per cpu : %u", &bogo) == 1);
+ }
+
+ for(sl = hd_data->cpu; sl; sl = sl->next) {
+ if(
+ sscanf(sl->str, "processor %u : version = %x , identification = %x , machine = %x", &u0, &u1, &u2, &u3) == 4
+ ) {
+ ct = new_mem(sizeof *ct);
+#ifdef __s390x__
+ ct->architecture = arch_s390x;
+#else
+ ct->architecture = arch_s390;
+#endif
+ if(vendor_id) ct->vend_name = new_str(vendor_id);
+ ct->stepping = u1;
+ hd_data->boot = boot_s390;
+
+ hd = add_hd_entry(hd_data, __LINE__, 0);
+ hd->base_class.id = bc_internal;
+ hd->sub_class.id = sc_int_cpu;
+ hd->slot = cpus;
+ hd->detail = new_mem(sizeof *hd->detail);
+ hd->detail->type = hd_detail_cpu;
+ hd->detail->cpu.data = ct;
+
+ bogo = 0;
+ cpus++;
+ }
+ }
+#endif /* defined(__s390__) || defined(__s390x__) */
+}
+
+/*
+ * Add some cpu data to the global log.
+ */
+void dump_cpu_data(hd_data_t *hd_data)
+{
+ str_list_t *sl;
+
+ ADD2LOG("----- /proc/cpuinfo -----\n");
+ for(sl = hd_data->cpu; sl; sl = sl->next) {
+ ADD2LOG(" %s", sl->str);
+ }
+ ADD2LOG("----- /proc/cpuinfo end -----\n");
+}
+
+
+#if defined(__i386__) || defined(__x86_64__)
+inline unsigned units_per_cpu()
+{
+ unsigned u;
+
+ asm(
+#ifdef __i386__
+ "push %%ebx\n\t"
+#else
+ "push %%rbx\n\t"
+#endif
+ "mov $1,%%eax\n\t"
+ "cpuid\n\t"
+ "shr $8,%%ebx\n\t"
+ "movzx %%bh,%%eax\n\t"
+#ifdef __i386__
+ "pop %%ebx"
+#else
+ "pop %%rbx"
+#endif
+ : "=a" (u)
+ :: "%ecx", "%edx"
+ );
+
+ return u;
+}
+#endif
+
+
+#ifdef __ia64__
+
+/*
+ * IA64 SMP detection code
+ */
+
+#define PAGE_OFFSET(addr) ((uintptr_t) (addr) & (getpagesize () - 1))
+
+typedef struct
+{
+ uint8_t type;
+ uint8_t length;
+} __attribute__ ((packed)) acpi_table_entry_header;
+
+struct acpi20_table_rsdp
+{
+ char signature[8];
+ uint8_t checksum;
+ char oem_id[6];
+ uint8_t revision;
+ uint32_t rsdt_address;
+ uint32_t length;
+ unsigned long xsdt_address;
+ uint8_t ext_checksum;
+ uint8_t reserved[3];
+} __attribute__ ((packed));
+
+struct acpi_table_header
+{
+ char signature[4];
+ uint32_t length;
+ uint8_t revision;
+ uint8_t checksum;
+ char oem_id[6];
+ char oem_table_id[8];
+ uint32_t oem_revision;
+ char asl_compiler_id[4];
+ uint32_t asl_compiler_revision;
+};
+
+#define ACPI_XSDT_SIG "XSDT"
+struct acpi_table_xsdt
+{
+ struct acpi_table_header header;
+ unsigned long entry[0];
+} __attribute__ ((packed));
+
+#define ACPI_MADT_SIG "ACPI"
+struct acpi_table_madt
+{
+ struct acpi_table_header header;
+ uint32_t lapic_address;
+ struct
+ {
+ uint32_t pcat_compat:1;
+ uint32_t reserved:31;
+ } flags;
+} __attribute__ ((packed));
+
+#define ACPI_MADT_LSAPIC 7
+
+struct acpi_table_lsapic
+{
+ acpi_table_entry_header header;
+ uint8_t acpi_id;
+ uint8_t id;
+ uint8_t eid;
+ uint8_t reserved[3];
+ struct
+ {
+ uint32_t enabled:1;
+ uint32_t reserved:31;
+ } flags;
+} __attribute__ ((packed));
+
+/*
+ * Map an ACPI table into virtual memory
+ */
+static struct acpi_table_header *
+acpi_map_table (int mem, unsigned long addr, char *signature)
+{
+ /* mmap header to determine table size */
+ struct acpi_table_header *table = NULL;
+ unsigned long offset = PAGE_OFFSET (addr);
+ uint8_t *mapped = mmap (NULL,
+ sizeof (struct acpi_table_header) + offset,
+ PROT_READ,
+ MAP_PRIVATE,
+ mem,
+ (unsigned long) addr - offset);
+ table = (struct acpi_table_header *) (mapped != MAP_FAILED
+ ? mapped + offset
+ : NULL);
+ if (table)
+ {
+ if (memcmp (table->signature, signature, sizeof (table->signature)))
+ {
+ munmap ((char *) table - offset,
+ sizeof (struct acpi_table_header) + offset);
+ return NULL;
+ }
+ {
+ /* re-mmap entire table */
+ unsigned long size = table->length;
+ munmap ((uint8_t *) table - offset,
+ sizeof (struct acpi_table_header) + offset);
+ mapped = mmap (NULL, size + offset, PROT_READ, MAP_PRIVATE, mem,
+ (unsigned long) addr - offset);
+ table = (struct acpi_table_header *) (mapped != MAP_FAILED
+ ? mapped + offset
+ : NULL);
+ }
+ }
+ return table;
+}
+
+/*
+ * Unmap an ACPI table from virtual memory
+ */
+static void
+acpi_unmap_table (struct acpi_table_header * table)
+{
+ if (table)
+ {
+ unsigned long offset = PAGE_OFFSET (table);
+ munmap ((uint8_t *) table - offset, table->length + offset);
+ }
+}
+
+int
+acpi_parse_lsapic (acpi_table_entry_header *p)
+{
+ struct acpi_table_lsapic *lsapic = (struct acpi_table_lsapic *) p;
+
+ return lsapic->flags.enabled;
+}
+
+static int
+acpi_parse_madt (struct acpi_table_madt *madt)
+{
+ acpi_table_entry_header *p, *end;
+ int n_cpu = 0;
+
+ p = (acpi_table_entry_header *) (madt + 1);
+ end = (acpi_table_entry_header *) ((char *) madt + madt->header.length);
+
+ while (p < end)
+ {
+ if (p->type == ACPI_MADT_LSAPIC)
+ n_cpu += acpi_parse_lsapic (p);
+
+ p = (acpi_table_entry_header *) ((char *) p + p->length);
+ }
+
+ return n_cpu;
+}
+
+static int
+acpi_parse_rsdp (int mem_fd, struct acpi20_table_rsdp *rsdp)
+{
+ int n_cpu = 0;
+ int i;
+ struct acpi_table_xsdt *xsdt = 0;
+ int tables;
+
+ if (rsdp->xsdt_address)
+ xsdt = (struct acpi_table_xsdt *) acpi_map_table (mem_fd, rsdp->xsdt_address,
+ ACPI_XSDT_SIG);
+ if (xsdt)
+ {
+ tables = (xsdt->header.length - sizeof (struct acpi_table_header)) / 8;
+ for (i = 0; i < tables; i++)
+ {
+ struct acpi_table_header *dt
+ = acpi_map_table (mem_fd, xsdt->entry[i], ACPI_MADT_SIG);
+ if (dt)
+ n_cpu += acpi_parse_madt ((struct acpi_table_madt *) dt);
+ acpi_unmap_table (dt);
+ }
+ acpi_unmap_table ((struct acpi_table_header *) xsdt);
+ }
+ return n_cpu;
+}
+
+int ia64DetectSMP(hd_data_t *hd_data)
+{
+ int n_cpu = 0, mem_fd, systab_fd;
+ struct acpi20_table_rsdp rsdp;
+ uint8_t *mapped;
+ unsigned long addr = 0, offset;
+ int ok = 0;
+ str_list_t *sl;
+ const char *rsd_klog = "ACPI 2.0=";
+ const char *rsd_systab = "ACPI20=";
+ char *s;
+
+ mem_fd = open("/dev/mem", O_RDONLY);
+ if(mem_fd == -1) return -1;
+
+ systab_fd = open("/proc/efi/systab", O_RDONLY);
+ if (systab_fd != -1)
+ {
+ char buffer[512];
+ int n_read = read(systab_fd, buffer, sizeof(buffer) - 1);
+ close(systab_fd);
+ if (n_read > 0)
+ {
+ buffer[n_read] = 0;
+ if ((s = strstr(buffer, rsd_systab)) != NULL &&
+ sscanf(s + strlen(rsd_systab), "%lx", &addr) == 1)
+ goto found_it;
+ }
+ }
+
+ if(!hd_data->klog) read_klog(hd_data);
+
+ for(sl = hd_data->klog; sl; sl = sl->next) {
+ if((s = strstr(sl->str, rsd_klog))) {
+ if(sscanf(s + strlen(rsd_klog), "%lx", &addr) == 1) {
+ found_it:
+ offset= PAGE_OFFSET (addr);
+ mapped = mmap(NULL, sizeof rsdp + offset, PROT_READ, MAP_PRIVATE,
+ mem_fd, (unsigned long) addr - offset);
+ if(mapped != MAP_FAILED) {
+ ADD2LOG("seek to 0x%lx\n", addr);
+ memcpy(&rsdp, mapped + offset, sizeof rsdp);
+ munmap(mapped, sizeof rsdp + offset);
+ ok = 1;
+ }
+ break;
+ }
+ }
+ }
+
+ if(ok) {
+ n_cpu = acpi_parse_rsdp(mem_fd, &rsdp);
+ if(n_cpu) {
+ ADD2LOG("RSDP found at 0x%lx\n", addr);
+ }
+ }
+
+ close (mem_fd);
+
+ ADD2LOG("n_cpu = %d\n", n_cpu);
+
+ return n_cpu;
+}
+
+
+#endif /* __ia64__ */
+
--- /dev/null
+void hd_scan_cpu(hd_data_t *hd_data);
--- /dev/null
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+
+#include "hd.h"
+#include "hd_int.h"
+#include "hddb.h"
+#include "edd.h"
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ * edd
+ *
+ * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ */
+
+static void get_edd_info(hd_data_t *hd_data);
+
+void hd_scan_sysfs_edd(hd_data_t *hd_data)
+{
+ if(!hd_probe_feature(hd_data, pr_edd)) return;
+
+ hd_data->module = mod_edd;
+
+ /* some clean-up */
+ remove_hd_entries(hd_data);
+
+ hd_data->flags.edd_used = 0;
+
+ if(hd_probe_feature(hd_data, pr_edd_mod)) {
+ PROGRESS(1, 0, "edd mod");
+ load_module(hd_data, "edd");
+ }
+
+ PROGRESS(2, 0, "edd info");
+
+ get_edd_info(hd_data);
+}
+
+
+void get_edd_info(hd_data_t *hd_data)
+{
+ hd_t *hd;
+ hd_res_t *res;
+ unsigned u, u1, u2, edd_cnt = 0, lba;
+ uint64_t ul0;
+ str_list_t *sl;
+ bios_info_t *bt;
+ edd_info_t *ei;
+
+ struct sysfs_directory *sf_dir;
+ struct sysfs_directory *sf_dir_2;
+ struct sysfs_link *sf_link;
+
+ for(u = 0; u < sizeof hd_data->edd / sizeof *hd_data->edd; u++) {
+ free_mem(hd_data->edd[u].sysfs_id);
+ }
+
+ memset(hd_data->edd, 0, sizeof hd_data->edd);
+
+ sf_dir = sysfs_open_directory("/sys/firmware/edd");
+
+ if(sf_dir) {
+ if(!sysfs_read_all_subdirs(sf_dir)) {
+ if(sf_dir->subdirs) {
+ dlist_for_each_data(sf_dir->subdirs, sf_dir_2, struct sysfs_directory) {
+
+ if(
+ sscanf(sf_dir_2->name, "int13_dev%02x", &u) == 1 &&
+ u >= 0x80 &&
+ u <= 0xff
+ ) {
+ edd_cnt++;
+
+ u -= 0x80;
+
+ ei = hd_data->edd + u;
+
+ if(hd_attr_uint(sysfs_get_directory_attribute(sf_dir_2, "sectors"), &ul0, 0)) {
+ ei->sectors = ul0;
+ }
+
+ if(hd_attr_uint(sysfs_get_directory_attribute(sf_dir_2, "default_cylinders"), &ul0, 0)) {
+ ei->edd.cyls = ul0;
+ }
+
+ if(hd_attr_uint(sysfs_get_directory_attribute(sf_dir_2, "default_heads"), &ul0, 0)) {
+ ei->edd.heads = ul0;
+ }
+
+ if(hd_attr_uint(sysfs_get_directory_attribute(sf_dir_2, "default_sectors_per_track"), &ul0, 0)) {
+ ei->edd.sectors = ul0;
+ }
+
+ if(hd_attr_uint(sysfs_get_directory_attribute(sf_dir_2, "legacy_max_cylinder"), &ul0, 0)) {
+ ei->legacy.cyls = ul0 + 1;
+ }
+
+ if(hd_attr_uint(sysfs_get_directory_attribute(sf_dir_2, "legacy_max_head"), &ul0, 0)) {
+ ei->legacy.heads = ul0 + 1;
+ }
+
+ if(hd_attr_uint(sysfs_get_directory_attribute(sf_dir_2, "legacy_sectors_per_track"), &ul0, 0)) {
+ ei->legacy.sectors = ul0;
+ }
+
+ if(ei->sectors && ei->edd.heads && ei->edd.sectors) {
+ ei->edd.cyls = ei->sectors / (ei->edd.heads * ei->edd.sectors);
+ }
+
+ sf_link = sysfs_get_directory_link(sf_dir_2, "pci_dev");
+ if(sf_link) {
+ hd_data->edd[u].sysfs_id = new_str(hd_sysfs_id(sf_link->target));
+ if((hd = hd_find_sysfs_id(hd_data, hd_data->edd[u].sysfs_id))) {
+ hd_data->edd[u].hd_idx = hd->idx;
+ }
+ }
+
+ sl = hd_attr_list(sysfs_get_directory_attribute(sf_dir_2, "extensions"));
+ if(search_str_list(sl, "Fixed disk access")) hd_data->edd[u].ext_fixed_disk = 1;
+ if(search_str_list(sl, "Device locking and ejecting")) hd_data->edd[u].ext_lock_eject = 1;
+ if(search_str_list(sl, "Enhanced Disk Drive support")) hd_data->edd[u].ext_edd = 1;
+ if(search_str_list(sl, "64-bit extensions")) hd_data->edd[u].ext_64bit = 1;
+
+ ADD2LOG(
+ "edd: 0x%02x\n size: %"PRIu64"\n chs default: %u/%u/%u\n chs legacy: %u/%u/%u\n caps: %s%s%s%s\n attached: #%u %s\n",
+ u + 0x80,
+ ei->sectors,
+ ei->edd.cyls,
+ ei->edd.heads,
+ ei->edd.sectors,
+ ei->legacy.cyls,
+ ei->legacy.heads,
+ ei->legacy.sectors,
+ ei->ext_fixed_disk ? "fixed " : "",
+ ei->ext_lock_eject ? "lock " : "",
+ ei->ext_edd ? "edd " : "",
+ ei->ext_64bit ? "64bit " : "",
+ ei->hd_idx,
+ ei->sysfs_id ?: ""
+ );
+ }
+ }
+ }
+ }
+ }
+
+ sysfs_close_directory(sf_dir);
+
+ if(!edd_cnt) return;
+
+ for(hd = hd_data->hd; hd; hd = hd->next) {
+ if(
+ hd->base_class.id == bc_storage_device &&
+ hd->sub_class.id == sc_sdev_disk
+ ) {
+ hd->rom_id = free_mem(hd->rom_id);
+ }
+ }
+
+ /* add BIOS drive ids to disks */
+
+ /* first, check sysfs link */
+ for(u = 0; u < sizeof hd_data->edd / sizeof *hd_data->edd; u++) {
+ if(!hd_data->edd[u].hd_idx) continue;
+ for(hd = hd_data->hd; hd; hd = hd->next) {
+ if(
+ hd->base_class.id == bc_storage_device &&
+ hd->sub_class.id == sc_sdev_disk &&
+ hd->attached_to == hd_data->edd[u].hd_idx &&
+ !hd->rom_id
+ ) {
+ str_printf(&hd->rom_id, 0, "0x%02x", u + 0x80);
+ hd_data->flags.edd_used = 1;
+ hd_data->edd[u].assigned = 1;
+ break;
+ }
+ }
+ }
+
+ /* try based on disk size */
+ for(u = 0; u < sizeof hd_data->edd / sizeof *hd_data->edd; u++) {
+ if(hd_data->edd[u].assigned) continue;
+ if(!(ul0 = hd_data->edd[u].sectors)) continue;
+ for(u1 = u2 = 0; u1 < sizeof hd_data->edd / sizeof *hd_data->edd; u1++) {
+ if(ul0 == hd_data->edd[u1].sectors) u2++;
+ }
+
+ /* more than one disk with this size */
+ if(u2 != 1) continue;
+
+ for(hd = hd_data->hd; hd; hd = hd->next) {
+ if(
+ hd->base_class.id == bc_storage_device &&
+ hd->sub_class.id == sc_sdev_disk &&
+ !hd->rom_id
+ ) {
+ for(res = hd->res; res; res = res->next) {
+ if(
+ res->any.type == res_size &&
+ res->size.unit == size_unit_sectors &&
+ res->size.val1 == ul0
+ ) break;
+ }
+
+ if(!res) continue;
+
+ str_printf(&hd->rom_id, 0, "0x%02x", u + 0x80);
+ hd_data->flags.edd_used = 1;
+ hd_data->edd[u].assigned = 1;
+ break;
+ }
+ }
+ }
+
+ /* set lba support flag in BIOS data */
+ for(lba = u = 0; u < sizeof hd_data->edd / sizeof *hd_data->edd; u++) {
+ if(hd_data->edd[u].ext_fixed_disk) {
+ lba = 1;
+ break;
+ }
+ }
+
+ if(lba) {
+ for(hd = hd_data->hd; hd; hd = hd->next) {
+ if(
+ hd->base_class.id == bc_internal &&
+ hd->sub_class.id == sc_int_bios &&
+ hd->detail &&
+ hd->detail->type == hd_detail_bios &&
+ (bt = hd->detail->bios.data)
+ ) {
+ bt->lba_support = lba;
+ }
+ }
+ }
+
+}
+
--- /dev/null
+void hd_scan_sysfs_edd(hd_data_t *hd_data);
--- /dev/null
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/ioctl.h>
+#include <linux/hdreg.h>
+#include <linux/fb.h>
+
+#include "hd.h"
+#include "hd_int.h"
+#include "fb.h"
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ *
+ * scan framebuffer devices
+ *
+ * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ */
+
+typedef struct {
+ unsigned width;
+ unsigned height;
+ double pix_clock;
+ double h_freq;
+ double v_freq;
+} fb_info_t;
+
+static fb_info_t *fb_get_info(hd_data_t *hd_data);
+
+void hd_scan_fb(hd_data_t *hd_data)
+{
+ fb_info_t *fb;
+ hd_t *hd;
+ hd_res_t *res;
+ unsigned imac_dev, imac_vend;
+ unsigned imac = 0;
+ monitor_info_t *mi = NULL;
+
+ if(!hd_probe_feature(hd_data, pr_fb)) return;
+
+ hd_data->module = mod_fb;
+
+ /* some clean-up */
+ remove_hd_entries(hd_data);
+
+ PROGRESS(1, 0, "read info");
+
+ fb = fb_get_info(hd_data);
+
+ if(fb) {
+ imac_dev = MAKE_ID(TAG_EISA, 0x9d03);
+ imac_vend = name2eisa_id("APP");
+
+ for(hd = hd_data->hd; hd; hd = hd->next) {
+ if(hd->base_class.id == bc_monitor) break;
+ }
+
+ if(hd && hd->device.id == imac_dev && hd->vendor.id == imac_vend) {
+ hd->tag.remove = 1;
+ remove_tagged_hd_entries(hd_data);
+ imac = 1;
+ hd = NULL;
+ }
+
+ /* add monitor entry based on fb data if we have no other info */
+ if(!hd) {
+ hd = add_hd_entry(hd_data, __LINE__, 0);
+ hd->base_class.id = bc_monitor;
+ if(imac) {
+ hd->vendor.id = imac_vend;
+ hd->device.id = imac_dev;
+ }
+ else {
+ hd->vendor.name = new_str("Generic");
+ hd->device.name = new_str("Monitor");
+ }
+
+ res = add_res_entry(&hd->res, new_mem(sizeof *res));
+ res->monitor.type = res_monitor;
+ res->monitor.width = fb->width;
+ res->monitor.height = fb->height;
+ res->monitor.vfreq = fb->v_freq + 0.5;
+
+ if(!hd->detail) {
+ mi = new_mem(sizeof *mi);
+ hd->detail = new_mem(sizeof *hd->detail);
+ hd->detail->type = hd_detail_monitor;
+ hd->detail->monitor.data = mi;
+
+ mi->min_vsync = 50;
+ mi->min_hsync = 31;
+ mi->max_vsync = fb->v_freq * 1.11 + 0.9;
+ mi->max_hsync = fb->h_freq / 1000.0 + 1.9;
+ if(mi->max_vsync <= mi->min_vsync) mi->max_vsync = mi->min_vsync + 10;
+ if(mi->max_hsync <= mi->min_hsync) mi->max_hsync = mi->min_hsync + 5;
+ /* round up */
+ mi->max_vsync = ((mi->max_vsync + 9) / 10) * 10;
+ }
+ }
+ }
+}
+
+fb_info_t *fb_get_info(hd_data_t *hd_data)
+{
+ int fd;
+ struct fb_var_screeninfo fbv_info;
+ static fb_info_t fb_info;
+ fb_info_t *fb = NULL;
+ int h, v;
+
+ fd = open(DEV_FB, O_RDONLY);
+ if(fd < 0) fd = open(DEV_FB0, O_RDONLY);
+ if(fd < 0) return fb;
+
+ if(!ioctl(fd, FBIOGET_VSCREENINFO, &fbv_info)) {
+ h = fbv_info.left_margin + fbv_info.xres + fbv_info.right_margin + fbv_info.hsync_len;
+ v = fbv_info.upper_margin + fbv_info.yres + fbv_info.lower_margin + fbv_info.vsync_len;
+ if(fbv_info.pixclock && h && v) {
+ fb_info.width = fbv_info.xres;
+ fb_info.height = fbv_info.yres;
+ fb_info.pix_clock = 1e12 / fbv_info.pixclock;
+ fb_info.h_freq = fb_info.pix_clock / h;
+ fb_info.v_freq = fb_info.h_freq / v;
+ fb = &fb_info;
+ ADD2LOG("fb: size %d x %d\n", fb_info.width, fb_info.height);
+ ADD2LOG("fb: timing %.2f MHz, %.2f kHz, %.2f Hz\n", fb_info.pix_clock * 1e-6, fb_info.h_freq * 1e-3, fb_info.v_freq);
+ }
+ }
+
+ close(fd);
+
+ return fb;
+}
--- /dev/null
+void hd_scan_fb(hd_data_t *hd_data);
--- /dev/null
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#include "hd.h"
+#include "hd_int.h"
+#include "klog.h"
+#include "floppy.h"
+
+static void dump_floppy_data(hd_data_t *hd_data);
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ * floppy info
+ *
+ * This should currently be called *before* scan_misc() so we can try to get
+ * the floppy controller resources in scan_misc() by actually accessing the
+ * floppy drive. (Otherwise there would be a rather longish timeout.)
+ *
+ * This is all rather strange and should be rewritten...
+ *
+ * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ */
+
+
+void hd_scan_floppy(hd_data_t *hd_data)
+{
+ hd_t *hd;
+ char b0[10], b1[10], c;
+ unsigned u;
+ int fd, i, floppy_ctrls = 0, floppy_ctrl_idx = 0;
+ str_list_t *sl;
+ hd_res_t *res;
+ int floppy_stat[2] = { 1, 1 };
+
+ if(!hd_probe_feature(hd_data, pr_floppy)) return;
+
+ hd_data->module = mod_floppy;
+
+ /* some clean-up */
+ remove_hd_entries(hd_data);
+ hd_data->floppy = free_str_list(hd_data->floppy);
+
+ PROGRESS(1, 0, "get nvram");
+
+ /*
+ * Look for existing floppy controller entries (typically there will be
+ * *none*).
+ */
+ for(hd = hd_data->hd; hd; hd = hd->next) {
+ if(hd->base_class.id == bc_storage && hd->sub_class.id == sc_sto_floppy) {
+ floppy_ctrls++;
+ floppy_ctrl_idx = hd->idx;
+ }
+ }
+
+ /*
+ * Is enough to load the nvram module.
+ *
+ * Note: although you must be root to access /dev/nvram, every
+ * user can read /proc/nvram.
+ */
+ fd = open(DEV_NVRAM, O_RDONLY | O_NONBLOCK);
+ if(fd >= 0) close(fd);
+
+ if(
+ !(hd_data->floppy = read_file(PROC_NVRAM_24, 0, 0)) &&
+ !(hd_data->floppy = read_file(PROC_NVRAM_22, 0, 0))
+ );
+
+ if(hd_data->floppy && (hd_data->debug & HD_DEB_FLOPPY)) dump_floppy_data(hd_data);
+
+ if(!hd_data->klog) read_klog(hd_data);
+
+ for(sl = hd_data->klog; sl; sl = sl->next) {
+ if(sscanf(sl->str, "<4>floppy%u: no floppy controllers foun%c", &u, &c) == 2) {
+ if(u < sizeof floppy_stat / sizeof *floppy_stat) {
+ floppy_stat[u] = 0;
+ }
+ }
+ }
+
+ if(hd_data->floppy) {
+ PROGRESS(2, 0, "nvram info");
+ sl = hd_data->floppy;
+ }
+ else {
+ PROGRESS(2, 0, "klog info");
+ sl = hd_data->klog;
+ }
+
+ for(; sl; sl = sl->next) {
+ if(hd_data->floppy) {
+ i = sscanf(sl->str, " Floppy %u type : %8[0-9.]'' %8[0-9.]%c", &u, b0, b1, &c) == 4;
+ }
+ else {
+ i = sscanf(sl->str, "<6>Floppy drive(s): fd%u is %8[0-9.]%c", &u, b1, &c) == 3;
+ *b0 = 0;
+ }
+
+ if(i) {
+ if(
+ !floppy_ctrls &&
+ u < sizeof floppy_stat / sizeof *floppy_stat &&
+ floppy_stat[u]
+ ) {
+ /* create one, if missing (there's no floppy without a controller...) */
+ hd = add_hd_entry(hd_data, __LINE__, 0);
+ hd->base_class.id = bc_storage;
+ hd->sub_class.id = sc_sto_floppy;
+ floppy_ctrl_idx = hd->idx;
+ floppy_ctrls++;
+ }
+
+ if(floppy_ctrls) {
+ hd = add_hd_entry(hd_data, __LINE__, 0);
+ hd->base_class.id = bc_storage_device;
+ hd->sub_class.id = sc_sdev_floppy;
+ hd->bus.id = bus_floppy;
+ hd->slot = u;
+ str_printf(&hd->unix_dev_name, 0, "/dev/fd%u", u);
+
+ if(*b0) {
+ res = add_res_entry(&hd->res, new_mem(sizeof *res));
+ res->size.type = res_size;
+ res->size.val1 = str2float(b0, 2);
+ res->size.unit = size_unit_cinch;
+ }
+
+ /* 'k' or 'M' */
+ i = c == 'M' ? str2float(b1, 3) : str2float(b1, 0);
+
+ res = add_res_entry(&hd->res, new_mem(sizeof *res));
+ res->size.type = res_size;
+ res->size.val1 = i << 1;
+ res->size.val2 = 0x200;
+ res->size.unit = size_unit_sectors;
+
+ /* the only choice... */
+ if(floppy_ctrls == 1) hd->attached_to = floppy_ctrl_idx;
+ }
+ }
+ }
+}
+
+
+/*
+ * Add floppy data to the global log.
+ */
+void dump_floppy_data(hd_data_t *hd_data)
+{
+ str_list_t *sl;
+
+ ADD2LOG("----- /proc/nvram -----\n");
+ for(sl = hd_data->floppy; sl; sl = sl->next) {
+ ADD2LOG(" %s", sl->str);
+ }
+ ADD2LOG("----- /proc/nvram end -----\n");
+}
--- /dev/null
+void hd_scan_floppy(hd_data_t *hd_data);
--- /dev/null
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <stdarg.h>
+#include <fcntl.h>
+#include <signal.h>
+#include <ctype.h>
+#include <errno.h>
+#include <dirent.h>
+#include <time.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+#include <sys/time.h>
+#include <sys/ioctl.h>
+#include <sys/mount.h>
+#include <sys/ipc.h>
+#include <sys/shm.h>
+#include <sys/mman.h>
+typedef unsigned long kernel_ulong_t;
+#include <linux/types.h>
+#include <linux/pci.h>
+#include <linux/hdreg.h>
+#define _LINUX_AUDIT_H_
+#include <linux/fs.h>
+
+#define u64 uint64_t
+
+#ifndef BLKSSZGET
+#define BLKSSZGET _IO(0x12,104) /* get block device sector size */
+#endif
+
+#include "hd.h"
+#include "hddb.h"
+#include "hd_int.h"
+#include "smbios.h"
+#include "memory.h"
+#include "isapnp.h"
+#include "monitor.h"
+#include "cpu.h"
+#include "misc.h"
+#include "mouse.h"
+#include "floppy.h"
+#include "bios.h"
+#include "serial.h"
+#include "net.h"
+#include "version.h"
+#include "usb.h"
+#include "adb.h"
+#include "modem.h"
+#include "parallel.h"
+#include "isa.h"
+#include "isdn.h"
+#include "kbd.h"
+#include "prom.h"
+#include "sbus.h"
+#include "int.h"
+#include "braille.h"
+#include "sys.h"
+#include "manual.h"
+#include "fb.h"
+#include "pppoe.h"
+#include "pcmcia.h"
+#include "s390.h"
+#include "pci.h"
+#include "block.h"
+#include "edd.h"
+#include "input.h"
+#include "wlan.h"
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ * various functions commmon to all probing modules
+ *
+ * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ */
+
+#ifdef __i386__
+#define HD_ARCH "ia32"
+#endif
+
+#ifdef __ia64__
+#define HD_ARCH "ia64"
+#endif
+
+#ifdef __alpha__
+#define HD_ARCH "axp"
+#endif
+
+#ifdef __PPC__
+#define HD_ARCH "ppc"
+#endif
+
+#ifdef __sparc__
+#define HD_ARCH "sparc"
+#endif
+
+#ifdef __s390x__
+#define HD_ARCH "s390x"
+#else
+#ifdef __s390__
+#define HD_ARCH "s390"
+#endif
+#endif
+
+#ifdef __arm__
+#define HD_ARCH "arm"
+#endif
+
+#ifdef __mips__
+#define HD_ARCH "mips"
+#endif
+
+#ifdef __x86_64__
+#define HD_ARCH "x86-64"
+#endif
+
+#ifdef __hppa__
+#define HD_ARCH "hppa"
+#endif
+
+typedef struct disk_s {
+ struct disk_s *next;
+ unsigned crc;
+ unsigned crc_match:1;
+ unsigned hd_idx;
+ char *dev_name;
+ unsigned char *data;
+} disk_t;
+
+static struct s_pr_flags *get_pr_flags(enum probe_feature feature);
+static void fix_probe_features(hd_data_t *hd_data);
+static void set_probe_feature(hd_data_t *hd_data, enum probe_feature feature, unsigned val);
+static void free_old_hd_entries(hd_data_t *hd_data);
+static hd_t *free_hd_entry(hd_t *hd);
+static hd_t *add_hd_entry2(hd_t **hd, hd_t *new_hd);
+static void timeout_alarm_handler(int signal);
+static void get_probe_env(hd_data_t *hd_data);
+static void hd_scan_xtra(hd_data_t *hd_data);
+static hd_t *hd_get_device_by_id(hd_data_t *hd_data, char *id);
+static int has_item(hd_hw_item_t *items, hd_hw_item_t item);
+static int has_hw_class(hd_t *hd, hd_hw_item_t *items);
+
+static void test_read_block0_open(void *arg);
+static void get_kernel_version(hd_data_t *hd_data);
+static int is_modem(hd_data_t *hd_data, hd_t *hd);
+static int is_audio(hd_data_t *hd_data, hd_t *hd);
+static void assign_hw_class(hd_data_t *hd_data, hd_t *hd);
+static void short_vendor(char *vendor);
+static void create_model_name(hd_data_t *hd_data, hd_t *hd);
+
+static void sigchld_handler(int);
+static pid_t child_id;
+static volatile pid_t child;
+static char *hd_shm_add_str(hd_data_t *hd_data, char *str);
+static str_list_t *hd_shm_add_str_list(hd_data_t *hd_data, str_list_t *sl);
+
+static hd_udevinfo_t *hd_free_udevinfo(hd_udevinfo_t *ui);
+static hd_sysfsdrv_t *hd_free_sysfsdrv(hd_sysfsdrv_t *sf);
+
+
+/*
+ * Names of the probing modules.
+ * Cf. enum mod_idx in hd_int.h.
+ */
+static struct s_mod_names {
+ unsigned val;
+ char *name;
+} pr_modules[] = {
+ { mod_none, "none"},
+ { mod_memory, "memory"},
+ { mod_pci, "pci"},
+ { mod_isapnp, "isapnp"},
+ { mod_pnpdump, "pnpdump"},
+ { mod_net, "net"},
+ { mod_floppy, "floppy"},
+ { mod_misc, "misc" },
+ { mod_bios, "bios"},
+ { mod_cpu, "cpu"},
+ { mod_monitor, "monitor"},
+ { mod_serial, "serial"},
+ { mod_mouse, "mouse"},
+ { mod_scsi, "scsi"},
+ { mod_usb, "usb"},
+ { mod_adb, "adb"},
+ { mod_modem, "modem"},
+ { mod_parallel, "parallel" },
+ { mod_isa, "isa" },
+ { mod_isdn, "isdn" },
+ { mod_kbd, "kbd" },
+ { mod_prom, "prom" },
+ { mod_sbus, "sbus" },
+ { mod_int, "int" },
+ { mod_braille, "braille" },
+ { mod_xtra, "hd" },
+ { mod_sys, "sys" },
+ { mod_manual, "manual" },
+ { mod_fb, "fb" },
+ { mod_pppoe, "pppoe" },
+ { mod_pcmcia, "pcmcia" },
+ { mod_s390, "s390" },
+ { mod_sysfs, "sysfs" },
+ { mod_dsl, "dsl" },
+ { mod_block, "block" },
+ { mod_edd, "edd" },
+ { mod_input, "input" }
+};
+
+/*
+ * Names for the probe flags. Used for debugging and command line parsing in
+ * hw.c. Cf. enum probe_feature, hd_data_t.probe.
+ */
+static struct s_pr_flags {
+ enum probe_feature val, parent;
+ unsigned mask; /* bit 0: default, bit 1: all, bit 2: max, bit 3: linuxrc */
+ char *name;
+} pr_flags[] = {
+ { pr_default, -1, 1, "default" },
+ { pr_all, -1, 2 , "all" },
+ { pr_max, -1, 4 , "max" },
+ { pr_lxrc, -1, 8 , "lxrc" },
+ { pr_memory, 0, 8|4|2|1, "memory" },
+ { pr_pci, 0, 8|4|2|1, "pci" },
+ { pr_s390, 0, 8|4|2|1, "s390" },
+ { pr_s390disks, 0, 0, "s390disks" },
+ { pr_isapnp, 0, 4|2|1, "isapnp" },
+ { pr_isapnp_old, pr_isapnp, 0, "isapnp.old" },
+ { pr_isapnp_new, pr_isapnp, 0, "isapnp.new" },
+ { pr_isapnp_mod, 0, 4 , "isapnp.mod" },
+ { pr_isapnp, 0, 0, "pnpdump" }, /* alias for isapnp */
+ { pr_net, 0, 8|4|2|1, "net" },
+ { pr_floppy, 0, 8|4|2|1, "floppy" },
+ { pr_misc, pr_bios, 8|4|2|1, "misc" }, // ugly hack!
+ { pr_misc_serial, pr_misc, 8|4|2|1, "misc.serial" },
+ { pr_misc_par, pr_misc, 4|2|1, "misc.par" },
+ { pr_misc_floppy, pr_misc, 8|4|2|1, "misc.floppy" },
+ { pr_bios, 0, 8|4|2|1, "bios" },
+ { pr_bios_vesa, pr_bios, 4|2|1, "bios.vesa" },
+ { pr_bios_ddc, pr_bios_vesa, 0, "bios.ddc" },
+ { pr_bios_fb, pr_bios_vesa, 0, "bios.fb" },
+ { pr_bios_mode, pr_bios_vesa, 0, "bios.mode" },
+ { pr_bios_vbe, pr_bios_mode, 0, "bios.vbe" }, // just an alias
+ { pr_cpu, 0, 8|4|2|1, "cpu" },
+ { pr_monitor, 0, 8|4|2|1, "monitor" },
+ { pr_serial, 0, 4|2|1, "serial" },
+#if defined(__sparc__)
+ /* Probe for mouse on SPARC */
+ { pr_mouse, 0, 8|4|2|1, "mouse" },
+#else
+ { pr_mouse, 0, 4|2|1, "mouse" },
+#endif
+ { pr_scsi, 0, 8|4|2|1, "scsi" },
+ { pr_scsi_noserial, 0, 0, "scsi.noserial" },
+ { pr_usb, 0, 8|4|2|1, "usb" },
+ { pr_usb_mods, 0, 4 , "usb.mods" },
+ { pr_adb, 0, 8|4|2|1, "adb" },
+ { pr_modem, 0, 4|2|1, "modem" },
+ { pr_modem_usb, pr_modem, 4|2|1, "modem.usb" },
+ { pr_parallel, 0, 4|2|1, "parallel" },
+ { pr_parallel_lp, pr_parallel, 4|2|1, "parallel.lp" },
+ { pr_parallel_zip, pr_parallel, 4|2|1, "parallel.zip" },
+ { pr_parallel_imm, 0, 0, "parallel.imm" },
+ { pr_isa, 0, 4|2|1, "isa" },
+ { pr_isa_isdn, pr_isa, 4|2|1, "isa.isdn" },
+ { pr_isdn, 0, 4|2|1, "isdn" },
+ { pr_kbd, 0, 8|4|2|1, "kbd" },
+ { pr_prom, 0, 8|4|2|1, "prom" },
+ { pr_sbus, 0, 8|4|2|1, "sbus" },
+ { pr_int, 0, 8|4|2|1, "int" },
+#if defined(__i386__) || defined (__x86_64__)
+ { pr_braille, 0, 4|2|1, "braille" },
+ { pr_braille_alva, pr_braille, 4|2|1, "braille.alva" },
+ { pr_braille_fhp, pr_braille, 4|2|1, "braille.fhp" },
+ { pr_braille_ht, pr_braille, 4|2|1, "braille.ht" },
+ { pr_braille_baum, pr_braille, 4|2|1, "braille.baum" },
+#else
+ { pr_braille, 0, 4|2 , "braille" },
+ { pr_braille_alva, pr_braille, 0, "braille.alva" },
+ { pr_braille_fhp, pr_braille, 4|2 , "braille.fhp" },
+ { pr_braille_ht, pr_braille, 4|2 , "braille.ht" },
+ { pr_braille_baum, pr_braille, 4|2 , "braille.baum" },
+#endif
+ { pr_ignx11, 0, 0, "ignx11" },
+ { pr_sys, 0, 8|4|2|1, "sys" },
+ { pr_manual, 0, 8|4|2|1, "manual" },
+ { pr_fb, 0, 8|4|2|1, "fb" },
+ { pr_pppoe, 0, 8|4|2|1, "pppoe" },
+ /* dummy, used to turn off hwscan */
+ { pr_scan, 0, 0, "scan" },
+ { pr_pcmcia, 0, 8|4|2|1, "pcmcia" },
+ { pr_fork, 0, 0, "fork" },
+ { pr_cpuemu, 0, 0, "cpuemu" },
+ { pr_cpuemu_debug, pr_cpuemu, 0, "cpuemu.debug" },
+ { pr_sysfs, 0, 0, "sysfs" },
+ { pr_dsl, 0, 4|2|1, "dsl" },
+ { pr_udev, 0, 8|4|2|1, "udev" },
+ { pr_block, 0, 8|4|2|1, "block" },
+ { pr_block_cdrom, pr_block, 8|4|2|1, "block.cdrom" },
+ { pr_block_part, pr_block, 8|4|2|1, "block.part" },
+ { pr_block_mods, pr_block, 8|4|2|1, "block.mods" },
+ { pr_edd, 0, 8|4|2|1, "edd" },
+ { pr_edd_mod, pr_edd, 8|4|2|1, "edd.mod" },
+ { pr_input, 0, 8|4|2|1, "input" },
+ { pr_wlan, 0, 8|4|2|1, "wlan" }
+};
+
+struct s_pr_flags *get_pr_flags(enum probe_feature feature)
+{
+ int i;
+
+ for(i = 0; (unsigned) i < sizeof pr_flags / sizeof *pr_flags; i++) {
+ if(feature == pr_flags[i].val) return pr_flags + i;
+ }
+
+ return NULL;
+}
+
+void fix_probe_features(hd_data_t *hd_data)
+{
+ int i;
+
+ for(i = 0; (unsigned) i < sizeof hd_data->probe; i++) {
+ hd_data->probe[i] |= hd_data->probe_set[i];
+ hd_data->probe[i] &= ~hd_data->probe_clr[i];
+ }
+}
+
+void set_probe_feature(hd_data_t *hd_data, enum probe_feature feature, unsigned val)
+{
+ unsigned ofs, bit, mask;
+ int i;
+ struct s_pr_flags *pr;
+
+ if(!(pr = get_pr_flags(feature))) return;
+
+ if(pr->parent == -1u) {
+ mask = pr->mask;
+ for(i = 0; (unsigned) i < sizeof pr_flags / sizeof *pr_flags; i++) {
+ if(pr_flags[i].parent != -1u && (pr_flags[i].mask & mask))
+ set_probe_feature(hd_data, pr_flags[i].val, val);
+ }
+ }
+ else {
+ ofs = feature >> 3; bit = feature & 7;
+ if(ofs < sizeof hd_data->probe) {
+ if(val) {
+ hd_data->probe_set[ofs] |= 1 << bit;
+ hd_data->probe_clr[ofs] &= ~(1 << bit);
+ }
+ else {
+ hd_data->probe_clr[ofs] |= 1 << bit;
+ hd_data->probe_set[ofs] &= ~(1 << bit);
+ }
+ }
+ if(pr->parent) set_probe_feature(hd_data, pr->parent, val);
+ }
+
+ fix_probe_features(hd_data);
+}
+
+void hd_set_probe_feature(hd_data_t *hd_data, enum probe_feature feature)
+{
+ unsigned ofs, bit, mask;
+ int i;
+ struct s_pr_flags *pr;
+
+#ifdef LIBHD_MEMCHECK
+ {
+ if(libhd_log)
+ fprintf(libhd_log, "; %s\t%p\t%p\n", __FUNCTION__, CALLED_FROM(hd_set_probe_feature, hd_data), hd_data);
+ }
+#endif
+
+ if(!(pr = get_pr_flags(feature))) return;
+
+ if(pr->parent == -1u) {
+ mask = pr->mask;
+ for(i = 0; (unsigned) i < sizeof pr_flags / sizeof *pr_flags; i++) {
+ if(pr_flags[i].parent != -1u && (pr_flags[i].mask & mask))
+ hd_set_probe_feature(hd_data, pr_flags[i].val);
+ }
+ }
+ else {
+ ofs = feature >> 3; bit = feature & 7;
+ if(ofs < sizeof hd_data->probe)
+ hd_data->probe[ofs] |= 1 << bit;
+ if(pr->parent) hd_set_probe_feature(hd_data, pr->parent);
+ }
+
+ fix_probe_features(hd_data);
+}
+
+void hd_clear_probe_feature(hd_data_t *hd_data, enum probe_feature feature)
+{
+ unsigned ofs, bit, mask;
+ int i;
+ struct s_pr_flags *pr;
+
+#ifdef LIBHD_MEMCHECK
+ {
+ if(libhd_log)
+ fprintf(libhd_log, "; %s\t%p\t%p\n", __FUNCTION__, CALLED_FROM(hd_clear_probe_feature, hd_data), hd_data);
+ }
+#endif
+
+ if(!(pr = get_pr_flags(feature))) return;
+
+ if(pr->parent == -1u) {
+ mask = pr->mask;
+ for(i = 0; (unsigned) i < sizeof pr_flags / sizeof *pr_flags; i++) {
+ if(pr_flags[i].parent != -1u && (pr_flags[i].mask & mask))
+ hd_clear_probe_feature(hd_data, pr_flags[i].val);
+ }
+ }
+ else {
+ ofs = feature >> 3; bit = feature & 7;
+ if(ofs < sizeof hd_data->probe)
+ hd_data->probe[ofs] &= ~(1 << bit);
+ }
+}
+
+int hd_probe_feature(hd_data_t *hd_data, enum probe_feature feature)
+{
+#ifdef LIBHD_MEMCHECK
+ {
+ if(libhd_log)
+ fprintf(libhd_log, "; %s\t%p\t%p\n", __FUNCTION__, CALLED_FROM(hd_probe_feature, hd_data), hd_data);
+ }
+#endif
+
+ if(feature < 0 || feature >= pr_default) return 0;
+
+ return hd_data->probe[feature >> 3] & (1 << (feature & 7)) ? 1 : 0;
+}
+
+
+void hd_set_probe_feature_hw(hd_data_t *hd_data, hd_hw_item_t item)
+{
+ hd_set_probe_feature(hd_data, pr_int);
+ hd_set_probe_feature(hd_data, pr_manual);
+
+ switch(item) {
+ case hw_cdrom:
+ hd_set_probe_feature(hd_data, pr_pci);
+ hd_set_probe_feature(hd_data, pr_usb);
+ hd_set_probe_feature(hd_data, pr_block_mods);
+ hd_set_probe_feature(hd_data, pr_scsi);
+ if(!hd_data->flags.fast) {
+ hd_set_probe_feature(hd_data, pr_block_cdrom);
+ }
+ break;
+
+ case hw_floppy:
+ hd_set_probe_feature(hd_data, pr_floppy);
+ hd_set_probe_feature(hd_data, pr_misc_floppy);
+ hd_set_probe_feature(hd_data, pr_prom);
+ hd_set_probe_feature(hd_data, pr_pci);
+ hd_set_probe_feature(hd_data, pr_usb);
+ hd_set_probe_feature(hd_data, pr_block);
+ hd_set_probe_feature(hd_data, pr_block_mods);
+ hd_set_probe_feature(hd_data, pr_scsi);
+ break;
+
+ case hw_partition:
+ hd_set_probe_feature(hd_data, pr_block_part);
+
+ case hw_disk:
+ hd_set_probe_feature(hd_data, pr_s390disks);
+ hd_set_probe_feature(hd_data, pr_bios); // bios disk order
+ hd_set_probe_feature(hd_data, pr_pci);
+ hd_set_probe_feature(hd_data, pr_usb);
+ hd_set_probe_feature(hd_data, pr_block);
+ hd_set_probe_feature(hd_data, pr_block_mods);
+ hd_set_probe_feature(hd_data, pr_edd_mod);
+ hd_set_probe_feature(hd_data, pr_scsi);
+ break;
+
+ case hw_block:
+ hd_set_probe_feature(hd_data, pr_prom);
+ hd_set_probe_feature(hd_data, pr_s390disks);
+ hd_set_probe_feature(hd_data, pr_bios); // bios disk order
+ hd_set_probe_feature(hd_data, pr_pci);
+ hd_set_probe_feature(hd_data, pr_usb);
+ hd_set_probe_feature(hd_data, pr_block);
+ hd_set_probe_feature(hd_data, pr_block_mods);
+ hd_set_probe_feature(hd_data, pr_edd_mod);
+ hd_set_probe_feature(hd_data, pr_scsi);
+ if(!hd_data->flags.fast) {
+ hd_set_probe_feature(hd_data, pr_floppy);
+ hd_set_probe_feature(hd_data, pr_misc_floppy);
+ hd_set_probe_feature(hd_data, pr_block_cdrom);
+ }
+ hd_set_probe_feature(hd_data, pr_block_part);
+ break;
+
+ case hw_network:
+ hd_set_probe_feature(hd_data, pr_net);
+ hd_set_probe_feature(hd_data, pr_pci);
+ hd_set_probe_feature(hd_data, pr_prom);
+ hd_set_probe_feature(hd_data, pr_usb);
+ break;
+
+ case hw_display:
+ hd_set_probe_feature(hd_data, pr_pci);
+ hd_set_probe_feature(hd_data, pr_sbus);
+ hd_set_probe_feature(hd_data, pr_prom);
+ hd_set_probe_feature(hd_data, pr_misc); /* for isa cards */
+ break;
+
+ case hw_monitor:
+ hd_set_probe_feature(hd_data, pr_misc);
+ hd_set_probe_feature(hd_data, pr_prom);
+ hd_set_probe_feature(hd_data, pr_pci);
+ hd_set_probe_feature(hd_data, pr_bios_ddc);
+ hd_set_probe_feature(hd_data, pr_fb);
+ hd_set_probe_feature(hd_data, pr_monitor);
+ break;
+
+ case hw_framebuffer:
+ hd_set_probe_feature(hd_data, pr_misc);
+ hd_set_probe_feature(hd_data, pr_prom);
+ hd_set_probe_feature(hd_data, pr_pci);
+ hd_set_probe_feature(hd_data, pr_bios_fb);
+ hd_set_probe_feature(hd_data, pr_fb);
+ break;
+
+ case hw_mouse:
+ hd_set_probe_feature(hd_data, pr_misc);
+ if(!hd_data->flags.fast) {
+ hd_set_probe_feature(hd_data, pr_serial);
+ }
+ hd_set_probe_feature(hd_data, pr_adb);
+ hd_set_probe_feature(hd_data, pr_usb);
+ hd_set_probe_feature(hd_data, pr_kbd);
+ hd_set_probe_feature(hd_data, pr_sys);
+ hd_set_probe_feature(hd_data, pr_bios);
+ hd_set_probe_feature(hd_data, pr_mouse);
+ hd_set_probe_feature(hd_data, pr_input);
+ break;
+
+ case hw_joystick:
+ hd_set_probe_feature(hd_data, pr_usb);
+ hd_set_probe_feature(hd_data, pr_input);
+ break;
+
+ case hw_chipcard:
+ hd_set_probe_feature(hd_data, pr_misc);
+ if(!hd_data->flags.fast) {
+ hd_set_probe_feature(hd_data, pr_serial);
+ }
+ hd_set_probe_feature(hd_data, pr_usb);
+ hd_set_probe_feature(hd_data, pr_mouse); /* we need the pnp code */
+ break;
+
+ case hw_camera:
+ hd_set_probe_feature(hd_data, pr_usb);
+ break;
+
+ case hw_keyboard:
+ hd_set_probe_feature(hd_data, pr_cpu);
+ hd_set_probe_feature(hd_data, pr_misc);
+ hd_set_probe_feature(hd_data, pr_adb);
+ hd_set_probe_feature(hd_data, pr_usb);
+ hd_set_probe_feature(hd_data, pr_kbd);
+ hd_set_probe_feature(hd_data, pr_input);
+#ifdef __PPC__
+ hd_set_probe_feature(hd_data, pr_serial);
+#endif
+ break;
+
+ case hw_sound:
+ hd_set_probe_feature(hd_data, pr_misc);
+ hd_set_probe_feature(hd_data, pr_pci);
+ hd_set_probe_feature(hd_data, pr_isapnp);
+ hd_set_probe_feature(hd_data, pr_isapnp_mod);
+ hd_set_probe_feature(hd_data, pr_sbus);
+ hd_set_probe_feature(hd_data, pr_prom);
+ break;
+
+ case hw_isdn:
+ hd_set_probe_feature(hd_data, pr_misc); /* get basic i/o res */
+ hd_set_probe_feature(hd_data, pr_pci);
+ hd_set_probe_feature(hd_data, pr_pcmcia);
+ hd_set_probe_feature(hd_data, pr_isapnp);
+ hd_set_probe_feature(hd_data, pr_isapnp_mod);
+ hd_set_probe_feature(hd_data, pr_isa_isdn);
+ hd_set_probe_feature(hd_data, pr_usb);
+ hd_set_probe_feature(hd_data, pr_isdn);
+ break;
+
+ case hw_modem:
+ hd_set_probe_feature(hd_data, pr_misc);
+ hd_set_probe_feature(hd_data, pr_serial);
+ hd_set_probe_feature(hd_data, pr_usb);
+ hd_set_probe_feature(hd_data, pr_pci);
+ hd_set_probe_feature(hd_data, pr_modem);
+ hd_set_probe_feature(hd_data, pr_modem_usb);
+ break;
+
+ case hw_storage_ctrl:
+ hd_set_probe_feature(hd_data, pr_floppy);
+ hd_set_probe_feature(hd_data, pr_sys);
+ hd_set_probe_feature(hd_data, pr_pci);
+ hd_set_probe_feature(hd_data, pr_sbus);
+ if(!hd_data->flags.fast) {
+ hd_set_probe_feature(hd_data, pr_misc_par);
+ hd_set_probe_feature(hd_data, pr_parallel_zip);
+ }
+ hd_set_probe_feature(hd_data, pr_s390);
+ hd_set_probe_feature(hd_data, pr_prom);
+#ifdef __PPC__
+ hd_set_probe_feature(hd_data, pr_misc);
+#endif
+ break;
+
+ case hw_network_ctrl:
+ hd_set_probe_feature(hd_data, pr_misc);
+ hd_set_probe_feature(hd_data, pr_usb);
+ hd_set_probe_feature(hd_data, pr_pci);
+ hd_set_probe_feature(hd_data, pr_net);
+ hd_set_probe_feature(hd_data, pr_pcmcia);
+ hd_set_probe_feature(hd_data, pr_isapnp);
+ hd_set_probe_feature(hd_data, pr_isapnp_mod);
+ hd_set_probe_feature(hd_data, pr_sbus);
+ hd_set_probe_feature(hd_data, pr_isdn);
+ hd_set_probe_feature(hd_data, pr_dsl);
+ hd_set_probe_feature(hd_data, pr_prom);
+ hd_set_probe_feature(hd_data, pr_s390);
+ hd_set_probe_feature(hd_data, pr_wlan);
+ break;
+
+ case hw_printer:
+ hd_set_probe_feature(hd_data, pr_sys);
+ hd_set_probe_feature(hd_data, pr_bios);
+ hd_set_probe_feature(hd_data, pr_misc_par);
+ hd_set_probe_feature(hd_data, pr_parallel_lp);
+ hd_set_probe_feature(hd_data, pr_usb);
+ break;
+
+ case hw_wlan:
+ hd_set_probe_feature(hd_data, pr_pcmcia);
+ hd_set_probe_feature(hd_data, pr_wlan);
+ hd_set_probe_feature(hd_data, pr_pci);
+ hd_set_probe_feature(hd_data, pr_usb);
+ hd_set_probe_feature(hd_data, pr_net);
+ break;
+
+ case hw_tv:
+ case hw_dvb:
+ hd_set_probe_feature(hd_data, pr_pci);
+ break;
+
+ case hw_scanner:
+ hd_set_probe_feature(hd_data, pr_pci);
+ hd_set_probe_feature(hd_data, pr_usb);
+ hd_set_probe_feature(hd_data, pr_scsi);
+ break;
+
+ case hw_braille:
+ hd_set_probe_feature(hd_data, pr_misc_serial);
+ hd_set_probe_feature(hd_data, pr_serial);
+ hd_set_probe_feature(hd_data, pr_braille_alva);
+ hd_set_probe_feature(hd_data, pr_braille_fhp);
+ hd_set_probe_feature(hd_data, pr_braille_ht);
+ hd_set_probe_feature(hd_data, pr_braille_baum);
+ hd_set_probe_feature(hd_data, pr_usb);
+ break;
+
+ case hw_sys:
+ hd_set_probe_feature(hd_data, pr_bios);
+ hd_set_probe_feature(hd_data, pr_prom);
+ hd_set_probe_feature(hd_data, pr_s390);
+ hd_set_probe_feature(hd_data, pr_sys);
+ break;
+
+ case hw_cpu:
+ hd_set_probe_feature(hd_data, pr_cpu);
+ break;
+
+ case hw_bios:
+ hd_set_probe_feature(hd_data, pr_bios);
+ hd_set_probe_feature(hd_data, pr_edd_mod);
+ break;
+
+ case hw_vbe:
+ hd_set_probe_feature(hd_data, pr_bios_ddc);
+ hd_set_probe_feature(hd_data, pr_bios_fb);
+ hd_set_probe_feature(hd_data, pr_bios_mode);
+ hd_set_probe_feature(hd_data, pr_monitor);
+ break;
+
+ case hw_manual:
+ hd_set_probe_feature(hd_data, pr_manual);
+ break;
+
+ case hw_usb_ctrl:
+ case hw_pcmcia_ctrl:
+ case hw_ieee1394_ctrl:
+ case hw_hotplug_ctrl:
+ hd_set_probe_feature(hd_data, pr_misc);
+ hd_set_probe_feature(hd_data, pr_pci);
+ break;
+
+ case hw_usb:
+ hd_set_probe_feature(hd_data, pr_usb);
+ hd_set_probe_feature(hd_data, pr_isdn); // need pr_misc, too?
+ hd_set_probe_feature(hd_data, pr_dsl);
+ hd_set_probe_feature(hd_data, pr_block);
+ hd_set_probe_feature(hd_data, pr_block_mods);
+ hd_set_probe_feature(hd_data, pr_scsi);
+ hd_set_probe_feature(hd_data, pr_net);
+ hd_data->flags.fast = 1;
+ break;
+
+ case hw_pci:
+ hd_set_probe_feature(hd_data, pr_misc);
+ hd_set_probe_feature(hd_data, pr_pci);
+ hd_set_probe_feature(hd_data, pr_net);
+ hd_set_probe_feature(hd_data, pr_isdn);
+ hd_set_probe_feature(hd_data, pr_dsl);
+ hd_set_probe_feature(hd_data, pr_prom);
+ break;
+
+ case hw_isapnp:
+ hd_set_probe_feature(hd_data, pr_isapnp);
+ hd_set_probe_feature(hd_data, pr_isapnp_mod);
+ hd_set_probe_feature(hd_data, pr_misc);
+ hd_set_probe_feature(hd_data, pr_isdn);
+ break;
+
+ case hw_bridge:
+ hd_set_probe_feature(hd_data, pr_misc);
+ hd_set_probe_feature(hd_data, pr_pci);
+ break;
+
+ case hw_hub:
+ hd_set_probe_feature(hd_data, pr_usb);
+ break;
+
+ case hw_memory:
+ hd_set_probe_feature(hd_data, pr_memory);
+ break;
+
+ case hw_scsi:
+ case hw_tape:
+ hd_set_probe_feature(hd_data, pr_pci);
+ hd_set_probe_feature(hd_data, pr_block);
+ hd_set_probe_feature(hd_data, pr_block_mods);
+ hd_set_probe_feature(hd_data, pr_scsi);
+ break;
+
+ case hw_ide:
+ hd_set_probe_feature(hd_data, pr_pci);
+ hd_set_probe_feature(hd_data, pr_block);
+ hd_set_probe_feature(hd_data, pr_block_mods);
+ break;
+
+ case hw_pppoe:
+ hd_set_probe_feature(hd_data, pr_net);
+ hd_set_probe_feature(hd_data, pr_pppoe);
+ break;
+
+ case hw_dsl:
+ hd_set_probe_feature(hd_data, pr_net);
+ hd_set_probe_feature(hd_data, pr_pci);
+ hd_set_probe_feature(hd_data, pr_pppoe);
+ hd_set_probe_feature(hd_data, pr_usb);
+ break;
+
+ case hw_pcmcia:
+ hd_set_probe_feature(hd_data, pr_pci);
+ hd_set_probe_feature(hd_data, pr_pcmcia);
+ hd_set_probe_feature(hd_data, pr_wlan);
+ hd_set_probe_feature(hd_data, pr_net);
+ hd_set_probe_feature(hd_data, pr_isdn);
+ break;
+
+ case hw_bluetooth:
+ hd_set_probe_feature(hd_data, pr_usb);
+ hd_set_probe_feature(hd_data, pr_isdn); // need pr_misc, too?
+ hd_set_probe_feature(hd_data, pr_dsl);
+ break;
+
+ case hw_all:
+ hd_set_probe_feature(hd_data, pr_default);
+ break;
+
+ case hw_redasd:
+ hd_set_probe_feature(hd_data, pr_block);
+ hd_set_probe_feature(hd_data, pr_block_mods);
+ break;
+
+ case hw_unknown:
+ case hw_ieee1394:
+ case hw_hotplug:
+ case hw_zip:
+ break;
+ }
+}
+
+
+/*
+ * Free all data associated with a hd_data_t struct. *Not* the struct itself.
+ */
+hd_data_t *hd_free_hd_data(hd_data_t *hd_data)
+{
+ hddb_pci_t *p;
+ unsigned u;
+
+#ifdef LIBHD_MEMCHECK
+ {
+ if(libhd_log)
+ fprintf(libhd_log, "; %s\t%p\t%p\n", __FUNCTION__, CALLED_FROM(hd_free_hd_data, hd_data), hd_data);
+ }
+#endif
+
+ add_hd_entry2(&hd_data->old_hd, hd_data->hd); hd_data->hd = NULL;
+ hd_data->log = free_mem(hd_data->log);
+ free_old_hd_entries(hd_data); /* hd_data->old_hd */
+ /* hd_data->pci is always NULL */
+ /* hd_data->isapnp->card is always NULL */
+ hd_data->isapnp = free_mem(hd_data->isapnp);
+ /* hd_data->cdrom is always NULL */
+ hd_data->net = free_str_list(hd_data->net);
+ hd_data->floppy = free_str_list(hd_data->floppy);
+ hd_data->misc = free_misc(hd_data->misc);
+ /* hd_data->serial is always NULL */
+ /* hd_data->scsi is always NULL */
+ /* hd_data->ser_mouse is always NULL */
+ /* hd_data->ser_modem is always NULL */
+ hd_data->cpu = free_str_list(hd_data->cpu);
+ hd_data->klog = free_str_list(hd_data->klog);
+ hd_data->proc_usb = free_str_list(hd_data->proc_usb);
+ /* hd_data->usb is always NULL */
+
+ if((p = hd_data->hddb_pci)) {
+ for(; p->module; p++) free_mem(p->module);
+ }
+ if(hd_data->hddb2[0]) {
+ free_mem(hd_data->hddb2[0]->list);
+ free_mem(hd_data->hddb2[0]->ids);
+ free_mem(hd_data->hddb2[0]->strings);
+ hd_data->hddb2[0] = free_mem(hd_data->hddb2[0]);
+ }
+ /* hddb2[1] is the static internal database; don't try to free it! */
+ hd_data->hddb2[1] = NULL;
+
+ hd_data->hddb_pci = free_mem(hd_data->hddb_pci);
+ hd_data->kmods = free_str_list(hd_data->kmods);
+ hd_data->bios_rom.data = free_mem(hd_data->bios_rom.data);
+ hd_data->bios_ram.data = free_mem(hd_data->bios_ram.data);
+ hd_data->bios_ebda.data = free_mem(hd_data->bios_ebda.data);
+ hd_data->cmd_line = free_mem(hd_data->cmd_line);
+ hd_data->xtra_hd = free_str_list(hd_data->xtra_hd);
+ hd_data->devtree = free_devtree(hd_data);
+ hd_data->manual = hd_free_manual(hd_data->manual);
+ hd_data->disks = free_str_list(hd_data->disks);
+ hd_data->partitions = free_str_list(hd_data->partitions);
+ hd_data->cdroms = free_str_list(hd_data->cdroms);
+
+ hd_data->smbios = smbios_free(hd_data->smbios);
+
+ hd_data->udevinfo = hd_free_udevinfo(hd_data->udevinfo);
+ hd_data->sysfsdrv = hd_free_sysfsdrv(hd_data->sysfsdrv);
+
+ hd_data->only = free_str_list(hd_data->only);
+ hd_data->scanner_db = free_str_list(hd_data->scanner_db);
+
+ for(u = 0; u < sizeof hd_data->edd / sizeof *hd_data->edd; u++) {
+ hd_data->edd[u].sysfs_id = free_mem(hd_data->edd[u].sysfs_id);
+ }
+
+ hd_data->last_idx = 0;
+
+ hd_shm_done(hd_data);
+
+ memset(hd_data, 0, sizeof *hd_data);
+
+ return NULL;
+}
+
+
+/*
+ * Free all data associated with a driver_info_t struct. Even the struct itself.
+ */
+driver_info_t *free_driver_info(driver_info_t *di)
+{
+ driver_info_t *next;
+
+#ifdef LIBHD_MEMCHECK
+ {
+ if(libhd_log)
+ fprintf(libhd_log, "; %s\t%p\t%p\n", __FUNCTION__, CALLED_FROM(free_driver_info, di), di);
+ }
+#endif
+
+ for(; di; di = next) {
+ next = di->next;
+
+ switch(di->any.type) {
+ case di_any:
+ case di_display:
+ break;
+
+ case di_module:
+ free_str_list(di->module.names);
+ free_str_list(di->module.mod_args);
+ free_mem(di->module.conf);
+ break;
+
+ case di_mouse:
+ free_mem(di->mouse.xf86);
+ free_mem(di->mouse.gpm);
+ break;
+
+ case di_x11:
+ free_mem(di->x11.server);
+ free_mem(di->x11.xf86_ver);
+ free_str_list(di->x11.extensions);
+ free_str_list(di->x11.options);
+ free_str_list(di->x11.raw);
+ free_mem(di->x11.script);
+ break;
+
+ case di_isdn:
+ free_mem(di->isdn.i4l_name);
+ if(di->isdn.params) {
+ isdn_parm_t *p = di->isdn.params, *next;
+ for(; p; p = next) {
+ next = p->next;
+ free_mem(p->name);
+ free_mem(p->alt_value);
+ free_mem(p);
+ }
+ }
+ break;
+
+ case di_dsl:
+ free_mem(di->dsl.name);
+ free_mem(di->dsl.mode);
+ break;
+
+ case di_kbd:
+ free_mem(di->kbd.XkbRules);
+ free_mem(di->kbd.XkbModel);
+ free_mem(di->kbd.XkbLayout);
+ free_mem(di->kbd.keymap);
+ break;
+ }
+
+ free_str_list(di->any.hddb0);
+ free_str_list(di->any.hddb1);
+
+ free_mem(di);
+ }
+
+ return NULL;
+}
+
+
+int exists_hd_entry(hd_data_t *hd_data, hd_t *old_hd, hd_t *hd_ex)
+{
+ hd_t *hd;
+
+ if(!hd_ex) return 0;
+
+ for(hd = hd_data->hd; hd; hd = hd->next) {
+ if(hd == hd_ex) return 1;
+ }
+ for(hd = old_hd; hd; hd = hd->next) {
+ if(hd == hd_ex) return 1;
+ }
+
+ return 0;
+}
+
+
+/*!
+ * \note This may not free it.
+ */
+hd_t *hd_free_hd_list(hd_t *hd)
+{
+ hd_t *h;
+
+#ifdef LIBHD_MEMCHECK
+ {
+ if(libhd_log)
+ fprintf(libhd_log, "; %s\t%p\t%p\n", __FUNCTION__, CALLED_FROM(hd_free_hd_list, hd), hd);
+ }
+#endif
+
+ /* Note: hd->next should better be NULL! */
+ if(hd && hd->tag.freeit) {
+ free_hd_entry(hd);
+ return free_mem(hd);
+ }
+
+ /* do nothing unless the list holds only copies of hd_t entries */
+ for(h = hd; h; h = h->next) if(!h->ref) return NULL;
+
+ for(; hd; hd = (h = hd)->next, free_mem(h));
+
+ return NULL;
+}
+
+hd_detail_t *free_hd_detail(hd_detail_t *d)
+{
+ if(!d) return NULL;
+
+ switch(d->type) {
+ case hd_detail_pci: {
+ pci_t *p = d->pci.data;
+
+ free_mem(p->log);
+ free_mem(p->sysfs_id);
+ free_mem(p->sysfs_bus_id);
+ free_mem(p);
+ }
+ break;
+
+ case hd_detail_usb:
+ {
+ usb_t *u = d->usb.data;
+
+ if(!u->cloned) {
+ free_str_list(u->c);
+ free_str_list(u->e);
+ }
+ free_str_list(u->d);
+ free_str_list(u->p);
+ free_str_list(u->s);
+ free_str_list(u->t);
+ free_str_list(u->i);
+
+ free_mem(u->manufact);
+ free_mem(u->product);
+ free_mem(u->serial);
+ free_mem(u->driver);
+ free_mem(u->raw_descr.data);
+
+ free_mem(u);
+ }
+ break;
+
+ case hd_detail_isapnp:
+ {
+ isapnp_dev_t *i = d->isapnp.data;
+ int j;
+
+ if(!i->ref) {
+ free_mem(i->card->serial);
+ free_mem(i->card->card_regs);
+ free_mem(i->card->ldev_regs);
+ for(j = 0; j < i->card->res_len; j++) {
+ free_mem(i->card->res[j].data);
+ }
+ if(i->card->res) free_mem(i->card->res);
+ }
+ free_mem(i->card);
+ free_mem(i);
+ }
+ break;
+
+ case hd_detail_cdrom:
+ {
+ cdrom_info_t *c = d->cdrom.data;
+
+ if(c) {
+ free_mem(c->name);
+ free_mem(c->iso9660.volume);
+ free_mem(c->iso9660.publisher);
+ free_mem(c->iso9660.preparer);
+ free_mem(c->iso9660.application);
+ free_mem(c->iso9660.creation_date);
+ free_mem(c->el_torito.id_string);
+ free_mem(c->el_torito.label);
+
+ free_mem(c);
+ }
+ }
+ break;
+
+ case hd_detail_floppy:
+ free_mem(d->floppy.data);
+ break;
+
+ case hd_detail_bios:
+ {
+ bios_info_t *b = d->bios.data;
+
+ free_mem(b->vbe.oem_name);
+ free_mem(b->vbe.vendor_name);
+ free_mem(b->vbe.product_name);
+ free_mem(b->vbe.product_revision);
+ free_mem(b->vbe.mode);
+ free_mem(b->lcd.vendor);
+ free_mem(b->lcd.name);
+ free_mem(b->mouse.vendor);
+ free_mem(b->mouse.type);
+
+ free_mem(b);
+ }
+ break;
+
+ case hd_detail_cpu:
+ {
+ cpu_info_t *c = d->cpu.data;
+
+ free_mem(c->vend_name);
+ free_mem(c->model_name);
+ free_mem(c->platform);
+ free_str_list(c->features);
+ free_mem(c);
+ }
+ break;
+
+ case hd_detail_prom:
+ free_mem(d->prom.data);
+ break;
+
+ case hd_detail_monitor:
+ {
+ monitor_info_t *m = d->monitor.data;
+
+ free_mem(m->vendor);
+ free_mem(m->name);
+ free_mem(m->serial);
+
+ free_mem(m);
+ }
+ break;
+
+ case hd_detail_sys:
+ {
+ sys_info_t *s = d->sys.data;
+
+ free_mem(s->system_type);
+ free_mem(s->generation);
+ free_mem(s->vendor);
+ free_mem(s->model);
+ free_mem(s->serial);
+ free_mem(s->lang);
+
+ free_mem(s);
+ }
+ break;
+
+ case hd_detail_scsi:
+ free_scsi(d->scsi.data, 1);
+ break;
+
+ case hd_detail_devtree:
+ /* is freed with hd_data->dev_tree */
+ break;
+
+ case hd_detail_ccw:
+ free_mem(d->ccw.data);
+ break;
+ }
+
+ free_mem(d);
+
+ return NULL;
+}
+
+
+hd_t *free_hd_entry(hd_t *hd)
+{
+ free_mem(hd->bus.name);
+ free_mem(hd->base_class.name);
+ free_mem(hd->sub_class.name);
+ free_mem(hd->prog_if.name);
+ free_mem(hd->vendor.name);
+ free_mem(hd->device.name);
+ free_mem(hd->sub_vendor.name);
+ free_mem(hd->sub_device.name);
+ free_mem(hd->revision.name);
+ free_mem(hd->serial);
+ free_mem(hd->compat_vendor.name);
+ free_mem(hd->compat_device.name);
+ free_mem(hd->model);
+ free_mem(hd->sysfs_id);
+ free_mem(hd->sysfs_bus_id);
+ free_mem(hd->sysfs_device_link);
+ free_str_list(hd->unix_dev_names);
+ free_mem(hd->unix_dev_name);
+ free_mem(hd->unix_dev_name2);
+ free_mem(hd->rom_id);
+ free_mem(hd->unique_id);
+ free_mem(hd->block0);
+ free_mem(hd->driver);
+ free_str_list(hd->drivers);
+ free_mem(hd->old_unique_id);
+ free_mem(hd->unique_id1);
+ free_mem(hd->usb_guid);
+ free_mem(hd->parent_id);
+ free_str_list(hd->child_ids);
+ free_mem(hd->config_string);
+ free_str_list(hd->extra_info);
+
+ free_res_list(hd->res);
+
+ free_hd_detail(hd->detail);
+
+ free_driver_info(hd->driver_info);
+ free_str_list(hd->requires);
+
+ memset(hd, 0, sizeof *hd);
+
+ return NULL;
+}
+
+misc_t *free_misc(misc_t *m)
+{
+ int i, j;
+
+ if(!m) return NULL;
+
+ for(i = 0; (unsigned) i < m->io_len; i++) {
+ free_mem(m->io[i].dev);
+ }
+ free_mem(m->io);
+
+ for(i = 0; (unsigned) i < m->dma_len; i++) {
+ free_mem(m->dma[i].dev);
+ }
+ free_mem(m->dma);
+
+ for(i = 0; (unsigned) i < m->irq_len; i++) {
+ for(j = 0; j < m->irq[i].devs; j++) {
+ free_mem(m->irq[i].dev[j]);
+ }
+ free_mem(m->irq[i].dev);
+ }
+ free_mem(m->irq);
+
+ free_str_list(m->proc_io);
+ free_str_list(m->proc_dma);
+ free_str_list(m->proc_irq);
+
+ free_mem(m);
+
+ return NULL;
+}
+
+scsi_t *free_scsi(scsi_t *scsi, int free_all)
+{
+ scsi_t *next;
+
+ for(; scsi; scsi = next) {
+ next = scsi->next;
+
+ free_mem(scsi->dev_name);
+ free_mem(scsi->guessed_dev_name);
+ free_mem(scsi->vendor);
+ free_mem(scsi->model);
+ free_mem(scsi->rev);
+ free_mem(scsi->type_str);
+ free_mem(scsi->serial);
+ free_mem(scsi->proc_dir);
+ free_mem(scsi->driver);
+ free_mem(scsi->info);
+ free_mem(scsi->usb_guid);
+ free_str_list(scsi->host_info);
+ free_mem(scsi->controller_id);
+
+ if(!free_all) {
+ next = scsi->next;
+ memset(scsi, 0, sizeof scsi);
+ scsi->next = next;
+ break;
+ }
+
+ free_mem(scsi);
+ }
+
+ return NULL;
+}
+
+
+hd_manual_t *hd_free_manual(hd_manual_t *manual)
+{
+ hd_manual_t *next;
+
+ if(!manual) return NULL;
+
+ for(; manual; manual = next) {
+ next = manual->next;
+
+ free_mem(manual->unique_id);
+ free_mem(manual->parent_id);
+ free_mem(manual->child_ids);
+ free_mem(manual->model);
+
+ free_mem(manual->config_string);
+
+ free_str_list(manual->key);
+ free_str_list(manual->value);
+
+ free_mem(manual);
+ }
+
+ return NULL;
+}
+
+
+/*
+ * Removes all hd_data->old_hd entries and frees their memory.
+ */
+void free_old_hd_entries(hd_data_t *hd_data)
+{
+ hd_t *hd, *next;
+
+ for(hd = hd_data->old_hd; hd; hd = next) {
+ next = hd->next;
+
+ if(exists_hd_entry(hd_data, next, hd->ref) && hd->ref->ref_cnt) hd->ref->ref_cnt--;
+
+ if(!hd->ref) free_hd_entry(hd);
+
+ free_mem(hd);
+ }
+
+ hd_data->old_hd = NULL;
+}
+
+
+void *new_mem(size_t size)
+{
+ void *p;
+
+ if(size == 0) return NULL;
+
+ p = calloc(size, 1);
+
+#ifdef LIBHD_MEMCHECK
+ {
+ if(libhd_log) fprintf(libhd_log, "%p\t%p\t0x%x\n", CALLED_FROM(new_mem, size), p, size);
+ }
+#endif
+
+ if(p) return p;
+
+ fprintf(stderr, "memory oops 1\n");
+ exit(11);
+ /*NOTREACHED*/
+ return 0;
+}
+
+void *resize_mem(void *p, size_t n)
+{
+#ifdef LIBHD_MEMCHECK
+ {
+ if(libhd_log && p) fprintf(libhd_log, "%p\t%p\n", CALLED_FROM(resize_mem, p), p);
+ }
+#endif
+
+ p = realloc(p, n);
+
+#ifdef LIBHD_MEMCHECK
+ {
+ if(libhd_log) fprintf(libhd_log, "%p\t%p\t0x%x\n", CALLED_FROM(resize_mem, p), p, n);
+ }
+#endif
+
+ if(!p) {
+ fprintf(stderr, "memory oops 7\n");
+ exit(17);
+ }
+
+ return p;
+}
+
+void *add_mem(void *p, size_t elem_size, size_t n)
+{
+#ifdef LIBHD_MEMCHECK
+ {
+ if(libhd_log && p) fprintf(libhd_log, "%p\t%p\n", CALLED_FROM(add_mem, p), p);
+ }
+#endif
+
+ p = realloc(p, (n + 1) * elem_size);
+
+#ifdef LIBHD_MEMCHECK
+ {
+ if(libhd_log) fprintf(libhd_log, "%p\t%p\t0x%x\n", CALLED_FROM(add_mem, p), p, (n + 1) * elem_size);
+ }
+#endif
+
+ if(!p) {
+ fprintf(stderr, "memory oops 7\n");
+ exit(17);
+ }
+
+ memset(p + n * elem_size, 0, elem_size);
+
+ return p;
+}
+
+char *new_str(const char *s)
+{
+ char *t;
+
+ if(!s) return NULL;
+
+ t = strdup(s);
+
+#ifdef LIBHD_MEMCHECK
+ {
+ if(libhd_log) fprintf(libhd_log, "%p\t%p\t0x%x\n", CALLED_FROM(new_str, s), t, strlen(t) + 1);
+ }
+#endif
+
+ if(t) return t;
+
+ fprintf(stderr, "memory oops 2\n");
+ /*NOTREACHED*/
+ exit(12);
+
+ return NULL;
+}
+
+void *free_mem(void *p)
+{
+#ifdef LIBHD_MEMCHECK
+ {
+ if(libhd_log && p) fprintf(libhd_log, "%p\t%p\n", CALLED_FROM(free_mem, p), p);
+ }
+#endif
+
+ if(p) free(p);
+
+ return NULL;
+}
+
+void join_res_io(hd_res_t **res1, hd_res_t *res2)
+{
+ hd_res_t *res;
+
+ /*
+ * see if we must add an i/o range (tricky...)
+ *
+ * We look for identical i/o bases and add a range if one was missing. If
+ * no matching pair was found, add the i/o resource.
+ */
+ for(; res2; res2 = res2->next) {
+ if(res2->io.type == res_io) {
+ for(res = *res1; res; res = res->next) {
+ if(res->io.type == res_io) {
+ if(res->io.base == res2->io.base) {
+ /* identical bases: take maximum of both ranges */
+ if(res2->io.range > res->io.range) {
+ res->io.range = res2->io.range;
+ }
+ break;
+ }
+ else if(
+ res->io.range &&
+ res2->io.range &&
+ res->io.base + res->io.range == res2->io.base)
+ {
+ /* res2 directly follows res1: extend res1 to cover res2 */
+ res->io.range += res2->io.range;
+ break;
+ }
+ else if(
+ res2->io.base >= res->io.base &&
+ res2->io.base < res->io.base + res->io.range
+ ) {
+ /* res2 is totally contained in res1: ignore it */
+ break;
+ }
+ }
+ }
+ if(!res) {
+ res = add_res_entry(res1, new_mem(sizeof *res));
+ *res = *res2; /* *copy* the struct */
+ res->next = NULL;
+ }
+ }
+ }
+}
+
+void join_res_irq(hd_res_t **res1, hd_res_t *res2)
+{
+ hd_res_t *res;
+
+ /* see if we must add an dma channel */
+ for(; res2; res2 = res2->next) {
+ if(res2->irq.type == res_irq) {
+ for(res = *res1; res; res = res->next) {
+ if(res->irq.type == res_irq && res->irq.base == res2->irq.base) break;
+ }
+ if(!res) {
+ res = add_res_entry(res1, new_mem(sizeof *res));
+ *res = *res2; /* *copy* the struct */
+ res->next = NULL;
+ }
+ }
+ }
+}
+
+
+void join_res_dma(hd_res_t **res1, hd_res_t *res2)
+{
+ hd_res_t *res;
+
+ /* see if we must add an dma channel */
+ for(; res2; res2 = res2->next) {
+ if(res2->dma.type == res_dma) {
+ for(res = *res1; res; res = res->next) {
+ if(res->dma.type == res_dma && res->dma.base == res2->dma.base) break;
+ }
+ if(!res) {
+ res = add_res_entry(res1, new_mem(sizeof *res));
+ *res = *res2; /* *copy* the struct */
+ res->next = NULL;
+ }
+ }
+ }
+}
+
+
+/*
+ * Check whether both resource lists have common entries.
+ */
+int have_common_res(hd_res_t *res1, hd_res_t *res2)
+{
+ hd_res_t *res;
+
+ for(; res1; res1 = res1->next) {
+ for(res = res2; res; res = res->next) {
+ if(res->any.type == res1->any.type) {
+ switch(res->any.type) {
+ case res_io:
+ if(res->io.base == res1->io.base) return 1;
+ break;
+
+ case res_irq:
+ if(res->irq.base == res1->irq.base) return 1;
+ break;
+
+ case res_dma:
+ if(res->dma.base == res1->dma.base) return 1;
+ break;
+
+ default: /* gcc -Wall */
+ break;
+ }
+ }
+ }
+ }
+
+ return 0;
+}
+
+
+/*
+ * Free the memory allocated by a resource list.
+ */
+hd_res_t *free_res_list(hd_res_t *res)
+{
+ hd_res_t *next;
+
+ for(; res; res = next) {
+ next = res->next;
+
+ if(res->any.type == res_init_strings) {
+ free_mem(res->init_strings.init1);
+ free_mem(res->init_strings.init2);
+ }
+
+ if(res->any.type == res_pppd_option) {
+ free_mem(res->pppd_option.option);
+ }
+
+ if(res->any.type == res_hwaddr) {
+ free_mem(res->hwaddr.addr);
+ }
+
+ free_mem(res);
+ }
+
+ return NULL;
+}
+
+
+/*
+ * Note: new_res is directly inserted into the list, so you *must* make sure
+ * that new_res points to a malloc'ed pice of memory.
+ */
+hd_res_t *add_res_entry(hd_res_t **res, hd_res_t *new_res)
+{
+ while(*res) res = &(*res)->next;
+
+ return *res = new_res;
+}
+
+
+hd_t *add_hd_entry(hd_data_t *hd_data, unsigned line, unsigned count)
+{
+ hd_t *hd;
+
+ hd = add_hd_entry2(&hd_data->hd, new_mem(sizeof *hd));
+
+ hd->idx = ++(hd_data->last_idx);
+ hd->module = hd_data->module;
+ hd->line = line;
+ hd->count = count;
+
+ return hd;
+}
+
+
+hd_t *add_hd_entry2(hd_t **hd, hd_t *new_hd)
+{
+ while(*hd) hd = &(*hd)->next;
+
+ return *hd = new_hd;
+}
+
+
+void hd_scan(hd_data_t *hd_data)
+{
+ char *s = NULL;
+ int i, j;
+ hd_t *hd, *hd2;
+ uint64_t irqs;
+ str_list_t *sl, *sl0;
+
+#ifdef LIBHD_MEMCHECK
+ if(!libhd_log) {
+ char *s = getenv("LIBHD_MEMCHECK");
+
+ if(s && *s) {
+ libhd_log = fopen(s, "w");
+ if(libhd_log) setlinebuf(libhd_log);
+ }
+ }
+#endif
+
+#ifdef LIBHD_MEMCHECK
+ {
+ if(libhd_log)
+ fprintf(libhd_log, "; %s\t%p\t%p\n", __FUNCTION__, CALLED_FROM(hd_scan, hd_data), hd_data);
+ }
+#endif
+
+ /* log the debug & probe flags */
+ if(hd_data->debug && !hd_data->flags.internal) {
+ ADD2LOG("libhd version %s%s (%s)\n", HD_VERSION_STRING, getuid() ? "u" : "", HD_ARCH);
+ }
+
+ get_kernel_version(hd_data);
+
+ /* needed only on 1st call */
+ if(hd_data->last_idx == 0) {
+ get_probe_env(hd_data);
+ }
+
+ fix_probe_features(hd_data);
+
+ if(hd_data->debug && !hd_data->flags.internal) {
+ for(i = sizeof hd_data->probe - 1; i >= 0; i--) {
+ str_printf(&s, -1, "%02x", hd_data->probe[i]);
+ }
+ ADD2LOG("debug = 0x%x\nprobe = 0x%s (", hd_data->debug, s);
+ s = free_mem(s);
+
+ for(i = 1; i < pr_default; i++) { /* 1 because of pr_memory */
+ if((s = hd_probe_feature_by_value(i))) {
+ ADD2LOG("%s%c%s", i == 1 ? "" : " ", hd_probe_feature(hd_data, i) ? '+' : '-', s);
+ }
+ }
+
+ ADD2LOG(")\n");
+ }
+
+ /* init driver info database */
+ hddb_init(hd_data);
+
+ /* only first time */
+ if(hd_data->last_idx == 0) {
+ hd_set_probe_feature(hd_data, pr_fork);
+ if(!hd_probe_feature(hd_data, pr_fork)) hd_data->flags.nofork = 1;
+// hd_set_probe_feature(hd_data, pr_sysfs);
+ if(!hd_probe_feature(hd_data, pr_sysfs)) hd_data->flags.nosysfs = 1;
+ if(hd_probe_feature(hd_data, pr_cpuemu)) hd_data->flags.cpuemu = 1;
+ if(hd_probe_feature(hd_data, pr_udev)) hd_data->flags.udev = 1;
+ }
+
+ /* get shm segment, if we didn't do it already */
+ hd_shm_init(hd_data);
+
+ if(!hd_data->shm.ok && !hd_data->flags.nofork) {
+ hd_data->flags.nofork = 1;
+ ADD2LOG("shm: failed to get shm segment; will not fork\n");
+ }
+
+ if(hd_data->only) {
+ s = hd_join(", ", hd_data->only);
+ ADD2LOG("only: %s\n", s);
+ s = free_mem(s);
+ }
+
+#ifndef LIBHD_TINY
+ /*
+ * There might be old 'manual' entries left from an earlier scan. Remove
+ * them, they will confuse us.
+ */
+ if(hd_probe_feature(hd_data, pr_manual)) {
+ hd_data->module = mod_manual;
+ remove_hd_entries(hd_data);
+ }
+#endif
+
+ /*
+ * for various reasons, do it befor scan_misc()
+ */
+ hd_scan_floppy(hd_data);
+
+ /*
+ * to be able to read the right parport io,
+ * we have to do this before scan_misc()
+ */
+#if defined(__i386__) || defined (__x86_64__) || defined (__ia64__)
+ hd_scan_bios(hd_data);
+#endif
+
+ /* before hd_scan_misc(): we need some ppc info later */
+ hd_scan_sys(hd_data);
+
+ /* get basic system info */
+ hd_scan_misc(hd_data);
+
+ /* hd_scan_cpu() after hd_scan_misc(): klog needed */
+ hd_scan_cpu(hd_data);
+ hd_scan_memory(hd_data);
+
+ hd_scan_sysfs_pci(hd_data);
+
+ /* do it _after_ hd_scan_sysfs_pci() */
+#if defined(__PPC__)
+ hd_scan_prom(hd_data);
+#endif
+
+#if defined(__s390__) || defined(__s390x__)
+ hd_scan_s390disks(hd_data);
+ hd_scan_s390(hd_data);
+#endif
+
+ /* after hd_scan_prom() and hd_scan_bios() */
+ hd_scan_monitor(hd_data);
+
+#ifndef LIBHD_TINY
+#if defined(__i386__) || defined(__alpha__)
+ hd_scan_isapnp(hd_data);
+#endif
+#endif
+
+#ifndef LIBHD_TINY
+#if defined(__i386__)
+ hd_scan_isa(hd_data);
+#endif
+#endif
+
+ /* after pci & isa */
+ hd_scan_pcmcia(hd_data);
+
+ hd_scan_serial(hd_data);
+
+ /* merge basic system info & the easy stuff */
+ hd_scan_misc2(hd_data);
+
+#ifndef LIBHD_TINY
+ if(!hd_data->flags.no_parport) {
+ hd_scan_parallel(hd_data); /* after hd_scan_misc*() */
+ }
+#endif
+
+ hd_scan_sysfs_block(hd_data);
+ hd_scan_sysfs_scsi(hd_data);
+ hd_scan_sysfs_usb(hd_data);
+ hd_scan_sysfs_edd(hd_data);
+
+#if defined(__PPC__)
+ hd_scan_adb(hd_data);
+#endif
+
+#ifndef LIBHD_TINY
+#if !defined(__sparc__)
+ hd_scan_braille(hd_data);
+#endif
+ hd_scan_modem(hd_data); /* do it before hd_scan_mouse() */
+ hd_scan_mouse(hd_data);
+#endif
+ hd_scan_sbus(hd_data);
+
+ hd_scan_input(hd_data);
+
+#if !defined(__s390__) && !defined(__s390x__)
+ hd_scan_kbd(hd_data);
+#endif
+
+ /* must be after hd_scan_monitor() */
+ hd_scan_fb(hd_data);
+
+ /* keep these at the end of the list */
+ hd_scan_net(hd_data);
+
+ hd_scan_pppoe(hd_data);
+
+#ifndef LIBHD_TINY
+ hd_scan_wlan(hd_data);
+#endif
+
+ for(hd = hd_data->hd; hd; hd = hd->next) hd_add_id(hd_data, hd);
+
+#ifndef LIBHD_TINY
+ hd_scan_manual(hd_data);
+#endif
+
+ /* add test entries */
+ hd_scan_xtra(hd_data);
+
+ /* some final fixup's */
+#if WITH_ISDN
+ hd_scan_isdn(hd_data);
+ hd_scan_dsl(hd_data);
+#endif
+ hd_scan_int(hd_data);
+
+ /* and again... */
+ for(hd = hd_data->hd; hd; hd = hd->next) hd_add_id(hd_data, hd);
+
+ /* assign parent & child ids */
+ for(hd = hd_data->hd; hd; hd = hd->next) {
+ hd->child_ids = free_str_list(hd->child_ids);
+ if((hd2 = hd_get_device_by_idx(hd_data, hd->attached_to))) {
+ free_mem(hd->parent_id);
+ hd->parent_id = new_str(hd2->unique_id);
+ }
+ else if((hd2 = hd_get_device_by_id(hd_data, hd->parent_id))) {
+ hd->attached_to = hd2->idx;
+ }
+ else {
+ hd->attached_to = 0;
+ }
+ }
+
+ for(hd = hd_data->hd; hd; hd = hd->next) {
+ if((hd2 = hd_get_device_by_idx(hd_data, hd->attached_to))) {
+ add_str_list(&hd2->child_ids, hd->unique_id);
+ }
+ }
+
+ /* assign a hw_class & build a useful model string */
+ for(hd = hd_data->hd; hd; hd = hd->next) {
+ assign_hw_class(hd_data, hd);
+
+ /* create model name _after_ hw_class */
+ create_model_name(hd_data, hd);
+ }
+
+#ifndef LIBHD_TINY
+ /* must be _after_ we have valid hw_class entries */
+ hd_scan_manual2(hd_data);
+#endif
+
+ /* we are done... */
+ for(hd = hd_data->hd; hd; hd = hd->next) hd->tag.fixed = 1;
+
+ /* for compatibility */
+ for(hd = hd_data->hd; hd; hd = hd->next) {
+ hd->driver = free_mem(hd->driver);
+ if(hd->drivers && hd->drivers->str) hd->driver = new_str(hd->drivers->str);
+ }
+
+ hd_data->module = mod_none;
+
+ if(
+ hd_data->debug &&
+ !hd_data->flags.internal &&
+ (
+ hd_data->kmods ||
+ hd_probe_feature(hd_data, pr_int /* arbitrary; just avoid /proc/modules for -pr_all */)
+ )
+ ) {
+ sl0 = read_file(PROC_MODULES, 0, 0);
+ ADD2LOG("----- /proc/modules -----\n");
+ for(sl = sl0; sl; sl = sl->next) {
+ ADD2LOG(" %s", sl->str);
+ }
+ ADD2LOG("----- /proc/modules end -----\n");
+ free_str_list(sl0);
+ }
+
+ update_irq_usage(hd_data);
+
+ if(hd_data->debug && !hd_data->flags.internal) {
+ irqs = hd_data->used_irqs;
+
+ ADD2LOG(" used irqs:");
+ for(i = j = 0; i < 64; i++, irqs >>= 1) {
+ if((irqs & 1)) {
+ ADD2LOG("%c%d", j ? ',' : ' ', i);
+ j = 1;
+ }
+ }
+ ADD2LOG("\n");
+ }
+}
+
+
+/*
+ * Note: due to byte order problems decoding the id is really a mess...
+ * And, we use upper case for hex numbers!
+ */
+char *isa_id2str(unsigned id)
+{
+ char *s = new_mem(8);
+ unsigned u = ((id & 0xff) << 8) + ((id >> 8) & 0xff);
+ unsigned v = ((id >> 8) & 0xff00) + ((id >> 24) & 0xff);
+
+ s[0] = ((u >> 10) & 0x1f) + 'A' - 1;
+ s[1] = ((u >> 5) & 0x1f) + 'A' - 1;
+ s[2] = ( u & 0x1f) + 'A' - 1;
+
+ sprintf(s + 3, "%04X", v);
+
+ return s;
+}
+
+char *eisa_vendor_str(unsigned v)
+{
+ static char s[4];
+
+ s[0] = ((v >> 10) & 0x1f) + 'A' - 1;
+ s[1] = ((v >> 5) & 0x1f) + 'A' - 1;
+ s[2] = ( v & 0x1f) + 'A' - 1;
+ s[3] = 0;
+
+ return s;
+}
+
+
+/*
+ * Must _not_ check that s is exactly 3 chars.
+ */
+unsigned name2eisa_id(char *s)
+{
+ int i;
+ unsigned u = 0;
+
+ for(i = 0; i < 3; i++) {
+ u <<= 5;
+ if(s[i] < 'A' - 1 || s[i] > 'A' - 1 + 0x1f) return 0;
+ u += s[i] - 'A' + 1;
+ }
+
+ return MAKE_ID(TAG_EISA, u);
+}
+
+
+/*
+ * Create a 'canonical' version, i.e. no spaces at start and end.
+ *
+ * Note: removes chars >= 0x80 as well (due to (char *))! This
+ * is currently considered a feature.
+ */
+char *canon_str(char *s, int len)
+{
+ char *m2, *m1, *m0;
+ int i;
+
+#ifdef LIBHD_MEMCHECK
+ {
+ if(libhd_log) fprintf(libhd_log, ">%p\n", CALLED_FROM(canon_str, s));
+ }
+#endif
+
+ if(len < 0) len = 0; /* just to be safe */
+
+ m0 = new_mem(len + 1);
+
+ for(m1 = m0, i = 0; i < len; i++) {
+ if(m1 == m0 && s[i] <= ' ') continue;
+ *m1++ = s[i];
+ }
+ *m1 = 0;
+ while(m1 > m0 && m1[-1] <= ' ') {
+ *--m1 = 0;
+ }
+
+ m2 = new_str(m0);
+ free_mem(m0);
+
+#ifdef LIBHD_MEMCHECK
+ {
+ if(libhd_log) fprintf(libhd_log, "<%p\n", CALLED_FROM(canon_str, s));
+ }
+#endif
+
+ return m2;
+}
+
+
+/*
+ * Convert a n-digit hex number to its numerical value.
+ */
+int hex(char *s, int n)
+{
+ int i = 0, j;
+
+ while(n--) {
+ if(sscanf(s++, "%1x", &j) != 1) return -1;
+ i = (i << 4) + j;
+ }
+
+ return i;
+}
+
+
+/* simple 32 bit fixed point numbers with n decimals */
+int str2float(char *s, int n)
+{
+ int i = 0;
+ int dot = 0;
+
+ while(*s) {
+ if(*s == '.') {
+ if(dot++) return 0;
+ }
+ else if(*s >= '0' && *s <= '9') {
+ if(dot) {
+ if(!n) return i;
+ n--;
+ }
+ i *= 10;
+ i += *s - '0';
+ }
+ else {
+ return 0;
+ }
+
+ s++;
+ }
+
+ while(n--) i *= 10;
+
+ return i;
+}
+
+
+/* simple 32 bit fixed point numbers with n decimals */
+char *float2str(int f, int n)
+{
+ int i = 1, j, m = n;
+ static char buf[32];
+
+ while(n--) i *= 10;
+
+ j = f / i;
+ i = f % i;
+
+ while(i && !(i % 10)) i /= 10, m--;
+
+ if(i) {
+ sprintf(buf, "%d.%0*d", j, m, i);
+ }
+ else {
+ sprintf(buf, "%d", j);
+ }
+
+ return buf;
+}
+
+
+/*
+ * find hardware entry with given index
+ */
+hd_t *hd_get_device_by_idx(hd_data_t *hd_data, unsigned idx)
+{
+ hd_t *hd;
+
+#ifdef LIBHD_MEMCHECK
+ {
+ if(libhd_log)
+ fprintf(libhd_log, "; %s\t%p\t%p\n", __FUNCTION__, CALLED_FROM(hd_get_device_by_idx, hd_data), hd_data);
+ }
+#endif
+
+ if(!idx) return NULL; /* early out: idx is always != 0 */
+
+ for(hd = hd_data->hd; hd; hd = hd->next) {
+ if(hd->idx == idx) return hd;
+ }
+
+ return NULL;
+}
+
+
+/*
+ * find hardware entry with given unique id
+ */
+hd_t *hd_get_device_by_id(hd_data_t *hd_data, char *id)
+{
+ hd_t *hd;
+
+ if(!id) return NULL;
+
+ for(hd = hd_data->hd; hd; hd = hd->next) {
+ if(hd->unique_id && !strcmp(hd->unique_id, id)) return hd;
+ }
+
+ return NULL;
+}
+
+
+/*
+ * Give the actual name of the probing module.
+ */
+char *mod_name_by_idx(unsigned idx)
+{
+ unsigned u;
+
+ for(u = 0; u < sizeof pr_modules / sizeof *pr_modules; u++)
+ if(idx == pr_modules[u].val) return pr_modules[u].name;
+
+ return "";
+}
+
+
+/*
+ * Print to a string.
+ * Note: *buf must point to a malloc'd memory area (or be NULL).
+ *
+ * Use an offset of -1 or -2 to append the new string.
+ *
+ * As this function is quite often used to extend our log messages, there
+ * is a cache that holds the length of the last string we created. This way
+ * we speed this up somewhat. Use an offset of -2 to use this feature.
+ * Note: this only works as long as str_printf() is used *exclusively* to
+ * extend the string.
+ */
+void str_printf(char **buf, int offset, char *format, ...)
+{
+ static char *last_buf = NULL;
+ static int last_len = 0;
+ int len, use_cache;
+ char b[0x10000];
+ va_list args;
+
+#ifdef LIBHD_MEMCHECK
+ {
+ if(libhd_log) fprintf(libhd_log, ">%p\n", CALLED_FROM(str_printf, buf));
+ }
+#endif
+
+ use_cache = offset == -2 ? 1 : 0;
+
+ if(*buf) {
+ if(offset == -1) {
+ offset = strlen(*buf);
+ }
+ else if(offset == -2) {
+ if(last_buf == *buf && last_len && !(*buf)[last_len])
+ offset = last_len;
+ else
+ offset = strlen(*buf);
+ }
+ }
+ else {
+ offset = 0;
+ }
+
+ va_start(args, format);
+ vsnprintf(b, sizeof b, format, args);
+ va_end(args);
+
+ *buf = resize_mem(*buf, (len = offset + strlen(b)) + 1);
+ strcpy(*buf + offset, b);
+
+ if(use_cache) {
+ last_buf = *buf;
+ last_len = len;
+ }
+
+#ifdef LIBHD_MEMCHECK
+ {
+ if(libhd_log) fprintf(libhd_log, "<%p\n", CALLED_FROM(str_printf, buf));
+ }
+#endif
+}
+
+
+void hexdump(char **buf, int with_ascii, unsigned data_len, unsigned char *data)
+{
+ unsigned i;
+
+ for(i = 0; i < data_len; i++) {
+ if(i)
+ str_printf(buf, -2, " %02x", data[i]);
+ else
+ str_printf(buf, -2, "%02x", data[i]);
+ }
+
+ if(with_ascii) {
+ str_printf(buf, -2, " \"");
+ for(i = 0; i < data_len; i++) {
+ str_printf(buf, -2, "%c", data[i] < ' ' || data[i] >= 0x7f ? '.' : data[i]);
+ }
+ str_printf(buf, -2, "\"");
+ }
+}
+
+
+/** \relates s_str_list_t
+ * Search a string list for a string.
+ */
+str_list_t *search_str_list(str_list_t *sl, char *str)
+{
+ if(!str) return NULL;
+
+ for(; sl; sl = sl->next) if(sl->str && !strcmp(sl->str, str)) return sl;
+
+ return NULL;
+}
+
+
+/** \relates s_str_list_t
+ * Add a string to a string list.
+ *
+ * The new string (str) will be *copied*!
+ */
+str_list_t *add_str_list(str_list_t **sl, char *str)
+{
+#ifdef LIBHD_MEMCHECK
+ {
+ if(libhd_log) fprintf(libhd_log, ">%p\n", CALLED_FROM(add_str_list, sl));
+ }
+#endif
+
+ while(*sl) sl = &(*sl)->next;
+
+ *sl = new_mem(sizeof **sl);
+ (*sl)->str = new_str(str);
+
+#ifdef LIBHD_MEMCHECK
+ {
+ if(libhd_log) fprintf(libhd_log, "<%p\n", CALLED_FROM(add_str_list, sl));
+ }
+#endif
+
+ return *sl;
+}
+
+
+/** \relates s_str_list_t
+ * Free the memory allocated by a string list.
+ */
+str_list_t *free_str_list(str_list_t *list)
+{
+ str_list_t *l;
+
+ for(; list; list = (l = list)->next, free_mem(l)) {
+ free_mem(list->str);
+ }
+
+ return NULL;
+}
+
+
+/*
+ * Read a file; return a linked list of lines.
+ *
+ * start_line is zero-based; lines == 0 -> all lines
+ */
+str_list_t *read_file(char *file_name, unsigned start_line, unsigned lines)
+{
+ FILE *f;
+ char buf[0x10000];
+ int pipe = 0;
+ str_list_t *sl_start = NULL, *sl_end = NULL, *sl;
+
+#ifdef LIBHD_MEMCHECK
+ {
+ if(libhd_log) fprintf(libhd_log, ">%p\n", CALLED_FROM(read_file, file_name));
+ }
+#endif
+
+ if(*file_name == '|') {
+ pipe = 1;
+ file_name++;
+ if(!(f = popen(file_name, "r"))) {
+#ifdef LIBHD_MEMCHECK
+ {
+ if(libhd_log) fprintf(libhd_log, "<%p\n", CALLED_FROM(read_file, file_name));
+ }
+#endif
+ return NULL;
+ }
+ }
+ else {
+ if(!(f = fopen(file_name, "r"))) {
+#ifdef LIBHD_MEMCHECK
+ {
+ if(libhd_log) fprintf(libhd_log, "<%p\n", CALLED_FROM(read_file, file_name));
+ }
+#endif
+ return NULL;
+ }
+ }
+
+ while(fgets(buf, sizeof buf, f)) {
+ if(start_line) {
+ start_line--;
+ continue;
+ }
+ sl = new_mem(sizeof *sl);
+ sl->str = new_str(buf);
+ if(sl_start)
+ sl_end->next = sl;
+ else
+ sl_start = sl;
+ sl_end = sl;
+
+ if(lines == 1) break;
+ lines--;
+ }
+
+ if(pipe)
+ pclose(f);
+ else
+ fclose(f);
+
+#ifdef LIBHD_MEMCHECK
+ {
+ if(libhd_log) fprintf(libhd_log, "<%p\n", CALLED_FROM(read_file, file_name));
+ }
+#endif
+
+ return sl_start;
+}
+
+
+/*
+ * Read directory, return a list of entries with file type 'type'.
+ */
+str_list_t *read_dir(char *dir_name, int type)
+{
+ str_list_t *sl_start = NULL, *sl_end = NULL, *sl;
+ DIR *dir;
+ struct dirent *de;
+ struct stat sbuf;
+ char *s;
+ int dir_type;
+
+ if(dir_name && (dir = opendir(dir_name))) {
+ while((de = readdir(dir))) {
+ if(!strcmp(de->d_name, ".") || !strcmp(de->d_name, "..")) continue;
+ dir_type = 0;
+
+ if(type) {
+ s = NULL;
+ str_printf(&s, 0, "%s/%s", dir_name, de->d_name);
+
+ if(!lstat(s, &sbuf)) {
+ if(S_ISDIR(sbuf.st_mode)) {
+ dir_type = 'd';
+ }
+ else if(S_ISREG(sbuf.st_mode)) {
+ dir_type = 'r';
+ }
+ else if(S_ISLNK(sbuf.st_mode)) {
+ dir_type = 'l';
+ }
+ }
+
+ s = free_mem(s);
+ }
+
+ if(dir_type == type) {
+ sl = new_mem(sizeof *sl);
+ sl->str = new_str(de->d_name);
+ if(sl_start)
+ sl_end->next = sl;
+ else
+ sl_start = sl;
+ sl_end = sl;
+ }
+ }
+ closedir(dir);
+ }
+
+ return sl_start;
+}
+
+
+char *hd_read_symlink(char *link_name)
+{
+ static char buf[256];
+ int i;
+
+ i = readlink(link_name, buf, sizeof buf);
+ buf[sizeof buf - 1] = 0;
+ if(i >= 0 && (unsigned) i < sizeof buf) buf[i] = 0;
+ if(i < 0) *buf = 0;
+
+ return buf;
+}
+
+
+/*
+ * Log the hardware detection progress.
+ */
+void progress(hd_data_t *hd_data, unsigned pos, unsigned count, char *msg)
+{
+ char buf1[32], buf2[32], buf3[128], *fn;
+
+ if(hd_data->shm.ok && hd_data->flags.forked) {
+ ((hd_data_t *) (hd_data->shm.data))->shm.updated++;
+ }
+
+ if(!msg) msg = "";
+
+ sprintf(buf1, "%u", hd_data->module);
+ sprintf(buf2, ".%u", count);
+ fn = mod_name_by_idx(hd_data->module);
+
+ sprintf(buf3, "%s.%u%s", *fn ? fn : buf1, pos, count ? buf2 : "");
+
+ if((hd_data->debug & HD_DEB_PROGRESS))
+ ADD2LOG(">> %s: %s\n", buf3, msg);
+
+ if(hd_data->progress) hd_data->progress(buf3, msg);
+}
+
+
+
+/*
+ * Returns a probe feature suitable for hd_*probe_feature().
+ * If name is not a valid probe feature, 0 is returned.
+ *
+ */
+enum probe_feature hd_probe_feature_by_name(char *name)
+{
+ unsigned u;
+
+#ifdef LIBHD_MEMCHECK
+ {
+ if(libhd_log)
+ fprintf(libhd_log, "; %s\t%p\t%p\n", __FUNCTION__, CALLED_FROM(hd_probe_feature_by_name, name), name);
+ }
+#endif
+
+ for(u = 0; u < sizeof pr_flags / sizeof *pr_flags; u++)
+ if(!strcmp(name, pr_flags[u].name)) return pr_flags[u].val;
+
+ return 0;
+}
+
+
+/*
+ * Coverts a enum probe_feature to a string.
+ * If it fails, NULL is returned.
+ */
+char *hd_probe_feature_by_value(enum probe_feature feature)
+{
+ unsigned u;
+
+#ifdef LIBHD_MEMCHECK
+ {
+ if(libhd_log)
+ fprintf(libhd_log, "; %s\t%p\t%u\n", __FUNCTION__, CALLED_FROM(hd_probe_feature_by_value, feature), feature);
+ }
+#endif
+
+ for(u = 0; u < sizeof pr_flags / sizeof *pr_flags; u++)
+ if(feature == pr_flags[u].val) return pr_flags[u].name;
+
+ return NULL;
+}
+
+
+/*
+ * Removes all hd_data->hd entries created by the current module from the
+ * list. The old entries are added to hd_data->old_hd.
+ */
+void remove_hd_entries(hd_data_t *hd_data)
+{
+ hd_t *hd;
+
+ for(hd = hd_data->hd; hd; hd = hd->next) {
+ if(hd->module == hd_data->module) {
+ hd->tag.remove = 1;
+ }
+ }
+
+ remove_tagged_hd_entries(hd_data);
+}
+
+
+/*
+ * Removes all hd_data->hd entries that have the remove tag set from the
+ * list. The old entries are added to hd_data->old_hd.
+ */
+void remove_tagged_hd_entries(hd_data_t *hd_data)
+{
+ hd_t *hd, **prev, **h;
+
+ for(hd = *(prev = &hd_data->hd); hd;) {
+ if(hd->tag.remove) {
+ /* find end of the old list... */
+ h = &hd_data->old_hd;
+ while(*h) h = &(*h)->next;
+ *h = hd; /* ...and append the entry */
+
+ hd = *prev = hd->next;
+ (*h)->next = NULL;
+ }
+ else {
+ hd = *(prev = &hd->next);
+ }
+ }
+}
+
+
+int hd_module_is_active(hd_data_t *hd_data, char *mod)
+{
+ str_list_t *sl, *sl0 = read_kmods(hd_data);
+ int active = 0;
+ char *s;
+#ifdef __PPC__
+ char *s1, *s2;
+#endif
+
+#ifdef LIBHD_MEMCHECK
+ {
+ if(libhd_log)
+ fprintf(libhd_log, "; %s\t%p\t%p\n", __FUNCTION__, CALLED_FROM(hd_module_is_active, hd_data), hd_data);
+ }
+#endif
+
+ mod = new_str(mod);
+
+ /* convert '-' to '_' */
+ for(s = mod; *s; s++) if(*s == '-') *s = '_';
+
+ for(sl = sl0; sl; sl = sl->next) {
+ if(!strcmp(sl->str, mod)) break;
+ }
+
+ free_str_list(sl0);
+ active = sl ? 1 : 0;
+
+ if(active) {
+ free_mem(mod);
+
+ return active;
+ }
+
+#ifdef __PPC__
+ /* temporary hack for ppc */
+ if(!strcmp(mod, "gmac")) {
+ s1 = "<6>eth";
+ s2 = " GMAC ";
+ }
+ else if(!strcmp(mod, "mace")) {
+ s1 = "<6>eth";
+ s2 = " MACE ";
+ }
+ else if(!strcmp(mod, "bmac")) {
+ s1 = "<6>eth";
+ s2 = " BMAC";
+ }
+ else if(!strcmp(mod, "mac53c94")) {
+ s1 = "<4>scsi";
+ s2 = " 53C94";
+ }
+ else if(!strcmp(mod, "mesh")) {
+ s1 = "<4>scsi";
+ s2 = " MESH";
+ }
+ else if(!strcmp(mod, "swim3")) {
+ s1 = "<6>fd";
+ s2 = " SWIM3 ";
+ }
+ else {
+ s1 = s2 = NULL;
+ }
+
+ if(s1) {
+ for(sl = hd_data->klog; sl; sl = sl->next) {
+ if(strstr(sl->str, s1) == sl->str && strstr(sl->str, s2)) {
+ active = 1;
+ break;
+ }
+ }
+ }
+#endif
+
+ free_mem(mod);
+
+ return active;
+}
+
+
+int hd_has_pcmcia(hd_data_t *hd_data)
+{
+ hd_t *hd;
+
+ for(hd = hd_data->hd; hd; hd = hd->next) {
+ if(is_pcmcia_ctrl(hd_data, hd)) return 1;
+ }
+
+ return 0;
+}
+
+
+int hd_apm_enabled(hd_data_t *hd_data)
+{
+ hd_t *hd;
+
+#ifdef LIBHD_MEMCHECK
+ {
+ if(libhd_log)
+ fprintf(libhd_log, "; %s\t%p\t%p\n", __FUNCTION__, CALLED_FROM(hd_apm_enabled, hd_data), hd_data);
+ }
+#endif
+
+ for(hd = hd_data->hd; hd; hd = hd->next) {
+ if(
+ hd->base_class.id == bc_internal &&
+ hd->sub_class.id == sc_int_bios &&
+ hd->detail &&
+ hd->detail->type == hd_detail_bios &&
+ hd->detail->bios.data
+ ) {
+ return hd->detail->bios.data->apm_enabled;
+ }
+ }
+
+ return 0;
+}
+
+
+int hd_usb_support(hd_data_t *hd_data)
+{
+ hd_t *hd;
+ hd_res_t *res;
+
+#ifdef LIBHD_MEMCHECK
+ {
+ if(libhd_log)
+ fprintf(libhd_log, "; %s\t%p\t%p\n", __FUNCTION__, CALLED_FROM(hd_usb_support, hd_data), hd_data);
+ }
+#endif
+
+ for(hd = hd_data->hd; hd; hd = hd->next) {
+ if(hd->base_class.id == bc_serial && hd->sub_class.id == sc_ser_usb) {
+ for(res = hd->res; res; res = res->next) {
+ if(res->any.type == res_irq)
+ return hd->prog_if.id == pif_usb_ohci ? 2 : 1; /* 2: ohci, 1: uhci */
+ }
+ }
+ }
+
+ return 0;
+}
+
+
+int hd_smp_support(hd_data_t *hd_data)
+{
+ int is_smp = 0;
+ unsigned u;
+ hd_t *hd, *hd0;
+#if defined(__i386__) || defined (__x86_64__)
+ unsigned cpu_threads = 0;
+ cpu_info_t *ct;
+#endif
+
+#ifdef LIBHD_MEMCHECK
+ {
+ if(libhd_log)
+ fprintf(libhd_log, "; %s\t%p\t%p\n", __FUNCTION__, CALLED_FROM(hd_smp_support, hd_data), hd_data);
+ }
+#endif
+
+ u = hd_data->flags.internal;
+ hd_data->flags.internal = 1;
+ hd = hd_list(hd_data, hw_cpu, 0, NULL);
+ if(!hd) hd = hd_list(hd_data, hw_cpu, 1, NULL);
+ hd_data->flags.internal = u;
+
+ for(is_smp = 0, hd0 = hd; hd0; hd0 = hd0->next) is_smp++;
+ if(is_smp == 1) is_smp = 0;
+
+#if defined(__i386__) || defined (__x86_64__)
+ if(
+ hd &&
+ hd->detail &&
+ hd->detail->type == hd_detail_cpu &&
+ (ct = hd->detail->cpu.data)
+ ) {
+ cpu_threads = ct->units;
+ }
+#endif
+
+ hd = hd_free_hd_list(hd);
+
+#if !defined(LIBHD_TINY) && (defined(__i386__) || defined (__x86_64__))
+ if(is_smp < 2) {
+ if(!hd_data->bios_ram.data) {
+ hd_free_hd_list(hd_list(hd_data, hw_sys, 1, NULL));
+ }
+ is_smp = detect_smp_bios(hd_data);
+ // at least 2 processors
+ if(is_smp < 2) is_smp = 0;
+ if(!is_smp && cpu_threads > 1) is_smp = 2;
+ }
+#endif
+
+#ifdef __PPC__
+ if(is_smp < 2) {
+ if(!hd_data->devtree) {
+ hd_free_hd_list(hd_list(hd_data, hw_sys, 1, NULL));
+ }
+ is_smp = detect_smp_prom(hd_data);
+ if(is_smp < 0) is_smp = 0;
+ }
+#endif
+
+#if defined(__s390__) || defined(__s390x__)
+ if(!is_smp) is_smp = 1;
+#endif
+
+ return is_smp;
+}
+
+
+int hd_color(hd_data_t *hd_data)
+{
+#if 0
+ hd_t *hd;
+ prom_info_t *pt;
+
+ for(hd = hd_data->hd; hd; hd = hd->next) {
+ if(
+ hd->base_class.id == bc_internal && hd->sub_class.id == sc_int_prom &&
+ hd->detail && hd->detail->type == hd_detail_prom &&
+ (pt = hd->detail->prom.data) &&
+ pt->has_color
+ ) {
+ return pt->color;
+ }
+ }
+#endif
+
+#ifdef LIBHD_MEMCHECK
+ {
+ if(libhd_log)
+ fprintf(libhd_log, "; %s\t%p\t%p\n", __FUNCTION__, CALLED_FROM(hd_color, hd_data), hd_data);
+ }
+#endif
+
+ if(hd_data->color_code) return hd_data->color_code & 0xffff;
+
+ return -1;
+}
+
+
+int hd_mac_color(hd_data_t *hd_data)
+{
+#ifdef LIBHD_MEMCHECK
+ {
+ if(libhd_log)
+ fprintf(libhd_log, "; %s\t%p\t%p\n", __FUNCTION__, CALLED_FROM(hd_mac_color, hd_data), hd_data);
+ }
+#endif
+
+ return hd_color(hd_data);
+}
+
+
+unsigned hd_display_adapter(hd_data_t *hd_data)
+{
+ hd_t *hd;
+ driver_info_t *di;
+ unsigned disp, disp_sbus, disp_pci, disp_any, disp_di;
+ unsigned disp_cnt, disp_any_cnt;
+
+#ifdef LIBHD_MEMCHECK
+ {
+ if(libhd_log)
+ fprintf(libhd_log, "; %s\t%p\t%p\n", __FUNCTION__, CALLED_FROM(hd_display_adapter, hd_data), hd_data);
+ }
+#endif
+
+ /* if we know exactly where our primary display is, return it */
+ if(hd_get_device_by_idx(hd_data, hd_data->display)) return hd_data->display;
+
+ disp = disp_sbus = disp_pci = disp_any = disp_di = 0;
+ disp_cnt = disp_any_cnt = 0;
+
+ for(hd = hd_data->hd; hd; hd = hd->next) {
+ if(hd->base_class.id == bc_display) {
+ disp_any_cnt++;
+ if(!disp_any) disp_any = hd->idx;
+ if(hd->sub_class.id == sc_dis_vga) {
+ disp_cnt++;
+ if(!disp) disp = hd->idx;
+ if(hd->bus.id == bus_pci && !disp_pci) disp_pci = hd->idx;
+ if(hd->bus.id == bus_sbus && !disp_sbus) disp_sbus = hd->idx;
+ }
+ if(!disp_di) {
+ if(!(di = hd->driver_info)) {
+ hddb_add_info(hd_data, hd);
+ di = hd->driver_info;
+ }
+ if(di && di->any.type == di_x11 && di->x11.server) {
+ disp_di = hd->idx;
+ }
+ }
+ }
+ }
+
+ /* if there's only one display adapter, return it */
+ if(disp_any_cnt == 1) return disp_any;
+
+ /* if there's only one vga compatible adapter, return it */
+ if(disp_cnt == 1) return disp;
+
+ /* return 1st (vga compatible) sbus card */
+ /* note: the sbus code enters display cards as 'vga compatible' */
+ if(disp_sbus) return disp_sbus;
+
+ /* return 1st display adapter that has some x11 info */
+ if(disp_di) return disp_di;
+
+ /* return 1st vga compatible pci card */
+ if(disp_pci) return disp_pci;
+
+ /* return 1st vga compatible card */
+ if(disp) return disp;
+
+ /* return 1st display adapter */
+ if(disp_any) return disp_any;
+
+ /* there were none... */
+ return 0;
+}
+
+
+enum cpu_arch hd_cpu_arch(hd_data_t *hd_data)
+{
+ hd_t *hd;
+
+#ifdef LIBHD_MEMCHECK
+ {
+ if(libhd_log)
+ fprintf(libhd_log, "; %s\t%p\t%p\n", __FUNCTION__, CALLED_FROM(hd_cpu_arch, hd_data), hd_data);
+ }
+#endif
+
+ for(hd = hd_data->hd; hd; hd = hd->next) {
+ if(
+ hd->base_class.id == bc_internal &&
+ hd->sub_class.id == sc_int_cpu &&
+ hd->detail &&
+ hd->detail->type == hd_detail_cpu &&
+ hd->detail->cpu.data
+ ) {
+ return hd->detail->cpu.data->architecture;
+ }
+ }
+
+#ifdef __i386__
+ return arch_intel;
+#else
+#ifdef __alpha__
+ return arch_alpha;
+#else
+#ifdef __PPC__
+ return arch_ppc;
+#else
+#ifdef __sparc__
+ return arch_sparc;
+#else
+#ifdef __s390x__
+ return arch_s390x;
+#else
+#ifdef __s390__
+ return arch_s390;
+#else
+#ifdef __ia64__
+ return arch_ia64;
+#else
+#ifdef __x86_64__
+ return arch_x86_64;
+#else
+ return arch_unknown;
+#endif
+#endif
+#endif
+#endif
+#endif
+#endif
+#endif
+#endif
+}
+
+
+enum boot_arch hd_boot_arch(hd_data_t *hd_data)
+{
+#ifdef LIBHD_MEMCHECK
+ {
+ if(libhd_log)
+ fprintf(libhd_log, "; %s\t%p\t%p\n", __FUNCTION__, CALLED_FROM(hd_boot_arch, hd_data), hd_data);
+ }
+#endif
+
+ return hd_data->boot;
+}
+
+
+int hd_is_uml(hd_data_t *hd_data)
+{
+ int is_uml = 0;
+ hd_t *hd;
+ cpu_info_t *ct;
+ unsigned u;
+ unsigned saved_mod = hd_data->module;
+ unsigned char probe_save[sizeof hd_data->probe];
+
+ u = hd_data->flags.internal;
+ hd_data->flags.internal = 1;
+ hd = hd_list(hd_data, hw_cpu, 0, NULL);
+ if(!hd) {
+ /* Do *not* run hd_list(,, 1,) here! */
+ memcpy(probe_save, hd_data->probe, sizeof probe_save);
+ hd_set_probe_feature(hd_data, pr_cpu);
+ hd_scan_cpu(hd_data);
+ memcpy(hd_data->probe, probe_save, sizeof hd_data->probe);
+ for(hd = hd_data->hd; hd; hd = hd->next) {
+ if(hd->base_class.id == bc_internal && hd->sub_class.id == sc_int_cpu) break;
+ }
+ }
+ hd_data->flags.internal = u;
+
+ if(
+ hd &&
+ hd->detail &&
+ hd->detail->type == hd_detail_cpu &&
+ (ct = hd->detail->cpu.data) &&
+ ct->model_name &&
+ !strcmp(ct->model_name, "UML")
+ ) {
+ is_uml = 1;
+ }
+
+ hd = hd_free_hd_list(hd);
+
+ hd_data->module = saved_mod;
+
+ return is_uml;
+}
+
+
+int hd_is_sgi_altix(hd_data_t *hd_data)
+{
+ struct stat sbuf;
+
+ return stat("/proc/sgi_sn", &sbuf) ? 0 : 1;
+}
+
+
+int hd_is_iseries(hd_data_t *hd_data)
+{
+ struct stat sbuf;
+
+ return stat(PROC_ISERIES, &sbuf) ? 0 : 1;
+}
+
+
+/*
+ * makes a (shallow) copy; does some magic fixes
+ */
+void hd_copy(hd_t *dst, hd_t *src)
+{
+ hd_t *tmp;
+// unsigned u;
+
+ tmp = dst->next;
+// u = dst->idx;
+
+ *dst = *src;
+ src->ref_cnt++;
+ dst->ref = src;
+
+ dst->next = tmp;
+// dst->idx = u;
+
+ /* needed to keep in sync with the real device tree */
+ if(
+ dst->detail &&
+ dst->detail->type == hd_detail_devtree
+ ) {
+ dst->detail = NULL; /* ??? was: free_mem(dst->detail); */
+ }
+}
+
+
+hd_t *hd_list(hd_data_t *hd_data, hd_hw_item_t item, int rescan, hd_t *hd_old)
+{
+ hd_t *hd, *hd1, *hd_list = NULL;
+ unsigned char probe_save[sizeof hd_data->probe];
+ unsigned fast_save;
+
+#ifdef LIBHD_MEMCHECK
+#ifndef __PPC__
+ {
+ if(libhd_log)
+ fprintf(libhd_log, "; %s\t%p\t%p\t%u\t%u\t%p\n", __FUNCTION__, CALLED_FROM(hd_list, hd_data), hd_data, item, rescan, hd_old);
+ }
+#endif
+#endif
+
+ if(rescan) {
+ memcpy(probe_save, hd_data->probe, sizeof probe_save);
+ fast_save = hd_data->flags.fast;
+ hd_clear_probe_feature(hd_data, pr_all);
+#ifdef __powerpc__
+ hd_set_probe_feature(hd_data, pr_sys);
+ hd_scan(hd_data);
+#endif
+ hd_set_probe_feature_hw(hd_data, item);
+ hd_scan(hd_data);
+ memcpy(hd_data->probe, probe_save, sizeof hd_data->probe);
+ hd_data->flags.fast = fast_save;
+ }
+
+ for(hd = hd_data->hd; hd; hd = hd->next) {
+ if(!hd_report_this(hd_data, hd)) continue;
+
+ if(
+ (
+ item == hw_manual || hd_is_hw_class(hd, item)
+ )
+#ifndef LIBHD_TINY
+/* with LIBHD_TINY hd->status is not maintained (cf. manual.c) */
+ && (
+ hd->status.available == status_yes ||
+ hd->status.available == status_unknown ||
+ item == hw_manual ||
+ hd_data->flags.list_all
+ )
+#endif
+ ) {
+// if(hd->is.softraiddisk) continue; /* don't report them */
+
+ /* don't report old entries again */
+ for(hd1 = hd_old; hd1; hd1 = hd1->next) {
+ if(!cmp_hd(hd1, hd)) break;
+ }
+ if(!hd1) {
+ hd1 = add_hd_entry2(&hd_list, new_mem(sizeof *hd_list));
+ hd_copy(hd1, hd);
+ }
+ }
+ }
+
+ if(item == hw_manual) {
+ for(hd = hd_list; hd; hd = hd->next) {
+ hd->status.available = hd->status.available_orig;
+ }
+ }
+
+ return hd_list;
+}
+
+
+hd_t *hd_list_with_status(hd_data_t *hd_data, hd_hw_item_t item, hd_status_t status)
+{
+ hd_t *hd, *hd1, *hd_list = NULL;
+ unsigned char probe_save[sizeof hd_data->probe];
+
+#ifdef LIBHD_MEMCHECK
+#ifndef __PPC__
+ {
+ if(libhd_log)
+ fprintf(libhd_log, "; %s\t%p\t%p\t%u\n", __FUNCTION__, CALLED_FROM(hd_list_with_status, hd_data), hd_data, item);
+ }
+#endif
+#endif
+
+ memcpy(probe_save, hd_data->probe, sizeof probe_save);
+ hd_clear_probe_feature(hd_data, pr_all);
+ hd_set_probe_feature(hd_data, pr_manual);
+ hd_scan(hd_data);
+ memcpy(hd_data->probe, probe_save, sizeof hd_data->probe);
+
+ for(hd = hd_data->hd; hd; hd = hd->next) {
+ if(hd_is_hw_class(hd, item)) {
+ if(
+ (status.configured == 0 || status.configured == hd->status.configured) &&
+ (status.available == 0 || status.available == hd->status.available) &&
+ (status.needed == 0 || status.needed == hd->status.needed) &&
+ (status.reconfig == 0 || status.reconfig == hd->status.reconfig)
+ ) {
+ hd1 = add_hd_entry2(&hd_list, new_mem(sizeof *hd_list));
+ hd_copy(hd1, hd);
+ }
+ }
+ }
+
+ return hd_list;
+}
+
+
+/* check if item is in items */
+int has_item(hd_hw_item_t *items, hd_hw_item_t item)
+{
+ while(*items) if(*items++ == item) return 1;
+
+ return 0;
+}
+
+
+/* check if one of items is in hw_class */
+int has_hw_class(hd_t *hd, hd_hw_item_t *items)
+{
+ while(*items) if(hd_is_hw_class(hd, *items++)) return 1;
+
+ return 0;
+}
+
+
+/*
+ * items must be a 0 terminated list
+ */
+hd_t *hd_list2(hd_data_t *hd_data, hd_hw_item_t *items, int rescan)
+{
+ hd_t *hd, *hd1, *hd_list = NULL;
+ unsigned char probe_save[sizeof hd_data->probe];
+ unsigned fast_save;
+ hd_hw_item_t *item_ptr;
+ int is_manual;
+
+ if(!items) return NULL;
+
+ is_manual = has_item(items, hw_manual);
+
+ if(rescan) {
+ memcpy(probe_save, hd_data->probe, sizeof probe_save);
+ fast_save = hd_data->flags.fast;
+ hd_clear_probe_feature(hd_data, pr_all);
+#ifdef __powerpc__
+ hd_set_probe_feature(hd_data, pr_sys);
+ hd_scan(hd_data);
+#endif
+ for(item_ptr = items; *item_ptr; item_ptr++) {
+ hd_set_probe_feature_hw(hd_data, *item_ptr);
+ }
+ hd_scan(hd_data);
+ memcpy(hd_data->probe, probe_save, sizeof hd_data->probe);
+ hd_data->flags.fast = fast_save;
+ }
+
+ for(hd = hd_data->hd; hd; hd = hd->next) {
+ if(!hd_report_this(hd_data, hd)) continue;
+ if(
+ (
+ is_manual || has_hw_class(hd, items)
+ )
+#ifndef LIBHD_TINY
+/* with LIBHD_TINY hd->status is not maintained (cf. manual.c) */
+ && (
+ hd->status.available == status_yes ||
+ hd->status.available == status_unknown ||
+ is_manual ||
+ hd_data->flags.list_all
+ )
+#endif
+ ) {
+// if(hd->is.softraiddisk) continue; /* don't report them */
+
+ /* don't report old entries again */
+ hd1 = add_hd_entry2(&hd_list, new_mem(sizeof *hd_list));
+ hd_copy(hd1, hd);
+ }
+ }
+
+ if(is_manual) {
+ for(hd = hd_list; hd; hd = hd->next) {
+ hd->status.available = hd->status.available_orig;
+ }
+ }
+
+ return hd_list;
+}
+
+
+/*
+ * items must be a 0 terminated list
+ */
+hd_t *hd_list_with_status2(hd_data_t *hd_data, hd_hw_item_t *items, hd_status_t status)
+{
+ hd_t *hd, *hd1, *hd_list = NULL;
+ unsigned char probe_save[sizeof hd_data->probe];
+
+ if(!items) return NULL;
+
+ memcpy(probe_save, hd_data->probe, sizeof probe_save);
+ hd_clear_probe_feature(hd_data, pr_all);
+ hd_set_probe_feature(hd_data, pr_manual);
+ hd_scan(hd_data);
+ memcpy(hd_data->probe, probe_save, sizeof hd_data->probe);
+
+ for(hd = hd_data->hd; hd; hd = hd->next) {
+ if(has_hw_class(hd, items)) {
+ if(
+ (status.configured == 0 || status.configured == hd->status.configured) &&
+ (status.available == 0 || status.available == hd->status.available) &&
+ (status.needed == 0 || status.needed == hd->status.needed) &&
+ (status.reconfig == 0 || status.reconfig == hd->status.reconfig)
+ ) {
+ hd1 = add_hd_entry2(&hd_list, new_mem(sizeof *hd_list));
+ hd_copy(hd1, hd);
+ }
+ }
+ }
+
+ return hd_list;
+}
+
+
+hd_t *hd_base_class_list(hd_data_t *hd_data, unsigned base_class)
+{
+ hd_t *hd, *hd1, *hd_list = NULL;
+// hd_t *bridge_hd;
+
+#ifdef LIBHD_MEMCHECK
+ {
+ if(libhd_log)
+ fprintf(libhd_log, "; %s\t%p\t%p\n", __FUNCTION__, CALLED_FROM(hd_base_class_list, hd_data), hd_data);
+ }
+#endif
+
+ for(hd = hd_data->hd; hd; hd = hd->next) {
+
+#if 0
+ /* ###### fix later: card bus magic */
+ if((bridge_hd = hd_get_device_by_idx(hd_data, hd->attached_to))) {
+ if(
+ bridge_hd->base_class.id == bc_bridge &&
+ bridge_hd->sub_class.id == sc_bridge_cardbus
+ ) continue;
+ }
+#endif
+
+ /* add multimedia/sc_multi_video to display */
+ if(
+ hd->base_class.id == base_class ||
+ (
+ base_class == bc_display &&
+ hd->base_class.id == bc_multimedia &&
+ hd->sub_class.id == sc_multi_video
+ )
+ ) {
+ hd1 = add_hd_entry2(&hd_list, new_mem(sizeof *hd_list));
+ hd_copy(hd1, hd);
+ }
+ }
+
+ return hd_list;
+}
+
+hd_t *hd_sub_class_list(hd_data_t *hd_data, unsigned base_class, unsigned sub_class)
+{
+ hd_t *hd, *hd1, *hd_list = NULL;
+
+#ifdef LIBHD_MEMCHECK
+ {
+ if(libhd_log)
+ fprintf(libhd_log, "; %s\t%p\t%p\n", __FUNCTION__, CALLED_FROM(hd_sub_class_list, hd_data), hd_data);
+ }
+#endif
+
+ for(hd = hd_data->hd; hd; hd = hd->next) {
+ if(hd->base_class.id == base_class && hd->sub_class.id == sub_class) {
+ hd1 = add_hd_entry2(&hd_list, new_mem(sizeof *hd_list));
+ hd_copy(hd1, hd);
+ }
+ }
+
+ return hd_list;
+}
+
+hd_t *hd_bus_list(hd_data_t *hd_data, unsigned bus)
+{
+ hd_t *hd, *hd1, *hd_list = NULL;
+
+#ifdef LIBHD_MEMCHECK
+ {
+ if(libhd_log)
+ fprintf(libhd_log, "; %s\t%p\t%p\n", __FUNCTION__, CALLED_FROM(hd_bus_list, hd_data), hd_data);
+ }
+#endif
+
+ for(hd = hd_data->hd; hd; hd = hd->next) {
+ if(hd->bus.id == bus) {
+ hd1 = add_hd_entry2(&hd_list, new_mem(sizeof *hd_list));
+ hd_copy(hd1, hd);
+ }
+ }
+
+ return hd_list;
+}
+
+/* Convert libhd bus IDs to hwcfg bus names */
+const char* hd_busid_to_hwcfg(int busid)
+{
+ const char* const ids1[]={"none","isa","eisa","mc","pci","pcmcia","nubus","cardbus","other"};
+ const char* const ids2[]={"ps2","serial","parallel","floppy","scsi","ide","usb","adb","raid","sbus","i2o","vio","ccw","iucv"};
+ if(busid <9)
+ return ids1[busid];
+ else if(busid >=0x80 && busid <0x8e)
+ return ids2[busid-0x80];
+ else
+ return 0;
+}
+
+/*
+ * Check if the execution of (*func)() takes longer than timeout seconds.
+ * This is useful to work around long kernel-timeouts as in the floppy
+ * detection and ps/2 mouse detection.
+ */
+int hd_timeout(void(*func)(void *), void *arg, int timeout)
+{
+ int child1, child2;
+ int status = 0;
+
+ child1 = fork();
+ if(child1 == -1) return -1;
+
+ if(child1) {
+ if(waitpid(child1, &status, 0) == -1) return -1;
+// fprintf(stderr, ">child1 status: 0x%x\n", status);
+
+ if(WIFEXITED(status)) {
+ status = WEXITSTATUS(status);
+// fprintf(stderr, ">normal child1 status: 0x%x\n", status);
+ /* != 0 if we timed out */
+ }
+ else {
+ status = 0;
+ }
+ }
+ else {
+ /* fork again */
+
+#ifdef LIBHD_MEMCHECK
+ /* stop logging in child process */
+ if(libhd_log) fclose(libhd_log);
+ libhd_log = NULL;
+#endif
+
+ child2 = fork();
+ if(child2 == -1) return -1;
+
+ if(child2) {
+// fprintf(stderr, ">signal\n");
+ signal(SIGALRM, timeout_alarm_handler);
+ alarm(timeout);
+ if(waitpid(child2, &status, 0) == -1) return -1;
+// fprintf(stderr, ">child2 status: 0x%x\n", status);
+ _exit(0);
+ }
+ else {
+ (*func)(arg);
+ _exit(0);
+ }
+ }
+
+ return status ? 1 : 0;
+}
+
+void timeout_alarm_handler(int signal)
+{
+ _exit(63);
+}
+
+
+/*
+ * Return list of loaded modules. Converts '-' to '_'.
+ */
+str_list_t *read_kmods(hd_data_t *hd_data)
+{
+ str_list_t *sl, *sl0, *sl1 = NULL;
+ char *s;
+
+ if(!hd_data->kmods || hd_data->flags.keep_kmods != 2) {
+ hd_data->kmods = free_str_list(hd_data->kmods);
+ if(!(sl0 = read_file(PROC_MODULES, 0, 0))) return NULL;
+ hd_data->kmods = sl0;
+ if(hd_data->flags.keep_kmods == 1) hd_data->flags.keep_kmods = 2;
+ }
+
+ for(sl = hd_data->kmods; sl; sl = sl->next) {
+ s = sl->str;
+ add_str_list(&sl1, strsep(&s, " \t"));
+ }
+
+ for(sl = sl1; sl; sl = sl->next) {
+ for(s = sl->str; *s; s++) if(*s == '-') *s = '_';
+ }
+
+ return sl1;
+}
+
+
+str_list_t *get_cmdline(hd_data_t *hd_data, char *key)
+{
+ str_list_t *sl0, *sl1, *cmd = NULL;
+ char *s, *t, *t0;
+ int i, l = strlen(key);
+
+ if(!hd_data->cmd_line) {
+ sl0 = read_file(PROC_CMDLINE, 0, 1);
+ sl1 = read_file(LIB_CMDLINE, 0, 1);
+
+ if(sl0) {
+ i = strlen(sl0->str);
+ if(i && sl0->str[i - 1] == '\n') sl0->str[i - 1] = 0;
+ hd_data->cmd_line = new_str(sl0->str);
+ if(hd_data->debug) {
+ ADD2LOG("----- " PROC_CMDLINE " -----\n");
+ ADD2LOG(" %s\n", sl0->str);
+ ADD2LOG("----- " PROC_CMDLINE " end -----\n");
+ }
+ }
+ if(sl1) {
+ i = strlen(sl1->str);
+ if(i && sl1->str[i - 1] == '\n') sl1->str[i - 1] = 0;
+ str_printf(&hd_data->cmd_line, -1, " %s", sl1->str);
+ if(hd_data->debug) {
+ ADD2LOG("----- " LIB_CMDLINE " -----\n");
+ ADD2LOG(" %s\n", sl1->str);
+ ADD2LOG("----- " LIB_CMDLINE " end -----\n");
+ }
+ }
+
+ free_str_list(sl0);
+ free_str_list(sl1);
+ }
+
+ if(!hd_data->cmd_line) return NULL;
+
+ t = t0 = new_str(hd_data->cmd_line);
+ while((s = strsep(&t, " "))) {
+ if(!*s) continue;
+ if(!strncmp(s, key, l) && s[l] == '=') {
+ add_str_list(&cmd, s + l + 1);
+ }
+ }
+
+ free_mem(t0);
+
+ return cmd;
+}
+
+
+/*
+ * Return field 'field' (starting with 0) from the 'SuSE='
+ * kernel cmd line parameter.
+ */
+char *get_cmd_param(hd_data_t *hd_data, int field)
+{
+ char *s, *t;
+ str_list_t *cmd;
+
+ if(!(cmd = get_cmdline(hd_data, "SuSE"))) return NULL;
+
+ s = cmd->str;
+
+ t = NULL;
+
+ if(s) {
+ for(; field; field--) {
+ if(!(s = strchr(s, ','))) break;
+ s++;
+ }
+
+ if(s && (t = strchr(s, ','))) *t = 0;
+ }
+
+ t = new_str(s);
+
+ free_str_list(cmd);
+
+ return t;
+}
+
+
+unsigned get_disk_crc(unsigned char *data, unsigned len)
+{
+ unsigned i, crc;
+
+ crc = -1;
+ for(i = 0; i < len; i++) {
+ crc += data[i];
+ crc *= 57;
+ }
+
+ return crc;
+}
+
+disk_t *add_disk_entry(disk_t **dl, disk_t *new_dl)
+{
+ while(*dl) dl = &(*dl)->next;
+ return *dl = new_dl;
+}
+
+disk_t *free_disk_list(disk_t *dl)
+{
+ disk_t *l;
+
+ for(; dl; dl = (l = dl)->next, free_mem(l));
+
+ return NULL;
+}
+
+int dev_name_duplicate(disk_t *dl, char *dev_name)
+{
+ for(; dl; dl = dl->next) {
+ if(!strcmp(dl->dev_name, dev_name)) return 1;
+ }
+
+ return 0;
+}
+
+unsigned hd_boot_disk(hd_data_t *hd_data, int *matches)
+{
+ hd_t *hd;
+ unsigned crc, hd_idx = 0;
+ char *s;
+ int i, j;
+ disk_t *dl, *dl0 = NULL, *dl1 = NULL;
+
+#ifdef LIBHD_MEMCHECK
+ {
+ if(libhd_log)
+ fprintf(libhd_log, "; %s\t%p\t%p\n", __FUNCTION__, CALLED_FROM(hd_boot_disk, hd_data), hd_data);
+ }
+#endif
+
+ if(matches) *matches = 0;
+
+ if(!(s = get_cmd_param(hd_data, 2))) return 0;
+
+ i = strlen(s);
+
+ if(i >= 8) {
+ crc = hex(s, 8);
+ }
+ else {
+ free_mem(s);
+ return 0;
+ }
+
+ s = free_mem(s);
+
+ if((hd_data->debug & HD_DEB_BOOT)) {
+ ADD2LOG(" boot dev crc 0x%x\n", crc);
+ }
+
+ for(hd = hd_data->hd; hd; hd = hd->next) {
+ if(
+ hd->base_class.id == bc_storage_device &&
+ hd->sub_class.id == sc_sdev_disk &&
+ hd->block0
+ ) {
+ if(dev_name_duplicate(dl0, hd->unix_dev_name)) continue;
+ dl = add_disk_entry(&dl0, new_mem(sizeof *dl0));
+ dl->dev_name = hd->unix_dev_name;
+ dl->hd_idx = hd->idx;
+ dl->crc = get_disk_crc(dl->data = hd->block0, 512);
+ }
+ }
+
+ if(!dl0) return 0;
+
+ if((hd_data->debug & HD_DEB_BOOT)) {
+ for(dl = dl0; dl; dl = dl->next) {
+ ADD2LOG(" crc %s 0x%08x\n", dl->dev_name, dl->crc);
+ }
+ }
+
+ for(i = 0, dl = dl0; dl; dl = dl->next) {
+ if(crc == dl->crc) {
+ dl->crc_match = 1;
+ dl1 = dl;
+ if(!i++) hd_idx = dl->hd_idx;
+ }
+ }
+
+ if(i == 1 && dl1 && (hd_data->debug & HD_DEB_BOOT)) {
+ ADD2LOG("----- MBR -----\n");
+ for(j = 0; j < 512; j += 0x10) {
+ ADD2LOG(" %03x ", j);
+ hexdump(&hd_data->log, 1, 0x10, dl1->data + j);
+ ADD2LOG("\n");
+ }
+ ADD2LOG("----- MBR end -----\n");
+ }
+
+ free_disk_list(dl0);
+
+ if(matches) *matches = i;
+
+ hd_data->debug &= ~HD_DEB_BOOT;
+
+ return hd_idx;
+}
+
+void update_irq_usage(hd_data_t *hd_data)
+{
+ hd_t *hd;
+ misc_irq_t *mi;
+ unsigned u, v;
+ uint64_t irqs = 0;
+ hd_res_t *res;
+
+ if(hd_data->misc) {
+ mi = hd_data->misc->irq;
+ for(u = 0; u < hd_data->misc->irq_len; u++) {
+ v = mi[u].irq;
+ irqs |= 1ull << v;
+ }
+ }
+
+ for(hd = hd_data->hd; hd; hd = hd->next) {
+ for(res = hd->res; res; res = res->next) {
+ if(res->any.type == res_irq) {
+ irqs |= 1ull << res->irq.base;
+ }
+ }
+ }
+
+ hd_data->used_irqs = irqs;
+}
+
+int run_cmd(hd_data_t *hd_data, char *cmd)
+{
+ char *xcmd = NULL;
+ str_list_t *sl, *sl0;
+
+ ADD2LOG("----- exec: \"%s\" -----\n", cmd);
+
+ if(*cmd == '/') {
+ str_printf(&xcmd, 0, "|%s 2>&1", cmd);
+ sl0 = read_file(xcmd, 0, 0);
+ for(sl = sl0; sl; sl = sl->next) ADD2LOG(" %s", sl->str);
+ sl0 = free_str_list(sl0);
+ }
+
+ ADD2LOG("----- return code: ? -----\n");
+
+ free_mem(xcmd);
+
+ return 0;
+}
+
+int probe_module(hd_data_t *hd_data, char *module)
+{
+ char *cmd = NULL;
+ int i;
+ struct stat sbuf;
+
+ if(hd_module_is_active(hd_data, module)) return 0;
+
+ if(stat(PROG_MODPROBE, &sbuf)) return 127;
+
+ str_printf(&cmd, 0, PROG_MODPROBE " %s", module);
+
+ i = run_cmd(hd_data, cmd);
+
+ free_mem(cmd);
+
+ return i;
+}
+
+int load_module_with_params(hd_data_t *hd_data, char *module, char *params)
+{
+ char *cmd = NULL;
+ int i;
+ struct stat sbuf;
+
+ if(hd_module_is_active(hd_data, module)) return 0;
+
+ if(stat(PROG_MODPROBE, &sbuf)) return 127;
+
+ str_printf(&cmd, 0, PROG_MODPROBE " %s %s", module, params ? params : "");
+
+ i = run_cmd(hd_data, cmd);
+
+ free_mem(cmd);
+
+ return i;
+}
+
+int load_module(hd_data_t *hd_data, char *module)
+{
+ return load_module_with_params(hd_data, module, NULL);
+}
+
+int unload_module(hd_data_t *hd_data, char *module)
+{
+ char *cmd = NULL;
+ int i;
+
+ if(!hd_module_is_active(hd_data, module)) return 0;
+
+ str_printf(&cmd, 0, PROG_RMMOD " %s", module);
+
+ i = run_cmd(hd_data, cmd);
+
+ free_mem(cmd);
+
+ return i;
+}
+
+/*
+ * Compare two hd entries and return 0 if they are identical.
+ */
+int cmp_hd(hd_t *hd1, hd_t *hd2)
+{
+ if(!hd1 || !hd2) return 1;
+
+ if(
+ hd1->bus.id != hd2->bus.id ||
+ hd1->slot != hd2->slot ||
+ hd1->func != hd2->func ||
+ hd1->base_class.id != hd2->base_class.id ||
+ hd1->sub_class.id != hd2->sub_class.id ||
+ hd1->prog_if.id != hd2->prog_if.id ||
+ hd1->device.id != hd2->device.id ||
+ hd1->vendor.id != hd2->vendor.id ||
+ hd1->sub_vendor.id != hd2->sub_vendor.id ||
+ hd1->revision.id != hd2->revision.id ||
+ hd1->compat_device.id != hd2->compat_device.id ||
+ hd1->compat_vendor.id != hd2->compat_vendor.id ||
+
+ hd1->module != hd2->module ||
+ hd1->line != hd2->line
+ ) {
+ return 1;
+ }
+
+ if(hd1->unix_dev_name || hd2->unix_dev_name) {
+ if(hd1->unix_dev_name && hd2->unix_dev_name) {
+ if(strcmp(hd1->unix_dev_name, hd2->unix_dev_name)) return 1;
+ }
+ else {
+ return 1;
+ }
+ }
+
+ return 0;
+}
+
+
+void get_probe_env(hd_data_t *hd_data)
+{
+ char *s, *t, *env;
+ str_list_t *cmd = NULL;
+ int j, k;
+ char buf[10];
+
+ env = getenv("hwprobe");
+ if(!env) {
+ cmd = get_cmdline(hd_data, "hwprobe");
+ if(cmd) env = cmd->str;
+ }
+ s = env = new_str(env);
+
+ free_str_list(cmd);
+
+ if(!env) return;
+
+ hd_data->xtra_hd = free_str_list(hd_data->xtra_hd);
+
+ while((t = strsep(&s, ","))) {
+ if(*t == '+') {
+ k = 1; t++;
+ }
+ else if(*t == '-') {
+ k = 0; t++;
+ }
+ else {
+ k = 2;
+// ADD2LOG("hwprobe: +/- missing before \"%s\"\n", t);
+// return;
+ }
+
+ if((j = hd_probe_feature_by_name(t))) {
+ set_probe_feature(hd_data, j, k ? 1 : 0);
+ }
+ else if(sscanf(t, "%8[^:]:%8[^:]:%8[^:]", buf, buf, buf) == 3) {
+ add_str_list(&hd_data->xtra_hd, t - (k == 2 ? 0 : 1));
+ }
+ else {
+ if(*t) ADD2LOG("hwprobe: what is \"%s\"?\n", t);
+ return;
+ }
+ }
+
+ free_mem(env);
+}
+
+void hd_scan_xtra(hd_data_t *hd_data)
+{
+ str_list_t *sl;
+ hd_t *hd, *hd_tmp;
+ unsigned u0, u1, u2, tag;
+ int i, err;
+ char buf0[10], buf1[10], buf2[10], buf3[64], *s, k;
+
+ hd_data->module = mod_xtra;
+
+ remove_hd_entries(hd_data);
+
+ for(sl = hd_data->xtra_hd; sl; sl = sl->next) {
+ s = sl->str;
+ err = 0;
+ switch(*s) {
+ case '+': k = 1; s++; break;
+ case '-': k = 0; s++; break;
+ default: k = 2;
+ }
+ if(
+ (i = sscanf(s, "%8[^:]:%8[^:]:%8[^:]:%60s", buf0, buf1, buf2, buf3)) >= 3
+ ) {
+ if(i < 4) *buf3 = 0;
+
+ u0 = strtoul(buf0, &s, 16);
+ if(*s) err |= 1;
+ if(strlen(buf1) == 3) {
+ u1 = name2eisa_id(buf1);
+ }
+ else {
+ tag = TAG_PCI;
+ s = buf1;
+ switch(*s) {
+ case 'p': tag = TAG_PCI; s++; break;
+ case 'r': tag = 0; s++; break;
+ case 's': tag = TAG_SPECIAL; s++; break;
+ case 'u': tag = TAG_USB; s++; break;
+ case 'P': tag = TAG_PCMCIA; s++; break;
+ }
+ u1 = strtoul(s, &s, 16);
+ if(*s) err |= 2;
+ u1 = MAKE_ID(tag, u1);
+ }
+ u2 = strtoul(buf2, &s, 16);
+ if(*s) err |= 4;
+ u2 = MAKE_ID(ID_TAG(u1), ID_VALUE(u2));
+ if((err & 1) && !strcmp(buf0, "*")) {
+ u0 = -1;
+ err &= ~1;
+ }
+ if((err & 2) && !strcmp(buf1, "*")) {
+ u1 = 0;
+ err &= ~2;
+ }
+ if((err & 4) && !strcmp(buf2, "*")) {
+ u2 = 0;
+ err &= ~4;
+ }
+ if(!err) {
+ if(k) {
+ if(k == 2) {
+ /* insert at top */
+ hd_tmp = hd_data->hd;
+ hd_data->hd = NULL;
+ hd = add_hd_entry(hd_data, __LINE__, 0);
+ hd->next = hd_tmp;
+ hd_tmp = NULL;
+ }
+ else {
+ hd = add_hd_entry(hd_data, __LINE__, 0);
+ }
+ hd->base_class.id = u0 >> 8;
+ hd->sub_class.id = u0 & 0xff;
+ hd->vendor.id = u1;
+ hd->device.id = u2;
+ if(ID_TAG(hd->vendor.id) == TAG_PCI) hd->bus.id = bus_pci;
+ if(ID_TAG(hd->vendor.id) == TAG_USB) hd->bus.id = bus_usb;
+ if(ID_TAG(hd->vendor.id) == TAG_PCMCIA) {
+ hd->bus.id = bus_pcmcia;
+ hd->hotplug = hp_pcmcia;
+ }
+ if(*buf3) hd->unix_dev_name = new_str(buf3);
+ hd->status.available = status_yes;
+ hd->status.configured = status_new;
+ hd->status.needed = status_no;
+ }
+ else {
+ for(hd = hd_data->hd; hd; hd = hd->next) {
+ if(
+ (u0 == -1u || (
+ hd->base_class.id == (u0 >> 8) &&
+ hd->sub_class.id == (u0 & 0xff)
+ )) &&
+ (u1 == 0 || hd->vendor.id == u1) &&
+ (u2 == 0 || hd->device.id == u2) &&
+ (*buf3 == 0 || (
+ hd->unix_dev_name &&
+ !strcmp(hd->unix_dev_name, buf3)
+ ))
+ ) {
+ hd->tag.remove = 1;
+ }
+ }
+ remove_tagged_hd_entries(hd_data);
+ }
+ }
+ }
+ }
+}
+
+unsigned has_something_attached(hd_data_t *hd_data, hd_t *hd)
+{
+ hd_t *hd1;
+
+ for(hd1 = hd_data->hd; hd1; hd1 = hd1->next) {
+ if(hd1->attached_to == hd->idx) return hd1->idx;
+ }
+
+ return 0;
+}
+
+
+/* ##### FIX: replace with a real crc later ##### */
+void crc64(uint64_t *id, void *p, int len)
+{
+ unsigned char uc;
+
+ for(; len; len--, p++) {
+ uc = *(unsigned char *) p;
+ *id += uc + ((uc + 57) << 27);
+ *id *= 73;
+ *id *= 65521;
+ }
+}
+
+char *numid2str(uint64_t id, int len)
+{
+ static char buf[32];
+
+#ifdef NUMERIC_UNIQUE_ID
+ /* numeric */
+
+ if(len < (sizeof id << 3)) id &= ~(-1LL << len);
+ sprintf(buf, "%0*"PRIx64, len >> 2, id);
+
+#else
+ /* base64 like */
+
+ int i;
+ unsigned char u;
+
+ memset(buf, 0, sizeof buf);
+ for(i = 0; len > 0 && i < (int) sizeof buf - 1; i++, len -= 6, id >>= 6) {
+ u = id & 0x3f;
+ if(u < 10) {
+ u += '0'; /* 0..9 */
+ }
+ else if(u < 10 + 26) {
+ u += 'A' - 10; /* A..Z */
+ }
+ else if(u < 10 + 26 + 26) {
+ u += 'a' - 10 - 26; /* a..z */
+ }
+ else if(u == 63) {
+ u = '+';
+ }
+ else {
+ u = '_';
+ }
+ buf[i] = u;
+ }
+
+#endif
+
+ return buf;
+}
+
+/*
+ * calculate unique ids
+ */
+#define INT_CRC(a, b) crc64(&a, &hd->b, sizeof hd->b);
+#define STR_CRC(a, b) if(hd->b) crc64(&a, hd->b, strlen(hd->b) + 1);
+
+
+// old method
+void hd_add_old_id(hd_t *hd)
+{
+ uint64_t id0 = 0, id1 = 0;
+
+ if(hd->unique_id) return;
+
+ INT_CRC(id0, bus.id);
+ INT_CRC(id0, slot);
+ INT_CRC(id0, func);
+ INT_CRC(id0, base_class.id);
+ INT_CRC(id0, sub_class.id);
+ INT_CRC(id0, prog_if.id);
+ STR_CRC(id0, unix_dev_name);
+ STR_CRC(id0, rom_id);
+
+ INT_CRC(id1, base_class.id);
+ INT_CRC(id1, sub_class.id);
+ INT_CRC(id1, prog_if.id);
+ INT_CRC(id1, device.id);
+ INT_CRC(id1, vendor.id);
+ INT_CRC(id1, sub_device.id);
+ INT_CRC(id1, sub_vendor.id);
+ INT_CRC(id1, revision.id);
+ INT_CRC(id1, compat_device.id);
+ INT_CRC(id1, compat_vendor.id);
+ STR_CRC(id1, device.name);
+ STR_CRC(id1, vendor.name);
+ STR_CRC(id1, sub_device.name);
+ STR_CRC(id1, sub_vendor.name);
+ STR_CRC(id1, revision.name);
+ STR_CRC(id1, serial);
+
+ id0 += (id0 >> 32);
+ str_printf(&hd->unique_id, 0, "%s", numid2str(id0, 24));
+ str_printf(&hd->unique_id, -1, ".%s", numid2str(id1, 64));
+}
+
+void hd_add_id(hd_data_t *hd_data, hd_t *hd)
+{
+ uint64_t id0 = 0, id1 = 0;
+
+ if(hd->unique_id) return;
+
+ hd_add_old_id(hd);
+ hd->old_unique_id = hd->unique_id;
+ hd->unique_id = NULL;
+
+ INT_CRC(id1, base_class.id);
+ INT_CRC(id1, sub_class.id);
+ INT_CRC(id1, prog_if.id);
+ INT_CRC(id1, device.id);
+ INT_CRC(id1, vendor.id);
+ INT_CRC(id1, sub_device.id);
+ INT_CRC(id1, sub_vendor.id);
+ INT_CRC(id1, revision.id);
+ if(
+ hd->detail &&
+ hd->detail->type == hd_detail_ccw &&
+ hd->detail->ccw.data
+ ) INT_CRC(id1, detail->ccw.data->cu_model);
+ INT_CRC(id1, compat_device.id);
+ INT_CRC(id1, compat_vendor.id);
+ // make sure we get the same id even if, say, the pci name list changes
+ if(!hd->device.id) STR_CRC(id1, device.name);
+ if(!hd->vendor.id) STR_CRC(id1, vendor.name);
+ if(!hd->sub_device.name) STR_CRC(id1, sub_device.name);
+ if(!hd->sub_vendor.name) STR_CRC(id1, sub_vendor.name);
+ if(!hd->revision.name) STR_CRC(id1, revision.name);
+ STR_CRC(id1, serial);
+
+ hd->unique_id1 = new_str(numid2str(id1, 64));
+
+ INT_CRC(id0, bus.id);
+
+ if(
+ (hd->bus.id == bus_usb ||
+ hd->bus.id == bus_ccw) &&
+ hd->sysfs_bus_id
+ ) {
+ STR_CRC(id0, sysfs_bus_id);
+ }
+ else if(
+ hd->bus.id != bus_usb &&
+ hd->bus.id != bus_pci &&
+ hd->sysfs_id
+ ) {
+ STR_CRC(id0, sysfs_id);
+ }
+ else if(hd->unix_dev_name) {
+ STR_CRC(id0, unix_dev_name);
+ }
+ else {
+ INT_CRC(id0, slot);
+ INT_CRC(id0, func);
+ }
+
+ STR_CRC(id0, rom_id);
+
+ id0 += (id0 >> 32);
+
+ str_printf(&hd->unique_id, 0, "%s.%s", numid2str(id0, 24), hd->unique_id1);
+}
+#undef INT_CRC
+#undef STR_CRC
+
+
+devtree_t *free_devtree(hd_data_t *hd_data)
+{
+ hd_t *hd;
+ devtree_t *dt, *next;
+
+ /*
+ * first, remove all references in the current device tree
+ * (refs in hd_old can remain)
+ */
+ for(hd = hd_data->hd; hd; hd = hd->next) {
+ if(hd->detail && hd->detail->type == hd_detail_devtree) {
+ hd->detail = free_mem(hd->detail);
+ }
+ }
+
+ for(dt = hd_data->devtree; dt; dt = next) {
+ next = dt->next;
+
+ free_mem(dt->path);
+ free_mem(dt->filename);
+ free_mem(dt->name);
+ free_mem(dt->model);
+ free_mem(dt->device_type);
+ free_mem(dt->compatible);
+ free_mem(dt->edid);
+
+ free_mem(dt);
+ }
+
+ return hd_data->devtree = NULL;
+}
+
+
+void test_read_block0_open(void *arg)
+{
+ open((char *) arg, O_RDONLY);
+}
+
+unsigned char *read_block0(hd_data_t *hd_data, char *dev, int *timeout)
+{
+ int fd, len, buf_size = 512, k, sel;
+ unsigned char *buf = NULL;
+ struct timeval to;
+ fd_set set, set0;
+
+ if(hd_timeout(test_read_block0_open, dev, *timeout) > 0) {
+ ADD2LOG(" read_block0: open(%s) timed out\n", dev);
+ *timeout = -1;
+ fd = -2;
+ }
+ else {
+ fd = open(dev, O_RDONLY);
+ if(fd < 0) ADD2LOG(" read_block0: open(%s) failed\n", dev);
+ }
+ if(fd >= 0) {
+ buf = new_mem(buf_size);
+ len = k = 0;
+
+ FD_ZERO(&set0);
+ FD_SET(fd, &set0);
+
+ to.tv_sec = *timeout; to.tv_usec = 0;
+ for(;;) {
+ set = set0;
+ if((sel = select(fd + 1, &set, NULL, NULL, &to)) > 0) {
+ if((k = read(fd, buf + len, buf_size - len)) > 0) len += k;
+ ADD2LOG(" read_block0: %d bytes (%ds, %dus)\n", k, (int) to.tv_sec, (int) to.tv_usec);
+ if(k <= 0 || buf_size == len) break;
+ }
+ if(sel == 0) {
+ *timeout = -2; break;
+ }
+ }
+
+ if(k < 0) {
+ ADD2LOG(" read_block0: read error(%s, %d, %d): errno %d\n", dev, len, buf_size - len, errno);
+ buf = free_mem(buf);
+ }
+ close(fd);
+ }
+
+ return buf;
+}
+
+
+void get_kernel_version(hd_data_t *hd_data)
+{
+ unsigned u1, u2;
+ str_list_t *sl;
+
+ if(hd_data->kernel_version) return;
+
+ hd_data->kernel_version = KERNEL_24;
+
+ sl = read_file(PROC_VERSION, 0, 1);
+
+ if(!sl || !sl->str) return;
+
+ if(sscanf(sl->str, "Linux version %u.%u.", &u1, &u2) == 2) {
+ if(hd_data->debug) {
+ ADD2LOG("kernel version is %u.%u\n", u1, u2);
+ }
+ u1 = (u1 << 16) + (u2 << 8);
+
+ if(u1 <= KERNEL_22) {
+ hd_data->kernel_version = KERNEL_22;
+ }
+ else if(u1 <= KERNEL_24) {
+ hd_data->kernel_version = KERNEL_24;
+ }
+ else if(u1 <= KERNEL_26) {
+ hd_data->kernel_version = KERNEL_26;
+ }
+ }
+
+ free_str_list(sl);
+}
+
+
+char *vend_id2str(unsigned vend)
+{
+ static char buf[32];
+ char *s;
+
+ *(s = buf) = 0;
+
+ if(ID_TAG(vend) == TAG_EISA) {
+ strcpy(s, eisa_vendor_str(vend));
+ }
+ else {
+ if(ID_TAG(vend) == TAG_USB) *s++ = 'u', *s = 0;
+ if(ID_TAG(vend) == TAG_SPECIAL) *s++ = 's', *s = 0;
+ if(ID_TAG(vend) == TAG_PCMCIA) *s++ = 'P', *s = 0;
+ sprintf(s, "%04x", ID_VALUE(vend));
+ }
+
+ return buf;
+}
+
+
+int is_modem(hd_data_t *hd_data, hd_t *hd)
+{
+ if(
+ hd->base_class.id == bc_modem ||
+ (
+ hd->base_class.id == bc_comm &&
+ hd->sub_class.id == sc_com_modem
+ )
+ ) return 1;
+
+ return 0;
+}
+
+
+int is_audio(hd_data_t *hd_data, hd_t *hd)
+{
+ /* ISA-PnP sound cards: just one entry per card */
+ if(
+ hd->bus.id == bus_isa &&
+ hd->is.isapnp &&
+ hd->func
+ ) return 0;
+
+ if(
+ hd->base_class.id == bc_multimedia &&
+ (
+ hd->sub_class.id == sc_multi_audio ||
+ hd->sub_class.id == 3
+ )
+ ) return 1;
+
+ return 0;
+}
+
+
+void assign_hw_class(hd_data_t *hd_data, hd_t *hd)
+{
+ int sc; /* compare sub_class too */
+ unsigned base_class, sub_class;
+ hd_hw_item_t item;
+ int (*test_func)(hd_data_t *, hd_t *);
+
+ if(!hd) return;
+
+ // ###### FIXME: maybe just return here?
+ if(!hd->hw_class) { /* skip if we've already done it */
+ for(item = 1; item < hw_all; item++) {
+
+ test_func = NULL;
+
+ sc = 0;
+ sub_class = 0;
+
+ base_class = -1;
+ switch(item) {
+ case hw_cdrom:
+ base_class = bc_storage_device;
+ sub_class = sc_sdev_cdrom;
+ sc = 1;
+ break;
+
+ case hw_floppy:
+ base_class = bc_storage_device;
+ sub_class = sc_sdev_floppy;
+ sc = 1;
+ break;
+
+ case hw_disk:
+ base_class = bc_storage_device;
+ sub_class = sc_sdev_disk;
+ sc = 1;
+ break;
+
+ case hw_network:
+ base_class = bc_network_interface;
+ break;
+
+ case hw_display:
+ base_class = bc_display;
+ break;
+
+ case hw_monitor:
+ base_class = bc_monitor;
+ break;
+
+ case hw_mouse:
+ base_class = bc_mouse;
+ break;
+
+ case hw_joystick:
+ base_class = bc_joystick;
+ break;
+
+ case hw_keyboard:
+ base_class = bc_keyboard;
+ break;
+
+ case hw_camera:
+ base_class = bc_camera;
+ break;
+
+ case hw_framebuffer:
+ base_class = bc_framebuffer;
+ break;
+
+ case hw_chipcard:
+ base_class = bc_chipcard;
+ break;
+
+ case hw_sound:
+ test_func = is_audio;
+ break;
+
+ case hw_isdn:
+ base_class = bc_isdn;
+ break;
+
+ case hw_dsl:
+ base_class = bc_dsl;
+ break;
+
+ case hw_modem:
+ test_func = is_modem;
+ break;
+
+ case hw_storage_ctrl:
+ base_class = bc_storage;
+ break;
+
+ case hw_network_ctrl:
+ base_class = bc_network;
+ break;
+
+ case hw_printer:
+ base_class = bc_printer;
+ break;
+
+ case hw_tv:
+ base_class = bc_tv;
+ break;
+
+ case hw_dvb:
+ base_class = bc_dvb;
+ break;
+
+ case hw_scanner:
+ base_class = bc_scanner;
+ break;
+
+ case hw_braille:
+ base_class = bc_braille;
+ break;
+
+ case hw_sys:
+ base_class = bc_internal;
+ sub_class = sc_int_sys;
+ sc = 1;
+ break;
+
+ case hw_cpu:
+ base_class = bc_internal;
+ sub_class = sc_int_cpu;
+ sc = 1;
+ break;
+
+ case hw_bios:
+ base_class = bc_internal;
+ sub_class = sc_int_bios;
+ sc = 1;
+ break;
+
+ case hw_usb_ctrl:
+ base_class = bc_serial;
+ sub_class = sc_ser_usb;
+ sc = 1;
+ break;
+
+ case hw_bridge:
+ base_class = bc_bridge;
+ break;
+
+ case hw_hub:
+ base_class = bc_hub;
+ break;
+
+ case hw_memory:
+ base_class = bc_internal;
+ sub_class = sc_int_main_mem;
+ sc = 1;
+ break;
+
+ case hw_ieee1394_ctrl:
+ base_class = bc_serial;
+ sub_class = sc_ser_fire;
+ sc = 1;
+ break;
+
+ case hw_pcmcia_ctrl:
+ test_func = is_pcmcia_ctrl;
+ break;
+
+ case hw_pppoe:
+ base_class = bc_network_interface;
+ break;
+
+ case hw_partition:
+ base_class = bc_partition;
+ break;
+
+ case hw_bluetooth:
+ base_class = bc_bluetooth;
+ break;
+
+ case hw_wlan:
+ case hw_block:
+ case hw_tape:
+ case hw_vbe:
+ break;
+
+ case hw_unknown:
+ case hw_all:
+ case hw_manual: /* special */
+
+ /* bus types */
+ case hw_usb:
+ case hw_pci:
+ case hw_isapnp:
+ case hw_scsi:
+ case hw_ide:
+
+ case hw_pcmcia: /* special */
+
+ case hw_ieee1394: /* not handled */
+ case hw_hotplug: /* not handled */
+ case hw_hotplug_ctrl: /* not handled */
+ case hw_zip: /* not handled */
+ case hw_redasd:
+ break;
+ }
+
+ if(test_func) {
+ if(test_func(hd_data, hd)) {
+ hd->hw_class = item;
+ break;
+ }
+ }
+ else if(
+ (
+ hd->base_class.id == base_class &&
+ (sc == 0 || hd->sub_class.id == sub_class)
+ )
+ ||
+ ( /* list other display adapters, too */
+ base_class == bc_display &&
+ hd->base_class.id == bc_multimedia &&
+ hd->sub_class.id == sc_multi_video
+ )
+ ||
+ ( /* make i2o storage controllers */
+ item == hw_storage_ctrl &&
+ hd->base_class.id == bc_i2o
+ )
+ ||
+ ( /* add fibre channel to storage ctrl list */
+ item == hw_storage_ctrl &&
+ hd->base_class.id == bc_serial &&
+ hd->sub_class.id == sc_ser_fiber
+ )
+ ) {
+ hd->hw_class = item;
+ break;
+ }
+ }
+
+ if(!hd->hw_class) hd->hw_class = hw_unknown;
+ }
+
+ hd_set_hw_class(hd, hd->hw_class);
+
+ if(hd->bus.id == bus_usb) {
+ hd_set_hw_class(hd, hw_usb);
+ }
+ else if(hd->bus.id == bus_pci) {
+ hd_set_hw_class(hd, hw_pci);
+ }
+ else if(hd->bus.id == bus_scsi) {
+ hd_set_hw_class(hd, hw_scsi);
+ }
+ else if(hd->bus.id == bus_ide) {
+ hd_set_hw_class(hd, hw_ide);
+ }
+ else if(hd->bus.id == bus_isa && hd->is.isapnp) {
+ hd_set_hw_class(hd, hw_isapnp);
+ }
+
+ if(hd->hw_class == hw_network && hd->is.pppoe) {
+ hd_set_hw_class(hd, hw_pppoe);
+ }
+
+ if(hd->usb_guid) {
+ hd_set_hw_class(hd, hw_usb); // ###### maybe only if(hd->bus.id == bus_scsi)?
+ }
+
+ if(hd->hotplug == hp_pcmcia || hd->hotplug == hp_cardbus) {
+ hd_set_hw_class(hd, hw_pcmcia);
+ }
+
+ if(hd->is.wlan) {
+ hd_set_hw_class(hd, hw_wlan);
+ }
+
+ if(hd_is_hw_class(hd, hw_bios)) {
+ hd_set_hw_class(hd, hw_vbe);
+ }
+
+ if(
+ hd->base_class.id == bc_storage_device ||
+ hd->base_class.id == bc_partition
+ ) {
+ hd_set_hw_class(hd, hw_block);
+ }
+
+ if(
+ hd->base_class.id == bc_storage_device &&
+ hd->sub_class.id == sc_sdev_tape
+ ) {
+ hd_set_hw_class(hd, hw_tape);
+ }
+
+ if(
+ hd->base_class.id == bc_storage_device &&
+ hd->sub_class.id == sc_sdev_disk
+ ) {
+ hd_set_hw_class(hd, hw_redasd);
+ }
+}
+
+
+void short_vendor(char *vendor)
+{
+ static char *remove[] = {
+ ".", ",", "-", "&", " inc", "corporation", " corp", " system",
+ " systems", "technology", "technologies", "multimedia", "communications",
+ "computer", " ltd", "(formerly ncr)", " group", " labs", "research",
+ "equipment", " ag", "personal", " canada", "data", "products",
+ " america", " co", " of", "solutions", " as", "publishing", "(old)",
+ " usa", " gmbh", "electronic", "components", "(matsushita)", " ab",
+ " pte", " north", " japan", "limited", "microcomputer", " kg",
+ "incorporated", "semiconductor", "sem", "graphics"
+ };
+ int i, j;
+ int len, len1, len2;
+
+ if(!vendor) return;
+
+ len2 = strlen(vendor);
+
+ if(!len2) return;
+
+ do {
+ len = len2;
+ for(i = 0; (unsigned) i < sizeof remove / sizeof *remove; i++) {
+ len1 = strlen(remove[i]);
+ if(len > len1 && !strcasecmp(vendor + len - len1, remove[i])) {
+ vendor[j = len - len1] = 0;
+ for(j--; j >= 0; vendor[j--] = 0) {
+ if(!isspace(vendor[j])) break;
+ }
+ }
+ }
+ len2 = strlen(vendor);
+ } while(len2 != len);
+
+}
+
+
+void create_model_name(hd_data_t *hd_data, hd_t *hd)
+{
+ char *vend, *dev;
+ char *compat, *dev_class, *hw_class;
+ char *part1, *part2;
+ cpu_info_t *ct;
+
+ /* early out */
+ if(!hd || hd->model) return;
+
+ part1 = part2 = NULL;
+
+ vend = dev = compat = dev_class = hw_class = NULL;
+
+ if(
+ hd->hw_class == hw_cpu &&
+ hd->detail &&
+ hd->detail->type == hd_detail_cpu &&
+ (ct = hd->detail->cpu.data) &&
+ ct->model_name
+ ) {
+ /* cpu entry */
+
+ part1 = new_str(ct->model_name);
+ if(ct->clock) str_printf(&part1, -1, ", %u MHz", ct->clock);
+ }
+ else {
+ /* normal entry */
+
+ vend = new_str(hd->sub_vendor.name);
+
+ dev = new_str(hd->sub_device.name);
+
+ if(!vend) vend = new_str(hd->vendor.name);
+
+ if(!dev) dev = new_str(hd->device.name);
+
+ if(dev) {
+ if(vend) {
+ part1 = vend; part2 = dev;
+ }
+ else {
+ part1 = dev;
+ }
+ }
+
+ if(!part1 && !part2) {
+ compat = new_str(hd->compat_device.name);
+
+ dev_class = new_str(hd->sub_class.name ?: hd->base_class.name);
+
+ hw_class = new_str(hd_hw_item_name(hd->hw_class));
+
+ if(vend) {
+ if(compat) {
+ part1 = vend; part2 = compat;
+ }
+ else if(dev_class) {
+ part1 = vend; part2 = dev_class;
+ }
+ }
+ else {
+ if(
+ compat &&
+ dev_class &&
+ hd->base_class.id != bc_internal /* avoid things like 'Notebook *System*' */
+ ) {
+ part1 = compat; part2 = dev_class;
+ }
+ else if(compat) {
+ part1 = compat;
+ }
+ else if(dev_class) {
+ part1 = dev_class;
+ if(hw_class && !strchr(part1, ' ') && strchr(hw_class, ' ')) {
+ part2 = hw_class;
+ }
+ }
+ }
+ }
+ }
+
+ if(part1 && part2) {
+ short_vendor(part1);
+ }
+
+ if(part1 && !strcasecmp(part1, "unknown")) {
+ part1 = part2;
+ part2 = NULL;
+ }
+
+ if(part1 && part2) {
+ /* maybe the vendor name is already part of the device name... */
+ if(strstr(part2, part1) || !strcasecmp(part1, part2)) {
+ part1 = part2;
+ part2 = NULL;
+ }
+ }
+
+ if(!part1 && !part2 && hw_class) {
+ str_printf(&part1, 0, "unknown %s", hw_class);
+ if(strchr(hw_class, ' ')) {
+ str_printf(&part1, -1, " hardware");
+ }
+ }
+
+ str_printf(&hd->model, 0, "%s%s%s", part1, part2 ? " " : "", part2 ? part2 : "");
+
+ free_mem(vend);
+ free_mem(dev);
+ free_mem(compat);
+ free_mem(dev_class);
+ free_mem(hw_class);
+}
+
+
+#ifndef LIBHD_TINY
+int hd_change_status(const char *id, hd_status_t status, const char *config_string)
+{
+ hd_data_t *hd_data;
+ hd_manual_t *entry;
+ int i;
+
+ hd_data = new_mem(sizeof *hd_data);
+
+ entry = hd_manual_read_entry(hd_data, (char *) id);
+
+ if(!entry || status.invalid) return 1;
+
+ if(status.configured) entry->status.configured = status.configured;
+ if(status.available) entry->status.available = status.available;
+ if(status.needed) entry->status.needed = status.needed;
+ entry->status.invalid = status.invalid;
+
+ if(config_string) {
+ free_mem(entry->config_string);
+ entry->config_string = new_str(config_string);
+ }
+
+ i = hd_manual_write_entry(hd_data, entry);
+
+ hd_free_manual(entry);
+
+ hd_free_hd_data(hd_data);
+
+ free_mem(hd_data);
+
+ return i;
+}
+
+#endif /* !defined(LIBHD_TINY) */
+
+
+int hd_getdisksize(hd_data_t *hd_data, char *dev, int fd, hd_res_t **geo, hd_res_t **size)
+{
+ int status=0;
+ hd_res_t *res;
+ struct hd_geometry geo_s;
+#ifdef HDIO_GETGEO_BIG
+ struct hd_big_geometry big_geo_s;
+#endif
+ unsigned long secs32;
+ uint64_t secs, secs0;
+ unsigned sec_size;
+ int close_fd = 0;
+ int got_big = 0;
+
+ *geo = *size = NULL;
+
+ ADD2LOG(" dev = %s, fd = %d\n", dev, fd);
+
+ if(fd < 0) {
+ if(!dev) return 0;
+ fd = open(dev, O_RDONLY | O_NONBLOCK);
+ close_fd = 1;
+ if(fd < 0) return 0;
+ }
+
+ ADD2LOG(" open ok, fd = %d\n", fd);
+
+ secs0 = 0;
+ res = NULL;
+
+#ifdef HDIO_GETGEO_BIG
+ if(!ioctl(fd, HDIO_GETGEO_BIG, &big_geo_s)) {
+ if(dev) ADD2LOG("%s: ioctl(big geo) ok\n", dev);
+ res = add_res_entry(geo, new_mem(sizeof *res));
+ res->disk_geo.type = res_disk_geo;
+ res->disk_geo.cyls = big_geo_s.cylinders;
+ res->disk_geo.heads = big_geo_s.heads;
+ res->disk_geo.sectors = big_geo_s.sectors;
+ res->disk_geo.geotype = geo_logical;
+ secs0 = (uint64_t) res->disk_geo.cyls * res->disk_geo.heads * res->disk_geo.sectors;
+ got_big = 1;
+ }
+ else {
+ ADD2LOG(" big geo failed: %s\n", strerror(errno));
+#else
+ {
+#endif
+ if(!ioctl(fd, HDIO_GETGEO, &geo_s)) {
+ if(dev) ADD2LOG("%s: ioctl(geo) ok\n", dev);
+ res = add_res_entry(geo, new_mem(sizeof *res));
+ res->disk_geo.type = res_disk_geo;
+ res->disk_geo.cyls = geo_s.cylinders;
+ res->disk_geo.heads = geo_s.heads;
+ res->disk_geo.sectors = geo_s.sectors;
+ res->disk_geo.geotype = geo_logical;
+ secs0 = (uint64_t) res->disk_geo.cyls * res->disk_geo.heads * res->disk_geo.sectors;
+ }
+ else {
+ ADD2LOG(" geo failed: %s\n", strerror(errno));
+ }
+ }
+
+ /* ##### maybe always BLKSZGET or always 0x200? */
+ if(!ioctl(fd, BLKSSZGET, &sec_size)) {
+ if(dev) ADD2LOG("%s: ioctl(block size) ok\n", dev);
+ if(!sec_size) sec_size = 0x200;
+ }
+ else {
+ sec_size = 0x200;
+ }
+
+ secs = 0;
+
+#if defined(__s390__) || defined(__s390x__)
+ if(res && res->disk_geo.sectors == 0)
+ { /* This seems to be an unformatted DASD -> fake the formatted geometry */
+ res->disk_geo.sectors=12;
+ sec_size=4096;
+ secs = (uint64_t) res->disk_geo.cyls * res->disk_geo.heads * res->disk_geo.sectors;
+ status=1;
+ }
+ else
+ {
+#endif
+ if(!ioctl(fd, BLKGETSIZE64, &secs)) {
+ if(dev) ADD2LOG("%s: ioctl(disk size) ok\n", dev);
+ secs /= sec_size;
+ }
+ else if(!ioctl(fd, BLKGETSIZE, &secs32)) {
+ if(dev) ADD2LOG("%s: ioctl(disk size32) ok\n", dev);
+ secs = secs32;
+ }
+ else {
+ secs = secs0;
+ }
+#if defined(__s390__) || defined(__s390x__)
+ }
+#endif
+
+ if(!got_big && secs0 && res) {
+ /* fix cylinder value */
+ res->disk_geo.cyls = secs / (res->disk_geo.heads * res->disk_geo.sectors);
+ }
+
+ if(secs) {
+ res = add_res_entry(size, new_mem(sizeof *res));
+ res->size.type = res_size;
+ res->size.unit = size_unit_sectors;
+ res->size.val1 = secs;
+ res->size.val2 = sec_size;
+ }
+
+ // ADD2LOG(" geo = %p, size = %p\n", *geo, *size);
+
+ if(close_fd) close(fd);
+
+ return status;
+}
+
+
+str_list_t *hd_split(char del, char *str)
+{
+ char *t, *s;
+ str_list_t *sl = NULL;
+
+ if(!str) return NULL;
+
+ for(s = str = new_str(str); (t = strchr(s, del)); s = t + 1) {
+ *t = 0;
+ add_str_list(&sl, s);
+ }
+ add_str_list(&sl, s);
+
+ free_mem(str);
+
+ return sl;
+}
+
+
+char *hd_join(char *del, str_list_t *str)
+{
+ char *s;
+ str_list_t *str0;
+ int len = 0, del_len = 0;
+
+ if(del) del_len = strlen(del);
+
+ for(str0 = str; str0; str0 = str0->next) {
+ if(str0->str) len += strlen(str0->str);
+ if(str0->next) len += del_len;
+ }
+
+ if(!len) return NULL;
+
+ len++;
+
+ s = new_mem(len);
+
+ for(; str; str = str->next) {
+ if(str->str) strcat(s, str->str);
+ if(str->next && del) strcat(s, del);
+ }
+
+ return s;
+}
+
+
+/*
+ * cf. pcmcia-cs-*:cardmgr/pcic_probe.c
+ */
+int is_pcmcia_ctrl(hd_data_t *hd_data, hd_t *hd)
+{
+ int i;
+ static unsigned ids[][2] = {
+ { 0x1013, 0x1100 },
+ { 0x1013, 0x1110 },
+ { 0x10b3, 0xb106 },
+ { 0x1180, 0x0465 },
+ { 0x1180, 0x0466 },
+ { 0x1180, 0x0475 },
+ { 0x1180, 0x0476 },
+ { 0x1180, 0x0478 },
+ { 0x104c, 0xac12 },
+ { 0x104c, 0xac13 },
+ { 0x104c, 0xac15 },
+ { 0x104c, 0xac1a },
+ { 0x104c, 0xac1e },
+ { 0x104c, 0xac17 },
+ { 0x104c, 0xac19 },
+ { 0x104c, 0xac1c },
+ { 0x104c, 0xac16 },
+ { 0x104c, 0xac1d },
+ { 0x104c, 0xac1f },
+ { 0x104c, 0xac50 },
+ { 0x104c, 0xac51 },
+ { 0x104c, 0xac1b },
+ { 0x104c, 0xac52 },
+ { 0x104c, 0xac41 },
+ { 0x104c, 0xac40 },
+ { 0x104c, 0xac42 },
+ { 0x1217, 0x6729 },
+ { 0x1217, 0x673a },
+ { 0x1217, 0x6832 },
+ { 0x1217, 0x6836 },
+ { 0x1217, 0x6872 },
+ { 0x1217, 0x6925 },
+ { 0x1217, 0x6933 },
+ { 0x1217, 0x6972 },
+ { 0x1179, 0x0603 },
+ { 0x1179, 0x060a },
+ { 0x1179, 0x060f },
+ { 0x1179, 0x0617 },
+ { 0x119b, 0x1221 },
+ { 0x8086, 0x1221 }
+ };
+
+ if(!hd) return 0;
+
+ if(
+ hd->base_class.id == bc_bridge &&
+ (hd->sub_class.id == sc_bridge_pcmcia || hd->sub_class.id == sc_bridge_cardbus)
+ ) return 1;
+
+ /* just in case... */
+ if(hd->bus.id == bus_pci) {
+ for(i = 0; (unsigned) i < sizeof ids / sizeof *ids; i++) {
+ if(
+ ID_VALUE(hd->vendor.id) == ids[i][0] &&
+ ID_VALUE(hd->device.id) == ids[i][1]
+ ) return 1;
+ }
+ }
+
+ return 0;
+}
+
+void hd_set_hw_class(hd_t *hd, hd_hw_item_t hw_class)
+{
+ unsigned ofs, bit;
+
+ ofs = (unsigned) hw_class >> 3;
+ bit = (unsigned) hw_class & 7;
+
+ if(ofs < sizeof hd->hw_class_list / sizeof *hd->hw_class_list) {
+ hd->hw_class_list[ofs] |= 1 << bit;
+ }
+}
+
+
+int hd_is_hw_class(hd_t *hd, hd_hw_item_t hw_class)
+{
+ unsigned ofs, bit;
+
+ if(hw_class == hw_all) return 1;
+
+ ofs = (unsigned) hw_class >> 3;
+ bit = (unsigned) hw_class & 7;
+
+ if(ofs < sizeof hd->hw_class_list / sizeof *hd->hw_class_list) {
+ return hd->hw_class_list[ofs] & (1 << bit) ? 1 : 0;
+ }
+
+ return 0;
+}
+
+
+/*
+ * Start subprocess for dangerous things.
+ *
+ * Stop it after total_timeout seconds or if nothing happens for
+ * timeout seconds.
+ */
+void hd_fork(hd_data_t *hd_data, int timeout, int total_timeout)
+{
+ void (*old_sigchld_handler)(int);
+ struct timespec wait_time;
+ int i, j, sleep_intr = 1;
+ hd_data_t *hd_data_shm;
+ time_t stop_time;
+ int updated, rem_time;
+ sigset_t new_set, old_set;
+
+ if(hd_data->flags.forked) return;
+
+ if(hd_data->flags.nofork) {
+ hd_data->flags.forked = 1;
+ return;
+ }
+
+ hd_data_shm = hd_data->shm.data;
+
+ stop_time = time(NULL) + total_timeout;
+ rem_time = total_timeout;
+
+ child_id = child = 0;
+
+ sigemptyset(&new_set);
+ sigaddset(&new_set, SIGCHLD);
+ sigprocmask(SIG_BLOCK, &new_set, &old_set);
+
+ old_sigchld_handler = signal(SIGCHLD, sigchld_handler);
+
+ wait_time.tv_sec = timeout;
+ wait_time.tv_nsec = 0;
+
+ updated = hd_data_shm->shm.updated;
+
+ child = fork();
+
+ sigprocmask(SIG_SETMASK, &old_set, NULL);
+
+ if(child != -1) {
+ if(child) {
+ ADD2LOG(
+ "****** started child process %d (%ds/%ds) ******\n",
+ (int) child, timeout, total_timeout
+ );
+
+ while(child_id != child && sleep_intr) {
+ sleep_intr = nanosleep(&wait_time, &wait_time);
+// fprintf(stderr, "woke up %d\n", sleep_intr);
+ rem_time = stop_time - time(NULL);
+ if(updated != hd_data_shm->shm.updated && rem_time >= 0) {
+ /* reset time if there was some progress and we've got some time left */
+ rem_time++;
+ wait_time.tv_sec = rem_time > timeout ? timeout : rem_time;
+ wait_time.tv_nsec = 0;
+
+ sleep_intr = 1;
+ }
+ updated = hd_data_shm->shm.updated;
+ }
+
+ if(child_id != child) {
+ ADD2LOG("****** killed child process %d (%ds) ******\n", (int) child, rem_time);
+ kill(child, SIGKILL);
+ for(i = 10; i && !waitpid(child, NULL, WNOHANG); i--) {
+ wait_time.tv_sec = 0;
+ wait_time.tv_nsec = 10*1000000;
+ nanosleep(&wait_time, NULL);
+ }
+ }
+
+ i = hd_data->log ? strlen(hd_data->log) : 0;
+
+ if(hd_data_shm->log) {
+ j = strlen(hd_data_shm->log);
+ hd_data->log = resize_mem(hd_data->log, i + j + 1);
+ memcpy(hd_data->log + i, hd_data_shm->log, j + 1);
+ }
+
+ ADD2LOG("****** stopped child process %d (%ds) ******\n", (int) child, rem_time);
+ }
+ else {
+#ifdef LIBHD_MEMCHECK
+ /* stop logging in child process */
+ if(libhd_log) fclose(libhd_log);
+ libhd_log = NULL;
+#endif
+ hd_data->log = free_mem(hd_data->log);
+
+ hd_data->flags.forked = 1;
+ }
+ }
+
+ signal(SIGCHLD, old_sigchld_handler);
+}
+
+
+/*
+ * Stop subprocess.
+ */
+void hd_fork_done(hd_data_t *hd_data)
+{
+ int len;
+ void *p;
+ hd_data_t *hd_data_shm;
+
+ if(!hd_data->flags.forked || hd_data->flags.nofork) return;
+
+ hd_data_shm = hd_data->shm.data;
+
+ if(hd_data->log) {
+ len = strlen(hd_data->log) + 1;
+ p = hd_shm_add(hd_data, hd_data->log, len);
+ hd_data_shm->log = p;
+ }
+
+ _exit(0);
+}
+
+
+/*
+ * SIGCHLD handler while we're waiting for our child.
+ */
+void sigchld_handler(int num)
+{
+ pid_t p = waitpid(child, NULL, WNOHANG);
+
+ if(p && p == child) child_id = p;
+}
+
+
+/*
+ * Get a sufficiently large shm segment.
+ */
+void hd_shm_init(hd_data_t *hd_data)
+{
+ void *p;
+
+ if(hd_data->shm.ok || hd_data->flags.nofork) return;
+
+ memset(&hd_data->shm, 0, sizeof hd_data->shm);
+
+ hd_data->shm.size = 256*1024;
+
+ hd_data->shm.id = shmget(IPC_PRIVATE, hd_data->shm.size, IPC_CREAT | 0600);
+
+ if(hd_data->shm.id == -1) {
+ ADD2LOG("shm: shmget failed (errno %d)\n", errno);
+ return;
+ }
+
+ p = shmat(hd_data->shm.id, NULL, 0);
+
+ if(p == (void *) -1) {
+ ADD2LOG("shm: shmat for segment %d failed (errno %d)\n", hd_data->shm.id, errno);
+ }
+
+ shmctl(hd_data->shm.id, IPC_RMID, NULL);
+
+ if(p == (void *) -1) return;
+
+ hd_data->shm.data = p;
+
+ ADD2LOG("shm: attached segment %d at %p\n", hd_data->shm.id, hd_data->shm.data);
+
+ hd_data->shm.ok = 1;
+
+ hd_shm_clean(hd_data);
+}
+
+
+/*
+ * Reset shm usage, remove references to shm area.
+ */
+void hd_shm_clean(hd_data_t *hd_data)
+{
+ hd_data_t *hd_data_shm;
+
+ if(!hd_data->shm.ok) return;
+
+ if(hd_is_shm_ptr(hd_data, hd_data->ser_mouse)) hd_data->ser_mouse = NULL;
+ if(hd_is_shm_ptr(hd_data, hd_data->ser_modem)) hd_data->ser_modem = NULL;
+
+
+ hd_data->shm.used = sizeof *hd_data;
+ hd_data->shm.updated = 0;
+
+ memcpy(hd_data_shm = hd_data->shm.data, hd_data, sizeof *hd_data);
+
+ hd_data_shm->log = NULL;
+}
+
+
+/*
+ * Release shm segment.
+ */
+void hd_shm_done(hd_data_t *hd_data)
+{
+ if(!hd_data->shm.ok) return;
+
+ shmdt(hd_data->shm.data);
+
+ hd_data->shm.ok = 0;
+}
+
+
+/*
+ * Copy into shm area. If ptr is NULL return a shm area of size len.
+ */
+void *hd_shm_add(hd_data_t *hd_data, void *ptr, unsigned len)
+{
+ if(!hd_data->shm.ok || !len) return NULL;
+
+ hd_data = hd_data->shm.data;
+
+ if(hd_data->shm.size - hd_data->shm.used < len) return NULL;
+
+ if(ptr) {
+ ptr = memcpy(hd_data->shm.data + hd_data->shm.used, ptr, len);
+ }
+ else {
+ ptr = memset(hd_data->shm.data + hd_data->shm.used, 0, len);
+ }
+
+ hd_data->shm.used += len;
+
+ return ptr;
+}
+
+
+/*
+ * Check if ptr points to a valid shm address.
+ */
+int hd_is_shm_ptr(hd_data_t *hd_data, void *ptr)
+{
+ if(!hd_data->shm.ok || !ptr) return 0;
+
+ hd_data = hd_data->shm.data;
+
+ if(
+ ptr < hd_data->shm.data ||
+ ptr >= hd_data->shm.data + hd_data->shm.used
+ ) return 0;
+
+ return 1;
+}
+
+
+char *hd_shm_add_str(hd_data_t *hd_data, char *str)
+{
+ return hd_shm_add(hd_data, str, str ? strlen(str) + 1 : 0);
+}
+
+
+str_list_t *hd_shm_add_str_list(hd_data_t *hd_data, str_list_t *sl)
+{
+ str_list_t *sl0 = NULL, **sl_shm;
+
+ for(sl_shm = &sl0; sl; sl = sl->next, sl_shm = &(*sl_shm)->next) {
+ *sl_shm = hd_shm_add(hd_data, NULL, sizeof **sl_shm);
+ (*sl_shm)->str = hd_shm_add_str(hd_data, sl->str);
+ }
+
+ return sl0;
+}
+
+
+void hd_move_to_shm(hd_data_t *hd_data)
+{
+ hd_data_t *hd_data_shm;
+ ser_device_t *ser, **ser_shm;
+ struct {
+ ser_device_t **src, **dst;
+ } ser_dev[2];
+ unsigned u;
+
+ if(!hd_data->shm.ok) return;
+
+ hd_data_shm = hd_data->shm.data;
+
+ ser_dev[0].src = &hd_data->ser_mouse;
+ ser_dev[0].dst = &hd_data_shm->ser_mouse;
+ ser_dev[1].src = &hd_data->ser_modem;
+ ser_dev[1].dst = &hd_data_shm->ser_modem;
+
+ for(u = 0; u < sizeof ser_dev / sizeof *ser_dev; u++) {
+ if(*ser_dev[u].src) {
+ /* copy serial mouse data */
+ for(
+ ser = *ser_dev[u].src, ser_shm = ser_dev[u].dst;
+ ser;
+ ser = ser->next, ser_shm = &(*ser_shm)->next
+ ) {
+ *ser_shm = hd_shm_add(hd_data, ser, sizeof *ser);
+ }
+
+ for(ser = *ser_dev[u].dst; ser; ser = ser->next) {
+ ser->dev_name = hd_shm_add_str(hd_data, ser->dev_name);
+ ser->serial = hd_shm_add_str(hd_data, ser->serial);
+ ser->class_name = hd_shm_add_str(hd_data, ser->class_name);
+ ser->dev_id = hd_shm_add_str(hd_data, ser->dev_id);
+ ser->user_name = hd_shm_add_str(hd_data, ser->user_name);
+ ser->vend = hd_shm_add_str(hd_data, ser->vend);
+ ser->init_string1 = hd_shm_add_str(hd_data, ser->init_string1);
+ ser->init_string2 = hd_shm_add_str(hd_data, ser->init_string2);
+ ser->pppd_option = hd_shm_add_str(hd_data, ser->pppd_option);
+
+ ser->at_resp = hd_shm_add_str_list(hd_data, ser->at_resp);
+ }
+ }
+ }
+
+}
+
+
+hd_udevinfo_t *hd_free_udevinfo(hd_udevinfo_t *ui)
+{
+ hd_udevinfo_t *next;
+
+ for(; ui; ui = next) {
+ next = ui->next;
+
+ free_mem(ui->sysfs);
+ free_mem(ui->name);
+ free_str_list(ui->links);
+
+ free_mem(ui);
+ }
+
+ return NULL;
+}
+
+
+void read_udevinfo(hd_data_t *hd_data)
+{
+ str_list_t *sl, *udevinfo, *sl0, *sl1, *dir_list;
+ hd_udevinfo_t **uip, *ui;
+ char *s, buf[256];
+ int l;
+
+ udevinfo = NULL;
+
+ if((dir_list = read_dir("/dev/.udevdb", 'r'))) {
+ s = NULL;
+
+ for(sl = dir_list; sl; sl = sl->next) {
+ str_printf(&s, 0, "/dev/.udevdb/%s", sl->str);
+ sl0 = read_file(s, 0, 0);
+ if(sl0) {
+ sl1 = udevinfo;
+ udevinfo = sl0;
+ while(sl0->next) sl0 = sl0->next;
+ sl0->next = sl1;
+ }
+ }
+
+ s = free_mem(s);
+ free_str_list(dir_list);
+ }
+ else {
+ udevinfo = read_file("| " PROG_UDEVINFO " -d 2>/dev/null", 0, 0);
+ }
+
+ ADD2LOG("----- udevinfo -----\n");
+ for(sl = udevinfo; sl; sl = sl->next) {
+ ADD2LOG(" %s", sl->str);
+ }
+ ADD2LOG("----- udevinfo end -----\n");
+
+ hd_data->udevinfo = hd_free_udevinfo(hd_data->udevinfo);
+
+ uip = &hd_data->udevinfo;
+
+ for(ui = NULL, sl = udevinfo; sl; sl = sl->next) {
+ if(sscanf(sl->str, "P: %255s", buf) == 1) {
+ ui = *uip = new_mem(sizeof **uip);
+ uip = &(*uip)->next;
+ ui->sysfs = new_str(buf);
+
+ continue;
+ }
+
+ if(sscanf(sl->str, "T: %255s", buf) == 1) {
+ ui->type = *buf;
+
+ continue;
+ }
+
+ if(sscanf(sl->str, "N: %255s", buf) == 1) {
+ free_mem(ui->name);
+ ui->name = new_str(buf);
+
+ continue;
+ }
+
+ if(!strncmp(sl->str, "S:", 2)) {
+ s = sl->str + 2;
+ while(*s == ' ') s++;
+ l = strlen(s);
+ while(l > 0 && isspace(s[l-1])) s[--l] = 0;
+ if(*s) {
+ sl0 = hd_split(' ', s);
+ for(sl1 = sl0; sl1; sl1 = sl1->next) {
+ add_str_list(&ui->links, sl1->str);
+ }
+ free_str_list(sl0);
+ }
+
+ continue;
+ }
+ }
+
+ for(ui = hd_data->udevinfo; ui; ui = ui->next) {
+ ADD2LOG("%s\n", ui->sysfs);
+ if(ui->name) ADD2LOG(" name: %s\n", ui->name);
+ if(ui->links) {
+ s = hd_join(", ", ui->links);
+ ADD2LOG(" links: %s\n", s);
+ free_mem(s);
+ }
+ }
+
+ free_str_list(udevinfo);
+}
+
+
+/*
+ * Return libhd version.
+ */
+char *hd_version()
+{
+ return HD_VERSION_STRING;
+}
+
+
+hd_t *hd_find_sysfs_id(hd_data_t *hd_data, char *id)
+{
+ hd_t *hd;
+
+ if(id && *id) {
+ for(hd = hd_data->hd; hd; hd = hd->next) {
+ if(hd->sysfs_id && !strcmp(hd->sysfs_id, id)) return hd;
+ }
+ }
+
+ return NULL;
+}
+
+
+hd_sysfsdrv_t *hd_free_sysfsdrv(hd_sysfsdrv_t *sf)
+{
+ hd_sysfsdrv_t *next;
+
+ for(; sf; sf = next) {
+ next = sf->next;
+
+ free_mem(sf->driver);
+ free_mem(sf->device);
+
+ free_mem(sf);
+ }
+
+ return NULL;
+}
+
+
+void hd_sysfs_driver_list(hd_data_t *hd_data)
+{
+ char *bus;
+ hd_sysfsdrv_t **sfp, *sf;
+ str_list_t *sl, *sl0;
+ uint64_t id = 0;
+
+ struct sysfs_bus *sf_bus;
+ struct sysfs_driver *sf_drv;
+ struct sysfs_device *sf_dev;
+
+ struct dlist *sf_subsys;
+ struct dlist *sf_drv_list;
+ struct dlist *sf_dev_list;
+
+
+ for(sl = sl0 = read_file(PROC_MODULES, 0, 0); sl; sl = sl->next) {
+ crc64(&id, sl->str, strlen(sl->str) + 1);
+ }
+ free_str_list(sl0);
+
+ if(id != hd_data->sysfsdrv_id) {
+ hd_data->sysfsdrv = hd_free_sysfsdrv(hd_data->sysfsdrv);
+ }
+
+ if(hd_data->sysfsdrv) return;
+
+ hd_data->sysfsdrv_id = id;
+
+ sfp = &hd_data->sysfsdrv;
+
+ ADD2LOG("----- sysfs driver list (id 0x%016"PRIx64") -----\n", id);
+
+ sf_subsys = sysfs_open_subsystem_list("bus");
+
+ if(sf_subsys) dlist_for_each_data(sf_subsys, bus, char) {
+ sf_bus = sysfs_open_bus(bus);
+
+ if(sf_bus) {
+ sf_drv_list = sysfs_get_bus_drivers(sf_bus);
+ if(sf_drv_list) dlist_for_each_data(sf_drv_list, sf_drv, struct sysfs_driver) {
+ sf_dev_list = sysfs_get_driver_devices(sf_drv);
+ if(sf_dev_list) dlist_for_each_data(sf_dev_list, sf_dev, struct sysfs_device) {
+ sf = *sfp = new_mem(sizeof **sfp);
+ sfp = &(*sfp)->next;
+ sf->driver = new_str(sf_drv->name);
+ sf->device = new_str(hd_sysfs_id(sf_dev->path));
+ ADD2LOG("%16s: %s\n", sf->driver, sf->device);
+ }
+ }
+
+ sysfs_close_bus(sf_bus);
+ }
+ }
+
+ sysfs_close_list(sf_subsys);
+
+ ADD2LOG("----- sysfs driver list end -----\n");
+}
+
+
+int hd_report_this(hd_data_t *hd_data, hd_t *hd)
+{
+ if(!hd_data->only) return 1;
+
+ if(search_str_list(hd_data->only, hd->sysfs_id)) return 1;
+
+ return search_str_list(hd_data->only, hd->unix_dev_name) ? 1 : 0;
+}
+
+
+str_list_t *hd_module_list(hd_data_t *hd_data, unsigned id)
+{
+ hd_t *hd;
+ str_list_t *drivers = NULL, *sl;
+ driver_info_t *di;
+
+ hd = new_mem(sizeof *hd);
+ hd->tag.freeit = 1;
+
+ hd->vendor.id = MAKE_ID(TAG_SPECIAL, 0xf000);
+ hd->device.id = MAKE_ID(TAG_SPECIAL, id);
+
+ hddb_add_info(hd_data, hd);
+
+ for(di = hd->driver_info; di; di = di->next) {
+ if(di->any.type == di_module && di->module.modprobe) {
+ for(sl = di->module.names; sl; sl = sl->next) {
+ add_str_list(&drivers, sl->str);
+ }
+ }
+ }
+
+ hd_free_hd_list(hd);
+
+ return drivers;
+}
+
+
+/*
+ * Read using mmap().
+ */
+int hd_read_mmap(hd_data_t *hd_data, char *name, unsigned char *buf, off_t start, unsigned size)
+{
+ off_t map_start, xofs;
+ int psize = getpagesize(), fd;
+ unsigned map_size;
+ void *p;
+ struct stat sbuf;
+
+ if(!size || !name) return 0;
+
+ memset(buf, 0, size);
+
+ map_start = start & -psize;
+ xofs = start - map_start;
+
+ map_size = (xofs + size + psize - 1) & -psize;
+
+ fd = open(name, O_RDONLY);
+
+ if(fd == -1) return 0;
+
+ if(!fstat(fd, &sbuf) && S_ISREG(sbuf.st_mode)) {
+ if(sbuf.st_size < start + size) {
+ if(sbuf.st_size > start) {
+ size = sbuf.st_size - start;
+ }
+ else {
+ size = 0;
+ }
+ }
+ }
+
+ if(!size) {
+ close(fd);
+ return 0;
+ }
+
+ p = mmap(NULL, map_size, PROT_READ, MAP_PRIVATE, fd, map_start);
+
+ if(p == MAP_FAILED) {
+ if(hd_data) ADD2LOG(
+ "%s[0x%x, %u]: mmap(, %u,,,, 0x%x) failed: %s\n",
+ name, (unsigned) start, size, map_size, (unsigned) map_start, strerror(errno)
+ );
+ close(fd);
+ return 0;
+ }
+ if(hd_data) ADD2LOG(
+ "%s[0x%x, %u]: mmap(, %u,,,, 0x%x) ok\n",
+ name, (unsigned) start, size, map_size, (unsigned) map_start
+ );
+
+ memcpy(buf, p + xofs, size);
+
+ munmap(p, map_size);
+
+ close(fd);
+
+ return 1;
+}
+
+
--- /dev/null
+#ifndef _HD_H
+#define _HD_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ *
+ * libhd data structures
+ *
+ * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ */
+
+#define HD_VERSION 10
+
+/*
+ * debug flags
+ */
+#define HD_DEB_SHOW_LOG (1 << 0)
+#define HD_DEB_PROGRESS (1 << 1)
+#define HD_DEB_CREATION (1 << 2)
+#define HD_DEB_DRIVER_INFO (1 << 3)
+#define HD_DEB_PCI (1 << 4)
+#define HD_DEB_ISAPNP (1 << 5)
+#define HD_DEB_CDROM (1 << 6)
+#define HD_DEB_NET (1 << 7)
+#define HD_DEB_FLOPPY (1 << 8)
+#define HD_DEB_MISC (1 << 9)
+#define HD_DEB_SERIAL (1 << 10)
+#define HD_DEB_MONITOR (1 << 11)
+#define HD_DEB_CPU (1 << 12)
+#define HD_DEB_BIOS (1 << 13)
+#define HD_DEB_MOUSE (1 << 14)
+#define HD_DEB_IDE (1 << 15)
+#define HD_DEB_SCSI (1 << 16)
+#define HD_DEB_USB (1 << 17)
+#define HD_DEB_ADB (1 << 18)
+#define HD_DEB_MODEM (1 << 19)
+#define HD_DEB_PARALLEL (1 << 20)
+#define HD_DEB_ISA (1 << 21)
+#define HD_DEB_BOOT (1 << 22)
+#define HD_DEB_HDDB (1 << 23)
+
+#include <stdio.h>
+#include <inttypes.h>
+#include <termios.h>
+#include <sys/types.h>
+
+/*
+ * libhd's directory
+ */
+#define HARDWARE_DIR "/var/lib/hardware"
+#define HARDWARE_UNIQUE_KEYS HARDWARE_DIR "/unique-keys"
+
+/**
+ * \defgroup idmacros Id macros
+ * Macros to handle device and vendor ids.
+ *
+ * Example: to check if an id is a pci id and get its value,
+ * do something like this:
+ * \code
+ * if(ID_TAG(hd->dev) == TAG_PCI) {
+ * pci_id = ID_VALUE(hd->dev)
+ * }
+ * \endcode
+ *@{
+ */
+
+#define TAG_PCI 1 /**< PCI ids. */
+#define TAG_EISA 2 /**< EISA ids (monitors, ISA-PnP, modems, mice etc). */
+#define TAG_USB 3 /**< USB ids. */
+#define TAG_SPECIAL 4 /**< Internally used ids. */
+#define TAG_PCMCIA 5 /**< PCMCIA ids. */
+
+/**
+ * Get the real id value.
+ */
+#define ID_VALUE(id) ((id) & 0xffff)
+
+/**
+ * Get the tag value.
+ */
+#define ID_TAG(id) (((id) >> 16) & 0xf)
+
+/**
+ * Combine tag and id value.
+ */
+#define MAKE_ID(tag, id_val) ((tag << 16) | (id_val))
+
+/*@}*/
+
+/*
+ * flags to control the probing.
+ */
+typedef enum probe_feature {
+ pr_memory = 1, pr_pci, pr_isapnp, pr_net, pr_floppy, pr_misc,
+ pr_misc_serial, pr_misc_par, pr_misc_floppy, pr_serial, pr_cpu, pr_bios,
+ pr_monitor, pr_mouse, pr_scsi, pr_usb, pr_usb_mods, pr_adb, pr_modem,
+ pr_modem_usb, pr_parallel, pr_parallel_lp, pr_parallel_zip, pr_isa,
+ pr_isa_isdn, pr_isdn, pr_kbd, pr_prom, pr_sbus, pr_int, pr_braille,
+ pr_braille_alva, pr_braille_fhp, pr_braille_ht, pr_ignx11, pr_sys,
+ pr_bios_vbe, pr_isapnp_old, pr_isapnp_new, pr_isapnp_mod, pr_braille_baum,
+ pr_manual, pr_fb, pr_veth, pr_pppoe, pr_scan, pr_pcmcia, pr_fork,
+ pr_parallel_imm, pr_s390, pr_cpuemu, pr_sysfs, pr_s390disks, pr_udev,
+ pr_block, pr_block_cdrom, pr_block_part, pr_edd, pr_edd_mod, pr_bios_ddc,
+ pr_bios_fb, pr_bios_mode, pr_input, pr_block_mods, pr_bios_vesa,
+ pr_cpuemu_debug, pr_scsi_noserial, pr_wlan,
+ pr_max, pr_lxrc, pr_dsl, pr_default, pr_all /* pr_all must be last */
+} hd_probe_feature_t;
+
+/*
+ * list types for hd_list()
+ *
+ * if you want to modify this: cf. manual.c::hw_items[]
+ *
+ * Note: hw_tv _must_ be < hw_display!
+ */
+typedef enum hw_item {
+ hw_sys = 1, hw_cpu, hw_keyboard, hw_braille, hw_mouse, hw_joystick,
+ hw_printer, hw_scanner, hw_chipcard, hw_monitor, hw_tv, hw_display,
+ hw_framebuffer, hw_camera, hw_sound, hw_storage_ctrl, hw_network_ctrl,
+ hw_isdn, hw_modem, hw_network, hw_disk, hw_partition, hw_cdrom, hw_floppy,
+ hw_manual, hw_usb_ctrl, hw_usb, hw_bios, hw_pci, hw_isapnp, hw_bridge,
+ hw_hub, hw_scsi, hw_ide, hw_memory, hw_dvb, hw_pcmcia, hw_pcmcia_ctrl,
+ hw_ieee1394, hw_ieee1394_ctrl, hw_hotplug, hw_hotplug_ctrl, hw_zip, hw_pppoe,
+ hw_wlan, hw_redasd, hw_dsl, hw_block, hw_tape, hw_vbe, hw_bluetooth,
+ /* append new entries here */
+ hw_unknown, hw_all /* hw_all must be last */
+} hd_hw_item_t;
+
+/*
+ * device base classes and bus types
+ *
+ */
+
+/* base class values (superset of PCI classes) */
+typedef enum base_classes {
+ /* these *must* match standard PCI class numbers */
+ bc_none, bc_storage, bc_network, bc_display, bc_multimedia,
+ bc_memory, bc_bridge, bc_comm, bc_system, bc_input, bc_docking,
+ bc_processor, bc_serial, bc_wireless, bc_i2o, bc_other = 0xff,
+
+ // add our own classes here (starting at 0x100 as PCI values are 8 bit)
+ bc_monitor = 0x100, bc_internal, bc_modem, bc_isdn, bc_ps2, bc_mouse,
+ bc_storage_device, bc_network_interface, bc_keyboard, bc_printer,
+ bc_hub, bc_braille, bc_scanner, bc_joystick, bc_chipcard, bc_camera,
+ bc_framebuffer, bc_dvb, bc_tv, bc_partition, bc_dsl, bc_bluetooth
+} hd_base_classes_t;
+
+/* subclass values of bc_monitor */
+typedef enum sc_monitor {
+ sc_mon_other, sc_mon_crt, sc_mon_lcd
+} hd_sc_monitor_t;
+
+/* subclass values of bc_storage */
+typedef enum sc_storage {
+ sc_sto_scsi, sc_sto_ide, sc_sto_floppy, sc_sto_ipi, sc_sto_raid,
+ sc_sto_other = 0x80
+} hd_sc_storage_t;
+
+/* subclass values of bc_display */
+typedef enum sc_display {
+ sc_dis_vga, sc_dis_xga, sc_dis_other = 0x80
+} hd_sc_display_t;
+
+/* subclass values of bc_framebuffer */
+typedef enum sc_framebuffer {
+ sc_fb_vesa = 1
+} hd_sc_framebuffer_t;
+
+/* subclass values of bc_bridge */
+typedef enum sc_bridge {
+ sc_bridge_host, sc_bridge_isa, sc_bridge_eisa, sc_bridge_mc,
+ sc_bridge_pci, sc_bridge_pcmcia, sc_bridge_nubus, sc_bridge_cardbus,
+ sc_bridge_other = 0x80
+} hd_sc_bridge_t;
+
+/* subclass values of bc_comm */
+typedef enum sc_comm {
+ sc_com_ser, sc_com_par, sc_com_multi, sc_com_modem, sc_com_other = 0x80
+} hd_sc_comm_t;
+
+/* subclass values of bc_system */
+typedef enum sc_system {
+ sc_sys_pic, sc_sys_dma, sc_sys_timer, sc_sys_rtc, sc_sys_other = 0x80
+} hd_sc_system_t;
+
+/* subclass values of bc_input */
+typedef enum sc_input {
+ sc_inp_keyb, sc_inp_digit, sc_inp_mouse, sc_inp_other = 0x80
+} hd_sc_input_t;
+
+/* subclass values of bc_serial */
+typedef enum sc_serial {
+ sc_ser_fire, sc_ser_access, sc_ser_ssa, sc_ser_usb, sc_ser_fiber,
+ sc_ser_smbus, sc_ser_other = 0x80
+} hd_sc_serial_t;
+
+/* internal sub class values (bc_internal) */
+typedef enum sc_internal {
+ sc_int_none, sc_int_isapnp_if, sc_int_main_mem, sc_int_cpu, sc_int_fpu,
+ sc_int_bios, sc_int_prom, sc_int_sys
+} hd_sc_internal_t;
+
+/* subclass values of bc_mouse */
+typedef enum sc_mouse {
+ sc_mou_ps2, sc_mou_ser, sc_mou_bus, sc_mou_usb, sc_mou_sun,
+ sc_mou_other = 0x80
+} hd_sc_mouse_t;
+
+/* subclass values of bc_storage_device */
+typedef enum sc_std {
+ sc_sdev_disk, sc_sdev_tape, sc_sdev_cdrom, sc_sdev_floppy, sc_sdev_scanner,
+ sc_sdev_other = 0x80
+} hd_sc_std_t;
+
+/* subclass values of bc_network_interface */
+typedef enum sc_net_if {
+ sc_nif_loopback, sc_nif_ethernet, sc_nif_tokenring, sc_nif_fddi,
+ sc_nif_ctc, sc_nif_iucv, sc_nif_hsi, sc_nif_qeth,
+ sc_nif_escon, sc_nif_myrinet, sc_nif_wlan, sc_nif_xp,
+ sc_nif_usb, sc_nif_other = 0x80, sc_nif_sit
+} hd_sc_net_if_t;
+
+/* subclass values of bc_multimedia */
+typedef enum sc_multimedia {
+ sc_multi_video, sc_multi_audio, sc_multi_other
+} hd_sc_multimedia_t;
+
+/* subclass values of bc_keyboard */
+typedef enum sc_keyboard {
+ sc_keyboard_kbd, sc_keyboard_console
+} hd_sc_keyboard_t;
+
+/* subclass values of bc_hub */
+typedef enum sc_hub {
+ sc_hub_other, sc_hub_usb
+} hd_sc_hub_t;
+
+/* subclass values of bc_camera */
+typedef enum sc_camera {
+ sc_camera_webcam, sc_camera_digital
+} hd_sc_camera_t;
+
+/* subclass values of bc_modem */
+typedef enum sc_modem {
+ sc_mod_at, sc_mod_win1, sc_mod_win2, sc_mod_win3, sc_mod_win4
+} hd_sc_modem_t;
+
+/* subclass values of bc_dsl */
+typedef enum sc_dsl {
+ sc_dsl_unknown, sc_dsl_pppoe, sc_dsl_capi, sc_dsl_capiisdn
+} hd_sc_dsl_t;
+
+/* prog_if's of sc_ser_usb */
+typedef enum pif_usb_e {
+ pif_usb_uhci = 0, pif_usb_ohci = 0x10, pif_usb_ehci = 0x20,
+ pif_usb_other = 0x80, pif_usb_device = 0xfe
+} hd_pif_usb_t;
+
+/* CD-ROM prog_if values */
+typedef enum pif_cdrom {
+ pif_cdrom, pif_cdr, pif_cdrw, pif_dvd, pif_dvdr, pif_dvdram
+} hd_pif_cdrom_t ;
+
+/* S/390 disk prog_if values */
+typedef enum pif_s390disk {
+ pif_scsi, pif_dasd, pif_dasd_fba
+} hd_pif_s390disk_t;
+
+/* bus type values similar to PCI bridge subclasses */
+typedef enum bus_types {
+ bus_none, bus_isa, bus_eisa, bus_mc, bus_pci, bus_pcmcia, bus_nubus,
+ bus_cardbus, bus_other,
+
+ /* outside the range of the PCI values */
+ bus_ps2 = 0x80, bus_serial, bus_parallel, bus_floppy, bus_scsi, bus_ide, bus_usb,
+ bus_adb, bus_raid, bus_sbus, bus_i2o, bus_vio, bus_ccw, bus_iucv
+} hd_bus_types_t;
+
+/**
+ * Hardware status.
+ * The status is stored in /var/lib/hardware/unique-keys/ and used
+ * to detect if the hardware is new and has to be configured by some
+ * hardware %config tool.
+ */
+typedef struct {
+ /**
+ * Status fields are invalid.
+ */
+ unsigned invalid:1;
+ /**
+ * Hardware should be reconfigured.
+ * Either \ref hd_status_t::status_yes or \ref hd_status_t::status_no.
+ * A hardware must be reconfigured if it is in state
+ * \ref hd_status_t::available == \ref hd_status_t::status_no and
+ * \ref hd_status_t::needed == \ref hd_status_t::status_yes.
+ * In other words, if a hardware that was
+ * needed to run the system is gone.
+ */
+ unsigned reconfig:3;
+
+ /**
+ * Hardware %config status.
+ * Set to \ref hd_status_t::status_yes if the hardware has been configured, otherwise
+ * \ref hd_status_t::status_no.
+ */
+ unsigned configured:3;
+
+ /**
+ * Hardware availability.
+ * Set to \ref hd_status_t::status_yes if the hardware has been detected or
+ * \ref hd_status_t::status_no if the hardware has not been found. You can set
+ * it to \ref hd_status_t::status_unknown to indicate that this hardware cannot
+ * be automatically detected (say, ISA cards).
+ * \note You can simulate all kinds of hardware on your system by
+ * creating entries in /var/lib/hardware/unique-keys/ that have
+ * \ref hd_status_t::available set to \ref hd_status_t::status_unknown.
+ */
+ unsigned available:3;
+
+ /**
+ * Hardware is needed.
+ * Set to \ref hd_status_t::status_yes if this hardware is really necessary to run
+ * your computer. The effect will be that some hardware %config dialog
+ * is run if the hardware item is not found.
+ * Typical examples are graphics cards and mice.
+ */
+ unsigned needed:3;
+
+ /**
+ * (Internal) original value of \ref available;
+ * This is used to keep track of the original value of the \ref hd_status_t::available
+ * state as it was stored in /var/lib/hardware/unique-keys/. (\ref hd_status_t::available
+ * is automatically updated during the detection process.)
+ */
+ unsigned available_orig:3;
+
+ /**
+ * Hardware is active.
+ */
+ unsigned active:3;
+} hd_status_t;
+
+/* hardware config status values */
+typedef enum {
+ status_no = 1, status_yes, status_unknown, status_new
+} hd_status_value_t;
+
+/**
+ * Various types of hotplug devices.
+ */
+typedef enum {
+ hp_none, /**< Not a hotpluggable %device. */
+ hp_pcmcia, /**< PCMCIA %device. */
+ hp_cardbus, /**< Cardbus %device. */
+ hp_pci, /**< PCI hotplug %device. */
+ hp_usb, /**< USB %device. */
+ hp_ieee1394 /**< IEEE 1394 (FireWire) %device */
+} hd_hotplug_t;
+
+
+/**
+ * Holds id/name pairs.
+ * Used for bus, class, vendor, %device and such.
+ */
+typedef struct {
+ unsigned id; /**< Numeric id. */
+ char *name; /**< Name (if any) that corresponds to \ref hd_id_t::id. */
+} hd_id_t;
+
+/**
+ * String list type.
+ * Used whenever we create a list of strings (e.g. file read).
+ */
+typedef struct s_str_list_t {
+ struct s_str_list_t *next; /**< Link to next member. */
+ char *str; /**< Some string data. */
+} str_list_t;
+
+
+typedef struct {
+ unsigned char bitmap[16]; /* large enough for all uses */
+ unsigned bits; /* real bitmap length in bits */
+ unsigned not_empty:1; /* at least 1 bit is set */
+ str_list_t *str; /* interpreted bitmask */
+} hd_bitmap_t;
+
+
+/*
+ * for memory areas
+ */
+typedef struct {
+ unsigned start, size; /* base address & size */
+ unsigned char *data; /* actual data */
+} memory_range_t;
+
+
+/*
+ * smp info according to Intel smp spec (ia32)
+ */
+typedef struct {
+ unsigned ok:1; /* data are valid */
+ unsigned rev; /* MP spec revision */
+ unsigned mpfp; /* MP Floating Pointer struct */
+ unsigned mpconfig_ok:1; /* MP config table valid */
+ unsigned mpconfig; /* MP config table */
+ unsigned mpconfig_size; /* dto, size */
+ unsigned char feature[5]; /* MP feature info */
+ char oem_id[9]; /* oem id */
+ char prod_id[13]; /* product id */
+ unsigned cpus, cpus_en; /* number of cpus & ennabled cpus */
+} smp_info_t;
+
+
+/*
+ * vesa bios extensions info
+ */
+typedef struct vbe_mode_info_s {
+ unsigned number; /* mode number */
+ unsigned attributes; /* mode attributes */
+ unsigned width, height; /* mode size */
+ unsigned bytes_p_line; /* line length */
+ unsigned pixel_size; /* bits per pixel */
+ unsigned fb_start; /* frame buffer start address (if any) */
+ unsigned win_A_start; /* window A start address */
+ unsigned win_A_attr; /* window A attributes */
+ unsigned win_B_start; /* window B start address */
+ unsigned win_B_attr; /* window B attributes */
+ unsigned win_size; /* window size in bytes */
+ unsigned win_gran; /* window granularity in bytes */
+ unsigned pixel_clock; /* maximum pixel clock */
+} vbe_mode_info_t;
+
+
+typedef struct {
+ unsigned ok:1; /* data are valid */
+ unsigned version; /* vbe version */
+ unsigned oem_version; /* oem version info */
+ unsigned memory; /* in bytes */
+ unsigned fb_start; /* != 0 if framebuffer is supported */
+ char *oem_name; /* oem name */
+ char *vendor_name; /* vendor name */
+ char *product_name; /* product name */
+ char *product_revision; /* product revision */
+ unsigned modes; /* number of supported video modes */
+ vbe_mode_info_t *mode; /* video mode list */
+ unsigned current_mode; /* current video mode */
+ unsigned char ddc[0x80]; /* ddc monitor info */
+} vbe_info_t;
+
+
+/*
+ * Compaq Controller Order EV (CQHORD) definition
+ */
+typedef struct {
+ unsigned id;
+ unsigned char slot;
+ unsigned char bus;
+ unsigned char devfn;
+ unsigned char misc;
+} cpq_ctlorder_t;
+
+
+typedef struct {
+ unsigned ok:1; /* data are valid */
+ unsigned entry; /* entry point */
+ unsigned compaq:1; /* is compaq system */
+ cpq_ctlorder_t cpq_ctrl[32]; /* 32 == MAX_CONTROLLERS */
+} bios32_info_t;
+
+
+/*
+ * smbios entries
+ */
+typedef enum {
+ sm_biosinfo, sm_sysinfo, sm_boardinfo, sm_chassis,
+ sm_processor, sm_memctrl, sm_memmodule, sm_cache,
+ sm_connect, sm_slot, sm_onboard, sm_oem,
+ sm_config, sm_lang, sm_group, sm_eventlog,
+ sm_memarray, sm_memdevice, sm_memerror, sm_memarraymap,
+ sm_memdevicemap, sm_mouse, sm_battery, sm_reset,
+ sm_secure, sm_power, sm_voltage, sm_cool,
+ sm_temperature, sm_current, sm_outofband, sm_bis,
+ sm_boot, sm_mem64error, sm_mandev, sm_mandevcomp,
+ sm_mdtd, sm_inactive = 126, sm_end = 127
+} hd_smbios_type_t;
+
+
+/* common part of all smbios_* types */
+typedef struct {
+ union u_hd_smbios_t *next; /* link to next entry */
+ hd_smbios_type_t type; /* BIOS info type */
+ int data_len; /* formatted section length */
+ unsigned char *data; /* formatted section */
+ str_list_t *strings; /* strings taken from the unformed section */
+ int handle; /* handle, unique 16 bit number */
+} smbios_any_t;
+
+
+/* BIOS related information */
+typedef struct {
+ union u_hd_smbios_t *next;
+ hd_smbios_type_t type;
+ int data_len;
+ unsigned char *data;
+ str_list_t *strings;
+ int handle;
+ char *vendor; /* vendor name */
+ char *version; /* version (free form) */
+ char *date; /* date mm/dd/yyyy (old: yy) */
+ hd_bitmap_t feature; /* BIOS characteristics */
+ unsigned start; /* start address */
+ unsigned rom_size; /* ROM size (in bytes) */
+} smbios_biosinfo_t;
+
+
+/* overall system related information */
+typedef struct {
+ union u_hd_smbios_t *next;
+ hd_smbios_type_t type;
+ int data_len;
+ unsigned char *data;
+ str_list_t *strings;
+ int handle;
+ char *manuf; /* manufacturer */
+ char *product; /* product name */
+ char *version; /* version */
+ char *serial; /* serial number */
+ unsigned char uuid[16]; /* universal unique id; all 0x00: undef, all 0xff: undef but settable */
+ hd_id_t wake_up; /* wake-up type */
+} smbios_sysinfo_t;
+
+
+/* motherboard related information */
+typedef struct {
+ union u_hd_smbios_t *next;
+ hd_smbios_type_t type;
+ int data_len;
+ unsigned char *data;
+ str_list_t *strings;
+ int handle;
+ char *manuf; /* manufacturer */
+ char *product; /* product name */
+ char *version; /* version */
+ char *serial; /* serial number */
+ char *asset; /* asset tag */
+ hd_id_t board_type; /* board type */
+ hd_bitmap_t feature; /* board features */
+ char *location; /* location in chassis */
+ int chassis; /* handle of chassis */
+ int objects_len; /* number of contained objects */
+ int *objects; /* array of object handles */
+} smbios_boardinfo_t;
+
+
+/* chassis information */
+typedef struct {
+ union u_hd_smbios_t *next;
+ hd_smbios_type_t type;
+ int data_len;
+ unsigned char *data;
+ str_list_t *strings;
+ int handle;
+ char *manuf; /* manufacturer */
+ char *version; /* version */
+ char *serial; /* serial number */
+ char *asset; /* asset tag */
+ hd_id_t ch_type; /* chassis type */
+ unsigned lock; /* 1: lock present, 0: not present or unknown */
+ hd_id_t bootup; /* bootup state */
+ hd_id_t power; /* power supply state (at last boot) */
+ hd_id_t thermal; /* thermal state (at last boot) */
+ hd_id_t security; /* security state (at last boot) */
+ unsigned oem; /* OEM-specific information */
+} smbios_chassis_t;
+
+
+/* processor information */
+typedef struct {
+ union u_hd_smbios_t *next;
+ hd_smbios_type_t type;
+ int data_len;
+ unsigned char *data;
+ str_list_t *strings;
+ int handle;
+ char *socket; /* socket */
+ hd_id_t upgrade; /* socket type */
+ char *manuf; /* manufacturer */
+ char *version; /* version */
+ char *serial; /* serial number */
+ char *asset; /* asset tag */
+ char *part; /* part number */
+ hd_id_t pr_type; /* processor type */
+ hd_id_t family; /* processor family */
+ uint64_t cpu_id; /* processor id */
+ unsigned voltage; /* in 0.1 V */
+ unsigned ext_clock; /* MHz */
+ unsigned max_speed; /* MHz */
+ unsigned current_speed; /* MHz */
+ unsigned sock_status; /* socket status (1: populated, 0: empty */
+ hd_id_t cpu_status; /* cpu status */
+ int l1_cache; /* handle of L1 cache */
+ int l2_cache; /* handle of L2 cache */
+ int l3_cache; /* handle of L3 cache */
+} smbios_processor_t;
+
+
+/* cache information */
+typedef struct {
+ union u_hd_smbios_t *next;
+ hd_smbios_type_t type;
+ int data_len;
+ unsigned char *data;
+ str_list_t *strings;
+ int handle;
+ char *socket; /* socket designation */
+ unsigned max_size; /* max cache size in kbytes */
+ unsigned current_size; /* current size in kbytes */
+ unsigned speed; /* cache speed in nanoseconds */
+ hd_id_t mode; /* operational mode */
+ unsigned state; /* 0/1: disabled/enabled */
+ hd_id_t location; /* cache location */
+ unsigned socketed; /* 0/1: not socketed/socketed */
+ unsigned level; /* cache level (0 = L1, 1 = L2, ...) */
+ hd_id_t ecc; /* error correction type */
+ hd_id_t cache_type; /* logical cache type */
+ hd_id_t assoc; /* cache associativity */
+ hd_bitmap_t supp_sram; /* supported SRAM types */
+ hd_bitmap_t sram; /* current SRAM type */
+} smbios_cache_t;
+
+
+/* port connector information */
+typedef struct {
+ union u_hd_smbios_t *next;
+ hd_smbios_type_t type;
+ int data_len;
+ unsigned char *data;
+ str_list_t *strings;
+ int handle;
+ hd_id_t port_type; /* port type */
+ char *i_des; /* internal reference designator */
+ hd_id_t i_type; /* internal connector type */
+ char *x_des; /* external reference designator */
+ hd_id_t x_type; /* external connector type */
+} smbios_connect_t;
+
+
+/* system slot information */
+typedef struct {
+ union u_hd_smbios_t *next;
+ hd_smbios_type_t type;
+ int data_len;
+ unsigned char *data;
+ str_list_t *strings;
+ int handle;
+ char *desig; /* slot designation */
+ hd_id_t slot_type; /* slot type */
+ hd_id_t bus_width; /* data bus width */
+ hd_id_t usage; /* current usage */
+ hd_id_t length; /* slot length */
+ unsigned id; /* slot id */
+ hd_bitmap_t feature; /* slot characteristics */
+} smbios_slot_t;
+
+
+/* on board devices information */
+typedef struct {
+ union u_hd_smbios_t *next;
+ hd_smbios_type_t type;
+ int data_len;
+ unsigned char *data;
+ str_list_t *strings;
+ int handle;
+ unsigned dev_len; /* device list length */
+ struct {
+ char *name; /* device name */
+ hd_id_t type; /* device type */
+ unsigned status; /* 0: disabled, 1: enabled */
+ } *dev; /* device list */
+} smbios_onboard_t;
+
+
+/* OEM information */
+typedef struct {
+ union u_hd_smbios_t *next;
+ hd_smbios_type_t type;
+ int data_len;
+ unsigned char *data;
+ str_list_t *strings;
+ int handle;
+ str_list_t *oem_strings; /* OEM strings */
+} smbios_oem_t;
+
+
+/* system config options */
+typedef struct {
+ union u_hd_smbios_t *next;
+ hd_smbios_type_t type;
+ int data_len;
+ unsigned char *data;
+ str_list_t *strings;
+ int handle;
+ str_list_t *options; /* system config options */
+} smbios_config_t;
+
+
+/* language information */
+typedef struct {
+ union u_hd_smbios_t *next;
+ hd_smbios_type_t type;
+ int data_len;
+ unsigned char *data;
+ str_list_t *strings; /* list of languages */
+ int handle;
+ char *current; /* current language */
+} smbios_lang_t;
+
+
+/* group associations */
+typedef struct {
+ union u_hd_smbios_t *next;
+ hd_smbios_type_t type;
+ int data_len;
+ unsigned char *data;
+ str_list_t *strings;
+ int handle;
+ char *name; /* group name */
+ int items_len; /* number of items in this group */
+ int *item_handles; /* array of item handles */
+} smbios_group_t;
+
+
+/* physical memory array (consists of several memory devices) */
+typedef struct {
+ union u_hd_smbios_t *next;
+ hd_smbios_type_t type;
+ int data_len;
+ unsigned char *data;
+ str_list_t *strings;
+ int handle;
+ hd_id_t location; /* memory device location */
+ hd_id_t use; /* memory usage */
+ hd_id_t ecc; /* ECC types */
+ unsigned max_size; /* maximum memory size in kB */
+ int error_handle; /* points to error info record; 0xfffe: not supported, 0xffff: no error */
+ unsigned slots; /* slots or sockets for this device */
+} smbios_memarray_t;
+
+
+/* memory device */
+typedef struct {
+ union u_hd_smbios_t *next;
+ hd_smbios_type_t type;
+ int data_len;
+ unsigned char *data;
+ str_list_t *strings;
+ int handle;
+ char *location; /* device location */
+ char *bank; /* bank location */
+ char *manuf; /* manufacturer */
+ char *serial; /* serial number */
+ char *asset; /* asset tag */
+ char *part; /* part number */
+ int array_handle; /* memory array this device belongs to */
+ int error_handle; /* points to error info record; 0xfffe: not supported, 0xffff: no error */
+ unsigned width; /* data width in bits */
+ unsigned eccbits; /* ecc bits */
+ unsigned size; /* kB */
+ hd_id_t form; /* form factor */
+ unsigned set; /* 0: does not belong to a set; 1-0xfe: set number; 0xff: unknown */
+ hd_id_t mem_type; /* memory type */
+ hd_bitmap_t type_detail; /* memory type details */
+ unsigned speed; /* in MHz */
+} smbios_memdevice_t;
+
+
+/* 32-bit memory error information */
+typedef struct {
+ union u_hd_smbios_t *next;
+ hd_smbios_type_t type;
+ int data_len;
+ unsigned char *data;
+ str_list_t *strings;
+ int handle;
+ hd_id_t err_type; /* error type memory */
+ hd_id_t granularity; /* memory array or memory partition */
+ hd_id_t operation; /* mem operation causing the error */
+ unsigned syndrome; /* vendor-specific ECC syndrome; 0: unknown */
+ unsigned array_addr; /* fault address rel. to mem array; 0x80000000: unknown */
+ unsigned device_addr; /* fault address rel to mem device; 0x80000000: unknown */
+ unsigned range; /* range, within which the error can be determined; 0x80000000: unknown */
+} smbios_memerror_t;
+
+
+/* memory array mapped address */
+typedef struct {
+ union u_hd_smbios_t *next;
+ hd_smbios_type_t type;
+ int data_len;
+ unsigned char *data;
+ str_list_t *strings;
+ int handle;
+ int array_handle; /* memory array this mapping belongs to */
+ uint64_t start_addr; /* memory range start address */
+ uint64_t end_addr; /* end address */
+ unsigned part_width; /* number of memory devices */
+} smbios_memarraymap_t;
+
+
+/* memory device mapped address */
+typedef struct {
+ union u_hd_smbios_t *next;
+ hd_smbios_type_t type;
+ int data_len;
+ unsigned char *data;
+ str_list_t *strings;
+ int handle;
+ int memdevice_handle; /* memory device handle */
+ int arraymap_handle; /* memory array mapping handle */
+ uint64_t start_addr; /* memory range start address */
+ uint64_t end_addr; /* end address */
+ unsigned row_pos; /* position of the referenced memory device in a row of the address partition */
+ unsigned interleave_pos; /* dto, in an interleave */
+ unsigned interleave_depth; /* number of consecutive rows */
+} smbios_memdevicemap_t;
+
+
+/* pointing device (aka 'mouse') information */
+typedef struct {
+ union u_hd_smbios_t *next;
+ hd_smbios_type_t type;
+ int data_len;
+ unsigned char *data;
+ str_list_t *strings;
+ int handle;
+ hd_id_t mtype; /* mouse type */
+ hd_id_t interface; /* interface type */
+ unsigned buttons; /* number of buttons */
+} smbios_mouse_t;
+
+
+/* hardware security */
+typedef struct {
+ union u_hd_smbios_t *next;
+ hd_smbios_type_t type;
+ int data_len;
+ unsigned char *data;
+ str_list_t *strings;
+ int handle;
+ hd_id_t power; /* power-on password status */
+ hd_id_t keyboard; /* keyboard password status */
+ hd_id_t admin; /* admin password status */
+ hd_id_t reset; /* front panel reset status */
+} smbios_secure_t;
+
+
+/* system power controls */
+typedef struct {
+ union u_hd_smbios_t *next;
+ hd_smbios_type_t type;
+ int data_len;
+ unsigned char *data;
+ str_list_t *strings;
+ int handle;
+ unsigned month; /* next scheduled power-on month */
+ unsigned day; /* dto, day */
+ unsigned hour; /* dto, hour */
+ unsigned minute; /* dto, minute */
+ unsigned second; /* dto, second */
+} smbios_power_t;
+
+
+/* 64-bit memory error information */
+typedef struct {
+ union u_hd_smbios_t *next;
+ hd_smbios_type_t type;
+ int data_len;
+ unsigned char *data;
+ str_list_t *strings;
+ int handle;
+ hd_id_t err_type; /* error type memory */
+ hd_id_t granularity; /* memory array or memory partition */
+ hd_id_t operation; /* mem operation causing the error */
+ unsigned syndrome; /* vendor-specific ECC syndrome; 0: unknown */
+ uint64_t array_addr; /* fault address rel. to mem array; 0x80000000: unknown */
+ uint64_t device_addr; /* fault address rel to mem device; 0x80000000: unknown */
+ unsigned range; /* range, within which the error can be determined; 0x80000000: unknown */
+} smbios_mem64error_t;
+
+
+typedef union u_hd_smbios_t {
+ union u_hd_smbios_t *next;
+ smbios_any_t any;
+ smbios_biosinfo_t biosinfo;
+ smbios_sysinfo_t sysinfo;
+ smbios_boardinfo_t boardinfo;
+ smbios_chassis_t chassis;
+ smbios_processor_t processor;
+ smbios_cache_t cache;
+ smbios_connect_t connect;
+ smbios_slot_t slot;
+ smbios_onboard_t onboard;
+ smbios_oem_t oem;
+ smbios_config_t config;
+ smbios_lang_t lang;
+ smbios_group_t group;
+ smbios_memarray_t memarray;
+ smbios_memdevice_t memdevice;
+ smbios_memerror_t memerror;
+ smbios_memarraymap_t memarraymap;
+ smbios_memdevicemap_t memdevicemap;
+ smbios_mouse_t mouse;
+ smbios_secure_t secure;
+ smbios_power_t power;
+ smbios_mem64error_t mem64error;
+} hd_smbios_t;
+
+
+/*
+ * udev database info
+ */
+typedef struct s_udevinfo_t {
+ struct s_udevinfo_t *next;
+ char *sysfs;
+ char *name;
+ str_list_t *links;
+ int type;
+} hd_udevinfo_t;
+
+
+/*
+ * sysfs driver info
+ */
+typedef struct s_sysfsdrv_t {
+ struct s_sysfsdrv_t *next;
+ char *driver;
+ char *device;
+} hd_sysfsdrv_t;
+
+
+/*
+ * device number; type is either 0 or 'b' or 'c'.
+ *
+ * range: number of nodes
+ */
+typedef struct {
+ int type;
+ unsigned major, minor, range;
+} hd_dev_num_t;
+
+
+/*
+ * structure holding the (raw) PCI data
+ */
+typedef struct s_pci_t {
+ struct s_pci_t *next; /* linked list */
+ unsigned data_len; /* the actual length of the data field */
+ unsigned data_ext_len; /* max. accessed config byte; see code */
+ unsigned char data[256]; /* the PCI data */
+ char *log; /* log messages */
+ unsigned flags, /* various info, see enum pci_flags */
+ cmd, /* PCI_COMMAND */
+ hdr_type, /* PCI_HEADER_TYPE */
+ secondary_bus; /* > 0 for PCI & CB bridges */
+ unsigned bus, /* PCI bus #, *nothing* to do with hw_t.bus */
+ slot, func; /* slot & function */
+ unsigned base_class, sub_class, prog_if; /* PCI device classes */
+ unsigned dev, vend, sub_dev, sub_vend, rev; /* vendor & device ids */
+ unsigned irq; /* used irq, if any */
+ uint64_t base_addr[7]; /* I/O or memory base */
+ uint64_t base_len[7]; /* I/O or memory ranges */
+ unsigned addr_flags[7]; /* I/O or memory address flags */
+ uint64_t rom_base_addr; /* memory base for card ROM */
+ uint64_t rom_base_len; /* memory range for card ROM */
+ char *sysfs_id; /* sysfs path */
+ char *sysfs_bus_id; /* sysfs bus id */
+} pci_t;
+
+/*
+ * pci related flags cf. (pci_t).flags
+ */
+typedef enum pci_flags {
+ pci_flag_ok, pci_flag_pm, pci_flag_agp
+} hd_pci_flags_t;
+
+
+/*
+ * raw USB data
+ */
+typedef struct usb_s {
+ struct usb_s *next;
+ unsigned hd_idx;
+ unsigned hd_base_idx;
+ /* see Linux USB docs */
+ str_list_t *c, *d, *e, *i, *p, *s, *t;
+ struct usb_s *cloned;
+ int bus, dev_nr, lev, parent, port, count, conns, used_conns, ifdescr;
+ unsigned speed;
+ unsigned vendor, device, rev;
+ char *manufact, *product, *serial;
+ char *driver;
+ memory_range_t raw_descr;
+ int d_cls, d_sub, d_prot;
+ int i_alt, i_cls, i_sub, i_prot;
+ unsigned country;
+} usb_t;
+
+/*
+ *structures to hold the (raw) ISA-PnP data
+ */
+typedef struct {
+ int len;
+ int type;
+ unsigned char *data;
+} isapnp_res_t;
+
+typedef struct {
+ int csn;
+ int log_devs;
+ unsigned char *serial;
+ unsigned char *card_regs;
+ unsigned char (*ldev_regs)[0xd0];
+ int res_len;
+ unsigned broken:1; /* mark a broken card */
+ isapnp_res_t *res;
+} isapnp_card_t;
+
+typedef struct {
+ int read_port;
+ int cards;
+ isapnp_card_t *card;
+} isapnp_t;
+
+typedef struct {
+ isapnp_card_t *card;
+ int dev;
+ unsigned flags; /* cf. enum isapnp_flags */
+ unsigned ref:1; /* internally used flag */
+} isapnp_dev_t;
+
+/*
+ * ISA-PnP related flags; cf. (isapnp_dev_t).flags
+ */
+typedef enum isapnp_flags {
+ isapnp_flag_act
+} hd_isapnp_flags_t;
+
+
+/*
+ * raw SCSI data
+ */
+typedef struct scsi_s {
+ struct scsi_s *next;
+ unsigned deleted:1;
+ unsigned generic:1;
+ unsigned fake:1;
+ char *dev_name;
+ char *guessed_dev_name;
+ int generic_dev;
+ unsigned host, channel, id, lun;
+ char *vendor, *model, *rev, *type_str, *serial;
+ int type;
+ unsigned inode_low;
+ char *proc_dir, *driver;
+ unsigned unique;
+ char *info;
+ unsigned lgeo_c, lgeo_h, lgeo_s;
+ unsigned pgeo_c, pgeo_h, pgeo_s;
+ uint64_t size;
+ unsigned sec_size;
+ unsigned cache;
+ str_list_t *host_info;
+ char *usb_guid;
+ unsigned pci_info;
+ unsigned pci_bus;
+ unsigned pci_slot;
+ unsigned pci_func;
+ uint64_t wwpn;
+ uint64_t fcp_lun;
+ char *controller_id;
+} scsi_t;
+
+
+/*
+ * PROM tree on PPC
+ */
+typedef struct devtree_s {
+ struct devtree_s *next;
+ struct devtree_s *parent;
+ unsigned idx;
+ char *path, *filename;
+ unsigned pci:1;
+ char *name, *model, *device_type, *compatible;
+ int class_code; /* class : sub_class : prog-if */
+ int vendor_id, device_id, subvendor_id, subdevice_id;
+ int revision_id, interrupt;
+ unsigned char *edid; /* 128 bytes */
+} devtree_t;
+
+/*
+ * Device/CU model numbers for S/390
+ */
+typedef struct ccw_s {
+ unsigned char lcss;
+ unsigned char cu_model;
+ unsigned char dev_model;
+} ccw_t;
+
+/*
+ * special CDROM entry
+ */
+typedef struct cdrom_info_s {
+ struct cdrom_info_s *next;
+ char *name;
+ unsigned speed;
+ unsigned cdr:1, cdrw:1, dvd:1, dvdr:1, dvdram:1;
+ unsigned cdrom:1; /* cdrom in drive */
+ struct {
+ unsigned ok:1;
+ char *volume, *publisher, *preparer, *application, *creation_date;
+ } iso9660;
+ struct {
+ unsigned ok:1;
+ unsigned platform;
+ char *id_string;
+ unsigned bootable:1;
+ unsigned media_type; /* boot emulation type */
+ unsigned load_address;
+ unsigned load_count; /* sectors to load */
+ unsigned start; /* start sector */
+ unsigned catalog; /* boot catalog start */
+ struct {
+ unsigned c, h, s;
+ unsigned size;
+ } geo;
+ char *label;
+ } el_torito;
+
+} cdrom_info_t;
+
+// note: obsolete, will be removed
+typedef struct {
+ unsigned char block0[512];
+} floppy_info_t;
+
+/*
+ * bios data (ix86)
+ */
+typedef struct {
+ unsigned apm_supported:1;
+ unsigned apm_enabled:1;
+ unsigned apm_ver, apm_subver;
+ unsigned apm_bios_flags;
+
+ unsigned vbe_ver;
+ unsigned vbe_video_mem;
+
+ unsigned ser_port0, ser_port1, ser_port2, ser_port3;
+ unsigned par_port0, par_port1, par_port2;
+
+ /* The id is still in big endian format! */
+ unsigned is_pnp_bios:1;
+ unsigned pnp_id;
+ unsigned lba_support:1;
+
+ unsigned low_mem_size;
+ smp_info_t smp;
+ vbe_info_t vbe;
+
+ unsigned smbios_ver;
+
+ struct {
+ unsigned width;
+ unsigned height;
+ char *vendor;
+ char *name;
+ } lcd;
+
+ struct {
+ char *vendor;
+ char *type;
+ unsigned bus;
+ unsigned compat_vend;
+ unsigned compat_dev;
+ } mouse;
+
+ struct {
+ unsigned ok:1;
+ unsigned scroll_lock:1;
+ unsigned num_lock:1;
+ unsigned caps_lock:1;
+ } led;
+
+ bios32_info_t bios32;
+
+} bios_info_t;
+
+
+/*
+ * prom data (ppc, sparc)
+ */
+typedef struct {
+ unsigned has_color:1;
+ unsigned color;
+} prom_info_t;
+
+
+/*
+ * general system data
+ */
+typedef struct {
+ char *system_type;
+ char *generation;
+ char *vendor;
+ char *model;
+ char *serial;
+ char *lang;
+} sys_info_t;
+
+
+/*
+ * monitor (DDC) data
+ */
+typedef struct {
+ unsigned manu_year;
+ unsigned min_vsync, max_vsync; /* vsync range */
+ unsigned min_hsync, max_hsync; /* hsync range */
+ char *vendor;
+ char *name;
+ char *serial;
+} monitor_info_t;
+
+
+typedef enum cpu_arch {
+ arch_unknown = 0,
+ arch_intel,
+ arch_alpha,
+ arch_sparc, arch_sparc64,
+ arch_ppc, arch_ppc64,
+ arch_68k,
+ arch_ia64,
+ arch_s390, arch_s390x,
+ arch_arm,
+ arch_mips,
+ arch_x86_64
+} hd_cpu_arch_t;
+
+// ###### drop boot_arch at all?
+typedef enum boot_arch {
+ boot_unknown = 0,
+ boot_lilo, boot_milo, boot_aboot, boot_silo, boot_ppc, boot_elilo, boot_s390,
+ boot_mips, boot_grub
+} hd_boot_arch_t;
+
+/* special cpu entry */
+typedef struct {
+ enum cpu_arch architecture;
+ unsigned family; /* axp: cpu variation */
+ unsigned model; /* axp: cpu revision */
+ unsigned stepping;
+ unsigned cache;
+ unsigned clock;
+ unsigned units; /* >1 "hyperthreading" */
+ char *vend_name; /* axp: system type */
+ char *model_name; /* axp: cpu model */
+ char *platform; /* x86: NULL */
+ str_list_t *features; /* x86: flags */
+} cpu_info_t;
+
+
+/*
+ * enhanced disk data (cf. edd.c)
+ */
+typedef struct {
+ uint64_t sectors;
+ struct {
+ unsigned cyls, heads, sectors;
+ } edd;
+ struct {
+ unsigned cyls, heads, sectors;
+ } legacy;
+ unsigned ext_fixed_disk:1;
+ unsigned ext_lock_eject:1;
+ unsigned ext_edd:1;
+ unsigned ext_64bit:1;
+ unsigned assigned:1;
+ char *sysfs_id;
+ unsigned hd_idx;
+} edd_info_t;
+
+
+/*
+ * database info
+ */
+typedef struct {
+ unsigned data_len, data_max;
+ unsigned *data;
+ unsigned names_len, names_max;
+ char *names;
+} hddb_data_t;
+
+typedef uint32_t hddb_entry_mask_t;
+
+typedef struct hddb_list_s {
+ hddb_entry_mask_t key_mask;
+ hddb_entry_mask_t value_mask;
+ unsigned key;
+ unsigned value;
+} hddb_list_t;
+
+typedef struct {
+ unsigned list_len, list_max;
+ hddb_list_t *list;
+ unsigned ids_len, ids_max;
+ unsigned *ids;
+ unsigned strings_len, strings_max;
+ char *strings;
+} hddb2_data_t;
+
+/*
+ * pci module info
+ */
+typedef struct {
+ char *module;
+ unsigned vendor;
+ unsigned device;
+ unsigned subvendor;
+ unsigned subdevice;
+ unsigned pciclass;
+ unsigned classmask;
+} hddb_pci_t;
+
+
+/*
+ * resource types
+ */
+typedef enum resource_types {
+ res_any, res_phys_mem, res_mem, res_io, res_irq, res_dma, res_monitor,
+ res_size, res_disk_geo, res_cache, res_baud, res_init_strings, res_pppd_option,
+ res_framebuffer, res_hwaddr, res_link, res_wlan
+} hd_resource_types_t;
+
+
+/*
+ * size units (cf. (res_size_t).unit)
+ */
+typedef enum size_units {
+ size_unit_cm, size_unit_cinch, size_unit_byte, size_unit_sectors,
+ size_unit_kbyte, size_unit_mbyte, size_unit_gbyte
+} hd_size_units_t;
+
+/*
+ * access types for I/O and memory resources
+ */
+typedef enum access_flags {
+ acc_unknown, acc_ro, acc_wo, acc_rw /* unknown, read only, write only, read/write */
+} hd_access_flags_t;
+
+
+typedef enum yes_no_flag {
+ flag_unknown, flag_no, flag_yes /* unknown, no, yes */
+} hd_yes_no_flag_t;
+
+
+typedef enum geo_types {
+ geo_physical = 0, geo_logical, geo_bios_edd, geo_bios_legacy
+} hd_geo_types_t;
+
+
+/*
+ * definitions for the various resource types
+ */
+typedef struct {
+ union u_hd_res_t *next;
+ enum resource_types type;
+} res_any_t;
+
+typedef struct {
+ union u_hd_res_t *next;
+ enum resource_types type;
+ uint64_t base, range;
+ unsigned
+ enabled:1, /* 0: disabled, 1 enabled */
+ access:2, /* enum access_flags */
+ prefetch:2; /* enum yes_no_flag */
+} res_mem_t;
+
+typedef struct {
+ union u_hd_res_t *next;
+ enum resource_types type;
+ uint64_t range;
+} res_phys_mem_t;
+
+typedef struct {
+ union u_hd_res_t *next;
+ enum resource_types type;
+ uint64_t base, range;
+ unsigned
+ enabled:1, /* 0: disabled, 1 enabled */
+ access:2; /* enum access_flags */
+} res_io_t;
+
+typedef struct {
+ union u_hd_res_t *next;
+ enum resource_types type;
+ unsigned base;
+ unsigned triggered; /* # of interrupts */
+ unsigned enabled:1; /* 0: disabled, 1 enabled */
+} res_irq_t;
+
+typedef struct {
+ union u_hd_res_t *next;
+ enum resource_types type;
+ unsigned base;
+ unsigned enabled:1; /* 0: disabled, 1 enabled */
+} res_dma_t;
+
+typedef struct {
+ union u_hd_res_t *next;
+ enum resource_types type;
+ enum size_units unit;
+ uint64_t val1, val2; /* to allow for 2D values */
+} res_size_t;
+
+typedef struct {
+ union u_hd_res_t *next;
+ enum resource_types type;
+ unsigned speed;
+ unsigned bits, stopbits;
+ char parity; /* n, e, o, s, m */
+ char handshake; /* -, h, s */
+} res_baud_t;
+
+typedef struct {
+ union u_hd_res_t *next;
+ enum resource_types type;
+ unsigned size; /* in kbyte */
+} res_cache_t;
+
+typedef struct {
+ union u_hd_res_t *next;
+ enum resource_types type;
+ unsigned cyls, heads, sectors;
+ uint64_t size;
+ enum geo_types geotype; /* 0-3: physical/logical/bios edd/bios legacy */
+} res_disk_geo_t;
+
+typedef struct {
+ union u_hd_res_t *next;
+ enum resource_types type;
+ unsigned width, height; /* in pixel */
+ unsigned vfreq; /* in Hz */
+ unsigned interlaced:1; /* 0/1 */
+} res_monitor_t;
+
+typedef struct {
+ union u_hd_res_t *next;
+ enum resource_types type;
+ char *init1;
+ char *init2;
+} res_init_strings_t;
+
+typedef struct {
+ union u_hd_res_t *next;
+ enum resource_types type;
+ char *option;
+} res_pppd_option_t;
+
+typedef struct {
+ union u_hd_res_t *next;
+ enum resource_types type;
+ unsigned width, height; /* in pixel */
+ unsigned bytes_p_line; /* line length in bytes (do not confuse with 'width') */
+ unsigned colorbits; /* 4, 8, 15, 16, 24, 32 */
+ unsigned mode; /* mode number for kernel */
+} res_framebuffer_t;
+
+typedef struct {
+ union u_hd_res_t *next;
+ enum resource_types type;
+ char *addr;
+} res_hwaddr_t;
+
+typedef struct {
+ union u_hd_res_t *next;
+ enum resource_types type;
+ unsigned state:1; /* network link state: 0 - not connected, 1 - connected */
+} res_link_t;
+
+/* wlan capabilities */
+typedef struct {
+ union u_hd_res_t *next;
+ enum resource_types type;
+ str_list_t *channels;
+ str_list_t *frequencies; /* in GHz units */
+ str_list_t *bitrates; /* in Mbps units */
+ str_list_t *auth_modes; /* open, sharedkey, wpa-psk, wpa-eap, wpa-leap */
+ str_list_t *enc_modes; /* WEP40, WEP104, WEP128, WEP232, TKIP, CCMP */
+} res_wlan_t;
+
+typedef union u_hd_res_t {
+ union u_hd_res_t *next;
+ res_any_t any;
+ res_io_t io;
+ res_mem_t mem;
+ res_phys_mem_t phys_mem;
+ res_irq_t irq;
+ res_dma_t dma;
+ res_size_t size;
+ res_cache_t cache;
+ res_baud_t baud;
+ res_disk_geo_t disk_geo;
+ res_monitor_t monitor;
+ res_init_strings_t init_strings;
+ res_pppd_option_t pppd_option;
+ res_framebuffer_t framebuffer;
+ res_hwaddr_t hwaddr;
+ res_link_t link;
+ res_wlan_t wlan;
+} hd_res_t;
+
+
+/*
+ * data gathered by the misc module; basically resources from /proc
+ */
+typedef struct {
+ uint64_t addr, size;
+ char *dev;
+ unsigned tag;
+} misc_io_t;
+
+typedef struct {
+ unsigned channel;
+ char *dev;
+ unsigned tag;
+} misc_dma_t;
+
+typedef struct {
+ unsigned irq, events;
+ int devs;
+ char **dev;
+ unsigned tag;
+} misc_irq_t;
+
+typedef struct {
+ unsigned io_len, dma_len, irq_len;
+ misc_io_t *io;
+ misc_dma_t *dma;
+ misc_irq_t *irq;
+ str_list_t *proc_io, *proc_dma, *proc_irq;
+} misc_t;
+
+typedef struct s_serial_t {
+ struct s_serial_t *next;
+ char *name;
+ char *device;
+ unsigned line, port, irq, baud;
+} serial_t;
+
+typedef struct s_ser_device_t {
+ struct s_ser_device_t *next;
+ unsigned hd_idx;
+ char *dev_name;
+ str_list_t *at_resp;
+ int fd;
+ struct termios tio;
+ unsigned max_baud, cur_baud;
+ unsigned is_mouse:1;
+ unsigned is_modem:1;
+ unsigned do_io:1;
+ unsigned char buf[0x1000];
+ int buf_len;
+ int garbage, non_pnp, pnp;
+ unsigned char pnp_id[8];
+ char *serial, *class_name, *dev_id, *user_name, *vend, *init_string1, *init_string2, *pppd_option;
+ unsigned pnp_rev;
+ unsigned bits;
+} ser_device_t;
+
+/*
+ * Notes on isdn_parm_t:
+ * - def_value is only relevant of alt_values != 0
+ * - def_value should be a value out of alt_value[]
+ * - see libihw docu for the meaning of name,type,flags,def_value
+ */
+typedef struct isdn_parm_s {
+ struct isdn_parm_s *next;
+ char *name; /* parameter name */
+ unsigned valid:1; /* 1: entry is valid, 0: some inconsistencies */
+ unsigned conflict:1; /* 1: ressource conflict (eg. no free irq) */
+ uint64_t value; /* value of the parameter */
+ unsigned type; /* CDBISDN type (P_...) */
+ unsigned flags; /* CDBISDN flags (P_...) */
+ unsigned def_value; /* default value */
+ int alt_values; /* length of alt_value[] */
+ unsigned *alt_value; /* possible values */
+} isdn_parm_t;
+
+/* device driver info types */
+typedef enum driver_info_type {
+ di_any, di_display, di_module, di_mouse, di_x11, di_isdn, di_kbd, di_dsl
+} hd_driver_info_t;
+
+/* unspecific info */
+typedef struct {
+ union driver_info_u *next;
+ enum driver_info_type type; /* driver info type */
+ str_list_t *hddb0, *hddb1; /* the actual driver database entries */
+} driver_info_any_t;
+
+/* display (monitor) info */
+typedef struct {
+ union driver_info_u *next;
+ enum driver_info_type type; /* driver info type */
+ str_list_t *hddb0, *hddb1; /* the actual driver database entries */
+ unsigned width, height; /* max. useful display geometry */
+ unsigned min_vsync, max_vsync; /* vsync range */
+ unsigned min_hsync, max_hsync; /* hsync range */
+ unsigned bandwidth; /* max. pixel clock */
+} driver_info_display_t;
+
+/* module info */
+typedef struct {
+ union driver_info_u *next;
+ enum driver_info_type type; /* driver info type */
+ str_list_t *hddb0, *hddb1; /* the actual driver database entries */
+ unsigned active:1; /* if module is currently active */
+ unsigned modprobe:1; /* modprobe or insmod */
+ str_list_t *names; /* (ordered) list of module names */
+ str_list_t *mod_args; /* list of module args (corresponds to the module name list) */
+ char *conf; /* conf.modules entry, if any (e.g. for sb.o) */
+} driver_info_module_t;
+
+/* mouse protocol info */
+typedef struct {
+ union driver_info_u *next;
+ enum driver_info_type type; /* driver info type */
+ str_list_t *hddb0, *hddb1; /* the actual driver database entries */
+ char *xf86; /* the XF86 protocol name */
+ char *gpm; /* dto, gpm */
+ int buttons; /* number of buttons, -1 --> unknown */
+ int wheels; /* dto, wheels */
+} driver_info_mouse_t;
+
+/* X11 server info */
+typedef struct {
+ union driver_info_u *next;
+ enum driver_info_type type; /* driver info type */
+ str_list_t *hddb0, *hddb1; /* the actual driver database entries */
+ char *server; /* the server/module name */
+ char *xf86_ver; /* XFree86 version (3 or 4) */
+ unsigned x3d:1; /* has 3D support */
+ struct {
+ unsigned all:5; /* the next 5 entries combined */
+ unsigned c8:1, c15:1, c16:1, c24:1, c32:1;
+ } colors; /* supported color depths */
+ unsigned dacspeed; /* max. ramdac clock */
+ str_list_t *extensions; /* additional X extensions to load ('Module' section) */
+ str_list_t *options; /* special server options */
+ str_list_t *raw; /* extra info to add to XF86Config */
+ char *script; /* 3d script to run */
+} driver_info_x11_t;
+
+/* isdn info */
+typedef struct {
+ union driver_info_u *next;
+ enum driver_info_type type; /* driver info type */
+ str_list_t *hddb0, *hddb1; /* the actual driver database entries */
+ int i4l_type, i4l_subtype; /* I4L types */
+ char *i4l_name; /* I4L card name */
+ isdn_parm_t *params; /* isdn parameters */
+} driver_info_isdn_t;
+
+/* dsl info */
+typedef struct {
+ union driver_info_u *next;
+ enum driver_info_type type; /* driver info type */
+ str_list_t *hddb0, *hddb1; /* the actual driver database entries */
+ char *mode; /* DSL driver types */
+ char *name; /* DSL driver name */
+} driver_info_dsl_t;
+
+/* keyboard info */
+typedef struct {
+ union driver_info_u *next;
+ enum driver_info_type type; /* driver info type */
+ str_list_t *hddb0, *hddb1; /* the actual driver database entries */
+ char *XkbRules; /* XF86Config entries */
+ char *XkbModel;
+ char *XkbLayout;
+ char *keymap; /* console keymap */
+} driver_info_kbd_t;
+
+/*
+ * holds device driver info
+ */
+typedef union driver_info_u {
+ union driver_info_u *next;
+ driver_info_any_t any;
+ driver_info_module_t module;
+ driver_info_mouse_t mouse;
+ driver_info_x11_t x11;
+ driver_info_display_t display;
+ driver_info_isdn_t isdn;
+ driver_info_dsl_t dsl;
+ driver_info_kbd_t kbd;
+} driver_info_t;
+
+
+/*
+ * Some hardware doesn't fit into the hd_t scheme or there is info we
+ * gathered during the scan process but that no-one really cares about. Such
+ * stuff is stored in hd_detail_t.
+ */
+typedef enum hd_detail_type {
+ hd_detail_pci, hd_detail_usb, hd_detail_isapnp, hd_detail_cdrom,
+ hd_detail_floppy, hd_detail_bios, hd_detail_cpu, hd_detail_prom,
+ hd_detail_monitor, hd_detail_sys, hd_detail_scsi, hd_detail_devtree,
+ hd_detail_ccw
+} hd_detail_type_t;
+
+typedef struct {
+ enum hd_detail_type type;
+ pci_t *data;
+} hd_detail_pci_t;
+
+typedef struct {
+ enum hd_detail_type type;
+ usb_t *data;
+} hd_detail_usb_t;
+
+typedef struct {
+ enum hd_detail_type type;
+ isapnp_dev_t *data;
+} hd_detail_isapnp_t;
+
+typedef struct {
+ enum hd_detail_type type;
+ cdrom_info_t *data;
+} hd_detail_cdrom_t;
+
+typedef struct {
+ enum hd_detail_type type;
+ floppy_info_t *data;
+} hd_detail_floppy_t;
+
+typedef struct {
+ enum hd_detail_type type;
+ bios_info_t *data;
+} hd_detail_bios_t;
+
+typedef struct {
+ enum hd_detail_type type;
+ cpu_info_t *data;
+} hd_detail_cpu_t;
+
+typedef struct {
+ enum hd_detail_type type;
+ prom_info_t *data;
+} hd_detail_prom_t;
+
+typedef struct {
+ enum hd_detail_type type;
+ monitor_info_t *data;
+} hd_detail_monitor_t;
+
+typedef struct {
+ enum hd_detail_type type;
+ sys_info_t *data;
+} hd_detail_sys_t;
+
+typedef struct {
+ enum hd_detail_type type;
+ scsi_t *data;
+} hd_detail_scsi_t;
+
+typedef struct {
+ enum hd_detail_type type;
+ devtree_t *data;
+} hd_detail_devtree_t;
+
+typedef struct {
+ enum hd_detail_type type;
+ ccw_t *data;
+} hd_detail_ccw_t;
+
+typedef union {
+ enum hd_detail_type type;
+ hd_detail_pci_t pci;
+ hd_detail_usb_t usb;
+ hd_detail_isapnp_t isapnp;
+ hd_detail_cdrom_t cdrom;
+ hd_detail_floppy_t floppy;
+ hd_detail_bios_t bios;
+ hd_detail_cpu_t cpu;
+ hd_detail_prom_t prom;
+ hd_detail_monitor_t monitor;
+ hd_detail_sys_t sys;
+ hd_detail_scsi_t scsi;
+ hd_detail_devtree_t devtree;
+ hd_detail_ccw_t ccw;
+} hd_detail_t;
+
+
+/* info about manually configured hardware (in /var/lib/hardware/) */
+typedef struct hd_manual_s {
+ struct hd_manual_s *next;
+
+ char *unique_id;
+ char *parent_id;
+ char *child_ids;
+ unsigned hw_class;
+ char *model;
+
+ hd_status_t status;
+ char *config_string;
+
+ /* More or less free-form key, value pairs.
+ * key should not contain '=', however.
+ */
+ str_list_t *key;
+ str_list_t *value;
+} hd_manual_t;
+
+
+/**
+ * Individual hardware item.
+ * Every hardware component gets an \ref hd_t entry. A list of all hardware
+ * items is in \ref hd_data_t::hd.
+ */
+typedef struct s_hd_t {
+ struct s_hd_t *next; /**< Link to next hardware item. */
+ /**
+ * Unique index, starting at 1.
+ * Use \ref hd_get_device_by_idx() to look up an hardware entry by index. And don't
+ * free the result!
+ */
+ unsigned idx;
+
+ /**
+ * Hardware appears to be broken in some way.
+ * This was used to indicate broken framebuffer support of some graphics cards.
+ * Currently unused.
+ */
+ unsigned broken:1;
+
+ /**
+ * Bus type (id and name).
+ */
+ hd_id_t bus;
+
+ /**
+ * Slot and bus number.
+ * Bits 0-7: slot number, 8-31 bus number.
+ */
+ unsigned slot;
+
+ /**
+ * (PCI) function.
+ */
+ unsigned func;
+
+ /**
+ * Base class (id and name).
+ */
+ hd_id_t base_class;
+
+ /**
+ * Sub class (id and name).
+ */
+ hd_id_t sub_class;
+
+ /**
+ * (PCI) programming interface (id and name).
+ */
+ hd_id_t prog_if;
+
+ /**
+ * Vendor id and name.
+ * Id is actually a combination of some tag to differentiate the
+ * various id types and the real id. Use the \ref ID_VALUE macro to
+ * get e.g. the real PCI id value for a PCI %device.
+ */
+ hd_id_t vendor;
+
+ /**
+ * Device id and name.
+ * Id is actually a combination of some tag to differentiate the
+ * various id types and the real id. Use the \ref ID_VALUE macro to
+ * get e.g. the real PCI id value for a PCI %device.
+ * \note If you're looking or something printable, you might want to use \ref hd_t::model
+ * instead.
+ */
+ hd_id_t device;
+
+ /**
+ * Subvendor id and name.
+ * Id is actually a combination of some tag to differentiate the
+ * various id types and the real id. Use the \ref ID_VALUE macro to
+ * get e.g. the real PCI id value for a PCI %device.
+ */
+ hd_id_t sub_vendor;
+
+ /**
+ * Subdevice id and name.
+ * Id is actually a combination of some tag to differentiate the
+ * various id types and the real id. Use the \ref ID_VALUE macro to
+ * get e.g. the real PCI id value for a PCI %device.
+ */
+ hd_id_t sub_device;
+
+ /**
+ * Revision id or string.
+ * If revision is numerical (e.g. PCI) \ref hd_id_t::id is used.
+ * If revision is some char data (e.g. disk drives) it is stored in \ref hd_id_t::name.
+ */
+ hd_id_t revision;
+
+ /**
+ * Serial id.
+ */
+ char *serial;
+
+ /**
+ * Vendor id and name of some compatible hardware.
+ * Used mainly for ISA-PnP devices.
+ */
+ hd_id_t compat_vendor;
+
+ /**
+ * Device id and name of some compatible hardware.
+ * Used mainly for ISA-PnP devices.
+ */
+ hd_id_t compat_device;
+
+ /**
+ * Hardware class.
+ * Not to confuse with \ref base_class!
+ */
+ hd_hw_item_t hw_class;
+
+ /**
+ * Hardware class list.
+ * A device may belong to more than one hardware class.
+ */
+ unsigned char hw_class_list[(hw_all + 7) / 8]; /**< (Internal) bitmask of hw classes. */
+
+ /**
+ * Model name.
+ * This is a combination of vendor and %device names. Some heuristics is used
+ * to make it more presentable. Use this instead of \ref hd_t::vendor and
+ * \ref hd_t::device.
+ */
+ char *model;
+
+ /**
+ * Device this hardware is attached to.
+ * Link to some 'parent' %device. Use \ref hd_get_device_by_idx() to get
+ * the corresponding hardware entry.
+ */
+ unsigned attached_to;
+
+ /**
+ * sysfs entry for this hardware, if any.
+ */
+ char *sysfs_id;
+
+ /**
+ * sysfs bus id for this hardware, if any.
+ */
+ char *sysfs_bus_id;
+
+ /**
+ * sysfs device link.
+ */
+ char *sysfs_device_link;
+
+ /**
+ * Special %device file.
+ * Device file name to access this hardware. Normally something below /dev.
+ * For network interfaces this is the interface name.
+ */
+ char *unix_dev_name;
+
+ /**
+ * Device type & number according to sysfs.
+ */
+ hd_dev_num_t unix_dev_num;
+
+ /**
+ * List of %device names.
+ * Device file names to access this hardware. Normally something below /dev.
+ * They should be all equivalent. The preferred name however is
+ * \ref hd_t::unix_dev_name.
+ */
+ str_list_t *unix_dev_names;
+
+ /**
+ * Special %device file.
+ * Device file name to access this hardware. Most hardware only has one
+ * %device name stored in \ref hd_t::unix_dev_name. But in some cases
+ * there's an alternative name.
+ */
+ char *unix_dev_name2;
+
+ /**
+ * Device type & number according to sysfs.
+ */
+ hd_dev_num_t unix_dev_num2;
+
+ /**
+ * BIOS/PROM id.
+ * Where appropriate, this is a special BIOS/PROM id (e.g. "0x80" for
+ * the first harddisk on Intel-PCs).
+ * CHPID for s390.
+ */
+ char *rom_id;
+
+ /**
+ * Unique id for this hardware.
+ * A unique string identifying this hardware. The string consists
+ * of two parts separated by a dot ("."). The part before the dot
+ * describes the location (where the hardware is attached in the system).
+ * The part after the dot identifies the hardware itself. The string
+ * must not contain slashes ("/") because we're going to create files
+ * with this id as name. Apart from this there are no restrictions on
+ * the form of this string.
+ */
+ char *unique_id;
+
+ /* List of ids. */
+ str_list_t *unique_ids;
+
+ /**
+ * (Internal) Probing module that created this entry.
+ */
+ unsigned module;
+
+ /**
+ * (Internal) Source code line where this entry was created.
+ */
+ unsigned line;
+
+ /**
+ * (Internal) Counter, used in combination with \ref hd_t::module and \ref hd_t::line.
+ */
+ unsigned count;
+
+ /**
+ * Device resources.
+ */
+ hd_res_t *res;
+
+ /**
+ * Special info associated with this hardware.
+ * \note This is going to change!
+ */
+ hd_detail_t *detail;
+
+ /**
+ * (Internal) Unspecific text info.
+ * It is used to track IDE interfaces and assign them to the correct
+ * IDE controllers.
+ */
+ str_list_t *extra_info;
+
+ /**
+ * Hardware status (if available).
+ * The status is stored in files below /var/lib/hardware/unique-keys/. Every
+ * hardware item gets a file there with its unique id as file name.
+ */
+ hd_status_t status;
+
+ /**
+ * Some %config info.
+ * Every hardware item may get some string assigned. This string is stored
+ * in files below /var/lib/hardware/unique-keys/. There is no meaning
+ * associated with this string.
+ */
+ char *config_string;
+
+ /**
+ * Hotplug controller for this %device.
+ * It indicates what kind of hotplug %device (if any) this is.
+ */
+ hd_hotplug_t hotplug;
+
+ /**
+ * Slot the hotplug device is connected to (e.g. PCMCIA socket).
+ * \note \ref hotplug_slot counts 1-based (0: no information available).
+ */
+ unsigned hotplug_slot;
+
+ struct is_s {
+ unsigned agp:1; /* AGP device */
+ unsigned isapnp:1; /* ISA-PnP device */
+ unsigned notready:1; /* block devices: no medium, other: device not configured */
+ unsigned manual:1; /* undetectable, manually configured hardware */
+ unsigned softraiddisk:1; /* disk belongs to some soft raid array */
+ unsigned zip:1; /* zip floppy */
+ unsigned cdr:1; /* CD-R */
+ unsigned cdrw:1; /* CD-RW */
+ unsigned dvd:1; /* DVD */
+ unsigned dvdr:1; /* DVD-R */
+ unsigned dvdram:1; /* DVD-RAM */
+ unsigned pppoe:1; /* PPPOE modem connected */
+ unsigned wlan:1; /* WLAN card */
+ } is;
+
+ struct tag_s { /* this struct is for internal purposes only */
+ unsigned remove:1; /* schedule for removal */
+ unsigned freeit:1; /* for internal memory management */
+ unsigned fixed:1; /* fixed, do no longer modify this entry */
+ unsigned ser_skip:1; /* if serial line, don't scan for devices */
+ unsigned ser_device:2; /* if != 0: info about attached serial device; see serial.c */
+ } tag;
+
+ /**
+ * (Internal) First 512 bytes of block devices.
+ * To check accessibility of block devices we read the first block. The data
+ * is used to identify the boot %device.
+ */
+ unsigned char *block0;
+
+ /**
+ * Currently active driver.
+ */
+ char *driver;
+
+ /**
+ * List of currently active drivers.
+ */
+ str_list_t *drivers;
+
+ /**
+ * Old \ref unique_id for compatibility.
+ * The calculation of unique ids has changed in libhd v3.17. Basically
+ * we no longer use the vendor/%device names if there are vendor/%device
+ * ids. (Otherwise a simple %device name database update would change the id,
+ * which is really not what you want.)
+ */
+ char *old_unique_id;
+
+ /**
+ * \ref unique_id of parent (\ref attached_to).
+ * \note Please do not use it for now.
+ *
+ */
+ char *parent_id;
+
+ /**
+ * \ref unique_ids of children (\ref parent_id).
+ * \note Please do not use it for now.
+ *
+ */
+ str_list_t *child_ids;
+
+ /**
+ * (Internal) location independent \ref unique_id part.
+ * The speed up some internal searches, we store it here separately.
+ */
+ char *unique_id1;
+
+ /**
+ * USB Global Unique Identifier.
+ * Available for USB devices. This may even be set if \ref hd_t::bus is not
+ * \ref bus_usb (e.g. USB storage devices will have \ref hd_t::bus set to
+ * \ref bus_scsi due to SCSI emulation).
+ */
+ char *usb_guid;
+
+ driver_info_t *driver_info; /* device driver info */
+
+ str_list_t *requires; /* packages/programs required for this hardware */
+
+ /*
+ * These are used internally for memory management.
+ * Do not even _think_ of modifying these!
+ */
+ unsigned ref_cnt; /**< (Internal) memory reference count. */
+ struct s_hd_t *ref; /**< (Internal) if set, this is only a reference. */
+} hd_t;
+
+
+/**
+ * Holds all data accumulated during hardware probing.
+ */
+typedef struct {
+ /**
+ * Current hardware list.
+ * The list of all currently probed hardware. This is not identical with
+ * the result of \ref hd_list(). (But a superset of it.)
+ */
+ hd_t *hd;
+
+ /**
+ * A progress indicator.
+ * If this callback function is not NULL, it is called at various points and can
+ * be used to give some user feedback what we are actually doing.
+ * If the debug flag HD_DEB_PROGRESS is set, progress messages are logged.
+ * \param pos Indicates where we are.
+ * \param msg Indicates what we are going to do.
+ */
+ void (*progress)(char *pos, char *msg);
+
+ /** Log messages.
+ * All messages logged during hardware probing accumulate here.
+ */
+ char *log;
+
+ /** Debug flags.
+ * Although there exist some debug flag defines this scheme is currently
+ * not followed consistently. It is guaranteed however that -1 will give
+ * the most log messages and 0 the least.
+ */
+ unsigned debug;
+
+ /**
+ * Special flags.
+ * Influence hardware probing in some strange ways with these. You normally
+ * do not want to use them.
+ */
+ struct flag_struct {
+ unsigned internal:1; /**< \ref hd_scan() has been called internally. */
+ unsigned dformat:2; /**< Alternative output format. */
+ unsigned no_parport:1; /**< Don't do parport probing: parport modules (used to) crash pmacs. */
+ unsigned iseries:1; /**< Set if we are on an iSeries machine. */
+ unsigned list_all:1; /**< Return even devices with status 'not available'. */
+ unsigned fast:1; /**< Don't check tricky hardware. */
+ unsigned list_md:1; /**< Report md & lvm devices from /proc/partitions */
+ unsigned nofork:1; /**< don't run potentially hanging code in a subprocess */
+ unsigned nosysfs:1; /**< don't ask sysfs */
+ unsigned forked:1; /**< we're running in a subprocess */
+ unsigned cpuemu:1; /**< use CPU emulation to run BIOS code (i386 only) */
+ unsigned udev:1; /**< return first udev symlink as device name */
+ unsigned edd_used:1; /**< internal: edd info has been used */
+ unsigned keep_kmods:2; /**< internal: don't reread kmods */
+ } flags;
+
+
+ /** Concentrate on these devices.
+ * List of sysfs ids for devices to look for.
+ */
+ str_list_t *only;
+
+ /*
+ * The following entries should *not* be accessed outside of libhd!
+ */
+ unsigned char probe[(pr_all + 7) / 8]; /**< (Internal) bitmask of probing features. */
+ unsigned char probe_set[(pr_all + 7) / 8]; /**< (Iternal) bitmask of probing features that will always be set. */
+ unsigned char probe_clr[(pr_all + 7) / 8]; /**< (Internal) bitmask of probing features that will always be reset. */
+ unsigned last_idx; /**< (Internal) index of the last hd entry generated */
+ unsigned module; /**< (Internal) the current probing module we are in */
+ enum boot_arch boot; /**< (Internal) boot method */
+ hd_t *old_hd; /**< (Internal) old (outdated) entries (if you scan more than once) */
+ pci_t *pci; /**< (Internal) raw PCI data */
+ isapnp_t *isapnp; /**< (Internal) raw ISA-PnP data */
+ cdrom_info_t *cdrom; /**< (Internal) CDROM devs from PROC_CDROM_INFO */
+ str_list_t *net; /**< (Internal) list of network interfaces */
+ str_list_t *floppy; /**< (Internal) contents of PROC_NVRAM, used by the floppy module */
+ misc_t *misc; /**< (Internal) data gathered in the misc module */
+ serial_t *serial; /**< (Internal) /proc's serial info */
+ scsi_t *scsi; /**< (Internal) raw SCSI data */
+ ser_device_t *ser_mouse; /**< (Internal) info about serial mice */
+ ser_device_t *ser_modem; /**< (Internal) info about serial modems */
+ str_list_t *cpu; /**< (Internal) /proc/cpuinfo */
+ str_list_t *klog; /**< (Internal) kernel log */
+ str_list_t *proc_usb; /**< (Internal) /proc/bus/usb info */
+ usb_t *usb; /**< (Internal) usb info */
+ hddb_pci_t *hddb_pci_hm; /**< (Internal) pci module info */
+ hddb_pci_t *hddb_pci; /**< (Internal) pci module info */
+ hddb2_data_t *hddb2[2]; /**< (Internal) hardware database */
+ str_list_t *kmods; /**< (Internal) list of active kernel modules */
+ uint64_t used_irqs; /**< (Internal) irq usage */
+ uint64_t assigned_irqs; /**< (Internal) irqs automatically assigned by libhd (for driver info) */
+ memory_range_t bios_rom; /**< (Internal) BIOS 0xc0000 - 0xfffff */
+ memory_range_t bios_ram; /**< (Internal) BIOS 0x00400 - 0x004ff */
+ memory_range_t bios_ebda; /**< (Internal) EBDA */
+ unsigned display; /**< (Internal) hd_idx of the active (vga) display */
+ unsigned color_code; /**< (Internal) color, if any */
+ char *cmd_line; /**< (Internal) kernel command line */
+ str_list_t *xtra_hd; /**< (Internal) fake hd entries (for testing) */
+ devtree_t *devtree; /**< (Internal) prom device tree on ppc */
+ unsigned kernel_version; /**< (Internal) kernel version */
+ int in_vmware; /**< (Internal) running in vmware */
+ hd_manual_t *manual; /**< (Internal) hardware config info */
+ str_list_t *disks; /**< (Internal) disks according to /proc/partitions */
+ str_list_t *partitions; /**< (Internal) dto, partitions */
+ str_list_t *cdroms; /**< (Internal) cdroms according to PROC_CDROM_INFO */
+ hd_smbios_t *smbios; /**< (Internal) smbios data */
+ struct {
+ unsigned ok:1;
+ unsigned size;
+ unsigned used;
+ void *data;
+ int id;
+ int updated;
+ } shm; /**< (Internal) our shm segment */
+ unsigned pci_config_type; /**< (Internal) PCI config type (1 or 2), 0: unknown */
+ hd_udevinfo_t *udevinfo; /**< (Internal) udev info */
+ hd_sysfsdrv_t *sysfsdrv; /**< (Internal) sysfs driver info */
+ uint64_t sysfsdrv_id; /**< (Internal) sysfs driver info id */
+ str_list_t *scanner_db; /**< (Internal) list of scanner modules */
+ edd_info_t edd[0x80]; /**< (Internal) enhanced disk drive data */
+} hd_data_t;
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ *
+ * libhd interface functions
+ *
+ * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ */
+
+/* implemented in hd.c */
+
+/* the actual hardware scan */
+void hd_scan(hd_data_t *hd_data);
+
+//! Free all data.
+hd_data_t *hd_free_hd_data(hd_data_t *hd_data);
+
+//! Free hardware items returned by e.g. \ref hd_list().
+hd_t *hd_free_hd_list(hd_t *hd);
+
+void hd_set_probe_feature(hd_data_t *hd_data, enum probe_feature feature);
+void hd_clear_probe_feature(hd_data_t *hd_data, enum probe_feature feature);
+int hd_probe_feature(hd_data_t *hd_data, enum probe_feature feature);
+void hd_set_probe_feature_hw(hd_data_t *hd_data, hd_hw_item_t item);
+
+enum probe_feature hd_probe_feature_by_name(char *name);
+char *hd_probe_feature_by_value(enum probe_feature feature);
+
+int hd_module_is_active(hd_data_t *hd_data, char *mod);
+
+hd_t *hd_base_class_list(hd_data_t *hd_data, unsigned base_class);
+hd_t *hd_sub_class_list(hd_data_t *hd_data, unsigned base_class, unsigned sub_class);
+hd_t *hd_bus_list(hd_data_t *hd_data, unsigned bus);
+const char* hd_busid_to_hwcfg(int busid);
+hd_t *hd_list(hd_data_t *hd_data, hd_hw_item_t item, int rescan, hd_t *hd_old);
+hd_t *hd_list_with_status(hd_data_t *hd_data, hd_hw_item_t item, hd_status_t status);
+hd_t *hd_list2(hd_data_t *hd_data, hd_hw_item_t *items, int rescan);
+hd_t *hd_list_with_status2(hd_data_t *hd_data, hd_hw_item_t *items, hd_status_t status);
+
+int hd_has_pcmcia(hd_data_t *hd_data);
+// will be gone soon
+// int hd_apm_enabled(hd_data_t *hd_data);
+int hd_usb_support(hd_data_t *hd_data);
+int hd_smp_support(hd_data_t *hd_data);
+int hd_mac_color(hd_data_t *hd_data);
+int hd_color(hd_data_t *hd_data);
+int hd_is_uml(hd_data_t *hd_data);
+unsigned hd_display_adapter(hd_data_t *hd_data);
+unsigned hd_boot_disk(hd_data_t *hd_data, int *matches);
+enum cpu_arch hd_cpu_arch(hd_data_t *hd_data);
+enum boot_arch hd_boot_arch(hd_data_t *hd_data);
+
+hd_t *hd_get_device_by_idx(hd_data_t *hd_data, unsigned idx);
+
+void hd_set_hw_class(hd_t *hd, hd_hw_item_t hw_class);
+int hd_is_hw_class(hd_t *hd, hd_hw_item_t hw_class);
+
+int hd_is_sgi_altix(hd_data_t *hd_data);
+
+char *hd_version(void);
+
+/* implemented in hddb.c */
+
+str_list_t *get_hddb_packages(hd_data_t *hd_data);
+void hddb_add_info(hd_data_t *hd_data, hd_t *hd);
+
+void hddb_dump_raw(hddb2_data_t *hddb, FILE *f);
+void hddb_dump(hddb2_data_t *hddb, FILE *f);
+
+/* implemented in hdp.c */
+
+void hd_dump_entry(hd_data_t *hd_data, hd_t *hd, FILE *f);
+
+
+/* implemented in cdrom.c */
+
+cdrom_info_t *hd_read_cdrom_info(hd_data_t *hd_data, hd_t *hd);
+
+/* implemented in manual.c */
+hd_manual_t *hd_manual_read_entry(hd_data_t *hd_data, const char *id);
+int hd_manual_write_entry(hd_data_t *hd_data, hd_manual_t *entry);
+hd_manual_t *hd_free_manual(hd_manual_t *manual);
+hd_t *hd_read_config(hd_data_t *hd_data, const char *id);
+int hd_write_config(hd_data_t *hd_data, hd_t *hd);
+char *hd_hw_item_name(hd_hw_item_t item);
+char *hd_status_value_name(hd_status_value_t status);
+int hd_change_status(const char *id, hd_status_t status, const char *config_string);
+int hd_read_mmap(hd_data_t *hd_data, char *name, unsigned char *buf, off_t start, unsigned size);
+
+
+/*
+ * - - - - - CDB ISDN interface - - - - -
+ */
+
+
+/* (C) 2003 kkeil@suse.de */
+
+#define CDBISDN_VERSION 0x0101
+
+#ifndef PCI_ANY_ID
+#define PCI_ANY_ID 0xffff
+#endif
+
+#define CDBISDN_P_NONE 0x0
+#define CDBISDN_P_IRQ 0x1
+#define CDBISDN_P_MEM 0x2
+#define CDBISDN_P_IO 0x3
+
+/* vendor info */
+typedef struct {
+ char *name;
+ char *shortname;
+ int vnr;
+ int refcnt;
+} cdb_isdn_vendor;
+
+typedef struct {
+ int handle; /* internal identifier idx in database */
+ int vhandle; /* internal identifier to vendor database */
+ char *name; /* cardname */
+ char *lname; /* vendor short name + cardname */
+ char *Class; /* CLASS of the card */
+ char *bus; /* bus type */
+ int revision; /* revision used with USB */
+ int vendor; /* Vendor ID for ISAPNP and PCI cards */
+ int device; /* Device ID for ISAPNP and PCI cards */
+ int subvendor; /* Subvendor ID for PCI cards */
+ /* A value of 0xffff is ANY_ID */
+ int subdevice; /* Subdevice ID for PCI cards */
+ /* A value of 0xffff is ANY_ID */
+ unsigned int features; /* feature flags */
+ int line_cnt; /* count of ISDN ports */
+ int vario_cnt; /* count of driver varios */
+ int vario; /* referenz to driver vario record */
+} cdb_isdn_card;
+
+typedef struct {
+ int handle; /* idx in database */
+ int next_vario; /* link to alternate vario */
+ int drvid; /* unique id of the driver vario */
+ int typ; /* Type to identify the driver */
+ int subtyp; /* Subtype of the driver type */
+ int smp; /* SMP supported ? */
+ char *mod_name; /* name of the driver module */
+ char *para_str; /* optional parameter string */
+ char *mod_preload; /* optional modules to preload */
+ char *cfg_prog; /* optional cfg prog */
+ char *firmware; /* optional firmware to load */
+ char *description; /* optional description */
+ char *need_pkg; /* list of packages needed for function */
+ char *info; /* optional additional info */
+ char *protocol; /* supported D-channel protocols */
+ char *interface; /* supported API interfaces */
+ char *io; /* possible IO ports with legacy ISA cards */
+ char *irq; /* possible interrupts with legacy ISA cards */
+ char *membase; /* possible membase with legacy ISA cards */
+ char *features; /* optional features*/
+ int card_ref; /* reference to a card */
+ char *name; /* driver name */
+} cdb_isdn_vario;
+
+
+extern cdb_isdn_vendor *hd_cdbisdn_get_vendor(int);
+extern cdb_isdn_card *hd_cdbisdn_get_card(int);
+extern cdb_isdn_vario *hd_cdbisdn_get_vario_from_type(int, int);
+extern cdb_isdn_card *hd_cdbisdn_get_card_from_type(int, int);
+extern cdb_isdn_card *hd_cdbisdn_get_card_from_id(int, int, int, int);
+extern cdb_isdn_vario *hd_cdbisdn_get_vario(int);
+extern int hd_cdbisdn_get_version(void);
+extern int hd_cdbisdn_get_db_version(void);
+extern char *hd_cdbisdn_get_db_date(void);
+
+/* CDB ISDN interface end */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _HD_H */
--- /dev/null
+#include <sysfs/dlist.h>
+#include <sysfs/libsysfs.h>
+
+#define PROC_CMDLINE "/proc/cmdline"
+#define PROC_PCI_DEVICES "/proc/bus/pci/devices"
+#define PROC_PCI_BUS "/proc/bus/pci"
+#define PROC_CPUINFO "/proc/cpuinfo"
+#define PROC_IOPORTS "/proc/ioports"
+#define PROC_DMA "/proc/dma"
+#define PROC_INTERRUPTS "/proc/interrupts"
+#define PROC_NVRAM_22 "/proc/driver/nvram"
+#define PROC_NVRAM_24 "/proc/nvram"
+#define PROC_IDE "/proc/ide"
+#define PROC_SCSI "/proc/scsi"
+#define PROC_CDROM_INFO "/proc/sys/dev/cdrom/info"
+#define PROC_NET_IF_INFO "/proc/net/dev"
+#define PROC_MODULES "/proc/modules"
+#define PROC_DRIVER_SERIAL "/proc/tty/driver/serial"
+#define PROC_DRIVER_MACSERIAL "/proc/tty/driver/macserial"
+#define PROC_PARPORT_22 "/proc/parport/" /* Final '/' is essential! */
+#define PROC_PARPORT_24 "/proc/sys/dev/parport/parport"
+#define PROC_KCORE "/proc/kcore"
+// #define PROC_USB_DEVICES "/proc/bus/usb/devices"
+#define PROC_USB_DEVICES "/proc/bus/usb/devices_please-use-sysfs-instead"
+#define PROC_PROM "/proc/device-tree"
+#define PROC_MEMINFO "/proc/meminfo"
+#define PROC_VERSION "/proc/version"
+#define PROC_ISAPNP "/proc/isapnp"
+#define PROC_ISERIES "/proc/iSeries"
+#define PROC_ISERIES_VETH "/proc/iSeries/veth"
+#define PROC_PARTITIONS "/proc/partitions"
+#define PROC_APM "/proc/apm"
+
+#define DEV_NVRAM "/dev/nvram"
+#define DEV_PSAUX "/dev/psaux"
+#define DEV_ADBMOUSE "/dev/adbmouse"
+#define DEV_MEM "/dev/mem"
+#define DEV_KBD "/dev/kbd"
+#define DEV_CONSOLE "/dev/console"
+#define DEV_OPENPROM "/dev/openprom"
+#define DEV_SUNMOUSE "/dev/sunmouse"
+#define DEV_MICE "/dev/input/mice"
+#define DEV_FB "/dev/fb"
+#define DEV_FB0 "/dev/fb0"
+
+#define PROG_MODPROBE "/sbin/modprobe"
+#define PROG_RMMOD "/sbin/rmmod"
+#define PROG_CARDCTL "/sbin/cardctl"
+#define PROG_UDEVINFO "/usr/bin/udevinfo"
+
+#define KLOG_BOOT "/var/log/boot.msg"
+#define ISAPNP_CONF "/etc/isapnp.conf"
+
+#define ID_LIST HARDWARE_DIR "/hd.ids"
+#define LIB_CMDLINE HARDWARE_DIR "/cmdline"
+
+#define KERNEL_22 0x020200
+#define KERNEL_24 0x020400
+#define KERNEL_26 0x020600
+
+#if defined(__s390__) || defined(__s390x__) || defined(__alpha__) || defined(LIBHD_TINY)
+#define WITH_ISDN 0
+#else
+#define WITH_ISDN 1
+#endif
+
+#define PROGRESS(a, b, c) progress(hd_data, a, b, c)
+#define ADD2LOG(a...) str_printf(&hd_data->log, -2, a)
+
+#undef LIBHD_MEMCHECK
+
+#if defined(__i386__) || defined(__PPC__)
+/*
+ * f: function we are in
+ * a: first argument
+ */
+
+#ifdef __i386__
+#define CALLED_FROM(f, a) ((void *) ((unsigned *) &a)[-1] - 5)
+#endif
+
+#ifdef __PPC__
+/* (1-arg funcs only) #define CALLED_FROM(f, a) ((void *) *((unsigned *) ((void *) &a - ((short *) f)[1] - 4)) - 4) */
+static inline void *getr1() { void *p; asm("mr %0,1" : "=r" (p) :); return p; }
+#define CALLED_FROM(f, a) ((void *) ((unsigned *) (getr1() - ((short *) f)[1]))[1] - 4)
+#endif
+#else
+#undef LIBHD_MEMCHECK
+#endif
+
+#ifdef LIBHD_MEMCHECK
+FILE *libhd_log;
+#endif
+
+
+/*
+ * define to make (hd_t).unique_id a hex string, otherwise it is a
+ * base64-like string
+ */
+#undef NUMERIC_UNIQUE_ID
+
+/*
+ * Internal probing module numbers. Use mod_name_by_idx() outside of libhd.
+ */
+enum mod_idx {
+ mod_none, mod_memory, mod_pci, mod_isapnp, mod_pnpdump, mod_net,
+ mod_floppy, mod_misc, mod_bios, mod_cpu, mod_monitor, mod_mouse, mod_scsi,
+ mod_serial, mod_usb, mod_adb, mod_modem, mod_parallel, mod_isa, mod_isdn,
+ mod_kbd, mod_prom, mod_sbus, mod_int, mod_braille, mod_xtra, mod_sys,
+ mod_manual, mod_fb, mod_veth, mod_pppoe, mod_pcmcia, mod_s390,
+ mod_sysfs, mod_dsl, mod_block, mod_edd, mod_input, mod_wlan
+};
+
+void *new_mem(size_t size);
+void *resize_mem(void *, size_t);
+void *add_mem(void *, size_t, size_t);
+char *new_str(const char *);
+void *free_mem(void *);
+int have_common_res(hd_res_t *res1, hd_res_t *res2);
+void join_res_io(hd_res_t **res1, hd_res_t *res2);
+void join_res_irq(hd_res_t **res1, hd_res_t *res2);
+void join_res_dma(hd_res_t **res1, hd_res_t *res2);
+hd_res_t *free_res_list(hd_res_t *res);
+hd_res_t *add_res_entry(hd_res_t **res, hd_res_t *new_res);
+hd_t *add_hd_entry(hd_data_t *hd_data, unsigned line, unsigned count);
+misc_t *free_misc(misc_t *m);
+scsi_t *free_scsi(scsi_t *scsi, int free_all);
+hd_detail_t *free_hd_detail(hd_detail_t *d);
+devtree_t *free_devtree(hd_data_t *hd_data);
+void hd_add_id(hd_data_t *hd_data, hd_t *hd);
+
+char *isa_id2str(unsigned);
+char *eisa_vendor_str(unsigned);
+unsigned name2eisa_id(char *);
+char *canon_str(char *, int);
+
+int hex(char *string, int digits);
+
+void str_printf(char **buf, int offset, char *format, ...) __attribute__ ((format (printf, 3, 4)));
+void hexdump(char **buf, int with_ascii, unsigned data_len, unsigned char *data);
+str_list_t *search_str_list(str_list_t *sl, char *str);
+str_list_t *add_str_list(str_list_t **sl, char *str);
+str_list_t *free_str_list(str_list_t *list);
+str_list_t *read_file(char *file_name, unsigned start_line, unsigned lines);
+str_list_t *read_dir(char *dir_name, int type);
+char *hd_read_symlink(char *link_name);
+void progress(hd_data_t *hd_data, unsigned pos, unsigned count, char *msg);
+
+void remove_hd_entries(hd_data_t *hd_data);
+void remove_tagged_hd_entries(hd_data_t *hd_data);
+
+driver_info_t *free_driver_info(driver_info_t *di);
+
+int str2float(char *s, int n);
+char *float2str(int i, int n);
+
+/* return the file name of a module */
+char *mod_name_by_idx(unsigned idx);
+
+int hd_timeout(void(*func)(void *), void *arg, int timeout);
+
+str_list_t *read_kmods(hd_data_t *hd_data);
+char *get_cmd_param(hd_data_t *hd_data, int field);
+
+#ifdef __i386__
+/* smp/smp.c */
+int detectSMP(void);
+#endif
+
+void update_irq_usage(hd_data_t *hd_data);
+int run_cmd(hd_data_t *hd_data, char *cmd);
+int load_module_with_params(hd_data_t *hd_data, char *module, char *params);
+int load_module(hd_data_t *hd_data, char *module);
+int unload_module(hd_data_t *hd_data, char *module);
+int probe_module(hd_data_t *hd_data, char *module);
+
+int cmp_hd(hd_t *hd1, hd_t *hd2);
+unsigned has_something_attached(hd_data_t *hd_data, hd_t *hd);
+
+str_list_t *get_cmdline(hd_data_t *hd_data, char *key);
+
+int detect_smp_bios(hd_data_t *hd_data);
+int detect_smp_prom(hd_data_t *hd_data);
+
+unsigned char *read_block0(hd_data_t *hd_data, char *dev, int *timeout);
+
+void hd_copy(hd_t *dst, hd_t *src);
+
+/* parameter for gather_resources(,,, which) */
+#define W_IO (1 << 0)
+#define W_DMA (1 << 1)
+#define W_IRQ (1 << 2)
+
+void gather_resources(misc_t *m, hd_res_t **r, char *name, unsigned which);
+
+char *vend_id2str(unsigned vend);
+
+int hd_getdisksize(hd_data_t *hd_data, char *dev, int fd, hd_res_t **geo, hd_res_t **size);
+
+str_list_t *hd_split(char del, char *str);
+char *hd_join(char *del, str_list_t *str);
+
+int is_pnpinfo(ser_device_t *mi, int ofs);
+
+int is_pcmcia_ctrl(hd_data_t *hd_data, hd_t *hd);
+
+void hd_fork(hd_data_t *hd_data, int timeout, int total_timeout);
+void hd_fork_done(hd_data_t *hd_data);
+void hd_shm_init(hd_data_t *hd_data);
+void hd_shm_clean(hd_data_t *hd_data);
+void hd_shm_done(hd_data_t *hd_data);
+void *hd_shm_add(hd_data_t *hd_data, void *ptr, unsigned len);
+int hd_is_shm_ptr(hd_data_t *hd_data, void *ptr);
+void hd_move_to_shm(hd_data_t *hd_data);
+
+void read_udevinfo(hd_data_t *hd_data);
+
+hd_t *hd_find_sysfs_id(hd_data_t *hd_data, char *id);
+int hd_attr_uint(struct sysfs_attribute *attr, uint64_t *u, int base);
+char *hd_attr_str(struct sysfs_attribute *attr);
+str_list_t *hd_attr_list(struct sysfs_attribute *attr);
+char *hd_sysfs_id(char *path);
+char *hd_sysfs_name2_dev(char *str);
+char *hd_sysfs_dev2_name(char *str);
+void hd_sysfs_driver_list(hd_data_t *hd_data);
+char *hd_sysfs_find_driver(hd_data_t *hd_data, char *sysfs_id, int exact);
+int hd_report_this(hd_data_t *hd_data, hd_t *hd);
+str_list_t *hd_module_list(hd_data_t *hd_data, unsigned id);
+
+int hd_is_iseries(hd_data_t *hd_data);
+
+
+#ifdef __cplusplus
+}
+#endif
+
--- /dev/null
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <sys/utsname.h>
+
+#include "hd.h"
+#include "hd_int.h"
+#include "hddb.h"
+#include "isdn.h"
+#include "hddb_int.h"
+
+extern hddb2_data_t hddb_internal;
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+// #define HDDB_TRACE
+// #define HDDB_TEST
+// #define HDDB_EXTERNAL_ONLY
+
+static char *hid_tag_names[] = { "", "pci ", "eisa ", "usb ", "special ", "pcmcia " };
+// just experimenting...
+static char *hid_tag_names2[] = { "", "pci ", "eisa ", "usb ", "int ", "pcmcia " };
+
+typedef enum {
+ pref_empty, pref_new, pref_and, pref_or, pref_add
+} prefix_t;
+
+typedef struct line_s {
+ prefix_t prefix;
+ hddb_entry_t key;
+ char *value;
+} line_t;
+
+typedef struct {
+ int len;
+ unsigned val[32]; /* arbitrary (approx. max. number of modules/xf86 config lines) */
+} tmp_entry_t;
+
+/* except for driver, all strings are static and _must not_ be freed */
+typedef struct {
+ hddb_entry_mask_t key;
+ hddb_entry_mask_t value;
+ hddb_entry_mask_t value_mask[he_nomask];
+ hd_id_t bus;
+ hd_id_t base_class;
+ hd_id_t sub_class;
+ hd_id_t prog_if;
+ hd_id_t vendor;
+ hd_id_t device;
+ hd_id_t sub_vendor;
+ hd_id_t sub_device;
+ hd_id_t revision;
+ hd_id_t cu_model;
+ char *serial;
+ str_list_t *driver;
+ char *requires;
+} hddb_search_t;
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+static void hddb_init_pci(hd_data_t *hd_data);
+static hddb_pci_t *parse_pcimap(str_list_t *file);
+static driver_info_t *hd_pcidb(hd_data_t *hd_data, hddb_pci_t *pci_db, hd_t *hd, driver_info_t *drv_info);
+static void hddb_init_external(hd_data_t *hd_data);
+
+static line_t *parse_line(char *str);
+static unsigned store_string(hddb2_data_t *x, char *str);
+static unsigned store_list(hddb2_data_t *x, hddb_list_t *list);
+static unsigned store_value(hddb2_data_t *x, unsigned val);
+static unsigned store_entry(hddb2_data_t *x, tmp_entry_t *te);
+static void clear_entry(tmp_entry_t *te);
+static void add_value(tmp_entry_t *te, hddb_entry_t idx, unsigned val);
+static hddb_entry_mask_t add_entry(hddb2_data_t *hddb2, tmp_entry_t *te, hddb_entry_t idx, char *str);
+static int compare_ids(hddb2_data_t *hddb, hddb_search_t *hs, hddb_entry_mask_t mask, unsigned key);
+static void complete_ids(hddb2_data_t *hddb, hddb_search_t *hs, hddb_entry_mask_t key_mask, hddb_entry_mask_t mask, unsigned val_idx);
+static int hddb_search(hd_data_t *hd_data, hddb_search_t *hs, int max_recursions);
+#ifdef HDDB_TEST
+static void test_db(hd_data_t *hd_data);
+#endif
+static driver_info_t *hddb_to_device_driver(hd_data_t *hd_data, hddb_search_t *hs);
+static driver_info_t *kbd_driver(hd_data_t *hd_data, hd_t *hd);
+static driver_info_t *monitor_driver(hd_data_t *hd_data, hd_t *hd);
+
+#if WITH_ISDN
+/* static int chk_free_biosmem(hd_data_t *hd_data, unsigned addr, unsigned len); */
+/* static isdn_parm_t *new_isdn_parm(isdn_parm_t **ip); */
+static driver_info_t *isdn_driver(hd_data_t *hd_data, hd_t *hd, cdb_isdn_card *cic);
+static driver_info_t *dsl_driver(hd_data_t *hd_data, hd_t *hd, cdb_isdn_card *cic);
+#endif
+
+static hd_res_t *get_res(hd_t *h, enum resource_types t, unsigned index);
+static driver_info_t *reorder_x11(driver_info_t *di0, char *info);
+static void expand_driver_info(hd_data_t *hd_data, hd_t *hd);
+static char *module_cmd(hd_t *hd, char *cmd);
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+void hddb_init_pci(hd_data_t *hd_data)
+{
+ str_list_t *sl = NULL;
+ char *s = NULL, *r;
+ struct utsname ubuf;
+
+ if(!hd_data->hddb_pci) {
+ if(!uname(&ubuf)) {
+ r = getenv("LIBHD_KERNELVERSION");
+ if(!r || !*r) r = ubuf.release;
+ str_printf(&s, 0, "/lib/modules/%s/modules.pcimap", r);
+ sl = read_file(s, 0, 0);
+ s = free_mem(s);
+ }
+
+ hd_data->hddb_pci = parse_pcimap(sl);
+
+ sl = free_str_list(sl);
+ }
+
+ if(!hd_data->hddb_pci_hm) {
+ sl = read_file("/etc/hotplug/pci.handmap", 0, 0);
+ hd_data->hddb_pci_hm = parse_pcimap(sl);
+ sl = free_str_list(sl);
+ }
+}
+
+
+hddb_pci_t *parse_pcimap(str_list_t *file)
+{
+ str_list_t *sl;
+ unsigned len;
+ hddb_pci_t *pci, *p;
+ char buf[64];
+ unsigned u0, u1, u2, u3, u4, u5;
+
+ for(len = 1, sl = file; sl; sl = sl->next) len++;
+
+ pci = new_mem(len * sizeof *pci);
+
+ for(p = pci, sl = file; sl; sl = sl->next) {
+ if(sscanf(sl->str, "%63s %x %x %x %x %x %x", buf, &u0, &u1, &u2, &u3, &u4, &u5) == 7) {
+ p->module = new_str(buf);
+ p->vendor = u0;
+ p->device = u1;
+ p->subvendor = u2;
+ p->subdevice = u3;
+ p->pciclass = u4;
+ p->classmask = u5;
+
+ p++;
+ }
+ }
+
+#if 0
+ fprintf(stderr, "--- pcimap ---\n");
+ for(p = pci; p->module; p++) {
+ fprintf(stderr, "%s, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x\n",
+ p->module, p->vendor, p->device, p->subvendor, p->subdevice,
+ p->pciclass, p->classmask
+ );
+ }
+#endif
+
+ return pci;
+}
+
+
+driver_info_t *hd_pcidb(hd_data_t *hd_data, hddb_pci_t *pci_db, hd_t *hd, driver_info_t *drv_info)
+{
+ unsigned vendor, device, subvendor, subdevice, pciclass;
+ driver_info_t **di = NULL, *di2;
+ pci_t *pci;
+ char *mod_list[16 /* arbitrary */];
+ int mod_prio[sizeof mod_list / sizeof *mod_list];
+ int i, prio, mod_list_len;
+
+ if(!pci_db) return drv_info;
+
+ if(ID_TAG(hd->vendor.id) != TAG_PCI) return drv_info;
+
+ /* don't add module info if driver info of some other type exists */
+ for(di = &drv_info; *di; di = &(*di)->next) {
+ if((*di)->any.type != di_module) return drv_info;
+ }
+
+ vendor = ID_VALUE(hd->vendor.id);
+ device = ID_VALUE(hd->device.id);
+ subvendor = ID_VALUE(hd->sub_vendor.id);
+ subdevice = ID_VALUE(hd->sub_device.id);
+ pciclass = (hd->base_class.id << 16) + ((hd->sub_class.id & 0xff) << 8) + (hd->prog_if.id & 0xff);
+
+ if(
+ hd->detail &&
+ hd->detail->type == hd_detail_pci &&
+ (pci = hd->detail->pci.data)
+ ) {
+ pciclass = (pci->base_class << 16) + ((pci->sub_class & 0xff) << 8) + (pci->prog_if & 0xff);
+ }
+
+ for(mod_list_len = 0; pci_db->module; pci_db++) {
+ if(
+ (pci_db->vendor == 0xffffffff || pci_db->vendor == vendor) &&
+ (pci_db->device == 0xffffffff || pci_db->device == device) &&
+ (pci_db->subvendor == 0xffffffff || pci_db->subvendor == subvendor) &&
+ (pci_db->subdevice == 0xffffffff || pci_db->subdevice == subdevice) &&
+ !((pci_db->pciclass ^ pciclass) & pci_db->classmask)
+ ) {
+ for(di2 = drv_info; di2; di2 = di2->next) {
+ if(
+ di2->any.type == di_module &&
+ di2->any.hddb0 &&
+ di2->any.hddb0->str &&
+ !strcmp(di2->any.hddb0->str, pci_db->module)
+ ) break;
+ }
+
+ if(di2) continue;
+
+ prio = 0;
+ if(pci_db->vendor == vendor) prio = 1;
+ if(pci_db->device == device) prio = 2;
+ if(pci_db->subvendor == subvendor) prio = 3;
+ if(pci_db->subdevice == subdevice) prio = 4;
+
+ mod_prio[mod_list_len] = prio;
+ mod_list[mod_list_len++] = pci_db->module;
+
+ if(mod_list_len >= sizeof mod_list / sizeof *mod_list) break;
+ }
+ }
+
+ for(prio = 4; prio >= 0; prio--) {
+ for(i = 0; i < mod_list_len; i++) {
+ if(mod_prio[i] == prio) {
+ *di = new_mem(sizeof **di);
+ (*di)->any.type = di_module;
+ (*di)->module.modprobe = 1;
+ add_str_list(&(*di)->any.hddb0, mod_list[i]);
+ di = &(*di)->next;
+ }
+ }
+ }
+
+ return drv_info;
+}
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+void hddb_init(hd_data_t *hd_data)
+{
+ hddb_init_pci(hd_data);
+ hddb_init_external(hd_data);
+
+#ifndef HDDB_EXTERNAL_ONLY
+ hd_data->hddb2[1] = &hddb_internal;
+#endif
+
+#ifdef HDDB_TEST
+ test_db(hd_data);
+#endif
+}
+
+
+void hddb_init_external(hd_data_t *hd_data)
+{
+ str_list_t *sl, *sl0;
+ line_t *l;
+ unsigned l_start, l_end /* end points _past_ last element */;
+ unsigned u, ent, l_nr = 1;
+ tmp_entry_t tmp_entry[he_nomask /* _must_ be he_nomask! */];
+ hddb_entry_mask_t entry_mask = 0;
+ int state;
+ hddb_list_t dbl = {};
+ hddb2_data_t *hddb2;
+
+ if(hd_data->hddb2[0]) return;
+
+ hddb2 = hd_data->hddb2[0] = new_mem(sizeof *hd_data->hddb2[0]);
+
+ sl0 = read_file(ID_LIST, 0, 0);
+
+ l_start = l_end = 0;
+ state = 0;
+
+ for(sl = sl0; sl; sl = sl->next, l_nr++) {
+ l = parse_line(sl->str);
+ if(!l) {
+ ADD2LOG("hd.ids line %d: invalid line\n", l_nr);
+ state = 4;
+ break;
+ };
+ if(l->prefix == pref_empty) continue;
+ switch(l->prefix) {
+ case pref_new:
+ if((state == 2 && !entry_mask) || state == 1) {
+ ADD2LOG("hd.ids line %d: new item not allowed\n", l_nr);
+ state = 4;
+ break;
+ }
+ if(state == 2 && entry_mask) {
+ ent = store_entry(hddb2, tmp_entry);
+ if(ent == -1u) {
+ ADD2LOG("hd.ids line %d: internal hddb oops 1\n", l_nr);
+ state = 4;
+ break;
+ }
+ if(l_end && l_end > l_start) {
+ for(u = l_start; u < l_end; u++) {
+ hddb2->list[u].value_mask = entry_mask;
+ hddb2->list[u].value = ent;
+ }
+ }
+ }
+ entry_mask = 0;
+ clear_entry(tmp_entry);
+ state = 1;
+ l_start = store_list(hddb2, &dbl);
+ l_end = l_start + 1;
+ break;
+
+ case pref_and:
+ if(state != 1) {
+ ADD2LOG("hd.ids line %d: must start item first\n", l_nr);
+ state = 4;
+ break;
+ }
+ break;
+
+ case pref_or:
+ if(state != 1 || !entry_mask || l_end <= l_start || l_end < 1) {
+ ADD2LOG("hd.ids line %d: must start item first\n", l_nr);
+ state = 4;
+ break;
+ }
+ ent = store_entry(hddb2, tmp_entry);
+ if(ent == -1u) {
+ ADD2LOG("hd.ids line %d: internal hddb oops 2\n", l_nr);
+ state = 4;
+ break;
+ }
+ hddb2->list[l_end - 1].key_mask = entry_mask;
+ hddb2->list[l_end - 1].key = ent;
+ entry_mask = 0;
+ clear_entry(tmp_entry);
+ u = store_list(hddb2, &dbl);
+ if(u != l_end) {
+ ADD2LOG("hd.ids line %d: internal hddb oops 2\n", l_nr);
+ state = 4;
+ break;
+ }
+ l_end++;
+ break;
+
+ case pref_add:
+ if(state == 1 && !entry_mask) {
+ ADD2LOG("hd.ids line %d: driver info not allowed\n", l_nr);
+ state = 4;
+ break;
+ }
+ if(state == 1 && l_end > l_start) {
+ ent = store_entry(hddb2, tmp_entry);
+ if(ent == -1u) {
+ ADD2LOG("hd.ids line %d: internal hddb oops 3\n", l_nr);
+ state = 4;
+ break;
+ }
+ hddb2->list[l_end - 1].key_mask = entry_mask;
+ hddb2->list[l_end - 1].key = ent;
+ entry_mask = 0;
+ clear_entry(tmp_entry);
+ state = 2;
+ }
+ if(state != 2 || l_end == 0) {
+ ADD2LOG("hd.ids line %d: driver info not allowed\n", l_nr);
+ state = 4;
+ break;
+ }
+ break;
+
+ default:
+ state = 4;
+ }
+
+ if(state != 4) {
+ u = add_entry(hddb2, tmp_entry, l->key, l->value);
+ if(u) {
+ entry_mask |= u;
+ }
+ else {
+ ADD2LOG("hd.ids line %d: invalid info\n", l_nr);
+ state = 4;
+ }
+ }
+
+ if(state == 4) break; /* error */
+ }
+
+ /* finalize last item */
+ if(state == 2 && entry_mask) {
+ ent = store_entry(hddb2, tmp_entry);
+ if(ent == -1u) {
+ ADD2LOG("hd.ids line %d: internal hddb oops 4\n", l_nr);
+ state = 4;
+ }
+ else if(l_end && l_end > l_start) {
+ for(u = l_start; u < l_end; u++) {
+ hddb2->list[u].value_mask = entry_mask;
+ hddb2->list[u].value = ent;
+ }
+ }
+ }
+
+ sl0 = free_str_list(sl0);
+
+ if(state == 4) {
+ /* there was an error */
+
+ free_mem(hddb2->list);
+ free_mem(hddb2->ids);
+ free_mem(hddb2->strings);
+ hd_data->hddb2[0] = free_mem(hd_data->hddb2[0]);
+ }
+}
+
+
+line_t *parse_line(char *str)
+{
+ static line_t l;
+ char *s;
+ int i;
+
+ /* drop leading spaces */
+ while(isspace(*str)) str++;
+
+ /* skip emtpy lines and comments */
+ if(!*str || *str == ';' || *str == '#') {
+ l.prefix = pref_empty;
+ return &l;
+ }
+
+ l.prefix = pref_new;
+
+ switch(*str) {
+ case '&':
+ l.prefix = pref_and;
+ str++;
+ break;
+
+ case '|':
+ l.prefix = pref_or;
+ str++;
+ break;
+
+ case '+':
+ l.prefix = pref_add;
+ str++;
+ break;
+ }
+
+ /* skip spaces */
+ while(isspace(*str)) str++;
+
+ s = str;
+ while(*str && !isspace(*str)) str++;
+ if(*str) *str++ = 0;
+ while(isspace(*str)) str++;
+
+ for(i = 0; (unsigned) i < sizeof hddb_entry_strings / sizeof *hddb_entry_strings; i++) {
+ if(!strcmp(s, hddb_entry_strings[i])) {
+ l.key = i;
+ break;
+ }
+ }
+
+ if((unsigned) i >= sizeof hddb_entry_strings / sizeof *hddb_entry_strings) return NULL;
+
+ l.value = str;
+
+ /* drop trailing white space */
+ i = strlen(str);
+ while(i > 0) {
+ if(isspace(str[i - 1]))
+ str[--i] = 0;
+ else
+ break;
+ }
+
+ /* special case: drop leading and final double quotes, if any */
+ i = strlen(l.value);
+ if(i >= 2 && l.value[0] == '"' && l.value[i - 1] == '"') {
+ l.value[i - 1] = 0;
+ l.value++;
+ }
+
+ // fprintf(stderr, "pre = %d, key = %d, val = \"%s\"\n", l.prefix, l.key, l.value);
+
+ return &l;
+}
+
+
+unsigned store_string(hddb2_data_t *x, char *str)
+{
+ unsigned l = strlen(str), u;
+
+ if(x->strings_len + l >= x->strings_max) {
+ x->strings_max += l + 0x1000; /* >4k steps */
+ x->strings = resize_mem(x->strings, x->strings_max * sizeof *x->strings);
+ }
+
+ /* make sure the 1st byte is 0 */
+ if(x->strings_len == 0) {
+ *x->strings = 0; /* resize_mem does _not_ clear memory */
+ x->strings_len = 1;
+ }
+
+ if(l == 0) return 0; /* 1st byte is always 0 */
+
+ strcpy(x->strings + (u = x->strings_len), str);
+ x->strings_len += l + 1;
+
+ return u;
+}
+
+
+unsigned store_list(hddb2_data_t *x, hddb_list_t *list)
+{
+ if(x->list_len == x->list_max) {
+ x->list_max += 0x100; /* 4k steps */
+ x->list = resize_mem(x->list, x->list_max * sizeof *x->list);
+ }
+
+ x->list[x->list_len++] = *list;
+
+ return x->list_len - 1;
+}
+
+
+unsigned store_value(hddb2_data_t *x, unsigned val)
+{
+ if(x->ids_len == x->ids_max) {
+ x->ids_max += 0x400; /* 4k steps */
+ x->ids = resize_mem(x->ids, x->ids_max * sizeof *x->ids);
+ }
+
+ x->ids[x->ids_len++] = val;
+
+ return x->ids_len - 1;
+}
+
+
+/* returns index in hddb2->ids */
+unsigned store_entry(hddb2_data_t *x, tmp_entry_t *te)
+{
+ int i, j;
+ unsigned ent = -1, u, v;
+
+ for(i = 0; i < he_nomask; i++) {
+ if(te[i].len) {
+ for(j = 0; j < te[i].len; j++) {
+ v = te[i].val[j] | (1 << 31);
+ if(j == te[i].len - 1) v &= ~(1 << 31);
+ u = store_value(x, v);
+ if(ent == -1u) ent = u;
+ }
+ }
+ }
+
+ return ent;
+}
+
+void clear_entry(tmp_entry_t *te)
+{
+ memset(te, 0, he_nomask * sizeof *te);
+}
+
+void add_value(tmp_entry_t *te, hddb_entry_t idx, unsigned val)
+{
+ if(idx >= he_nomask) return;
+ te += idx;
+
+ if((unsigned) te->len >= sizeof te->val / sizeof *te->val) return;
+
+ te->val[te->len++] = val;
+}
+
+int parse_id(char *str, unsigned *id, unsigned *range, unsigned *mask)
+{
+ static unsigned id0, val;
+ unsigned tag = 0;
+ char c = 0, *s, *t = NULL;
+
+ *id = *range = *mask = 0;
+
+ if(!str || !*str) return 0;
+
+ for(s = str; *str && !isspace(*str); str++);
+ if(*str) {
+ c = *(t = str); /* remember for later */
+ *str++ = 0;
+ }
+ while(isspace(*str)) str++;
+
+ if(*s) {
+ if(!strcmp(s, "pci")) tag = TAG_PCI;
+ else if(!strcmp(s, "usb")) tag = TAG_USB;
+ else if(!strcmp(s, "special")) tag = TAG_SPECIAL;
+ else if(!strcmp(s, "eisa")) tag = TAG_EISA;
+ else if(!strcmp(s, "isapnp")) tag = TAG_EISA;
+ else if(!strcmp(s, "pcmcia")) tag = TAG_PCMCIA;
+ else {
+ str = s;
+ if(t) *t = c; /* restore */
+ }
+ }
+
+ id0 = strtoul(str, &s, 0);
+
+ if(s == str) {
+ id0 = name2eisa_id(str);
+ if(!id0) return 0;
+ s = str + 3;
+ id0 = ID_VALUE(id0);
+ if(!tag) tag = TAG_EISA;
+ }
+
+ while(isspace(*s)) s++;
+ if(*s && *s != '&' && *s != '+') return 0;
+
+ *id = MAKE_ID(tag, id0);
+
+ if(!*s) return 1;
+
+ c = *s++;
+
+ while(isspace(*s)) s++;
+
+ val = strtoul(s, &str, 0);
+
+ if(s == str) return 0;
+
+ while(isspace(*str)) str++;
+
+ if(*str) return 0;
+
+ if(c == '+') *range = val; else *mask = val;
+
+ return c == '+' ? 2 : 3;
+}
+
+
+hddb_entry_mask_t add_entry(hddb2_data_t *hddb2, tmp_entry_t *te, hddb_entry_t idx, char *str)
+{
+ hddb_entry_mask_t mask = 0;
+ int i;
+ unsigned u, u0, u1, u2;
+ char *s, c;
+
+ for(i = 0; (unsigned) i < sizeof hddb_is_numeric / sizeof *hddb_is_numeric; i++) {
+ if(idx == hddb_is_numeric[i]) break;
+ }
+
+ if((unsigned) i < sizeof hddb_is_numeric / sizeof *hddb_is_numeric) {
+ /* numeric id */
+ mask |= 1 << idx;
+
+ i = parse_id(str, &u0, &u1, &u2);
+
+ switch(i) {
+ case 1:
+ add_value(te, idx, MAKE_DATA(FLAG_ID, u0));
+ break;
+
+ case 2:
+ add_value(te, idx, MAKE_DATA(FLAG_RANGE, u1));
+ add_value(te, idx, MAKE_DATA(FLAG_ID, u0));
+ break;
+
+ case 3:
+ add_value(te, idx, MAKE_DATA(FLAG_MASK, u2));
+ add_value(te, idx, MAKE_DATA(FLAG_ID, u0));
+ break;
+
+ default:
+ return 0;
+ }
+ }
+ else {
+ if(idx < he_nomask) {
+ /* strings */
+
+ mask |= 1 << idx;
+ u = store_string(hddb2, str);
+ // fprintf(stderr, ">>> %s\n", str);
+ add_value(te, idx, MAKE_DATA(FLAG_STRING, u));
+ }
+ else {
+ /* special */
+
+ if(idx == he_class_id) {
+ i = parse_id(str, &u0, &u1, &u2);
+ if(i != 1) return 0;
+ u = ID_VALUE(u0) >> 8;
+ add_value(te, he_baseclass_id, MAKE_DATA(FLAG_ID, u));
+ u = u0 & 0xff;
+ add_value(te, he_subclass_id, MAKE_DATA(FLAG_ID, u));
+ /* add_value(te, he_progif_id, MAKE_DATA(FLAG_ID, 0)); */
+ mask |= (1 << he_baseclass_id) + (1 << he_subclass_id) /* + (1 << he_progif_id) */;
+ }
+ else {
+ switch(idx) {
+ case he_driver_module_insmod:
+ c = 'i';
+ break;
+
+ case he_driver_module_modprobe:
+ c = 'm';
+ break;
+
+ case he_driver_module_config:
+ c = 'M';
+ break;
+
+ case he_driver_xfree:
+ c = 'x';
+ break;
+
+ case he_driver_xfree_config:
+ c = 'X';
+ break;
+
+ case he_driver_mouse:
+ c = 'p';
+ break;
+
+ case he_driver_display:
+ c = 'd';
+ break;
+
+ case he_driver_any:
+ c = 'a';
+ break;
+
+ default:
+ c = 0;
+ break;
+ }
+ if(c) {
+ s = new_mem(strlen(str) + 3);
+ s[0] = c;
+ s[1] = '\t';
+ strcpy(s + 2, str);
+ mask |= add_entry(hddb2, te, he_driver, s);
+ s = free_mem(s);
+ }
+ }
+ }
+ }
+
+ return mask;
+}
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+void hddb_dump_raw(hddb2_data_t *hddb, FILE *f)
+{
+ int i;
+ unsigned u, fl, v, t, id;
+ char *s;
+
+ if(!hddb) return;
+
+ fprintf(f, "=== strings 0x%05x/0x%05x ===\n", hddb->strings_len, hddb->strings_max);
+
+ for(s = hddb->strings, i = 0, u = 0; u < hddb->strings_len; u++) {
+ if(!hddb->strings[u]) {
+ fprintf(f, "%4d (0x%05x): \"%s\"\n", i, (unsigned) (s - hddb->strings), s);
+ i++;
+ s = hddb->strings + u + 1;
+ }
+ }
+
+ fprintf(f, "\n=== ids 0x%05x/0x%05x ===\n", hddb->ids_len, hddb->ids_max);
+
+ for(u = 0; u < hddb->ids_len; u++) {
+ fprintf(f, "0x%05x: 0x%08x ", u, hddb->ids[u]);
+ if(hddb->ids[u] & (1 << 31)) fprintf(f, " ");
+ fl = DATA_FLAG(hddb->ids[u]) & 0x7;
+ v = DATA_VALUE(hddb->ids[u]);
+ if(fl == FLAG_STRING && v < hddb->strings_len) {
+ fprintf(f, "\"%s\"", hddb->strings + v);
+ }
+ else if(fl == FLAG_MASK) {
+ fprintf(f, "&0x%04x", v);
+ }
+ else if(fl == FLAG_RANGE) {
+ fprintf(f, "+0x%04x", v);
+ }
+ else if(fl == FLAG_ID) {
+ t = ID_TAG(v);
+ id = ID_VALUE(v);
+ fprintf(f, "%s0x%04x", hid_tag_name(t), id);
+ if(t == TAG_EISA) {
+ fprintf(f, " (%s)", eisa_vendor_str(id));
+ }
+ }
+ fprintf(f, "\n");
+ }
+
+ fprintf(f, "\n=== search list 0x%05x/0x%05x ===\n", hddb->list_len, hddb->list_max);
+
+ for(u = 0; u < hddb->list_len; u++) {
+ fprintf(f,
+ "%4d: 0x%08x 0x%08x 0x%05x 0x%05x\n",
+ u, hddb->list[u].key_mask, hddb->list[u].value_mask,
+ hddb->list[u].key, hddb->list[u].value
+ );
+ }
+}
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+void hddb_dump_ent_name(hddb2_data_t *hddb, FILE *f, char pre, hddb_entry_t ent)
+{
+ int len, tab_ind = 24;
+
+ if(ent >= sizeof hddb_entry_strings / sizeof *hddb_entry_strings) return;
+
+ fprintf(f, "%c%s\t", pre, hddb_entry_strings[ent]);
+
+ len = strlen(hddb_entry_strings[ent]) + 1;
+
+ for(len = (len & ~7) + 8; len < tab_ind; len += 8) {
+ fputc('\t', f);
+ }
+}
+
+
+void hddb_dump_skey(hddb2_data_t *hddb, FILE *f, prefix_t pre, hddb_entry_mask_t key_mask, unsigned key)
+{
+ static char pref_char[5] = { ' ', ' ', '&', '|', '+' };
+ hddb_entry_t ent;
+ unsigned rm_val = 0, r_or_m = 0;
+ unsigned fl, val, *ids, id, tag, u;
+ char *str_val;
+ int i;
+
+ if(pre >= sizeof pref_char) return;
+
+ if(key >= hddb->ids_len) return;
+
+ ids = hddb->ids + key;
+
+ for(ent = 0; ent < he_nomask && key_mask; ent++, key_mask >>= 1) {
+ if(!(key_mask & 1)) continue;
+
+ fl = DATA_FLAG(*ids);
+ val = DATA_VALUE(*ids);
+
+ r_or_m = 0;
+
+ while((fl & FLAG_CONT)) {
+ if(fl == (FLAG_CONT | FLAG_RANGE)) {
+ rm_val = val;
+ r_or_m = 1;
+ }
+ else if(fl == (FLAG_CONT | FLAG_MASK)) {
+ rm_val = val;
+ r_or_m = 2;
+ }
+ else {
+ break;
+ }
+
+ ids++;
+
+ fl = DATA_FLAG(*ids);
+ val = DATA_VALUE(*ids);
+ }
+
+ fl &= ~FLAG_CONT;
+
+ if(ent != he_driver) {
+ hddb_dump_ent_name(hddb, f, pref_char[pre], ent);
+
+ if(fl == FLAG_ID) {
+ tag = ID_TAG(val);
+ id = ID_VALUE(val);
+ if(tag == TAG_EISA && (ent == he_vendor_id || ent == he_subvendor_id)) {
+ fprintf(f, "%s", eisa_vendor_str(id));
+ }
+ else {
+ u = 4;
+ if(ent == he_bus_id || ent == he_subclass_id || ent == he_progif_id) {
+ u = 2;
+ }
+ else if(ent == he_baseclass_id) {
+ u = 3;
+ }
+ fprintf(f, "%s0x%0*x", hid_tag_name(tag), u, id);
+ }
+ if(r_or_m) {
+ fprintf(f, "%c0x%04x", r_or_m == 1 ? '+' : '&', rm_val);
+ }
+ }
+ else if(fl == FLAG_STRING) {
+ if(val < hddb->strings_len) {
+ str_val = hddb->strings + val;
+ fprintf(f, "%s", str_val);
+ }
+ }
+ fputc('\n', f);
+ }
+ else {
+ ids--;
+ do {
+ ids++;
+ fl = DATA_FLAG(*ids) & ~FLAG_CONT;
+ val = DATA_VALUE(*ids);
+ if(fl != FLAG_STRING) break;
+ str_val = NULL;
+ if(val < hddb->strings_len) str_val = hddb->strings + val;
+ if(!str_val) break;
+ if(!*str_val && !str_val[1] == '\t') break;
+
+ switch(*str_val) {
+ case 'x':
+ i = he_driver_xfree;
+ break;
+
+ case 'X':
+ i = he_driver_xfree_config;
+ break;
+
+ case 'i':
+ i = he_driver_module_insmod;
+ break;
+
+ case 'm':
+ i = he_driver_module_modprobe;
+ break;
+
+ case 'M':
+ i = he_driver_module_config;
+ break;
+
+ case 'p':
+ i = he_driver_mouse;
+ break;
+
+ case 'd':
+ i = he_driver_display;
+ break;
+
+ case 'a':
+ i = he_driver_any;
+ break;
+
+ default:
+ i = -1;
+ break;
+ }
+ if(i == -1) break;
+
+ hddb_dump_ent_name(hddb, f, pref_char[pre], i);
+ fprintf(f, "%s\n", str_val + 2);
+ }
+ while((*ids & (1 << 31)));
+ }
+
+ /* at this point 'ids' must be the _current_ entry (_not_ the next) */
+
+ /* skip potential garbage/unhandled entries */
+ while((*ids & (1 << 31))) ids++;
+
+ ids++;
+
+ if(pre != pref_add) pre = pref_and;
+ }
+}
+
+
+void hddb_dump(hddb2_data_t *hddb, FILE *f)
+{
+ unsigned u;
+
+ if(!hddb) return;
+
+ for(u = 0; u < hddb->list_len; u++) {
+ hddb_dump_skey(hddb, f, pref_new, hddb->list[u].key_mask, hddb->list[u].key);
+ hddb_dump_skey(hddb, f, pref_add, hddb->list[u].value_mask, hddb->list[u].value);
+ fputc('\n', f);
+ }
+}
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+int compare_ids(hddb2_data_t *hddb, hddb_search_t *hs, hddb_entry_mask_t mask, unsigned key)
+{
+ hddb_entry_t ent;
+ unsigned rm_val = 0, r_or_m = 0, res = 0;
+ unsigned fl, val, ok, *ids, id;
+ char *str, *str_val;
+
+ if(key >= hddb->ids_len) return 1;
+
+ ids = hddb->ids + key;
+
+ for(ent = 0; ent < he_nomask && mask && !res; ent++, mask >>= 1) {
+ if(!(mask & 1)) continue;
+
+ fl = DATA_FLAG(*ids);
+ val = DATA_VALUE(*ids);
+
+ r_or_m = 0;
+
+ while((fl & FLAG_CONT)) {
+ if(fl == (FLAG_CONT | FLAG_RANGE)) {
+ rm_val = val;
+ r_or_m = 1;
+ }
+ else if(fl == (FLAG_CONT | FLAG_MASK)) {
+ rm_val = val;
+ r_or_m = 2;
+ }
+ else {
+ break;
+ }
+
+ ids++;
+
+ fl = DATA_FLAG(*ids);
+ val = DATA_VALUE(*ids);
+ }
+
+ fl &= ~FLAG_CONT;
+
+ id = 0;
+ str = str_val = NULL;
+ ok = 0;
+ if(fl == FLAG_ID) {
+ ok = 1;
+ switch(ent) {
+ case he_bus_id:
+ id = hs->bus.id;
+ break;
+
+ case he_baseclass_id:
+ id = hs->base_class.id;
+ break;
+
+ case he_subclass_id:
+ id = hs->sub_class.id;
+ break;
+
+ case he_progif_id:
+ id = hs->prog_if.id;
+ break;
+
+ case he_vendor_id:
+ id = hs->vendor.id;
+ break;
+
+ case he_device_id:
+ id = hs->device.id;
+ break;
+
+ case he_subvendor_id:
+ id = hs->sub_vendor.id;
+ break;
+
+ case he_subdevice_id:
+ id = hs->sub_device.id;
+ break;
+
+ case he_rev_id:
+ id = hs->revision.id;
+ break;
+ case he_detail_ccw_data_cu_model:
+ id = hs->cu_model.id;
+ break;
+
+ default:
+ ok = 0;
+ break;
+ }
+ }
+ else if(fl == FLAG_STRING) {
+ if(val < hddb->strings_len) str_val = hddb->strings + val;
+ ok = 2;
+ switch(ent) {
+ case he_bus_name:
+ str = hs->bus.name;
+ break;
+
+ case he_baseclass_name:
+ str = hs->base_class.name;
+ break;
+
+ case he_subclass_name:
+ str = hs->sub_class.name;
+ break;
+
+ case he_progif_name:
+ str = hs->prog_if.name;
+ break;
+
+ case he_vendor_name:
+ str = hs->vendor.name;
+ break;
+
+ case he_device_name:
+ str = hs->device.name;
+ break;
+
+ case he_subvendor_name:
+ str = hs->sub_vendor.name;
+ break;
+
+ case he_subdevice_name:
+ str = hs->sub_device.name;
+ break;
+
+ case he_rev_name:
+ str = hs->revision.name;
+ break;
+
+ case he_serial:
+ str = hs->serial;
+ break;
+
+ case he_requires:
+ str = hs->requires;
+ break;
+
+ default:
+ ok = 0;
+ }
+ }
+
+ switch(ok) {
+ case 1:
+ switch(r_or_m) {
+ case 1:
+ if(id < val || id >= val + rm_val) res = 1;
+ break;
+
+ case 2:
+ if((id & ~rm_val) != val) res = 1;
+ break;
+
+ default:
+ if(id != val) res = 1;
+ }
+ break;
+
+ case 2:
+ if(str && str_val) {
+ if(strcmp(str, str_val)) res = 1;
+ }
+ else {
+ res = 1;
+ }
+ break;
+
+ default:
+ res = 1;
+ }
+
+#ifdef HDDB_TRACE
+ switch(ok) {
+ case 1:
+ if(r_or_m) {
+ printf(
+ "cmp: 0x%05x: (ent = %2d, id = 0x%x, val = 0x%x%c0x%x) = %d\n",
+ key, ent, id, val, r_or_m == 1 ? '+' : '&', rm_val, res
+ );
+ }
+ else {
+ printf(
+ "cmp: 0x%05x: (ent = %2d, id = 0x%x, val = 0x%x) = %d\n",
+ key, ent, id, val, res
+ );
+ }
+ break;
+
+ case 2:
+ printf(
+ "cmp: 0x%05x: (ent = %2d, id = \"%s\", val = \"%s\") = %d\n",
+ key, ent, str, str_val, res
+ );
+
+ break;
+
+ default:
+ printf("cmp: 0x%05x: (ent = %2d, *** unhandled key ***) = %d\n", key, ent, res);
+ }
+#endif
+
+ /* at this point 'ids' must be the _current_ entry (_not_ the next) */
+
+ /* skip potential garbage/unhandled entries */
+ while((*ids & (1 << 31))) ids++;
+
+ ids++;
+ }
+
+ return res;
+}
+
+void complete_ids(
+ hddb2_data_t *hddb, hddb_search_t *hs,
+ hddb_entry_mask_t key_mask, hddb_entry_mask_t mask, unsigned val_idx
+)
+{
+ hddb_entry_t ent;
+ unsigned *ids, *id;
+ unsigned fl, val, ok;
+ char **str, *str_val;
+
+ if(val_idx >= hddb->ids_len) return;
+
+ ids = hddb->ids + val_idx;
+
+ for(ent = 0; ent < he_nomask && mask; ent++, mask >>= 1) {
+ if(!(mask & 1)) continue;
+
+ fl = DATA_FLAG(*ids);
+ val = DATA_VALUE(*ids);
+
+ fl &= ~FLAG_CONT;
+
+ id = NULL;
+ str = NULL;
+ str_val = NULL;
+ ok = 0;
+ if(fl == FLAG_ID) {
+ ok = 1;
+ switch(ent) {
+ case he_bus_id:
+ id = &hs->bus.id;
+ break;
+
+ case he_baseclass_id:
+ id = &hs->base_class.id;
+ break;
+
+ case he_subclass_id:
+ id = &hs->sub_class.id;
+ break;
+
+ case he_progif_id:
+ id = &hs->prog_if.id;
+ break;
+
+ case he_vendor_id:
+ id = &hs->vendor.id;
+ break;
+
+ case he_device_id:
+ id = &hs->device.id;
+ break;
+
+ case he_subvendor_id:
+ id = &hs->sub_vendor.id;
+ break;
+
+ case he_subdevice_id:
+ id = &hs->sub_device.id;
+ break;
+
+ case he_rev_id:
+ id = &hs->revision.id;
+ break;
+
+ case he_detail_ccw_data_cu_model:
+ id = &hs->cu_model.id;
+ break;
+
+ default:
+ ok = 0;
+ break;
+ }
+ }
+ else if(fl == FLAG_STRING) {
+ if(val < hddb->strings_len) str_val = hddb->strings + val;
+ ok = 2;
+ switch(ent) {
+ case he_bus_name:
+ str = &hs->bus.name;
+ break;
+
+ case he_baseclass_name:
+ str = &hs->base_class.name;
+ break;
+
+ case he_subclass_name:
+ str = &hs->sub_class.name;
+ break;
+
+ case he_progif_name:
+ str = &hs->prog_if.name;
+ break;
+
+ case he_vendor_name:
+ str = &hs->vendor.name;
+ break;
+
+ case he_device_name:
+ str = &hs->device.name;
+ break;
+
+ case he_subvendor_name:
+ str = &hs->sub_vendor.name;
+ break;
+
+ case he_subdevice_name:
+ str = &hs->sub_device.name;
+ break;
+
+ case he_rev_name:
+ str = &hs->revision.name;
+ break;
+
+ case he_serial:
+ str = &hs->serial;
+ break;
+
+ case he_driver:
+ ok = 3;
+ break;
+
+ case he_requires:
+ str = &hs->requires;
+ break;
+
+ default:
+ ok = 0;
+ }
+ }
+
+ if(ok) {
+ if(
+ (hs->value_mask[ent] & key_mask) == hs->value_mask[ent] &&
+ key_mask != hs->value_mask[ent]
+ ) {
+ hs->value_mask[ent] = key_mask;
+ hs->value |= 1 << ent;
+ }
+ else {
+ /* don't change if already set */
+ ok = 4;
+ }
+
+#if 0
+ if((hs->value & (1 << ent))) {
+ /* don't change if already set */
+ ok = 4;
+ }
+ else if(ent != he_driver) {
+ hs->value |= 1 << ent;
+ }
+#endif
+ }
+
+ switch(ok) {
+ case 1:
+ *id = val;
+#ifdef HDDB_TRACE
+ printf("add: 0x%05x: (ent = %2d, val = 0x%08x)\n", val_idx, ent, val);
+#endif
+ break;
+
+ case 2:
+ *str = str_val;
+#ifdef HDDB_TRACE
+ printf("add: 0x%05x: (ent = %2d, val = \"%s\")\n", val_idx, ent, str_val);
+#endif
+ break;
+
+ case 3:
+ ids--;
+ hs->driver = free_str_list(hs->driver);
+ do {
+ ids++;
+ fl = DATA_FLAG(*ids) & ~FLAG_CONT;
+ val = DATA_VALUE(*ids);
+ if(fl != FLAG_STRING) break;
+ str_val = NULL;
+ if(val < hddb->strings_len) str_val = hddb->strings + val;
+ if(!str_val) break;
+#ifdef HDDB_TRACE
+ printf("add: 0x%05x: (ent = %2d, val = \"%s\")\n", val_idx, ent, str_val);
+#endif
+ add_str_list(&hs->driver, str_val);
+ }
+ while((*ids & (1 << 31)));
+ break;
+
+ case 4:
+ break;
+
+#ifdef HDDB_TRACE
+ default:
+ printf("add: 0x%05x: (ent = %2d, *** unhandled value ***)\n", val_idx, ent);
+#endif
+ }
+
+ /* at this point 'ids' must be the _current_ entry (_not_ the next) */
+
+ /* skip potential garbage/unhandled entries */
+ while((*ids & (1 << 31))) ids++;
+
+ ids++;
+ }
+}
+
+int hddb_search(hd_data_t *hd_data, hddb_search_t *hs, int max_recursions)
+{
+ unsigned u;
+ int i;
+ hddb2_data_t *hddb;
+ int db_idx;
+ hddb_entry_mask_t all_values = 0;
+
+ if(!hs) return 0;
+
+ if(!max_recursions) max_recursions = 2;
+
+ while(max_recursions--) {
+ for(db_idx = 0; (unsigned) db_idx < sizeof hd_data->hddb2 / sizeof *hd_data->hddb2; db_idx++) {
+ if(!(hddb = hd_data->hddb2[db_idx])) continue;
+
+ for(u = 0; u < hddb->list_len; u++) {
+ if(
+ (hs->key & hddb->list[u].key_mask) == hddb->list[u].key_mask
+ /* && (hs->value & hddb->list[u].value_mask) != hddb->list[u].value_mask */
+ ) {
+ i = compare_ids(hddb, hs, hddb->list[u].key_mask, hddb->list[u].key);
+ if(!i) {
+ complete_ids(hddb, hs,
+ hddb->list[u].key_mask,
+ hddb->list[u].value_mask, hddb->list[u].value
+ );
+ }
+ }
+ }
+ }
+
+ all_values |= hs->value;
+
+ if(!max_recursions) break;
+
+ hs->key |= hs->value;
+ hs->value = 0;
+ memset(hs->value_mask, 0, sizeof hs->value_mask);
+ }
+
+ hs->value = all_values;
+
+ return 1;
+}
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+#ifdef HDDB_TEST
+void test_db(hd_data_t *hd_data)
+{
+ hddb_search_t hs = {};
+ int i;
+
+ hs.bus.id = 4;
+ hs.key |= (1 << he_bus_id) + (1 << he_serial);
+
+ hs.serial = "ser 0123";
+
+ i = hddb_search(hd_data, &hs, 0);
+
+ printf("%d, >%s<\n", i, hs.bus.name);
+}
+#endif
+
+
+str_list_t *get_hddb_packages(hd_data_t *hd_data)
+{
+ return NULL;
+}
+
+
+unsigned device_class(hd_data_t *hd_data, unsigned vendor, unsigned device)
+{
+ hddb_search_t hs = {};
+
+ hs.vendor.id = vendor;
+ hs.device.id = device;
+ hs.key |= (1 << he_vendor_id) + (1 << he_device_id);
+
+ hddb_search(hd_data, &hs, 1);
+
+ if(
+ (hs.value & ((1 << he_baseclass_id) + (1 << he_subclass_id))) ==
+ ((1 << he_baseclass_id) + (1 << he_subclass_id))
+ ) {
+ return (hs.base_class.id << 8) + (hs.sub_class.id & 0xff);
+ }
+
+ return 0;
+}
+
+
+unsigned sub_device_class(hd_data_t *hd_data, unsigned vendor, unsigned device, unsigned sub_vendor, unsigned sub_device)
+{
+ hddb_search_t hs = {};
+
+ hs.vendor.id = vendor;
+ hs.device.id = device;
+ hs.sub_vendor.id = sub_vendor;
+ hs.sub_device.id = sub_device;
+ hs.key |= (1 << he_vendor_id) + (1 << he_device_id) + (1 << he_subvendor_id) + (1 << he_subdevice_id);
+
+ hddb_search(hd_data, &hs, 1);
+
+ if(
+ (hs.value & ((1 << he_baseclass_id) + (1 << he_subclass_id))) ==
+ ((1 << he_baseclass_id) + (1 << he_subclass_id))
+ ) {
+ return (hs.base_class.id << 8) + (hs.sub_class.id & 0xff);
+ }
+
+ return 0;
+}
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+void hddb_add_info(hd_data_t *hd_data, hd_t *hd)
+{
+ hddb_search_t hs = {};
+ driver_info_t *new_driver_info = NULL;
+#if WITH_ISDN
+ cdb_isdn_card *cic;
+#endif
+
+ if(hd->tag.fixed) return;
+
+ hs.bus.id = hd->bus.id;
+ hs.key |= 1 << he_bus_id;
+
+ hs.base_class.id = hd->base_class.id;
+ hs.key |= 1 << he_baseclass_id;
+
+ hs.sub_class.id = hd->sub_class.id;
+ hs.key |= 1 << he_subclass_id;
+
+ hs.prog_if.id = hd->prog_if.id;
+ hs.key |= 1 << he_progif_id;
+
+ if(hd->vendor.id) {
+ hs.vendor.id = hd->vendor.id;
+ hs.key |= 1 << he_vendor_id;
+ }
+
+ if(hd->vendor.name) {
+ hs.vendor.name = hd->vendor.name;
+ hs.key |= 1 << he_vendor_name;
+ }
+
+ if(hd->device.id) {
+ hs.device.id = hd->device.id;
+ hs.key |= 1 << he_device_id;
+ }
+
+ if(hd->device.name) {
+ hs.device.name = hd->device.name;
+ hs.key |= 1 << he_device_name;
+ }
+
+ if(hd->sub_vendor.id) {
+ hs.sub_vendor.id = hd->sub_vendor.id;
+ hs.key |= 1 << he_subvendor_id;
+ }
+
+ if(hd->sub_device.id) {
+ hs.sub_device.id = hd->sub_device.id;
+ hs.key |= 1 << he_subdevice_id;
+ }
+
+ hs.revision.id = hd->revision.id;
+ hs.key |= 1 << he_rev_id;
+
+ if(hd->revision.name) {
+ hs.revision.name = hd->revision.name;
+ hs.key |= 1 << he_rev_name;
+ }
+
+ if(hd->serial) {
+ hs.serial = hd->serial;
+ hs.key |= 1 << he_serial;
+ }
+
+ if(hd->detail && hd->detail->ccw.data) {
+ hs.cu_model.id=hd->detail->ccw.data->cu_model;
+ hs.key |= 1 << he_detail_ccw_data_cu_model;
+ }
+
+ hddb_search(hd_data, &hs, 0);
+
+ if((hs.value & (1 << he_bus_id))) {
+ hd->bus.id = hs.bus.id;
+ }
+
+ if((hs.value & (1 << he_bus_name))) {
+ if(!hd->ref) free_mem(hd->bus.name);
+ hd->bus.name = new_str(hs.bus.name);
+ }
+
+ if((hs.value & (1 << he_baseclass_id))) {
+ hd->base_class.id = hs.base_class.id;
+ }
+
+ if((hs.value & (1 << he_baseclass_name))) {
+ if(!hd->ref) free_mem(hd->base_class.name);
+ hd->base_class.name = new_str(hs.base_class.name);
+ }
+
+ if((hs.value & (1 << he_subclass_id))) {
+ hd->sub_class.id = hs.sub_class.id;
+ }
+
+ if((hs.value & (1 << he_subclass_name))) {
+ if(!hd->ref) free_mem(hd->sub_class.name);
+ hd->sub_class.name = new_str(hs.sub_class.name);
+ }
+
+ if((hs.value & (1 << he_progif_id))) {
+ hd->prog_if.id = hs.prog_if.id;
+ }
+
+ if((hs.value & (1 << he_progif_name))) {
+ if(!hd->ref) free_mem(hd->prog_if.name);
+ hd->prog_if.name = new_str(hs.prog_if.name);
+ }
+
+ if((hs.value & (1 << he_requires))) {
+ if(!hd->ref) hd->requires = free_str_list(hd->requires);
+ hd->requires = hd_split('|', hs.requires);
+ }
+
+ if((hs.value & (1 << he_vendor_id))) {
+ hd->vendor.id = hs.vendor.id;
+ }
+
+ if((hs.value & (1 << he_vendor_name))) {
+ if(!hd->ref) free_mem(hd->vendor.name);
+ hd->vendor.name = new_str(hs.vendor.name);
+ }
+
+ if((hs.value & (1 << he_device_id))) {
+ hd->device.id = hs.device.id;
+ }
+
+ if((hs.value & (1 << he_device_name))) {
+ if(!hd->ref) free_mem(hd->device.name);
+ hd->device.name = new_str(hs.device.name);
+ }
+
+ if((hs.value & (1 << he_subvendor_id))) {
+ hd->sub_vendor.id = hs.sub_vendor.id;
+ }
+
+ if((hs.value & (1 << he_subvendor_name))) {
+ if(!hd->ref) free_mem(hd->sub_vendor.name);
+ hd->sub_vendor.name = new_str(hs.sub_vendor.name);
+ }
+
+ if((hs.value & (1 << he_subdevice_id))) {
+ hd->sub_device.id = hs.sub_device.id;
+ }
+
+ if((hs.value & (1 << he_subdevice_name))) {
+ if(!hd->ref) free_mem(hd->sub_device.name);
+ hd->sub_device.name = new_str(hs.sub_device.name);
+ }
+
+ if((hs.value & (1 << he_detail_ccw_data_cu_model))) {
+ if(hd->detail && hd->detail->ccw.data)
+ hd->detail->ccw.data->cu_model=hs.cu_model.id;
+ }
+
+ /* look for sub vendor again */
+
+ if(!hd->sub_vendor.name && hd->sub_vendor.id) {
+ hddb_search_t hs2 = {};
+
+ hs2.vendor.id = hd->sub_vendor.id;
+ hs2.key |= 1 << he_vendor_id;
+
+ hddb_search(hd_data, &hs2, 1);
+
+ if((hs2.value & (1 << he_vendor_name))) {
+ hd->sub_vendor.name = new_str(hs2.vendor.name);
+ }
+ }
+
+ /* look for compat device name */
+ if(
+ hd->compat_vendor.id &&
+ hd->compat_device.id &&
+ !hd->compat_vendor.name &&
+ !hd->compat_device.name
+ ) {
+ hddb_search_t hs2 = {};
+
+ hs2.vendor.id = hd->compat_vendor.id;
+ hs2.key |= 1 << he_vendor_id;
+
+ hs2.device.id = hd->compat_device.id;
+ hs2.key |= 1 << he_device_id;
+
+ hddb_search(hd_data, &hs2, 1);
+
+ if((hs2.value & (1 << he_vendor_name))) {
+ hd->compat_vendor.name = new_str(hs2.vendor.name);
+ }
+
+ if((hs2.value & (1 << he_device_name))) {
+ hd->compat_device.name = new_str(hs2.device.name);
+ }
+ }
+
+ /* get package info for compat device id */
+
+ if(!hd->requires) {
+ hddb_search_t hs2 = {};
+
+ hs2.vendor.id = hd->compat_vendor.id;
+ hs2.key |= 1 << he_vendor_id;
+
+ hs2.device.id = hd->compat_device.id;
+ hs2.key |= 1 << he_device_id;
+
+ hddb_search(hd_data, &hs2, 1);
+
+ if((hs2.value & (1 << he_requires))) {
+ hd->requires = hd_split('|', hs2.requires);
+ }
+ }
+
+ /* get driver info */
+
+#if WITH_ISDN
+ if((cic = get_isdn_info(hd))) {
+ new_driver_info = isdn_driver(hd_data, hd, cic);
+ if(!hd->model && cic->lname && *cic->lname) {
+ hd->model = new_str(cic->lname);
+ }
+ free_mem(cic);
+ }
+ if (!new_driver_info && ((cic = get_dsl_info(hd)))) {
+ new_driver_info = dsl_driver(hd_data, hd, cic);
+ if(!hd->model && cic->lname && *cic->lname) {
+ hd->model = new_str(cic->lname);
+ }
+ free_mem(cic);
+ }
+#endif
+
+ if(!new_driver_info) {
+ new_driver_info = hd_pcidb(hd_data, hd_data->hddb_pci_hm, hd, new_driver_info);
+ }
+
+ if(!new_driver_info && (hs.value & (1 << he_driver))) {
+ new_driver_info = hddb_to_device_driver(hd_data, &hs);
+ }
+
+ if(!new_driver_info && (hd->compat_vendor.id || hd->compat_device.id)) {
+ memset(&hs, 0, sizeof hs);
+
+ if(hd->compat_vendor.id) {
+ hs.vendor.id = hd->compat_vendor.id;
+ hs.key |= 1 << he_vendor_id;
+ }
+ if(hd->compat_device.id) {
+ hs.device.id = hd->compat_device.id;
+ hs.key |= 1 << he_device_id;
+ }
+
+ hddb_search(hd_data, &hs, 1);
+
+ if((hs.value & (1 << he_driver))) {
+ new_driver_info = hddb_to_device_driver(hd_data, &hs);
+ }
+ }
+
+ if(!new_driver_info && hd->base_class.id == bc_keyboard) {
+ new_driver_info = kbd_driver(hd_data, hd);
+ }
+
+ if(!new_driver_info && hd->base_class.id == bc_monitor) {
+ new_driver_info = monitor_driver(hd_data, hd);
+ }
+
+ new_driver_info = hd_pcidb(hd_data, hd_data->hddb_pci, hd, new_driver_info);
+
+ if(new_driver_info) {
+ if(!hd->ref) {
+ hd->driver_info = free_driver_info(hd->driver_info);
+ }
+ hd->driver_info = new_driver_info;
+ expand_driver_info(hd_data, hd);
+ }
+
+ free_str_list(hs.driver);
+}
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+driver_info_t *hddb_to_device_driver(hd_data_t *hd_data, hddb_search_t *hs)
+{
+ char *s, *t, *t0;
+ driver_info_t *di = NULL, *di0 = NULL;
+ str_list_t *sl;
+
+ for(sl = hs->driver; sl; sl = sl->next) {
+ if(!sl->str || !*sl->str || sl->str[1] != '\t') return NULL;
+
+ if(di && (*sl->str == 'M' || *sl->str == 'X')) {
+ add_str_list(&di->any.hddb1, sl->str + 2);
+ continue;
+ }
+
+ if(di)
+ di = di->next = new_mem(sizeof *di);
+ else
+ di = di0 = new_mem(sizeof *di);
+
+ switch(*sl->str) {
+ case 'd':
+ di->any.type = di_display;
+ break;
+
+ case 'm':
+ di->module.modprobe = 1;
+ case 'i':
+ di->any.type = di_module;
+ break;
+
+ case 'p':
+ di->any.type = di_mouse;
+ break;
+
+ case 'x':
+ di->any.type = di_x11;
+ break;
+
+ default:
+ di->any.type = di_any;
+ }
+
+ s = new_str(sl->str + 2);
+ for(t0 = s; (t = strsep(&t0, "|")); ) {
+ add_str_list(&di->any.hddb0, t);
+ }
+ free_mem(s);
+ }
+
+ return di0;
+}
+
+
+driver_info_t *kbd_driver(hd_data_t *hd_data, hd_t *hd)
+{
+ driver_info_t *di;
+ driver_info_kbd_t *ki;
+ int arch = hd_cpu_arch(hd_data);
+ unsigned u;
+ char *s1, *s2;
+ hd_t *hd_tmp;
+ usb_t *usb;
+
+ /* country codes
+ 1 Arabic
+ 2 Belgian
+ 3 Canadian-Bilingual
+ 4 Canadian-French
+ 5 Czech Republic
+ 6 Danish
+ 7 Finnish
+ 8 French
+ 9 German
+ 10 Greek
+ 11 Hebrew
+ 12 Hungary
+ 13 International (ISO)
+ 14 Italian
+ 15 Japan (Katakana)
+ 16 Korean
+ 17 Latin American
+ 18 Netherlands/Dutch
+ 19 Norwegian
+ 20 Persian (Farsi)
+ 21 Poland
+ 22 Portuguese
+ 23 Russia
+ 24 Slovakia
+ 25 Spanish
+ 26 Swedish
+ 27 Swiss/French
+ 28 Swiss/German
+ 29 Switzerland
+ 30 Taiwan
+ 31 Turkish
+ 32 UK
+ 33 US
+ 34 Yugoslavia
+ */
+ static struct {
+ unsigned country;
+ char *layout;
+ char *keymap;
+ } country_code[] = {
+ { 5, "cs", "cz-us-qwertz" },
+ { 8, "fr", "fr-latin1" },
+ { 9, "de", "de-latin1-nodeadkeys" },
+ { 10, "gr", "gr" },
+ { 14, "it", "it" },
+ { 18, "nl", "us" },
+ { 23, "ru", "ru1" },
+ { 25, "es", "es" },
+ { 32, "uk", "uk" },
+ { 33, "us", "us" }
+ };
+
+ if(hd->sub_class.id == sc_keyboard_console) return NULL;
+
+ di = new_mem(sizeof *di);
+ di->kbd.type = di_kbd;
+ ki = &(di->kbd);
+
+ switch(arch) {
+ case arch_intel:
+ case arch_x86_64:
+ case arch_alpha:
+ ki->XkbRules = new_str("xfree86");
+ ki->XkbModel = new_str("pc104");
+ break;
+
+ case arch_ppc:
+ case arch_ppc64:
+ ki->XkbRules = new_str("xfree86");
+ ki->XkbModel = new_str("macintosh");
+ for(hd_tmp = hd_data->hd; hd_tmp; hd_tmp = hd_tmp->next) {
+ if(
+ hd_tmp->base_class.id == bc_internal &&
+ hd_tmp->sub_class.id == sc_int_cpu &&
+ hd_tmp->detail &&
+ hd_tmp->detail->type == hd_detail_cpu &&
+ hd_tmp->detail->cpu.data
+ ) {
+ s1 = hd_tmp->detail->cpu.data->vend_name;
+ if(s1 && (strstr(s1, "CHRP ") == s1 || strstr(s1, "PReP ") == s1)) {
+ free_mem(ki->XkbModel);
+ ki->XkbModel = new_str("pc104");
+ }
+ }
+ }
+ break;
+
+ case arch_sparc:
+ case arch_sparc64:
+ if(hd->vendor.id == MAKE_ID(TAG_SPECIAL, 0x0202)) {
+ ki->XkbRules = new_str("sun");
+ u = ID_VALUE(hd->device.id);
+ if(u == 4) ki->XkbModel = new_str("type4");
+ if(u == 5) {
+ ki->XkbModel = new_str(ID_VALUE(hd->sub_device.id) == 2 ? "type5_euro" : "type5");
+ }
+ s1 = s2 = NULL;
+
+ switch(hd->prog_if.id) {
+ case 0: case 1: case 33: case 34: case 80: case 81:
+ default:
+ s1 = "us"; s2 = "sunkeymap";
+ break;
+
+ case 2:
+ s1 = "fr"; s2 = "sunt5-fr-latin1"; // fr_BE?
+ break;
+
+ case 3:
+ s1 = "ca";
+ break;
+
+ case 4: case 36: case 83:
+ s1 = "dk";
+ break;
+
+ case 5: case 37: case 84:
+ s1 = "de"; s2 = "sunt5-de-latin1";
+ break;
+
+ case 6: case 38: case 85:
+ s1 = "it";
+ break;
+
+ case 7: case 39: case 86:
+ s1 = "nl";
+ break;
+
+ case 8: case 40: case 87:
+ s1 = "no";
+ if(u == 4) s2 = "sunt4-no-latin1";
+ break;
+
+ case 9: case 41: case 88:
+ s1 = "pt";
+ break;
+
+ case 10: case 42: case 89:
+ s1 = "es";
+ s2 = u == 4 ? "sunt4-es" : "sunt5-es";
+ break;
+
+ case 11: case 43: case 90:
+ s1 = "se"; s2 = "sunt5-fi-latin1"; // se is swedish, not fi
+ break;
+
+ case 12: case 44: case 91:
+ s1 = "fr"; s2 = "sunt5-fr-latin1"; // fr_CH
+ break;
+
+ case 13: case 45: case 92:
+ s1 = "de"; s2 = "sunt5-de-latin1"; // de_CH
+ break;
+
+ case 14: case 46: case 93:
+ s1 = "gb"; s2 = "sunt5-uk";
+ break;
+
+ case 16: case 47: case 94:
+ s1 = "ko";
+ break;
+
+ case 17: case 48: case 95:
+ s1 = "tw";
+ break;
+
+ case 32: case 49: case 96:
+ s1 = "jp";
+ break;
+
+ case 50: case 97:
+ s1 = "fr"; s2 = "sunt5-fr-latin1"; // fr_CA
+ break;
+
+ case 51:
+ s1 = "hu";
+ break;
+
+ case 52:
+ s1 = "pl"; s2 = "sun-pl";
+ break;
+
+ case 53:
+ s1 = "cs";
+ break;
+
+ case 54:
+ s1 = "ru"; s2 = "sunt5-ru";
+ break;
+ }
+ ki->XkbLayout = new_str(s1);
+ ki->keymap = new_str(s2);
+ }
+ else {
+ ki->XkbRules = new_str("xfree86");
+ ki->XkbModel = new_str("pc104");
+ }
+ break;
+
+ default:
+ ki->XkbRules = new_str("xfree86");
+ }
+
+ if(
+ hd->bus.id == bus_usb &&
+ hd->detail &&
+ hd->detail->type == hd_detail_usb &&
+ (usb = hd->detail->usb.data) &&
+ usb->country
+ ) {
+ for(u = 0; u < sizeof country_code / sizeof *country_code; u++) {
+ if(country_code[u].country == usb->country) {
+ if(!ki->XkbLayout) ki->XkbLayout = new_str(country_code[u].layout);
+ if(!ki->keymap) ki->keymap = new_str(country_code[u].keymap);
+ break;
+ }
+ }
+ }
+
+ return di;
+}
+
+
+driver_info_t *monitor_driver(hd_data_t *hd_data, hd_t *hd)
+{
+ driver_info_t *di = NULL;
+ driver_info_display_t *ddi;
+ monitor_info_t *mi;
+ hd_res_t *res;
+ unsigned width = 640, height = 480;
+
+ if(
+ hd->detail &&
+ hd->detail->type == hd_detail_monitor &&
+ (mi = hd->detail->monitor.data) &&
+ mi->min_hsync
+ ) {
+ di = new_mem(sizeof *di);
+ di->display.type = di_display;
+ ddi = &(di->display);
+
+ ddi->min_vsync = mi->min_vsync;
+ ddi->max_vsync = mi->max_vsync;
+ ddi->min_hsync = mi->min_hsync;
+ ddi->max_hsync = mi->max_hsync;
+
+ for(res = hd->res; res; res = res->next) {
+ if(res->any.type == res_monitor) {
+ if(res->monitor.width * res->monitor.height > width * height ) {
+ width = res->monitor.width;
+ height = res->monitor.height;
+ }
+ }
+ }
+
+ ddi->width = width;
+ ddi->height = height;
+ }
+
+ return di;
+}
+
+
+#if WITH_ISDN
+
+#if 0
+int chk_free_biosmem(hd_data_t *hd_data, unsigned addr, unsigned len)
+{
+ unsigned u;
+ unsigned char c;
+
+ addr -= hd_data->bios_rom.start;
+ if(
+ !hd_data->bios_rom.data ||
+ addr >= hd_data->bios_rom.size ||
+ addr + len > hd_data->bios_rom.size
+ ) return 0;
+
+ for(c = 0xff, u = addr; u < addr + len; u++) {
+ c &= hd_data->bios_rom.data[u];
+ }
+
+ return c == 0xff ? 1 : 0;
+}
+
+isdn_parm_t *new_isdn_parm(isdn_parm_t **ip)
+{
+ while(*ip) ip = &(*ip)->next;
+
+ return *ip = new_mem(sizeof **ip);
+}
+#endif
+
+driver_info_t *isdn_driver(hd_data_t *hd_data, hd_t *hd, cdb_isdn_card *cic)
+{
+ driver_info_t *di0, *di;
+ cdb_isdn_vario *civ;
+/* hd_res_t *res;
+ uint64_t i, irqs, irqs2;
+ int irq_val, pnr;
+*/
+ int drv;
+ str_list_t *sl, *sl0;
+
+ if(!cic) return NULL;
+
+ di0 = new_mem(sizeof *di0);
+
+ drv = cic->vario;
+ di = NULL;
+
+ while((civ = hd_cdbisdn_get_vario(drv))) {
+ drv = civ->next_vario;
+ if (di) {
+ di->next = new_mem(sizeof *di);
+ di = di->next;
+ } else {
+ di = di0;
+ }
+ di->isdn.type = di_isdn;
+ di->isdn.i4l_type = civ->typ;
+ di->isdn.i4l_subtype = civ->subtyp;
+ di->isdn.i4l_name = new_str(cic->lname);
+
+ if(civ->need_pkg && *civ->need_pkg) {
+ sl0 = hd_split(',', (char *) civ->need_pkg);
+ for(sl = sl0; sl; sl = sl->next) {
+ if(!search_str_list(hd->requires, sl->str)) {
+ add_str_list(&hd->requires, sl->str);
+ }
+ }
+ free_str_list(sl0);
+ }
+
+ if(hd->bus.id == bus_pci) continue;
+#if 0
+ pnr = 1;
+ civ = hd_cdbisdn_get_vario(cic->vario);
+ if (!civ) continue;
+ if (civ->irq && civ->irq[0]) {
+ ip = new_isdn_parm(&di->isdn.params);
+ ip->name = new_str("IRQ");
+ ip->type = CDBISDN_P_IRQ;
+ }
+ if (civ->io && civ->io[0]) {
+ ip = new_isdn_parm(&di->isdn.params);
+ ip->name = new_str("IO");
+ ip->type = CDBISDN_P_IO;
+ }
+ if (civ->membase && civ->membase[0]) {
+ ip = new_isdn_parm(&di->isdn.params);
+ ip->name = new_str("MEMBASE");
+ ip->type = CDBISDN_P_MEM;
+ }
+ while((ipi = hd_ihw_get_parameter(ici->handle, pnr++))) {
+ ip = new_isdn_parm(&di->isdn.params);
+ ip->name = new_str(ipi->name);
+ ip->type = ipi->type & P_TYPE_MASK;
+ ip->flags = ipi->flags & P_PROPERTY_MASK;
+ ip->def_value = ipi->def_value;
+ if(ipi->list) ip->alt_values = *ipi->list;
+ ip->alt_value = new_mem(ip->alt_values * sizeof *ip->alt_value);
+ for(i = 0; i < ip->alt_values; i++) {
+ ip->alt_value[i] = ipi->list[i + 1];
+ }
+ ip->valid = 1;
+
+ if((ip->flags & P_SOFTSET)) {
+ switch(ip->type) {
+ case P_IRQ:
+ update_irq_usage(hd_data);
+ irqs = 0;
+ for(i = 0; i < ip->alt_values; i++) {
+ irqs |= 1ull << ip->alt_value[i];
+ }
+ irqs &= ~(hd_data->used_irqs | hd_data->assigned_irqs);
+#ifdef __i386__
+ irqs &= 0xffffull; /* max. 16 on intel */
+ /*
+ * The point is, that this is relevant for isa boards only
+ * and those have irq values < 16 anyway. So it really
+ * doesn't matter if we mask with 0xffff or not.
+ */
+#endif
+ if(!irqs) {
+ ip->conflict = 1;
+ ip->valid = 0;
+ }
+ else {
+ irqs2 = irqs & ~0xc018ull;
+ /* see if we can avoid irqs 3,4,14,15 */
+ if(irqs2) irqs = irqs2;
+ irq_val = -1;
+ /* try default value first */
+ if(ip->def_value && (irqs & (1ull << ip->def_value))) {
+ irq_val = ip->def_value;
+ }
+ else {
+ for(i = 0; i < 64 && irqs; i++, irqs >>= 1) {
+ if((irqs & 1)) irq_val = i;
+ }
+ }
+ if(irq_val >= 0) {
+ ip->value = irq_val;
+ hd_data->assigned_irqs |= 1ull << irq_val;
+ }
+ else {
+ ip->valid = 0;
+ }
+ }
+ break;
+ case P_MEM:
+ if(!hd_data->bios_rom.data) {
+ if(ip->def_value) {
+ ip->value = ip->def_value;
+ }
+ }
+ else {
+ /* ###### 0x2000 is just guessing -> should be provided by libihw */
+ if(ip->def_value && chk_free_biosmem(hd_data, ip->def_value, 0x2000)) {
+ ip->value = ip->def_value;
+ }
+ else {
+ for(i = ip->alt_values - 1; i >= 0; i--) {
+ if(chk_free_biosmem(hd_data, ip->alt_value[i], 0x2000)) {
+ ip->value = ip->alt_value[i];
+ break;
+ }
+ }
+ }
+ }
+ if(!ip->value) ip->conflict = 1;
+ break;
+ default:
+ ip->valid = 0;
+ }
+ }
+ else if((ip->flags & P_DEFINE)) {
+ res = NULL;
+ switch(ip->type) {
+ case P_IRQ:
+ res = get_res(hd, res_irq, 0);
+ if(res) ip->value = res->irq.base;
+ break;
+ case P_MEM:
+ res = get_res(hd, res_mem, 0);
+ if(res) ip->value = res->mem.base;
+ break;
+ case P_IO:
+ res = get_res(hd, res_io, 0);
+ if(res) ip->value = res->io.base;
+ break;
+ case P_IO0:
+ case P_IO1:
+ case P_IO2:
+ res = get_res(hd, res_io, ip->type - P_IO0);
+ if(res) ip->value = res->io.base;
+ break;
+ // ##### might break for 64bit pci entries?
+ case P_BASE0:
+ case P_BASE1:
+ case P_BASE2:
+ case P_BASE3:
+ case P_BASE4:
+ case P_BASE5:
+ res = get_res(hd, res_mem, ip->type - P_BASE0);
+ if(res) ip->value = res->mem.base;
+ break;
+ default:
+ ip->valid = 0;
+ }
+ if(!res) ip->valid = 0;
+ }
+ }
+#endif
+ }
+ if(!di) di0 = free_mem(di0);
+
+ return di0;
+}
+
+driver_info_t *dsl_driver(hd_data_t *hd_data, hd_t *hd, cdb_isdn_card *cic)
+{
+ driver_info_t *di0, *di;
+ cdb_isdn_vario *civ;
+ int drv;
+ str_list_t *sl, *sl0;
+
+ if(!cic) return NULL;
+
+ di0 = new_mem(sizeof *di0);
+
+ drv = cic->vario;
+ di = NULL;
+
+ while((civ = hd_cdbisdn_get_vario(drv))) {
+ drv = civ->next_vario;
+ if (di) {
+ di->next = new_mem(sizeof *di);
+ di = di->next;
+ } else {
+ di = di0;
+ }
+ di->dsl.type = di_dsl;
+ if(civ->interface && *civ->interface) {
+ if (!strcmp(civ->interface, "CAPI20")) {
+ di->dsl.mode = new_str("capiadsl");
+ if(civ->mod_name && *civ->mod_name)
+ di->dsl.name = new_str(civ->mod_name);
+ else
+ di->dsl.name = new_str("unknown");
+ } else if (!strcmp(civ->interface, "pppoe")) {
+ di->dsl.mode = new_str("pppoe");
+ if(civ->mod_name && *civ->mod_name)
+ di->dsl.name = new_str(civ->mod_name);
+ else
+ di->dsl.name = new_str("none");
+ } else {
+ di->dsl.mode = new_str("unknown");
+ di->dsl.name = new_str("unknown");
+ }
+ } else {
+ di->dsl.mode = new_str("unknown");
+ di->dsl.name = new_str("unknown");
+ }
+
+ if(civ->need_pkg && *civ->need_pkg) {
+ sl0 = hd_split(',', (char *) civ->need_pkg);
+ for(sl = sl0; sl; sl = sl->next) {
+ if(!search_str_list(hd->requires, sl->str)) {
+ add_str_list(&hd->requires, sl->str);
+ }
+ }
+ free_str_list(sl0);
+ }
+
+ if(hd->bus.id == bus_pci) continue;
+ }
+ if(!di) di0 = free_mem(di0);
+
+ return di0;
+}
+
+#endif /* WITH_ISDN */
+
+
+hd_res_t *get_res(hd_t *hd, enum resource_types t, unsigned index)
+{
+ hd_res_t *res;
+
+ for(res = hd->res; res; res = res->next) {
+ if(res->any.type == t) {
+ if(!index) return res;
+ index--;
+ }
+ }
+
+ return NULL;
+}
+
+
+driver_info_t *reorder_x11(driver_info_t *di0, char *info)
+{
+ driver_info_t *di, *di_new, **di_list;
+ int i, dis, found;
+
+ for(dis = 0, di = di0; di; di = di->next) dis++;
+
+ di_list = new_mem(dis * sizeof *di_list);
+
+ for(i = 0, di = di0; di; di = di->next) {
+ di_list[i++] = di;
+ }
+
+ di = di_new = NULL;
+ for(i = found = 0; i < dis; i++) {
+ if(
+ !strcmp(di_list[i]->x11.xf86_ver, info) ||
+ !strcmp(di_list[i]->x11.server, info)
+ ) {
+ found = 1;
+ if(di) {
+ di = di->next = di_list[i];
+ }
+ else {
+ di = di_new = di_list[i];
+ }
+ di->next = NULL;
+ di_list[i] = NULL;
+ }
+ }
+
+ for(i = 0; i < dis; i++) {
+ if(di_list[i]) {
+ if(di) {
+ di = di->next = di_list[i];
+ }
+ else {
+ di = di_new = di_list[i];
+ }
+ di->next = NULL;
+ di_list[i] = NULL;
+ }
+ }
+
+ free_mem(di_list);
+
+ if(!found && strlen(info) > 1) {
+ free_driver_info(di_new);
+ di_new = new_mem(sizeof *di_new);
+ di_new->any.type = di_x11;
+ di_new->x11.server = new_str(info);
+ di_new->x11.xf86_ver = new_str(*info >= 'A' && *info <= 'Z' ? "3" : "4");
+ }
+
+ return di_new;
+}
+
+
+void expand_driver_info(hd_data_t *hd_data, hd_t *hd)
+{
+ int i;
+ unsigned u1, u2;
+ char *s, *t, *t0;
+ driver_info_t *di;
+ str_list_t *sl, *sl1, *sl2, *cmd;
+
+ if(!hd || !hd->driver_info) return;
+
+ for(di = hd->driver_info; di; di = di->next) {
+ switch(di->any.type) {
+ case di_display:
+ for(i = 0, sl = di->display.hddb0; sl; sl = sl->next, i++) {
+ if(i == 0 && sscanf(sl->str, "%ux%u", &u1, &u2) == 2) {
+ di->display.width = u1;
+ di->display.height = u2;
+ }
+ else if(i == 1 && sscanf(sl->str, "%u-%u", &u1, &u2) == 2) {
+ di->display.min_vsync = u1;
+ di->display.max_vsync = u2;
+ }
+ else if(i == 2 && sscanf(sl->str, "%u-%u", &u1, &u2) == 2) {
+ di->display.min_hsync = u1;
+ di->display.max_hsync = u2;
+ }
+ else if(i == 3 && sscanf(sl->str, "%u", &u1) == 1) {
+ di->display.bandwidth = u1;
+ }
+ }
+ break;
+
+ case di_module:
+ for(di->module.active = 1, sl = di->module.hddb0; sl; sl = sl->next) {
+ t0 = s = new_str(sl->str);
+
+ t = strsep(&t0, " ");
+
+ add_str_list(&di->module.names, t);
+ di->module.active &= (
+ hd_module_is_active(hd_data, t) |
+ (search_str_list(hd->drivers, t) ? 1 : 0)
+ );
+
+ if(t0) {
+ add_str_list(&di->module.mod_args, module_cmd(hd, t0));
+ }
+ else {
+ add_str_list(&di->module.mod_args, NULL);
+ }
+
+ free_mem(s);
+ }
+ for(sl = di->module.hddb1; sl; sl = sl->next) {
+ s = module_cmd(hd, sl->str);
+ if(s) str_printf(&di->module.conf, -1, "%s\n", s);
+ }
+ break;
+
+ case di_mouse:
+ di->mouse.buttons = di->mouse.wheels = -1;
+ u1 = 0;
+ if(
+ hd->compat_vendor.id == MAKE_ID(TAG_SPECIAL, 0x0210) &&
+ ID_TAG(hd->compat_device.id) == TAG_SPECIAL
+ ) {
+ u1 = hd->compat_device.id;
+ }
+ if(
+ hd->vendor.id == MAKE_ID(TAG_SPECIAL, 0x0210) &&
+ ID_TAG(hd->device.id) == TAG_SPECIAL
+ ) {
+ u1 = hd->device.id;
+ }
+ if(u1) {
+ di->mouse.wheels = ID_VALUE(u1) >> 4;
+ di->mouse.buttons = ID_VALUE(u1) & 15;
+ }
+ for(i = 0, sl = di->mouse.hddb0; sl; sl = sl->next, i++) {
+ if(i == 0) {
+ di->mouse.xf86 = new_str(sl->str);
+ }
+ else if(i == 1) {
+ di->mouse.gpm = new_str(sl->str);
+ }
+ else if(i == 2 && *sl->str) {
+ di->mouse.buttons = strtol(sl->str, NULL, 10);
+ }
+ else if(i == 3 && *sl->str) {
+ di->mouse.wheels = strtol(sl->str, NULL, 10);
+ }
+ }
+ break;
+
+ case di_x11:
+ for(i = 0, sl = di->x11.hddb0; sl; sl = sl->next, i++) {
+ if(i == 0) {
+ di->x11.xf86_ver = new_str(sl->str);
+ }
+ else if(i == 1) {
+ di->x11.server = new_str(sl->str);
+ }
+ else if(i == 2) {
+ if(!strcmp(sl->str, "3d")) di->x11.x3d = 1;
+ }
+#if 0
+ else if(i == 3) {
+ s = new_str(sl->str);
+ for(t0 = s; (t = strsep(&t0, ",")); ) {
+ add_str_list(&di->x11.packages, t);
+ }
+ free_mem(s);
+ }
+#endif
+ else if(i == 4) {
+ s = new_str(sl->str);
+ for(t0 = s; (t = strsep(&t0, ",")); ) {
+ add_str_list(&di->x11.extensions, t);
+ }
+ free_mem(s);
+ }
+ else if(i == 5) {
+ s = new_str(sl->str);
+ for(t0 = s; (t = strsep(&t0, ",")); ) {
+ add_str_list(&di->x11.options, t);
+ }
+ free_mem(s);
+ }
+ else if(i == 6) {
+ for(sl2 = sl1 = hd_split(',', sl->str); sl2; sl2 = sl2->next) {
+ u1 = strtoul(sl2->str, NULL, 0);
+ switch(u1) {
+ case 8:
+ di->x11.colors.c8 = 1;
+ di->x11.colors.all |= (1 << 0);
+ break;
+
+ case 15:
+ di->x11.colors.c15 = 1;
+ di->x11.colors.all |= (1 << 1);
+ break;
+
+ case 16:
+ di->x11.colors.c16 = 1;
+ di->x11.colors.all |= (1 << 2);
+ break;
+
+ case 24:
+ di->x11.colors.c24 = 1;
+ di->x11.colors.all |= (1 << 3);
+ break;
+
+ case 32:
+ di->x11.colors.c32 = 1;
+ di->x11.colors.all |= (1 << 4);
+ break;
+ }
+ }
+ free_str_list(sl1);
+ }
+ else if(i == 7) {
+ di->x11.dacspeed = strtol(sl->str, NULL, 10);
+ }
+ else if(i == 8) {
+ di->x11.script = new_str(sl->str);
+ }
+ }
+ for(i = 0, sl = di->x11.hddb1; sl; sl = sl->next, i++) {
+ add_str_list(&di->x11.raw, sl->str);
+ }
+#if 0
+ // ######## for compatibility
+ for(sl = hd->requires; sl; sl = sl->next) {
+ add_str_list(&di->x11.packages, sl->str);
+ }
+#endif
+ break;
+
+ default:
+ break;
+ }
+ }
+
+ di = hd->driver_info;
+ if(di && di->any.type == di_x11 && !hd_probe_feature(hd_data, pr_ignx11)) {
+ cmd = get_cmdline(hd_data, "x11");
+ if(cmd && *cmd->str) {
+ hd->driver_info = reorder_x11(di, cmd->str);
+ }
+ free_str_list(cmd);
+ }
+}
+
+
+char *module_cmd(hd_t *hd, char *cmd)
+{
+ static char buf[256];
+ char *s = buf;
+ int idx, ofs;
+ hd_res_t *res;
+
+ // skip inactive PnP cards
+ // ##### Really necessary here?
+ if(
+ hd->is.isapnp &&
+ hd->detail &&
+ hd->detail->isapnp.data &&
+ !(hd->detail->isapnp.data->flags & (1 << isapnp_flag_act))
+ ) return NULL;
+
+ *buf = 0;
+ while(*cmd) {
+ if(sscanf(cmd, "<io%u>%n", &idx, &ofs) >= 1) {
+ if((res = get_res(hd, res_io, idx))) {
+ s += sprintf(s, "0x%02"PRIx64, res->io.base);
+ cmd += ofs;
+ }
+ else {
+ return NULL;
+ }
+ }
+ else if(sscanf(cmd, "<irq%u>%n", &idx, &ofs) >= 1) {
+ if((res = get_res(hd, res_irq, idx))) {
+ s += sprintf(s, "%u", res->irq.base);
+ cmd += ofs;
+ }
+ else {
+ return NULL;
+ }
+ }
+ else {
+ *s++ = *cmd++;
+ }
+
+ if(s - buf > (int) sizeof buf - 20) return NULL;
+ }
+
+ *s = 0;
+ return buf;
+}
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+char *hid_tag_name(int tag)
+{
+ return (unsigned) tag < sizeof hid_tag_names / sizeof *hid_tag_names ? hid_tag_names[tag] : "";
+}
+
+char *hid_tag_name2(int tag)
+{
+ return (unsigned) tag < sizeof hid_tag_names2 / sizeof *hid_tag_names2 ? hid_tag_names2[tag] : "";
+}
+
--- /dev/null
+void hddb_init(hd_data_t *hd_data);
+
+unsigned device_class(hd_data_t *hd_data, unsigned vendor, unsigned device);
+unsigned sub_device_class(hd_data_t *hd_data, unsigned vendor, unsigned device, unsigned sub_vendor, unsigned sub_device);
+
+char *hid_tag_name(int tag);
+char *hid_tag_name2(int tag);
--- /dev/null
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ *
+ * type defs for internal data base
+ *
+ * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+
+#define DATA_VALUE(a) ((a) & ~(-1 << 28))
+#define DATA_FLAG(a) (((a) >> 28) & 0xf)
+#define MAKE_DATA(a, b) ((a << 28) | (b))
+
+#define FLAG_ID 0
+#define FLAG_RANGE 1
+#define FLAG_MASK 2
+#define FLAG_STRING 3
+#define FLAG_REGEXP 4
+/* 5 - 7 reserved */
+#define FLAG_CONT 8 /* bit mask, _must_ be bit 31 */
+
+
+typedef enum hddb_entry_e {
+ he_other, he_bus_id, he_baseclass_id, he_subclass_id, he_progif_id,
+ he_vendor_id, he_device_id, he_subvendor_id, he_subdevice_id, he_rev_id,
+ he_bus_name, he_baseclass_name, he_subclass_name, he_progif_name,
+ he_vendor_name, he_device_name, he_subvendor_name, he_subdevice_name,
+ he_rev_name, he_serial, he_driver, he_requires /* 21 */,
+
+ he_detail_ccw_data_cu_model,
+ /* add new entries _here_! */
+
+ he_nomask,
+
+ /* if he_nomask exceeds 31, adjust entry_mask_t & hddb_entry_mask_t */
+
+ he_class_id = he_nomask, he_driver_module_insmod, he_driver_module_modprobe,
+ he_driver_module_config, he_driver_xfree, he_driver_xfree_config,
+ he_driver_mouse, he_driver_display, he_driver_any
+} hddb_entry_t;
+
+static hddb_entry_t hddb_is_numeric[] = {
+ he_bus_id, he_baseclass_id, he_subclass_id, he_progif_id, he_vendor_id,
+ he_device_id, he_subvendor_id, he_subdevice_id, he_rev_id, he_detail_ccw_data_cu_model
+};
+
+static char *hddb_entry_strings[] = {
+ "other", "bus.id", "baseclass.id", "subclass.id", "progif.id",
+ "vendor.id", "device.id", "subvendor.id", "subdevice.id", "rev.id",
+ "bus.name", "baseclass.name", "subclass.name", "progif.name",
+ "vendor.name", "device.name", "subvendor.name", "subdevice.name",
+ "rev.name", "serial", "driver", "requires",
+ "detail.ccw.data.cu_model",
+ "class.id", "driver.module.insmod", "driver.module.modprobe",
+ "driver.module.config", "driver.xfree", "driver.xfree.config",
+ "driver.mouse", "driver.display", "driver.any"
+};
+
--- /dev/null
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <stdarg.h>
+
+#include "hd.h"
+#include "hd_int.h"
+#include "hdp.h"
+#include "hddb.h"
+#include "smbios.h"
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ * This module provides a function that prints a hardware entry.
+ * This is useful for debugging or to provide the user with some fancy info.
+ *
+ * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ */
+
+#ifndef LIBHD_TINY
+
+#define dump_line(x0, x1...) fprintf(f, "%*s" x0, ind, "", x1)
+#define dump_line_str(x0...) fprintf(f, "%*s%s", ind, "", x0)
+#define dump_line0(x0...) fprintf(f, x0)
+
+static int ind = 0; /* output indentation */
+
+static void dump_normal(hd_data_t *, hd_t *, FILE *);
+static void dump_cpu(hd_data_t *, hd_t *, FILE *);
+static void dump_bios(hd_data_t *, hd_t *, FILE *);
+static void dump_prom(hd_data_t *, hd_t *, FILE *);
+static void dump_sys(hd_data_t *, hd_t *, FILE *);
+
+static char *dump_hid(hd_data_t *hd_data, hd_id_t *hid, int format, char *buf, int buf_size);
+static char *dump_hid2(hd_data_t *hd_data, hd_id_t *hid1, hd_id_t *hid2, char *buf, int buf_size);
+static char *print_dev_num(hd_dev_num_t *d);
+
+/*
+ * Dump a hardware entry to FILE *f.
+ */
+void hd_dump_entry(hd_data_t *hd_data, hd_t *h, FILE *f)
+{
+ char *s, *a0, *a1, *a2, *s1, *s2;
+ char buf1[32], buf2[32];
+ hd_t *hd_tmp;
+ int i, j;
+ str_list_t *sl;
+
+#ifdef LIBHD_MEMCHECK
+ {
+ if(libhd_log)
+ fprintf(libhd_log, "; %s\t%p\t%p\n", __FUNCTION__, CALLED_FROM(hd_dump_entry, hd_data), hd_data);
+ }
+#endif
+
+ if(!h) return;
+
+ s = "";
+ if(h->is.agp) s = "(AGP)";
+ // pci_flag_pm: dump_line0(", supports PM");
+ if(h->is.isapnp) s = "(PnP)";
+
+ a0 = h->bus.name;
+ a2 = NULL;
+ a1 = h->sub_class.name ?: h->base_class.name;
+ if(a1 && h->prog_if.name) {
+ str_printf(&a2, 0, "%s (%s)", a1, h->prog_if.name);
+ }
+ else {
+ a2 = new_str(a1 ?: "?");
+ }
+ dump_line(
+ "%02d: %s%s %02x.%x: %02x%02x %s\n",
+ h->idx, a0 ? a0 : "?", s, h->slot, h->func,
+ h->base_class.id, h->sub_class.id, a2
+ );
+
+ ind += 2;
+
+ if((hd_data->debug & HD_DEB_CREATION)) {
+ s = mod_name_by_idx(h->module);
+ if(!s) sprintf(s = buf1, "%u", h->module);
+ if(h->count)
+ sprintf(buf2, ".%u", h->count);
+ else
+ *buf2 = 0;
+ dump_line("[Created at %s.%u%s]\n", s, h->line, buf2);
+ }
+
+ if(hd_data->flags.dformat == 1) {
+ dump_line("ClassName: \"%s\"\n", a2);
+ dump_line("Bus: %d\n", h->slot >> 8);
+ dump_line("Slot: %d\n", h->slot & 0xff);
+ dump_line("Function: %d\n", h->func);
+ }
+
+ a2 = free_mem(a2);
+
+ if((hd_data->debug & HD_DEB_CREATION) && h->unique_id) {
+ dump_line("Unique ID: %s\n", h->unique_id);
+ }
+
+ if(hd_data->debug == -1u && h->old_unique_id) {
+ dump_line("Old Unique ID: %s\n", h->old_unique_id);
+ }
+
+ if((hd_data->debug & HD_DEB_CREATION) && h->parent_id) {
+ dump_line("Parent ID: %s\n", h->parent_id);
+ }
+
+ if(hd_data->debug == -1u && h->child_ids) {
+ s = hd_join(", ", h->child_ids);
+ dump_line("Child IDs: %s\n", s);
+ s = free_mem(s);
+ }
+
+ if(h->sysfs_id) {
+ dump_line("SysFS ID: %s\n", h->sysfs_id);
+ }
+
+ if(h->sysfs_bus_id) {
+ dump_line("SysFS BusID: %s\n", h->sysfs_bus_id);
+ }
+
+ if(h->sysfs_device_link) {
+ dump_line("SysFS Device Link: %s\n", h->sysfs_device_link);
+ }
+
+ if(h->hw_class && (s = hd_hw_item_name(h->hw_class))) {
+ dump_line("Hardware Class: %s\n", s);
+ }
+
+ if(hd_data->debug == -1u) {
+ for(i = j = 0; i < (int) hw_all; i++) {
+ if(i != hw_unknown && hd_is_hw_class(h, i) && (s = hd_hw_item_name(i))) {
+ if(!j) {
+ dump_line("HW Class List: %s", s);
+ }
+ else {
+ dump_line0(", %s", s);
+ }
+ j = 1;
+ }
+ }
+ if(j) dump_line0("\n");
+ }
+
+ if(h->base_class.id == bc_internal && h->sub_class.id == sc_int_cpu) {
+ dump_cpu(hd_data, h, f);
+ }
+ else if(h->base_class.id == bc_internal && h->sub_class.id == sc_int_bios) {
+ dump_bios(hd_data, h, f);
+ }
+ else if(h->base_class.id == bc_internal && h->sub_class.id == sc_int_prom) {
+ dump_prom(hd_data, h, f);
+ }
+ else {
+ dump_normal(hd_data, h, f);
+ }
+
+ s1 = s2 = NULL;
+ if(h->is.notready) {
+ if(h->base_class.id == bc_storage_device) {
+ s1 = "no medium";
+ }
+ else {
+ s1 = "not configured";
+ }
+ }
+ if(h->is.softraiddisk) s2 = "soft raid";
+ if(!s1) { s1 = s2; s2 = NULL; }
+
+ if(s1) {
+ dump_line("Drive status: %s%s%s\n", s1, s2 ? ", " : "", s2 ?: "");
+ }
+
+ if(h->extra_info) {
+ dump_line_str("Extra Info: ");
+ for(i = 0, sl = h->extra_info; sl; sl = sl->next) {
+ dump_line0("%s%s", i ? ", " : "", sl->str);
+ i = 1;
+ }
+ dump_line0("\n");
+ }
+
+ if(
+ hd_data->debug && (
+ h->status.configured ||
+ h->status.available ||
+ h->status.needed ||
+ h->status.active ||
+ h->status.invalid ||
+ h->is.manual
+ )
+ ) {
+ dump_line_str("Config Status: ");
+ i = 0;
+
+ if(h->status.invalid) {
+ dump_line0("invalid");
+ i++;
+ }
+
+ if(h->is.manual) {
+ dump_line0("%smanual", i ? ", " : "");
+ i++;
+ }
+
+ if(h->status.configured && (s = hd_status_value_name(h->status.configured))) {
+ dump_line0("%scfg=%s", i ? ", " : "", s);
+ i++;
+ }
+
+ if(h->status.available && (s = hd_status_value_name(h->status.available))) {
+ dump_line0("%savail=%s", i ? ", " : "", s);
+ i++;
+ }
+
+ if(h->status.needed && (s = hd_status_value_name(h->status.needed))) {
+ dump_line0("%sneed=%s", i ? ", " : "", s);
+ i++;
+ }
+
+ if(h->status.active && (s = hd_status_value_name(h->status.active))) {
+ dump_line0("%sactive=%s", i ? ", " : "", s);
+ i++;
+ }
+
+ dump_line0("\n");
+ }
+
+ if(hd_data->debug == -1u && h->config_string) {
+ dump_line("Configured as: \"%s\"\n", h->config_string);
+ }
+
+ if(
+ h->attached_to &&
+ (hd_tmp = hd_get_device_by_idx(hd_data, h->attached_to))
+ ) {
+ s = hd_tmp->sub_class.name ?: hd_tmp->base_class.name;
+ dump_line("Attached to: #%u (%s)\n", h->attached_to, s ?: "?");
+ }
+
+ if(h->detail && h->detail->ccw.type==hd_detail_ccw)
+ {
+ dump_line("LCSS: %x.%x\n",h->detail->ccw.data->lcss >> 8, h->detail->ccw.data->lcss & 0xf);
+ dump_line("CU Model: 0x%x\n",h->detail->ccw.data->cu_model);
+ dump_line("Device Model: 0x%x\n",h->detail->ccw.data->dev_model);
+ }
+
+#if defined(__s390__) || defined(__s390x__)
+ if(h->detail && h->detail->scsi.type==hd_detail_scsi)
+ {
+ if(h->detail->scsi.data->wwpn != (uint64_t)-1)
+ dump_line("WWPN: 0x%llx\n",(unsigned long long)h->detail->scsi.data->wwpn);
+ if(h->detail->scsi.data->wwpn != (uint64_t)-1)
+ dump_line("FCP LUN: 0x%llx\n",(unsigned long long)h->detail->scsi.data->fcp_lun);
+ dump_line("SCSI Host CCW ID: %s\n",h->detail->scsi.data->controller_id);
+ }
+#endif
+
+ if(
+ h->base_class.id == bc_storage_device &&
+ h->sub_class.id == sc_sdev_cdrom &&
+ h->detail &&
+ h->detail->type == hd_detail_cdrom &&
+ h->detail->cdrom.data
+ ) {
+ cdrom_info_t *ci = h->detail->cdrom.data;
+
+ if(ci->speed) {
+ dump_line("Drive Speed: %u\n", ci->speed);
+ }
+
+ if(ci->iso9660.ok) {
+ if(ci->iso9660.volume) dump_line("Volume ID: \"%s\"\n", ci->iso9660.volume);
+ if(ci->iso9660.application) dump_line("Application: \"%s\"\n", ci->iso9660.application);
+ if(ci->iso9660.publisher) dump_line("Publisher: \"%s\"\n", ci->iso9660.publisher);
+ if(ci->iso9660.preparer) dump_line("Preparer: \"%s\"\n", ci->iso9660.preparer);
+ if(ci->iso9660.creation_date) dump_line("Creation date: \"%s\"\n", ci->iso9660.creation_date);
+ }
+#if 0
+ else {
+ if(ci->cdrom) {
+ dump_line_str("Drive status: non-ISO9660 cdrom\n");
+ }
+ else {
+ dump_line_str("Drive status: no cdrom found\n");
+ }
+ }
+#endif
+ if(ci->el_torito.ok) {
+ dump_line(
+ "El Torito info: platform %u, %sbootable\n",
+ ci->el_torito.platform,
+ ci->el_torito.bootable ? "" : "not "
+ );
+ dump_line(" Boot Catalog: at sector 0x%04x\n", ci->el_torito.catalog);
+ if(ci->el_torito.id_string) dump_line(" Id String: \"%s\"\n", ci->el_torito.id_string);
+ if(ci->el_torito.label) dump_line(" Volume Label: \"%s\"\n", ci->el_torito.label);
+ {
+ static char *media[] = {
+ "none", "1.2MB Floppy", "1.44MB Floppy", "2.88MB Floppy", "Hard Disk"
+ };
+ dump_line(
+ " Media: %s starting at sector 0x%04x\n",
+ media[ci->el_torito.media_type < sizeof media / sizeof *media ? ci->el_torito.media_type : 0],
+ ci->el_torito.start
+ );
+ }
+ if(ci->el_torito.geo.size) dump_line(
+ " Geometry (CHS): %u/%u/%u (%u blocks)\n",
+ ci->el_torito.geo.c, ci->el_torito.geo.h, ci->el_torito.geo.s, ci->el_torito.geo.size
+ );
+ dump_line(" Load: %u bytes", ci->el_torito.load_count * 0x200);
+ if(ci->el_torito.load_address) {
+ dump_line0(" at 0x%04x\n", ci->el_torito.load_address);
+ }
+ else {
+ dump_line0("\n");
+ }
+ }
+ }
+
+#if 0
+ if(
+ h->base_class.id == bc_storage_device &&
+ h->sub_class.id == sc_sdev_floppy &&
+ h->detail &&
+ h->detail->type == hd_detail_floppy
+ ) {
+ floppy_info_t *fi = h->detail->floppy.data;
+
+ if(fi) {
+ dump_line_str("Drive status: floppy found\n");
+ }
+ else {
+ dump_line_str("Drive status: no floppy found\n");
+ }
+ }
+#endif
+
+ ind -= 2;
+
+ if(h->next) dump_line_str("\n");
+}
+
+
+/*
+ * print 'normal' hardware entries
+ */
+void dump_normal(hd_data_t *hd_data, hd_t *h, FILE *f)
+{
+ int i, j;
+ char *s;
+ uint64_t u64;
+ hd_res_t *res;
+ char buf[256], c0, c1;
+ driver_info_t *di;
+ str_list_t *sl, *sl1, *sl2;
+ isdn_parm_t *ip;
+ static char *geo_type_str[] = { "Physical", "Logical", "BIOS EDD", "BIOS Legacy" };
+
+ if(h->model) dump_line("Model: \"%s\"\n", h->model);
+
+ s = NULL;
+ switch(h->hotplug) {
+ case hp_none:
+ break;
+ case hp_pcmcia:
+ s = "PCMCIA";
+ break;
+ case hp_cardbus:
+ s = "CardBus";
+ break;
+ case hp_pci:
+ s = "PCI";
+ break;
+ case hp_usb:
+ s = "USB";
+ break;
+ case hp_ieee1394:
+ s = "IEEE1394 (FireWire)";
+ break;
+ }
+
+ if(s) {
+ dump_line("Hotplug: %s\n", s);
+ }
+
+ if(
+ (h->hotplug == hp_pcmcia || h->hotplug == hp_cardbus) &&
+ h->hotplug_slot
+ ) {
+ dump_line("Socket: %u\n", h->hotplug_slot - 1);
+ }
+
+ if(h->vendor.id || h->vendor.name || h->device.id || h->device.name) {
+ if(h->vendor.id || h->vendor.name) {
+ dump_line("Vendor: %s\n", dump_hid(hd_data, &h->vendor, 1, buf, sizeof buf));
+ }
+ dump_line("Device: %s\n", dump_hid(hd_data, &h->device, 0, buf, sizeof buf));
+ }
+
+ if(h->sub_vendor.id || h->sub_device.id || h->sub_device.name || h->sub_vendor.name) {
+ if(h->sub_vendor.id || h->sub_vendor.name || h->sub_device.id) {
+ dump_line("SubVendor: %s\n", dump_hid(hd_data, &h->sub_vendor, 1, buf, sizeof buf));
+ }
+ dump_line("SubDevice: %s\n", dump_hid(hd_data, &h->sub_device, 0, buf, sizeof buf));
+ }
+
+ if(h->revision.name) {
+ dump_line("Revision: \"%s\"\n", h->revision.name);
+ }
+ else if(h->revision.id) {
+ dump_line("Revision: 0x%02x\n", h->revision.id);
+ }
+
+ if(h->serial) {
+ dump_line("Serial ID: \"%s\"\n", h->serial);
+ }
+
+ if(h->usb_guid) {
+ dump_line("USB GUID: %s\n", h->usb_guid);
+ }
+
+ if(h->compat_vendor.id || h->compat_device.id) {
+ dump_line(
+ "Compatible to: %s\n",
+ dump_hid2(hd_data, &h->compat_vendor, &h->compat_device, buf, sizeof buf)
+ );
+ }
+
+ if(h->base_class.id == bc_internal && h->sub_class.id == sc_int_sys) {
+ dump_sys(hd_data, h, f);
+ }
+
+ if(h->drivers) {
+ s = hd_join("\", \"", h->drivers);
+ dump_line("Driver: \"%s\"\n", s);
+ s = free_mem(s);
+ }
+
+ if(h->broken) {
+ dump_line_str("Warning: might be broken\n");
+ }
+
+ if(hd_data->flags.dformat == 1) {
+ if(h->unix_dev_name) {
+ dump_line("Device File: %s\n", h->unix_dev_name);
+ }
+ if(h->unix_dev_name2) {
+ dump_line("Alternative Device File: %s\n", h->unix_dev_name2);
+ }
+ }
+ else {
+ s = h->unix_dev_name;
+ if(!s) s = h->unix_dev_name2;
+ if(s) {
+ dump_line("Device File: %s", s);
+ if(h->unix_dev_name2) {
+ dump_line0(" (%s)", h->unix_dev_name2);
+ }
+ dump_line0("\n");
+ }
+
+ }
+
+ /* only if there are more than one */
+ if(h->unix_dev_names && h->unix_dev_names->next) {
+ s = hd_join(", ", h->unix_dev_names);
+ dump_line("Device Files: %s\n", s);
+ s = free_mem(s);
+ }
+
+ if(h->unix_dev_num.type) {
+ dump_line("Device Number: %s", print_dev_num(&h->unix_dev_num));
+ if(h->unix_dev_num2.type) {
+ dump_line0(" (%s)", print_dev_num(&h->unix_dev_num2));
+ }
+ dump_line0("\n");
+ }
+
+ if(h->rom_id) {
+#if defined(__i386__) || defined (__x86_64__)
+ dump_line("BIOS id: %s\n", h->rom_id);
+#endif
+#if defined(__PPC__) || defined(__sparc__)
+ dump_line("PROM id: %s\n", h->rom_id);
+#endif
+#if defined(__s390__) || defined(__s390x__)
+ dump_line("IUCV user: %s\n", h->rom_id);
+#endif
+ }
+
+ if(h->tag.ser_skip) {
+ dump_line_str("Tags: ser_skip\n");
+ }
+
+ if(
+ h->is.zip ||
+ h->is.cdr || h->is.cdrw || h->is.dvd ||
+ h->is.dvdr || h->is.dvdram || h->is.pppoe || h->is.wlan
+ ) {
+ dump_line_str("Features:");
+ i = 0;
+ if(h->is.zip) dump_line0("%s ZIP", i++ ? "," : "");
+ if(h->is.cdr) dump_line0("%s CD-R", i++ ? "," : "");
+ if(h->is.cdrw) dump_line0("%s CD-RW", i++ ? "," : "");
+ if(h->is.dvd) dump_line0("%s DVD", i++ ? "," : "");
+ if(h->is.dvdr) dump_line0("%s DVD-R", i++ ? "," : "");
+ if(h->is.dvdram) dump_line0("%s DVDRAM", i++ ? "," : "");
+ if(h->is.pppoe) dump_line0("%s PPPOE", i++ ? "," : "");
+ if(h->is.wlan) dump_line0("%s WLAN", i++ ? "," : "");
+ dump_line0("\n");
+ }
+
+ for(res = h->res; res; res = res->next) {
+ switch(res->any.type) {
+ case res_phys_mem:
+ u64 = res->phys_mem.range >> 10;
+ c0 = 'M'; c1 = 'k';
+ if(u64 >> 20) {
+ u64 >>= 10;
+ c0 = 'G'; c1 = 'M';
+ }
+ if((u64 & 0x3ff)) {
+ dump_line("Memory Size: %"PRId64" %cB + %"PRId64" %cB\n", u64 >> 10, c0, u64 & 0x3ff, c1);
+ }
+ else {
+ dump_line("Memory Size: %"PRId64" %cB\n", u64 >> 10, c0);
+ }
+ break;
+
+ case res_mem:
+ *(s = buf) = 0;
+ strcat(buf, res->mem.access == acc_rw ? "rw" : res->mem.access == acc_ro ? "ro" : "wo");
+ strcat(buf, res->mem.prefetch == flag_yes ? ",prefetchable" : res->mem.prefetch == flag_no ? ",non-prefetchable" : "");
+ if(!res->mem.enabled) strcat(buf, ",disabled");
+ if(*s == ',') s++;
+ if(res->mem.range) {
+ dump_line(
+ "Memory Range: 0x%08"PRIx64"-0x%08"PRIx64" (%s)\n",
+ res->mem.base, res->mem.base + res->mem.range - 1, s
+ );
+ }
+ else {
+ dump_line("Memory Range: 0x%08"PRIx64"-??? (%s)\n", res->mem.base, s);
+ }
+ break;
+
+ case res_io:
+ *(s = buf) = 0;
+ strcat(buf, res->io.access == acc_rw ? "rw" : res->io.access == acc_ro ? "ro" : "wo");
+ if(!res->io.enabled) strcat(buf, ",disabled");
+ if(*s == ',') s++;
+ if(res->io.range == 0) {
+ dump_line("I/O Ports: 0x%02"PRIx64"-??? (%s)\n", res->io.base, s);
+ }
+ else if(res->io.range == 1) {
+ dump_line("I/O Port: 0x%02"PRIx64" (%s)\n", res->io.base, s);
+ }
+ else {
+ dump_line("I/O Ports: 0x%02"PRIx64"-0x%02"PRIx64" (%s)\n", res->io.base, res->io.base + res->io.range -1, s);
+ }
+ break;
+
+ case res_irq:
+ *(s = buf) = 0;
+ switch(res->irq.triggered) {
+ case 0:
+ strcpy(s, "no events");
+ break;
+
+ case 1:
+ strcpy(s, "1 event");
+ break;
+
+ default:
+ sprintf(s, "%u events", res->irq.triggered);
+ }
+ if(!res->irq.enabled) {
+ if(res->irq.triggered)
+ strcat(s, ",");
+ else
+ *s = 0;
+ strcat(s, "disabled");
+ }
+ dump_line("IRQ: %u (%s)\n", res->irq.base, s);
+ break;
+
+ case res_dma:
+ *(s = buf) = 0;
+ if(!res->dma.enabled) strcpy(buf, " (disabled)");
+ dump_line("DMA: %u%s\n", res->dma.base, s);
+ break;
+
+ case res_monitor:
+ dump_line(
+ "Resolution: %ux%u@%uHz%s\n",
+ res->monitor.width, res->monitor.height, res->monitor.vfreq,
+ res->monitor.interlaced ? " (interlaced)" : ""
+ );
+ break;
+
+ case res_size:
+ {
+ char *s, b0[64], b1[64];
+
+ switch(res->size.unit) {
+ case size_unit_cinch:
+ s = "''";
+ snprintf(b0, sizeof b0 - 1, "%s", float2str(res->size.val1, 2));
+ snprintf(b1, sizeof b1 - 1, "%s", float2str(res->size.val2, 2));
+ break;
+
+ default:
+ switch(res->size.unit) {
+ case size_unit_cm:
+ s = "cm";
+ break;
+ case size_unit_sectors:
+ s = "sectors";
+ break;
+ case size_unit_kbyte:
+ s = "kByte";
+ break;
+ default:
+ s = "some unit";
+ }
+ snprintf(b0, sizeof b0 - 1, "%"PRIu64, res->size.val1);
+ snprintf(b1, sizeof b1 - 1, "%"PRIu64, res->size.val2);
+ }
+ if(!res->size.val2)
+ dump_line("Size: %s %s\n", b0, s);
+ else if(res->size.unit == size_unit_sectors)
+ dump_line("Size: %s %s a %s bytes\n", b0, s, b1);
+ else
+ dump_line("Size: %sx%s %s\n", b0, b1, s);
+ }
+ break;
+
+ case res_disk_geo:
+ s = res->disk_geo.geotype < sizeof geo_type_str / sizeof *geo_type_str ?
+ geo_type_str[res->disk_geo.geotype] : "";
+ dump_line(
+ "Geometry (%s): CHS %u/%u/%u\n", s,
+ res->disk_geo.cyls, res->disk_geo.heads, res->disk_geo.sectors
+ );
+ if(res->disk_geo.size) {
+ dump_line("Size (%s): %"PRIu64" sectors\n", s, res->disk_geo.size);
+ }
+ break;
+
+ case res_cache:
+ dump_line("Cache: %u kb\n", res->cache.size);
+ break;
+
+ case res_baud:
+ if(res->baud.speed == 0 || res->baud.speed % 100) {
+ dump_line("Speed: %u bps\n", res->baud.speed);
+ }
+ else if(res->baud.speed % 100000) {
+ dump_line("Speed: %s kbps\n", float2str(res->baud.speed, 3));
+ }
+ else {
+ dump_line("Speed: %s Mbps\n", float2str(res->baud.speed, 6));
+ }
+ if(res->baud.bits || res->baud.stopbits || res->baud.parity || res->baud.handshake) {
+ int i = 0;
+
+ dump_line_str("Config: ");
+ if(res->baud.bits) {
+ dump_line0("%u bits", res->baud.bits);
+ i++;
+ }
+ if(res->baud.parity) {
+ dump_line0("%sparity %c", i++ ? ", " : "", res->baud.parity);
+ }
+ if(res->baud.stopbits) {
+ dump_line0("%s%u stopbits", i++ ? ", " : "", res->baud.stopbits);
+ }
+ if(res->baud.handshake) {
+ dump_line0("%shandshake %c", i++ ? ", " : "", res->baud.handshake);
+ }
+ dump_line0("\n");
+ }
+ break;
+
+ case res_init_strings:
+ if(res->init_strings.init1) dump_line("Init1: %s\n", res->init_strings.init1);
+ if(res->init_strings.init2) dump_line("Init2: %s\n", res->init_strings.init2);
+ break;
+
+ case res_pppd_option:
+ dump_line("PPPD Option: %s\n", res->pppd_option.option);
+ break;
+
+ case res_framebuffer:
+ dump_line("Mode 0x%04x: %ux%u (+%u), %u bits\n",
+ res->framebuffer.mode,
+ res->framebuffer.width,
+ res->framebuffer.height,
+ res->framebuffer.bytes_p_line,
+ res->framebuffer.colorbits
+ );
+ break;
+
+ case res_hwaddr:
+ dump_line("HW Address: %s\n", res->hwaddr.addr);
+ break;
+
+ case res_link:
+ dump_line("Link detected: %s\n", res->link.state ? "yes" : "no");
+ break;
+
+ case res_wlan:
+ if(res->wlan.channels) {
+ str_list_t *ptr = res->wlan.channels;
+ dump_line("WLAN channels: %s", ptr->str);
+ while((ptr=ptr->next)) dump_line0(" %s", ptr->str);
+ dump_line0("\n");
+ }
+ if(res->wlan.frequencies) {
+ str_list_t *ptr = res->wlan.frequencies;
+ dump_line("WLAN frequencies: %s", ptr->str);
+ while((ptr=ptr->next)) dump_line0(" %s", ptr->str);
+ dump_line0("\n");
+ }
+ if(res->wlan.bitrates) {
+ str_list_t *ptr = res->wlan.bitrates;
+ dump_line("WLAN bitrates: %s", ptr->str);
+ while((ptr=ptr->next)) dump_line0(" %s", ptr->str);
+ dump_line0("\n");
+ }
+ if(res->wlan.enc_modes) {
+ str_list_t *ptr = res->wlan.enc_modes;
+ dump_line("WLAN encryption modes: %s", ptr->str);
+ while((ptr=ptr->next)) dump_line0(" %s", ptr->str);
+ dump_line0("\n");
+ }
+ if(res->wlan.auth_modes) {
+ str_list_t *ptr = res->wlan.auth_modes;
+ dump_line("WLAN authentication modes: %s", ptr->str);
+ while((ptr=ptr->next)) dump_line0(" %s", ptr->str);
+ dump_line0("\n");
+ }
+ break;
+
+
+ default:
+ dump_line("Unknown resource type %d\n", res->any.type);
+ }
+ }
+
+ if((sl = h->requires)) {
+ dump_line("Requires: %s", sl->str);
+ for(sl = sl->next; sl; sl = sl->next) {
+ dump_line0(", %s", sl->str);
+ }
+ dump_line0("\n");
+ }
+
+ for(di = h->driver_info, i = 0; di; di = di->next, i++) {
+ dump_line("Driver Info #%d:\n", i);
+ ind += 2;
+ switch(di->any.type) {
+ case di_any:
+ dump_line_str("Driver Info:");
+ for(sl = di->any.hddb0, j = 0; sl; sl = sl->next, j++) {
+ dump_line0("%c%s", j ? ',' : ' ', sl->str);
+ }
+ dump_line0("\n");
+ break;
+
+ case di_display:
+ if(di->display.width)
+ dump_line("Max. Resolution: %ux%u\n", di->display.width, di->display.height);
+ if(di->display.min_vsync)
+ dump_line("Vert. Sync Range: %u-%u Hz\n", di->display.min_vsync, di->display.max_vsync);
+ if(di->display.min_hsync)
+ dump_line("Hor. Sync Range: %u-%u kHz\n", di->display.min_hsync, di->display.max_hsync);
+ if(di->display.bandwidth)
+ dump_line("Bandwidth: %u MHz\n", di->display.bandwidth);
+ break;
+
+ case di_module:
+ dump_line_str("Driver Status: ");
+ for(sl1 = di->module.names; sl1; sl1 = sl1->next) {
+ dump_line0("%s%c", sl1->str, sl1->next ? ',' : ' ');
+ }
+ dump_line0("%s %sactive\n",
+ di->module.names->next ? "are" : "is",
+ di->module.active ? "" : "not "
+ );
+
+ dump_line_str("Driver Activation Cmd: \"");
+ for(sl1 = di->module.names, sl2 = di->module.mod_args; sl1 && sl2; sl1 = sl1->next, sl2 = sl2->next) {
+ dump_line0("%s %s%s%s%s",
+ di->module.modprobe ? "modprobe" : "insmod",
+ sl1->str,
+ sl2->str ? " " : "",
+ sl2->str ? sl2->str : "",
+ (sl1->next && sl2->next) ? "; " : ""
+ );
+ }
+
+ dump_line0("\"\n");
+
+ if(di->module.conf) {
+ char *s = di->module.conf;
+
+ dump_line_str("Driver \"modules.conf\" Entry: \"");
+ for(; *s; s++) {
+ if(isprint(*s)) {
+ dump_line0("%c", *s);
+ }
+ else {
+ switch(*s) {
+ case '\n': dump_line0("\\n"); break;
+ case '\r': dump_line0("\\r"); break;
+ case '\t': dump_line0("\t"); break; /* *no* typo! */
+ default: dump_line0("\\%03o", *s);
+ }
+ }
+ }
+ dump_line0("\"\n");
+ }
+ break;
+
+ case di_mouse:
+ if(di->mouse.buttons >= 0) dump_line("Buttons: %d\n", di->mouse.buttons);
+ if(di->mouse.wheels >= 0) dump_line("Wheels: %d\n", di->mouse.wheels);
+ if(di->mouse.xf86) dump_line("XFree86 Protocol: %s\n", di->mouse.xf86);
+ if(di->mouse.gpm) dump_line("GPM Protocol: %s\n", di->mouse.gpm);
+ break;
+
+ case di_x11:
+ if(di->x11.server) {
+ dump_line(
+ "XFree86 v%s Server%s: %s\n",
+ di->x11.xf86_ver, strcmp(di->x11.xf86_ver, "4") ? "" : " Module", di->x11.server
+ );
+ }
+ if(di->x11.x3d) dump_line_str("3D Support: yes\n");
+ if(di->x11.script) dump_line("3D Script: %s\n", di->x11.script);
+ if(di->x11.colors.all) {
+ dump_line_str("Color Depths: ");
+ j = 0;
+ if(di->x11.colors.c8) { dump_line0("8"); j++; }
+ if(di->x11.colors.c15) { if(j) dump_line0(", "); dump_line0("15"); j++; }
+ if(di->x11.colors.c16) { if(j) dump_line0(", "); dump_line0("16"); j++; }
+ if(di->x11.colors.c24) { if(j) dump_line0(", "); dump_line0("24"); j++; }
+ if(di->x11.colors.c32) { if(j) dump_line0(", "); dump_line0("32"); j++; }
+ dump_line0("\n");
+ }
+ if(di->x11.dacspeed) dump_line("Max. DAC Clock: %u MHz\n", di->x11.dacspeed);
+ if(di->x11.extensions) {
+ dump_line("Extensions: %s", di->x11.extensions->str);
+ for(sl = di->x11.extensions->next; sl; sl = sl->next) {
+ dump_line0(", %s", sl->str);
+ }
+ dump_line0("\n");
+ }
+ if(di->x11.options) {
+ dump_line("Options: %s", di->x11.options->str);
+ for(sl = di->x11.options->next; sl; sl = sl->next) {
+ dump_line0(", %s", sl->str);
+ }
+ dump_line0("\n");
+ }
+ if(di->x11.raw) {
+ dump_line("XF86Config Entry: %s", di->x11.raw->str);
+ for(sl = di->x11.raw->next; sl; sl = sl->next) {
+ dump_line0("\\n%s", sl->str);
+ }
+ dump_line0("\n");
+ }
+ break;
+
+ case di_isdn:
+ dump_line(
+ "I4L Type: %d/%d [%s]\n",
+ di->isdn.i4l_type, di->isdn.i4l_subtype, di->isdn.i4l_name
+ );
+ if((ip = di->isdn.params)) {
+ int k, l;
+
+ dump_line_str("Parameter:\n");
+ for(k = 0; ip; ip = ip->next, k++) {
+ dump_line(
+ " %d%s: (0x%x/%02x): %s = 0x%"PRIx64,
+ k, ip->conflict ? "(conflict)" : ip->valid ? "" : "(invalid)",
+ ip->type, ip->flags >> 8, ip->name, ip->value
+ );
+ if(ip->alt_values) {
+ for(l = 0; l < ip->alt_values; l++) {
+ dump_line0(
+ "%s%s0x%x", l ? "," : " [",
+ ip->alt_value[l] == ip->def_value ? "*" : "",
+ ip->alt_value[l]
+ );
+ }
+ dump_line0("]");
+ }
+ dump_line0("\n");
+ }
+ }
+ break;
+
+ case di_dsl:
+ dump_line(
+ "DSL Mode: %s\n",
+ di->dsl.mode
+ );
+ dump_line(
+ "Driver: %s\n",
+ di->dsl.name
+ );
+ break;
+
+ case di_kbd:
+ if(di->kbd.XkbRules) dump_line("XkbRules: %s\n", di->kbd.XkbRules);
+ if(di->kbd.XkbModel) dump_line("XkbModel: %s\n", di->kbd.XkbModel);
+ if(di->kbd.XkbLayout) dump_line("XkbLayout: %s\n", di->kbd.XkbLayout);
+ if(di->kbd.keymap) dump_line("keymap: %s\n", di->kbd.keymap);
+ break;
+
+ default:
+ dump_line_str("Driver Status: unknown driver info format\n");
+ }
+
+ if((hd_data->debug & HD_DEB_DRIVER_INFO)) {
+ for(sl = di->any.hddb0, j = 0; sl; sl = sl->next, j++) {
+ if(j) {
+ dump_line0("|%s", sl->str);
+ }
+ else {
+ dump_line("Driver DB0: %d, %s", di->any.type, sl->str);
+ }
+ }
+ if(di->any.hddb0) dump_line0("\n");
+
+ for(sl = di->any.hddb1, j = 0; sl; sl = sl->next, j++) {
+ if(!j) dump_line_str("Driver DB1: \"");
+ dump_line0("%s\\n", sl->str);
+ }
+ if(di->any.hddb1) dump_line0("\"\n");
+ }
+
+ ind -= 2;
+ }
+}
+
+/*
+ * print CPU entries
+ */
+void dump_cpu(hd_data_t *hd_data, hd_t *hd, FILE *f)
+{
+ cpu_info_t *ct;
+ str_list_t *sl;
+
+ if(!hd->detail || hd->detail->type != hd_detail_cpu) return;
+ if(!(ct = hd->detail->cpu.data)) return;
+
+ dump_line0 (" Arch: ");
+ switch (ct->architecture) {
+ case arch_intel:
+ dump_line0 ("Intel\n");
+ break;
+ case arch_alpha:
+ dump_line0 ("Alpha\n");
+ break;
+ case arch_sparc:
+ dump_line0 ("Sparc (32)\n");
+ break;
+ case arch_sparc64:
+ dump_line0 ("UltraSparc (64)\n");
+ break;
+ case arch_ppc:
+ dump_line0 ("PowerPC\n");
+ break;
+ case arch_ppc64:
+ dump_line0 ("PowerPC (64)\n");
+ break;
+ case arch_68k:
+ dump_line0 ("68k\n");
+ break;
+ case arch_ia64:
+ dump_line0 ("IA-64\n");
+ break;
+ case arch_s390:
+ dump_line0 ("S390\n");
+ break;
+ case arch_s390x:
+ dump_line0 ("S390x\n");
+ break;
+ case arch_arm:
+ dump_line0 ("ARM\n");
+ break;
+ case arch_mips:
+ dump_line0 ("MIPS\n");
+ break;
+ case arch_x86_64:
+ dump_line0 ("X86-64\n");
+ break;
+ default:
+ dump_line0 ("**UNKNWON**\n");
+ break;
+ }
+
+ if(ct->vend_name) dump_line("Vendor: \"%s\"\n", ct->vend_name);
+
+ if(ct->model_name)
+ dump_line(
+ "Model: %u.%u.%u \"%s\"\n",
+ ct->family, ct->model, ct->stepping, ct->model_name
+ );
+
+ if(ct->platform) dump_line("Platform: \"%s\"\n", ct->platform);
+
+ if(ct->features) {
+ dump_line("Features: %s", ct->features->str);
+ for(sl = ct->features->next; sl; sl = sl->next) {
+ dump_line0(",%s", sl->str);
+ }
+ dump_line0("\n");
+ }
+
+ if(ct->clock) dump_line("Clock: %u MHz\n", ct->clock);
+
+ if(ct->cache) dump_line("Cache: %u kb\n", ct->cache);
+ if(ct->units) dump_line("Units/Processor: %u\n", ct->units);
+}
+
+
+/*
+ * print BIOS entries
+ */
+void dump_bios(hd_data_t *hd_data, hd_t *hd, FILE *f)
+{
+ bios_info_t *bt;
+
+ if(!hd->detail || hd->detail->type != hd_detail_bios) return;
+ if(!(bt = hd->detail->bios.data)) return;
+
+ if(bt->vbe_ver) {
+ dump_line("VESA BIOS Version: %u.%u\n", bt->vbe_ver >> 8, bt->vbe_ver & 0xff);
+ }
+
+ if(bt->vbe_video_mem) {
+ dump_line("Video Memory: %u kb\n", bt->vbe_video_mem >> 10);
+ }
+
+ if(bt->vbe.ok && bt->vbe.current_mode) {
+ dump_line("Current VESA Mode: 0x%04x\n", bt->vbe.current_mode);
+ }
+
+ if(bt->apm_supported) {
+ dump_line("APM Version: %u.%u\n", bt->apm_ver, bt->apm_subver);
+ dump_line("APM Status: %s\n", bt->apm_enabled ? "on" : "off");
+ dump_line("APM BIOS Flags: 0x%x\n", bt->apm_bios_flags);
+ }
+
+ if(bt->led.ok) {
+ dump_line_str("BIOS Keyboard LED Status:\n");
+ dump_line(" Scroll Lock: %s\n", bt->led.scroll_lock ? "on" : "off");
+ dump_line(" Num Lock: %s\n", bt->led.num_lock ? "on" : "off");
+ dump_line(" Caps Lock: %s\n", bt->led.caps_lock ? "on" : "off");
+ }
+
+ if(bt->ser_port0) dump_line("Serial Port 0: 0x%x\n", bt->ser_port0);
+ if(bt->ser_port1) dump_line("Serial Port 1: 0x%x\n", bt->ser_port1);
+ if(bt->ser_port2) dump_line("Serial Port 2: 0x%x\n", bt->ser_port2);
+ if(bt->ser_port3) dump_line("Serial Port 3: 0x%x\n", bt->ser_port3);
+
+ if(bt->par_port0) dump_line("Parallel Port 0: 0x%x\n", bt->par_port0);
+ if(bt->par_port1) dump_line("Parallel Port 1: 0x%x\n", bt->par_port1);
+ if(bt->par_port2) dump_line("Parallel Port 2: 0x%x\n", bt->par_port2);
+
+ if(bt->low_mem_size) dump_line("Base Memory: %u kB\n", bt->low_mem_size >> 10);
+
+ if(bt->is_pnp_bios) {
+ char *s = isa_id2str(bt->pnp_id);
+ dump_line("PnP BIOS: %s\n", s);
+ free_mem(s);
+ }
+
+ if(bt->lba_support) {
+ dump_line_str("BIOS: extended read supported\n");
+ }
+
+ if(bt->smp.ok) {
+ dump_line("MP spec rev 1.%u info:\n", bt->smp.rev);
+ dump_line(" OEM id: \"%s\"\n", bt->smp.oem_id);
+ dump_line(" Product id: \"%s\"\n", bt->smp.prod_id);
+ dump_line(" %u CPUs (%u disabled)\n", bt->smp.cpus, bt->smp.cpus - bt->smp.cpus_en);
+ }
+
+ if(bt->bios32.ok) {
+ dump_line("BIOS32 Service Directory Entry: 0x%05x\n", bt->bios32.entry);
+ }
+
+ if(bt->smbios_ver) {
+ dump_line("SMBIOS Version: %u.%u\n", bt->smbios_ver >> 8, bt->smbios_ver & 0xff);
+ }
+
+ smbios_dump(hd_data, f);
+}
+
+
+/*
+ * print PROM entries
+ */
+void dump_prom(hd_data_t *hd_data, hd_t *hd, FILE *f)
+{
+ prom_info_t *pt;
+ char *s;
+
+ if(!hd->detail || hd->detail->type != hd_detail_prom) return;
+ if(!(pt = hd->detail->prom.data)) return;
+
+ if(pt->has_color) {
+ // ###########################
+ // s = hd_device_name(hd_data, MAKE_ID(TAG_SPECIAL, 0x0300), MAKE_ID(TAG_SPECIAL, pt->color));
+ s = NULL;
+ if(s)
+ dump_line("Color: %s (0x%02x)\n", s, pt->color);
+ else
+ dump_line("Color: 0x%02x\n", pt->color);
+ }
+}
+
+
+/*
+ * print System entries
+ */
+void dump_sys(hd_data_t *hd_data, hd_t *hd, FILE *f)
+{
+ sys_info_t *st;
+
+ if(!hd->detail || hd->detail->type != hd_detail_sys) return;
+ if(!(st = hd->detail->sys.data)) return;
+
+ if(st->system_type) {
+ dump_line("SystemType: \"%s\"\n", st->system_type);
+ }
+ if(st->generation) {
+ dump_line("Generation: \"%s\"\n", st->generation);
+ }
+
+ if(st->lang) {
+ dump_line("Language: \"%s\"\n", st->lang);
+ }
+}
+
+
+char *dump_hid(hd_data_t *hd_data, hd_id_t *hid, int format, char *buf, int buf_size)
+{
+ char *s;
+ int i;
+ unsigned t, id;
+
+ *buf = 0;
+
+ if(hid->id) {
+ t = ID_TAG(hid->id);
+ id = ID_VALUE(hid->id);
+
+ if(format && t == TAG_EISA) {
+ snprintf(buf, buf_size - 1, "%s", eisa_vendor_str(id));
+ }
+ else {
+ snprintf(buf, buf_size - 1, "%s0x%04x", hid_tag_name2(t), id);
+ }
+ }
+
+ i = strlen(buf);
+ if(i) {
+ buf[i++] = ' ';
+ buf[i] = 0;
+ }
+ s = buf + i;
+ buf_size -= i;
+
+ if(!buf_size) return buf;
+
+ if(hid->name) {
+ snprintf(s, buf_size - 1, "\"%s\"", hid->name);
+ }
+
+ return buf;
+}
+
+char *dump_hid2(hd_data_t *hd_data, hd_id_t *hid1, hd_id_t *hid2, char *buf, int buf_size)
+{
+ char *s;
+ int i;
+ unsigned t, id1, id2;
+
+ *buf = 0;
+
+ t = 0;
+ if(hid1->id) t = ID_TAG(hid1->id);
+ if(hid2->id) t = ID_TAG(hid2->id);
+
+ id1 = ID_VALUE(hid1->id);
+ id2 = ID_VALUE(hid2->id);
+
+ if(hid1->id || hid2->id) {
+ if(t == TAG_EISA) {
+ snprintf(buf, buf_size - 1, "%s 0x%04x", eisa_vendor_str(id1), id2);
+ }
+ else {
+ snprintf(buf, buf_size - 1, "%s0x%04x 0x%04x", hid_tag_name2(t), id1, id2);
+ }
+ }
+
+ i = strlen(buf);
+ s = buf + i;
+ buf_size -= i;
+
+ if(!buf_size) return buf;
+
+ if(hid2->name) {
+ snprintf(s, buf_size - 1, " \"%s\"", hid2->name);
+ }
+
+ return buf;
+}
+
+
+char *print_dev_num(hd_dev_num_t *d)
+{
+ static char *buf = NULL;
+
+ if(d->type) {
+ str_printf(&buf, 0, "%s %u:%u",
+ d->type == 'b' ? "block" : "char",
+ d->major, d->minor
+ );
+ if(d->range > 1) {
+ str_printf(&buf, -1, "-%u:%u",
+ d->major, d->minor + d->range - 1
+ );
+ }
+ }
+ else {
+ str_printf(&buf, 0, "%s", "");
+ }
+
+ return buf;
+}
+
+
+#else /* ifndef LIBHD_TINY */
+
+void hd_dump_entry(hd_data_t *hd_data, hd_t *h, FILE *f) { }
+
+#endif /* ifndef LIBHD_TINY */
+
--- /dev/null
+ { 1024, 768, "IBM", "18305CU", NULL },
+ { 1024, 768, "IBM", "1830BLU", NULL },
+ { 1024, 768, "IBM", "1830H3U", NULL },
+ { 1024, 768, "IBM", "1830PVU", NULL },
+ { 1024, 768, "IBM", "18344AU", NULL },
+ { 1024, 768, "IBM", "18344EU", NULL },
+ { 1024, 768, "IBM", "183456U", NULL },
+ { 1024, 768, "IBM", "18345BU", NULL },
+ { 1024, 768, "IBM", "1834E7U", NULL },
+ { 1024, 768, "IBM", "1834ELU", NULL },
+ { 1024, 768, "IBM", "1834FKU", NULL },
+ { 1024, 768, "IBM", "1834NEU", NULL },
+ { 1024, 768, "IBM", "1836BAU", NULL },
+ { 1024, 768, "IBM", "1836H7U", NULL },
+ { 1024, 768, "IBM", "1836Q4U", NULL },
+ { 1024, 768, "IBM", "18422QU", NULL },
+ { 1024, 768, "IBM", "18422RU", NULL },
+ { 1024, 768, "IBM", "1842G3U", NULL },
+ { 1024, 768, "IBM", "1842G7U", NULL },
+ { 1024, 768, "IBM", "1842GDU", NULL },
+ { 1024, 768, "IBM", "1842GQU", NULL },
+ { 1024, 768, "IBM", "1842GRU", NULL },
+ { 1024, 768, "IBM", "1842HRU", NULL },
+ { 1024, 768, "IBM", "1842PPU", NULL },
+ { 1024, 768, "IBM", "185928U", NULL },
+ { 1024, 768, "IBM", "18594YU", NULL },
+ { 1024, 768, "IBM", "18595RU", NULL },
+ { 1024, 768, "IBM", "23711CU", NULL },
+ { 1024, 768, "IBM", "23716EU", NULL },
+ { 1024, 768, "IBM", "23716FU", NULL },
+ { 1024, 768, "IBM", "23716GU", NULL },
+ { 1024, 768, "IBM", "23717GU", NULL },
+ { 1024, 768, "IBM", "23718EU", NULL },
+ { 1024, 768, "IBM", "237197U", NULL },
+ { 1024, 768, "IBM", "2371A9U", NULL },
+ { 1024, 768, "IBM", "2371GHU", NULL },
+ { 1024, 768, "IBM", "23731FU", NULL },
+ { 1024, 768, "IBM", "23731HU", NULL },
+ { 1024, 768, "IBM", "23731WU", NULL },
+ { 1024, 768, "IBM", "23734YU", NULL },
+ { 1024, 768, "IBM", "23735TU", NULL },
+ { 1024, 768, "IBM", "23736VU", NULL },
+ { 1024, 768, "IBM", "23736YU", NULL },
+ { 1024, 768, "IBM", "23737FU", NULL },
+ { 1024, 768, "IBM", "2373J4U", NULL },
+ { 1024, 768, "IBM", "2373JTU", NULL },
+ { 1024, 768, "IBM", "2373K1U", NULL },
+ { 1024, 768, "IBM", "2373L1U", NULL },
+ { 1024, 768, "IBM", "23785UU", NULL },
+ { 1024, 768, "IBM", "2378DGU", NULL },
+ { 1024, 768, "IBM", "2378DHU", NULL },
+ { 1024, 768, "IBM", "2378DTU", NULL },
+ { 1024, 768, "IBM", "2378DUU", NULL },
+ { 1024, 768, "IBM", "2378DWU", NULL },
+ { 1024, 768, "IBM", "2378FTU", NULL },
+ { 1024, 768, "IBM", "2378FZU", NULL },
+ { 1024, 768, "IBM", "2378R1U", NULL },
+ { 1024, 768, "IBM", "2378R4U", NULL },
+ { 1024, 768, "IBM", "2378R8U", NULL },
+ { 1024, 768, "IBM", "23795VU", NULL },
+ { 1024, 768, "IBM", "2379DKU", NULL },
+ { 1024, 768, "IBM", "2379DWU", NULL },
+ { 1024, 768, "IBM", "2379R1U", NULL },
+ { 1024, 768, "IBM", "2379R6U", NULL },
+ { 1024, 768, "IBM", "2379R8U", NULL },
+ { 1024, 768, "IBM", "23826UU", NULL },
+ { 1024, 768, "IBM", "2382ECU", NULL },
+ { 1024, 768, "IBM", "2382HCU", NULL },
+ { 1024, 768, "IBM", "2384A9U", NULL },
+ { 1024, 768, "IBM", "2384ATU", NULL },
+ { 1024, 768, "IBM", "2384B9U", NULL },
+ { 1024, 768, "IBM", "2384DLU", NULL },
+ { 1024, 768, "IBM", "2384DWU", NULL },
+ { 1024, 768, "IBM", "2384ECU", NULL },
+ { 1024, 768, "IBM", "2384EHU", NULL },
+ { 1024, 768, "IBM", "2384JCU", NULL },
+ { 1024, 768, "IBM", "238613U", NULL },
+ { 1024, 768, "IBM", "23861CU", NULL },
+ { 1024, 768, "IBM", "23861ZU", NULL },
+ { 1024, 768, "IBM", "23865FU", NULL },
+ { 1024, 768, "IBM", "23866GU", NULL },
+ { 1024, 768, "IBM", "23866RU", NULL },
+ { 1024, 768, "IBM", "23866UU", NULL },
+ { 1024, 768, "IBM", "23868EU", NULL },
+ { 1024, 768, "IBM", "23868WU", NULL },
+ { 1024, 768, "IBM", "2386A4U", NULL },
+ { 1024, 768, "IBM", "2386E9U", NULL },
+ { 1024, 768, "IBM", "23884QU", NULL },
+ { 1024, 768, "IBM", "238852U", NULL },
+ { 1024, 768, "IBM", "2388DGU", NULL },
+ { 1024, 768, "IBM", "2388DMU", NULL },
+ { 1024, 768, "IBM", "2388EJU", NULL },
+ { 1024, 768, "IBM", "2388ENU", NULL },
+ { 1024, 768, "IBM", "2388F4U", NULL },
+ { 1024, 768, "IBM", "2388HBU", NULL },
+ { 1024, 768, "IBM", "2388JBU", NULL },
+ { 1024, 768, "IBM", "2389DHU", NULL },
+ { 1024, 768, "IBM", "26284UG", NULL },
+ { 1024, 768, "IBM", "26446AG", NULL },
+ { 1024, 768, "IBM", "26455BG", NULL },
+ { 1024, 768, "IBM", "264721G", NULL },
+ { 1024, 768, "IBM", "26725KU", NULL },
+ { 1024, 768, "IBM", "2672REU", NULL },
+ { 1024, 768, "IBM", "2672RHU", NULL },
+ { 1024, 768, "IBM", "267358U", NULL },
+ { 1024, 768, "IBM", "26735KU", NULL },
+ { 1024, 768, "IBM", "26817FU", NULL },
+ { 1024, 768, "IBM", "2682PAU", NULL },
+ { 1024, 768, "IBM", "2684FU4", NULL },
+ { 1024, 768, "IBM", "2684KJU", NULL },
+ { 1024, 768, "IBM", "2684QBU", NULL },
+ { 1024, 768, "IBM", "27225JU", NULL },
+ { 1024, 768, "IBM", "27233XU", NULL },
+ { 1024, 768, "IBM", "288122U", NULL },
+ { 1024, 768, "IBM", "288136U", NULL },
+ { 1024, 768, "IBM", "288157U", NULL },
+ { 1024, 768, "IBM", "28832ZU", NULL },
+ { 1024, 768, "IBM", "28838QU", NULL },
+ { 1024, 768, "IBM", "2883ARU", NULL },
+ { 1024, 768, "IBM", "2883ELU", NULL },
+ { 1024, 768, "IBM", "2883GKU", NULL },
+ { 1024, 768, "IBM", "28854WU", NULL },
+ { 1024, 768, "IBM", "2885PWU", NULL },
+ { 1024, 768, "IBM", "28865TU", NULL },
+ { 1024, 768, "IBM", "288692U", NULL },
+ { 1024, 768, "IBM", "28872KU", NULL },
+ { 1024, 768, "IBM", "288745U", NULL },
+ { 1024, 768, "IBM", "288767U", NULL },
+ { 1024, 768, "IBM", "28878PU", NULL },
+ { 1024, 768, "IBM", "28885RU", NULL },
+ { 1024, 768, "IBM", "2888M9U", NULL },
+ { 1400, 1050, "IBM", "1830BQU", NULL },
+ { 1400, 1050, "IBM", "18363SU", NULL },
+ { 1400, 1050, "IBM", "1836H8U", NULL },
+ { 1400, 1050, "IBM", "1836H9U", NULL },
+ { 1400, 1050, "IBM", "1836HAU", NULL },
+ { 1400, 1050, "IBM", "1836Q6U", NULL },
+ { 1400, 1050, "IBM", "1836Q7U", NULL },
+ { 1400, 1050, "IBM", "18594AU", NULL },
+ { 1400, 1050, "IBM", "237394U", NULL },
+ { 1400, 1050, "IBM", "23739FU", NULL },
+ { 1400, 1050, "IBM", "2373G1U", NULL },
+ { 1400, 1050, "IBM", "2373G3U", NULL },
+ { 1400, 1050, "IBM", "2373GEU", NULL },
+ { 1400, 1050, "IBM", "2373GGU", NULL },
+ { 1400, 1050, "IBM", "2373GHG", NULL },
+ { 1400, 1050, "IBM", "2373KTU", NULL },
+ { 1400, 1050, "IBM", "2373KUU", NULL },
+ { 1400, 1050, "IBM", "2373L4U", NULL },
+ { 1400, 1050, "IBM", "2374GGG", NULL },
+ { 1400, 1050, "IBM", "2378DXU", NULL },
+ { 1400, 1050, "IBM", "2378FVU", NULL },
+ { 1400, 1050, "IBM", "2379DJU", NULL },
+ { 1400, 1050, "IBM", "2379DXU", NULL },
+ { 1400, 1050, "IBM", "2379R9U", NULL },
+ { 1400, 1050, "IBM", "23885DU", NULL },
+ { 1400, 1050, "IBM", "2388F5U", NULL },
+ { 1400, 1050, "IBM", "288678U", NULL },
+ { 1400, 1050, "IBM", "288679U", NULL },
+ { 1400, 1050, "IBM", "288693U", NULL },
+ { 1600, 1200, "IBM", "183222U", NULL },
+ { 1600, 1200, "IBM", "183223U", NULL },
+ { 1600, 1200, "IBM", "2373HTU", NULL },
+ { 1600, 1200, "IBM", "2373HVU", NULL },
+ { 1600, 1200, "IBM", "2373KXU", NULL },
+ { 1600, 1200, "IBM", "2373KYU", NULL },
+ { 1600, 1200, "IBM", "2373Q1U", NULL },
+ { 1600, 1200, "IBM", "2378DYU", NULL },
+ { 1600, 1200, "IBM", "2379DYU", NULL },
--- /dev/null
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <linux/input.h>
+
+#include "hd.h"
+#include "hd_int.h"
+#include "hddb.h"
+#include "input.h"
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ * input devs
+ *
+ * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ */
+
+static void get_input_devices(hd_data_t *hd_data);
+static char *all_bits(char *str);
+static int test_bit(char *str, unsigned bit);
+
+void hd_scan_input(hd_data_t *hd_data)
+{
+ if(!hd_probe_feature(hd_data, pr_input)) return;
+
+ hd_data->module = mod_input;
+
+ /* some clean-up */
+ remove_hd_entries(hd_data);
+
+ PROGRESS(1, 0, "joydev mod");
+ load_module(hd_data, "joydev");
+
+ PROGRESS(1, 1, "evdev mod");
+ load_module(hd_data, "evdev");
+
+ PROGRESS(2, 0, "input");
+
+ get_input_devices(hd_data);
+}
+
+
+#define INP_NAME "N: Name="
+#define INP_HANDLERS "H: Handlers="
+#define INP_KEY "B: KEY="
+#define INP_REL "B: REL="
+
+void get_input_devices(hd_data_t *hd_data)
+{
+ hd_t *hd;
+ str_list_t *input, *sl, *sl1;
+ char *s;
+ unsigned ok, u;
+ unsigned bus, vendor, product, version;
+ unsigned mouse_buttons, mouse_wheels;
+ char *name = NULL, *handlers = NULL, *key = NULL, *rel = NULL;
+ size_t len;
+ str_list_t *handler_list;
+ hd_dev_num_t dev_num = { type: 'c', range: 1 };
+
+ input = read_file("/proc/bus/input/devices", 0, 0);
+
+ ADD2LOG("----- /proc/bus/input/devices -----\n");
+ for(sl = input; sl; sl = sl->next) {
+ ADD2LOG(" %s", sl->str);
+ }
+ ADD2LOG("----- /proc/bus/input/devices end -----\n");
+
+ for(ok = 0, sl = input; sl; sl = sl->next) {
+ if(*sl->str == '\n') {
+ ADD2LOG("bus = %u, name = %s\n", bus, name);
+ if(handlers) ADD2LOG(" handlers = %s\n", handlers);
+ if(key) ADD2LOG(" key = %s\n", key);
+ if(rel) ADD2LOG(" rel = %s\n", rel);
+
+ mouse_buttons = 0;
+ if(key) {
+ for(u = BTN_MOUSE; u < BTN_MOUSE + 8; u++) {
+ if(test_bit(key, u)) mouse_buttons++;
+ }
+ }
+ ADD2LOG(" mouse buttons = %u\n", mouse_buttons);
+
+ mouse_wheels = 0;
+ if(rel) {
+ for(u = REL_HWHEEL; u <= REL_MAX; u++) {
+ if(test_bit(rel, u)) mouse_wheels++;
+ }
+ }
+ ADD2LOG(" mouse wheels = %u\n", mouse_wheels);
+
+ if(ok && handlers) {
+ handler_list = hd_split(' ', handlers);
+
+ if(bus == BUS_USB) {
+ s = NULL;
+ for(sl1 = handler_list; sl1; sl1 = sl1->next) {
+ if(sscanf(sl1->str, "mouse%u", &u) == 1) {
+ str_printf(&s, 0, "/dev/input/mouse%u", u);
+ break;
+ }
+ }
+
+ if(s) {
+ for(hd = hd_data->hd; hd; hd = hd->next) {
+ if(hd->unix_dev_name2 && !strcmp(hd->unix_dev_name2, s)) {
+ hd->compat_vendor.id = MAKE_ID(TAG_SPECIAL, 0x0210);
+ hd->compat_device.id = MAKE_ID(TAG_SPECIAL, (mouse_wheels << 4) + mouse_buttons);
+ }
+ }
+ }
+
+ s = free_mem(s);
+ }
+ else {
+ if(search_str_list(handler_list, "kbd") && test_bit(key, KEY_1)) {
+ hd = add_hd_entry(hd_data, __LINE__, 0);
+ hd->base_class.id = bc_keyboard;
+ hd->sub_class.id = sc_keyboard_kbd;
+ hd->bus.id = bus_ps2;
+
+ hd->vendor.id = MAKE_ID(TAG_SPECIAL, 0x0211);
+ hd->device.id = MAKE_ID(TAG_SPECIAL, 0x0001);
+ hd->device.name = new_str(name);
+
+ for(sl1 = handler_list; sl1; sl1 = sl1->next) {
+ if(sscanf(sl1->str, "event%u", &u) == 1) {
+ str_printf(&hd->unix_dev_name, 0, "/dev/input/event%u", u);
+ dev_num.major = 13;
+ dev_num.minor = 64 + u;
+ hd->unix_dev_num = dev_num;
+ break;
+ }
+ }
+ }
+ else if(strstr(handlers, "mouse")) {
+ hd = add_hd_entry(hd_data, __LINE__, 0);
+ hd->base_class.id = bc_mouse;
+ hd->sub_class.id = sc_mou_ps2;
+ hd->bus.id = bus_ps2;
+
+ hd->vendor.id = MAKE_ID(TAG_SPECIAL, 0x0210);
+ hd->device.id = MAKE_ID(TAG_SPECIAL, (mouse_wheels << 4) + mouse_buttons);
+ hd->device.name = new_str(name);
+
+ /* Synaptics/Alps TouchPad */
+ if(vendor == 2 && (product == 7 || product == 8)) {
+ hd->compat_vendor.id = hd->vendor.id;
+ hd->compat_device.id = hd->device.id;
+ hd->vendor.id = MAKE_ID(TAG_SPECIAL, 0x0212);
+ hd->device.id = MAKE_ID(TAG_SPECIAL, product - 6);
+ }
+
+ hd->unix_dev_name = new_str(DEV_MICE);
+ dev_num.major = 13;
+ dev_num.minor = 63;
+ hd->unix_dev_num = dev_num;
+
+ for(sl1 = handler_list; sl1; sl1 = sl1->next) {
+ if(sscanf(sl1->str, "mouse%u", &u) == 1) {
+ str_printf(&hd->unix_dev_name2, 0, "/dev/input/mouse%u", u);
+ dev_num.major = 13;
+ dev_num.minor = 32 + u;
+ hd->unix_dev_num2 = dev_num;
+ break;
+ }
+ }
+
+ }
+ }
+
+ handler_list = free_str_list(handler_list);
+ }
+
+ ok = 0;
+
+ name = free_mem(name);
+ handlers = free_mem(handlers);
+ key = free_mem(key);
+ rel = free_mem(rel);
+ }
+
+ if(sscanf(sl->str, "I: Bus=%04x Vendor=%04x Product=%04x Version=%04x", &bus, &vendor, &product, &version) == 4) {
+ ok = 1;
+ continue;
+ }
+
+ if(!strncmp(sl->str, INP_NAME, sizeof INP_NAME - 1)) {
+ s = sl->str + sizeof INP_NAME;
+ len = strlen(s);
+ if(len > 2) {
+ name = canon_str(s, len - 2);
+ }
+ continue;
+ }
+
+ if(!strncmp(sl->str, INP_HANDLERS, sizeof INP_HANDLERS - 1)) {
+ s = sl->str + sizeof INP_HANDLERS - 1;
+ handlers = canon_str(s, strlen(s));
+ continue;
+ }
+
+ if(!strncmp(sl->str, INP_KEY, sizeof INP_KEY - 1)) {
+ s = sl->str + sizeof INP_KEY - 1;
+ key = canon_str(s, strlen(s));
+ key = all_bits(key);
+ continue;
+ }
+
+ if(!strncmp(sl->str, INP_REL, sizeof INP_REL - 1)) {
+ s = sl->str + sizeof INP_REL - 1;
+ rel = canon_str(s, strlen(s));
+ rel = all_bits(rel);
+ continue;
+ }
+ }
+
+ free_str_list(input);
+
+}
+
+
+char *all_bits(char *str)
+{
+ str_list_t *sl, *sl0;
+ char *s = NULL;
+ unsigned u;
+
+ if(!str) return NULL;
+
+ sl = sl0 = hd_split(' ', str);
+ for(; sl; sl = sl->next) {
+ u = strtoul(sl->str, NULL, 16);
+ str_printf(&s, -1, "%08x", u);
+ }
+ free_str_list(sl0);
+ free_mem(str);
+
+ return s;
+}
+
+
+int test_bit(char *str, unsigned bit)
+{
+ size_t len, ofs;
+ unsigned u, mask;
+
+ if(!str) return 0;
+
+ len = strlen(str);
+
+ ofs = bit >> 2;
+ mask = 1 << (bit & 3);
+
+ if(ofs >= len) return 0;
+
+ ofs = len - ofs - 1;
+
+ u = str[ofs] >= 'a' ? str[ofs] - 'a' + 10 : str[ofs] - '0';
+
+ return (u & mask) ? 1 : 0;
+}
+
+
--- /dev/null
+void hd_scan_input(hd_data_t *hd_data);
--- /dev/null
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+typedef unsigned long kernel_ulong_t;
+#include <linux/types.h>
+#ifdef __UCLIBC__
+#include <linux/pci.h>
+#else
+#include <sys/pci.h>
+#endif
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#include "hd.h"
+#include "hd_int.h"
+#include "int.h"
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ * internal things
+ *
+ * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ */
+
+static void int_hotplug(hd_data_t *hd_data);
+static void int_cdrom(hd_data_t *hd_data);
+#if defined(__i386__) || defined (__x86_64__)
+static int set_bios_id(hd_data_t *hd_data, hd_t *hd_ref, int bios_id);
+static int bios_ctrl_order(hd_data_t *hd_data, unsigned *sctrl, int sctrl_len);
+static void int_bios(hd_data_t *hd_data);
+#endif
+static void int_media_check(hd_data_t *hd_data);
+static int contains_word(char *str, char *str2);
+static int is_zip(hd_t *hd);
+static void int_floppy(hd_data_t *hd_data);
+static void int_fix_usb_scsi(hd_data_t *hd_data);
+static void int_mouse(hd_data_t *hd_data);
+static void new_id(hd_data_t *hd_data, hd_t *hd);
+static void int_modem(hd_data_t *hd_data);
+static void int_wlan(hd_data_t *hd_data);
+static void int_udev(hd_data_t *hd_data);
+static void int_devicenames(hd_data_t *hd_data);
+#if defined(__i386__) || defined (__x86_64__)
+static void int_softraid(hd_data_t *hd_data);
+#endif
+#if defined(__i386__) || defined (__x86_64__)
+static void int_system(hd_data_t *hd_data);
+static void int_legacy_geo(hd_data_t *hd_data);
+#endif
+
+void hd_scan_int(hd_data_t *hd_data)
+{
+ hd_t *hd;
+
+ if(!hd_probe_feature(hd_data, pr_int)) return;
+
+ hd_data->module = mod_int;
+
+ /* some clean-up */
+ remove_hd_entries(hd_data);
+
+ PROGRESS(2, 0, "cdrom");
+ int_cdrom(hd_data);
+
+ PROGRESS(3, 0, "media");
+ int_media_check(hd_data);
+
+ PROGRESS(4, 0, "floppy");
+ int_floppy(hd_data);
+
+#if defined(__i386__) || defined (__x86_64__)
+ PROGRESS(5, 0, "bios");
+ int_bios(hd_data);
+#endif
+
+ PROGRESS(6, 0, "mouse");
+ int_mouse(hd_data);
+
+#if defined(__i386__) || defined (__x86_64__)
+ PROGRESS(15, 0, "system info");
+ int_system(hd_data);
+#endif
+
+ PROGRESS(7, 0, "hdb");
+ hd_data->flags.keep_kmods = 1;
+ for(hd = hd_data->hd; hd; hd = hd->next) {
+ hddb_add_info(hd_data, hd);
+ }
+ hd_data->flags.keep_kmods = 0;
+
+ PROGRESS(8, 0, "usbscsi");
+ int_fix_usb_scsi(hd_data);
+
+ PROGRESS(9, 0, "hotplug");
+ int_hotplug(hd_data);
+
+ PROGRESS(10, 0, "modem");
+ int_modem(hd_data);
+
+ PROGRESS(11, 0, "wlan");
+ int_wlan(hd_data);
+
+ PROGRESS(12, 0, "udev");
+ int_udev(hd_data);
+
+ PROGRESS(13, 0, "device names");
+ int_devicenames(hd_data);
+
+#if defined(__i386__) || defined (__x86_64__)
+ PROGRESS(14, 0, "soft raid");
+ int_softraid(hd_data);
+
+ PROGRESS(15, 0, "geo");
+ int_legacy_geo(hd_data);
+#endif
+
+}
+
+/*
+ * Identify hotpluggable devices.
+ */
+void int_hotplug(hd_data_t *hd_data)
+{
+ hd_t *hd;
+
+ for(hd = hd_data->hd; hd; hd = hd->next) {
+ if(hd->bus.id == bus_usb || hd->usb_guid) {
+ hd->hotplug = hp_usb;
+ }
+ }
+}
+
+/*
+ * Add more info to CDROM entries.
+ */
+void int_cdrom(hd_data_t *hd_data)
+{
+ hd_t *hd;
+
+ for(hd = hd_data->hd; hd; hd = hd->next) {
+ if(
+ hd->base_class.id == bc_storage_device &&
+ hd->sub_class.id == sc_sdev_cdrom &&
+ !hd->prog_if.id
+ ) {
+ if(hd->device.name && strstr(hd->device.name, "DVD")) {
+ hd->prog_if.id = 3;
+ }
+ }
+ }
+}
+
+#if defined(__i386__) || defined (__x86_64__)
+
+int set_bios_id(hd_data_t *hd_data, hd_t *hd_ref, int bios_id)
+{
+ int found = 0;
+ hd_t *hd;
+
+ if(!hd_ref || !hd_ref->unix_dev_name) return 0;
+
+ for(hd = hd_data->hd; hd; hd = hd->next) {
+ if(
+ hd->base_class.id == bc_storage_device &&
+ hd->sub_class.id == sc_sdev_disk &&
+ hd->unix_dev_name &&
+ !strcmp(hd->unix_dev_name, hd_ref->unix_dev_name)
+ ) {
+ str_printf(&hd->rom_id, 0, "0x%02x", bios_id);
+ found = 1;
+ }
+ }
+
+ return found;
+}
+
+
+int bios_ctrl_order(hd_data_t *hd_data, unsigned *sctrl, int sctrl_len)
+{
+ hd_t *hd;
+ bios_info_t *bt;
+ int i, j, k, sctrl2_len = 0;
+ unsigned pci_slot, pci_func;
+ unsigned *sctrl2 = NULL, *sctrl3 = NULL;
+ int order_info = 0;
+
+ for(bt = NULL, hd = hd_data->hd; hd; hd = hd->next) {
+ if(
+ hd->base_class.id == bc_internal &&
+ hd->sub_class.id == sc_int_bios &&
+ hd->detail &&
+ hd->detail->type == hd_detail_bios &&
+ (bt = hd->detail->bios.data)
+ ) {
+ break;
+ }
+ }
+
+ if(!bt || !bt->bios32.ok || !bt->bios32.compaq) return 0;
+
+ sctrl2 = new_mem((sizeof bt->bios32.cpq_ctrl / sizeof *bt->bios32.cpq_ctrl) * sizeof *sctrl2);
+
+ for(i = 0; (unsigned) i < sizeof bt->bios32.cpq_ctrl / sizeof *bt->bios32.cpq_ctrl; i++) {
+ if(
+ bt->bios32.cpq_ctrl[i].id &&
+ !(bt->bios32.cpq_ctrl[i].misc & 0x40) /* bios support ??????? */
+ ) {
+ pci_slot = PCI_SLOT(bt->bios32.cpq_ctrl[i].devfn) + (bt->bios32.cpq_ctrl[i].bus << 8);
+ pci_func = PCI_FUNC(bt->bios32.cpq_ctrl[i].devfn);
+ for(hd = hd_data->hd; hd; hd = hd->next) {
+ if(hd->bus.id == bus_pci && hd->slot == pci_slot && hd->func == pci_func) {
+ sctrl2[sctrl2_len++] = hd->idx;
+ break;
+ }
+ }
+ }
+ }
+
+ if(sctrl2_len) order_info = 1;
+
+ for(i = 0; i < sctrl2_len; i++) {
+ ADD2LOG(" bios ord %d: %d\n", i, sctrl2[i]);
+ }
+
+ /* sort list */
+
+ sctrl3 = new_mem(sctrl_len * sizeof *sctrl3);
+
+ k = 0 ;
+ for(i = 0; i < sctrl2_len; i++) {
+ for(j = 0; j < sctrl_len; j++) {
+ if(sctrl[j] == sctrl2[i]) {
+ sctrl3[k++] = sctrl[j];
+ sctrl[j] = 0;
+ break;
+ }
+ }
+ }
+
+ for(i = 0; i < sctrl_len; i++) {
+ if(sctrl[i] && k < sctrl_len) sctrl3[k++] = sctrl[i];
+ }
+
+ memcpy(sctrl, sctrl3, sctrl_len * sizeof *sctrl);
+
+ free_mem(sctrl2);
+ free_mem(sctrl3);
+
+ return order_info;
+}
+
+
+void int_bios(hd_data_t *hd_data)
+{
+ hd_t *hd, *hd_boot;
+ unsigned *sctrl, *sctrl2;
+ int sctrl_len, i, j;
+ int bios_id, list_sorted;
+
+ /* don't do anything if there is useful edd info */
+ if(hd_data->flags.edd_used) return;
+
+ for(i = 0, hd = hd_data->hd; hd; hd = hd->next) {
+ if(
+ hd->base_class.id == bc_storage_device &&
+ hd->sub_class.id == sc_sdev_disk
+ ) {
+ i++;
+ }
+ }
+
+ if(!i) return;
+
+ sctrl = new_mem(i * sizeof *sctrl);
+
+ /* sctrl: list of storage controllers with disks */
+
+ for(sctrl_len = 0, hd = hd_data->hd; hd; hd = hd->next) {
+ if(
+ hd->base_class.id == bc_storage_device &&
+ hd->sub_class.id == sc_sdev_disk
+ ) {
+ for(i = 0; i < sctrl_len; i++) {
+ if(sctrl[i] == hd->attached_to) break;
+ }
+ if(i == sctrl_len) sctrl[sctrl_len++] = hd->attached_to;
+ }
+ }
+
+ /* sort list, if possible */
+
+ list_sorted = bios_ctrl_order(hd_data, sctrl, sctrl_len);
+
+ hd_boot = hd_get_device_by_idx(hd_data, hd_boot_disk(hd_data, &i));
+
+ /* if we know the boot device, make this controller the first */
+
+ if(hd_boot && hd_boot->attached_to && i == 1) {
+ for(i = 0; i < sctrl_len; i++) {
+ if(sctrl[i] == hd_boot->attached_to) break;
+ }
+ if(i < sctrl_len) {
+ sctrl2 = new_mem(sctrl_len * sizeof *sctrl2);
+ *sctrl2 = hd_boot->attached_to;
+ for(i = 0, j = 1; i < sctrl_len; i++) {
+ if(sctrl[i] != hd_boot->attached_to) sctrl2[j++] = sctrl[i];
+ }
+ free_mem(sctrl);
+ sctrl = sctrl2;
+ }
+ }
+ else {
+ hd_boot = NULL;
+ }
+
+ if(hd_boot) ADD2LOG(" bios boot dev: %d\n", hd_boot->idx);
+ for(i = 0; i < sctrl_len; i++) {
+ ADD2LOG(" bios ctrl %d: %d\n", i, sctrl[i]);
+ }
+
+ /* remove existing entries */
+
+ for(hd = hd_data->hd; hd; hd = hd->next) {
+ if(
+ hd->base_class.id == bc_storage_device &&
+ hd->sub_class.id == sc_sdev_disk
+ ) {
+ hd->rom_id = free_mem(hd->rom_id);
+ }
+ }
+
+ if(!list_sorted && !hd_boot && sctrl_len > 1) {
+ /* we have no info at all */
+ sctrl_len = 0;
+ }
+ else if(!list_sorted && hd_boot && sctrl_len > 2) {
+ /* we know which controller has the boot device */
+ sctrl_len = 1;
+ }
+
+ bios_id = 0x80;
+
+ /* rely on it */
+
+ if(hd_boot) {
+ bios_id += set_bios_id(hd_data, hd_boot, bios_id);
+ }
+
+ /* assign all the others */
+
+ for(i = 0; i < sctrl_len; i++) {
+ for(hd = hd_data->hd; hd; hd = hd->next) {
+ if(
+ hd->base_class.id == bc_storage_device &&
+ hd->sub_class.id == sc_sdev_disk &&
+ hd->attached_to == sctrl[i] &&
+ !hd->rom_id
+ ) {
+ bios_id += set_bios_id(hd_data, hd, bios_id);
+ }
+ }
+ }
+
+ free_mem(sctrl);
+}
+
+
+#if 0
+void int_bios(hd_data_t *hd_data)
+{
+ hd_t *hd, *hd_boot;
+ int i, start, bios = 0x80;
+ int ide_1st;
+ char ide_name[] = "/dev/hda";
+ char scsi_name[] = "/dev/sda";
+ char *s;
+
+ hd_boot = hd_get_device_by_idx(hd_data, hd_boot_disk(hd_data, &i));
+
+ if(hd_boot) {
+ free_mem(hd_boot->rom_id);
+ hd_boot->rom_id = new_str("0x80");
+ }
+
+ if(!hd_boot || i != 1) return;
+
+ if(strstr(hd_boot->unix_dev_name, "/dev/sd") == hd_boot->unix_dev_name) {
+ ide_1st = 0;
+ start = hd_boot->unix_dev_name[sizeof "/dev/sd" - 1] - 'a';
+ }
+ else if(strstr(hd_boot->unix_dev_name, "/dev/hd") == hd_boot->unix_dev_name) {
+ ide_1st = 1;
+ start = hd_boot->unix_dev_name[sizeof "/dev/hd" - 1] - 'a';
+ }
+ else {
+ return;
+ }
+
+ if(start < 0) return;
+
+ for(hd = hd_data->hd; hd; hd = hd->next) {
+ if(
+ hd->base_class.id == bc_storage_device &&
+ hd->sub_class.id == sc_sdev_disk
+ ) {
+ hd->rom_id = free_mem(hd->rom_id);
+ }
+ }
+
+ s = ide_1st ? ide_name : scsi_name;
+
+ for(i = start; i < 26; i++) {
+ s[strlen(s) - 1] = 'a' + i;
+ bios += set_bios_id(hd_data, s, bios);
+ }
+
+ for(i = 0; i < start; i++) {
+ s[strlen(s) - 1] = 'a' + i;
+ bios += set_bios_id(hd_data, s, bios);
+ }
+
+ s = ide_1st ? scsi_name : ide_name;
+
+ for(i = 0; i < 26; i++) {
+ s[strlen(s) - 1] = 'a' + i;
+ bios += set_bios_id(hd_data, s, bios);
+ }
+}
+#endif /* 0 */
+#endif /* defined(__i386__) || defined (__x86_64__) */
+
+/*
+ * Try to read block 0 for block devices.
+ */
+void int_media_check(hd_data_t *hd_data)
+{
+ hd_t *hd;
+ int i, j = 0;
+
+ for(hd = hd_data->hd; hd; hd = hd->next) {
+ if(!hd_report_this(hd_data, hd)) continue;
+ if(
+ hd->base_class.id == bc_storage_device &&
+ (
+ /* hd->sub_class.id == sc_sdev_cdrom || */ /* cf. cdrom.c */
+ hd->sub_class.id == sc_sdev_disk ||
+ hd->sub_class.id == sc_sdev_floppy
+ ) &&
+ hd->unix_dev_name &&
+ !hd->block0 &&
+ !hd->is.notready &&
+ hd->status.available != status_no
+ ) {
+ i = 5;
+ PROGRESS(4, ++j, hd->unix_dev_name);
+ hd->block0 = read_block0(hd_data, hd->unix_dev_name, &i);
+ hd->is.notready = hd->block0 ? 0 : 1;
+ }
+ }
+}
+
+
+/*
+ * Check if str has str2 in it.
+ */
+int contains_word(char *str, char *str2)
+{
+ int i, len, len2, found = 0;
+ char *s;
+
+ if(!str2 || !*str2 || !str || !*str) return 0;
+
+ str = new_str(str);
+
+ len = strlen(str);
+ len2 = strlen(str2);
+
+ for(i = 0; i < len; i++) {
+ if(str[i] >= 'a' && str[i] <= 'z') str[i] -= 'a' - 'A';
+ }
+
+ for(s = str; (s = strstr(s, str2)); s++) {
+ if(
+ (s == str || s[-1] < 'A' || s[-1] > 'Z') &&
+ (s[len2] < 'A' || s[len2] > 'Z')
+ ) {
+ found = 1;
+ break;
+ }
+ }
+
+ free_mem(str);
+
+ return found;
+}
+
+
+/*
+ * Check for zip drive.
+ */
+int is_zip(hd_t *hd)
+{
+ if(
+ hd->base_class.id == bc_storage_device &&
+ (
+ hd->sub_class.id == sc_sdev_disk ||
+ hd->sub_class.id == sc_sdev_floppy
+ )
+ ) {
+ if(
+ (
+ contains_word(hd->vendor.name, "IOMEGA") ||
+ contains_word(hd->sub_vendor.name, "IOMEGA") ||
+ contains_word(hd->device.name, "IOMEGA") ||
+ contains_word(hd->sub_device.name, "IOMEGA")
+ ) && (
+ contains_word(hd->device.name, "ZIP") ||
+ contains_word(hd->sub_device.name, "ZIP")
+ )
+ ) {
+ return 1;
+ }
+ }
+
+ return 0;
+}
+
+
+/*
+ * Turn some drives into floppies.
+ */
+void int_floppy(hd_data_t *hd_data)
+{
+ hd_t *hd;
+ hd_res_t *res;
+
+ for(hd = hd_data->hd; hd; hd = hd->next) {
+ if(is_zip(hd)) hd->is.zip = 1;
+ if(
+ hd->base_class.id == bc_storage_device &&
+ hd->sub_class.id == sc_sdev_disk
+ ) {
+ if(hd->is.zip) {
+ hd->sub_class.id = sc_sdev_floppy;
+ new_id(hd_data, hd);
+ }
+ else {
+ /* make everything a floppy that is 1440k */
+ for(res = hd->res; res; res = res->next) {
+ if(
+ res->any.type == res_size &&
+ res->size.unit == size_unit_sectors &&
+ res->size.val1 == 2880 &&
+ res->size.val2 == 512
+ ) {
+ hd->sub_class.id = sc_sdev_floppy;
+ new_id(hd_data, hd);
+ break;
+ }
+ }
+ }
+ }
+ }
+}
+
+
+#define COPY_ENTRY(a) if(hd_scsi->a) { free_mem(hd_usb->a); hd_usb->a = new_str(hd_scsi->a); }
+/*
+ * Remove usb entries that are handled by usb-storage.
+ */
+void int_fix_usb_scsi(hd_data_t *hd_data)
+{
+ hd_t *hd_scsi, *hd_usb;
+
+ for(hd_usb = hd_data->hd; hd_usb; hd_usb= hd_usb->next) {
+ if(
+ hd_usb->bus.id == bus_usb &&
+ hd_usb->sysfs_id &&
+ search_str_list(hd_usb->drivers, "usb-storage")
+ ) {
+ for(hd_scsi = hd_data->hd; hd_scsi; hd_scsi = hd_scsi->next) {
+ if(
+ hd_scsi->bus.id == bus_scsi &&
+ hd_scsi->sysfs_device_link &&
+ search_str_list(hd_scsi->drivers, "usb-storage")
+ ) {
+ if(!strncmp(hd_scsi->sysfs_device_link, hd_usb->sysfs_id, strlen(hd_usb->sysfs_id))) {
+ hd_set_hw_class(hd_scsi, hw_usb);
+
+ free_mem(hd_scsi->unique_id);
+ hd_scsi->unique_id = hd_usb->unique_id;
+ hd_usb->unique_id = NULL;
+
+ add_res_entry(&hd_scsi->res, hd_usb->res);
+ hd_usb->res = NULL;
+
+ new_id(hd_data, hd_scsi);
+
+ hd_usb->tag.remove = 1;
+ }
+ }
+ }
+ }
+
+ }
+
+
+
+#if 0
+ for(hd_scsi = hd_data->hd; hd_scsi; hd_scsi = hd_scsi->next) {
+ if(
+ hd_scsi->bus.id == bus_scsi &&
+ hd_scsi->usb_guid &&
+ search_str_list(hd_scsi->drivers, "usb-storage")
+ ) {
+ for(hd_usb = hd_data->hd; hd_usb ; hd_usb = hd_usb->next) {
+ if(
+ hd_usb->bus.id == bus_usb &&
+ hd_usb->usb_guid &&
+ !hd_usb->tag.remove &&
+ !strcmp(hd_usb->usb_guid, hd_scsi->usb_guid) &&
+ hd_usb->detail &&
+ hd_usb->detail->type == hd_detail_usb &&
+ (usb = hd_usb->detail->usb.data) &&
+ usb->driver &&
+ !strcmp(usb->driver, "usb-storage")
+ ) {
+ hd_scsi->tag.remove = 1;
+
+ /* join usb & scsi info */
+ hd_usb->bus.id = hd_scsi->bus.id;
+ COPY_ENTRY(bus.name);
+ hd_usb->base_class.id = hd_scsi->base_class.id;
+ COPY_ENTRY(base_class.name);
+ hd_usb->sub_class.id = hd_scsi->sub_class.id;
+ COPY_ENTRY(sub_class.name);
+ hd_usb->prog_if.id = hd_scsi->prog_if.id;
+ COPY_ENTRY(prog_if.name);
+ COPY_ENTRY(unix_dev_name);
+ COPY_ENTRY(model);
+ // ###### FIXME?: COPY_ENTRY(driver)
+
+ hd_usb->vendor.id = hd_scsi->vendor.id;
+ COPY_ENTRY(vendor.name);
+ hd_usb->device.id = hd_scsi->device.id;
+ COPY_ENTRY(device.name);
+ hd_usb->sub_vendor.name = free_mem(hd_usb->sub_vendor.name);
+ COPY_ENTRY(sub_vendor.name);
+ hd_usb->sub_device.name = free_mem(hd_usb->sub_device.name);
+ COPY_ENTRY(sub_device.name);
+ COPY_ENTRY(revision.name);
+ COPY_ENTRY(serial);
+
+ hd_usb->is.notready = hd_scsi->is.notready;
+ if(hd_usb->block0) free_mem(hd_usb->block0);
+ hd_usb->block0 = hd_scsi->block0;
+ hd_scsi->block0 = NULL;
+ add_res_entry(&hd_usb->res, hd_scsi->res);
+ hd_scsi->res = NULL;
+
+ new_id(hd_data, hd_usb);
+ }
+ }
+ }
+ }
+#endif
+
+
+
+ remove_tagged_hd_entries(hd_data);
+}
+#undef COPY_ENTRY
+
+
+/*
+ * Improve mouse info.
+ */
+void int_mouse(hd_data_t *hd_data)
+{
+ hd_t *hd;
+ bios_info_t *bt = NULL;
+
+ for(hd = hd_data->hd; hd; hd = hd->next) {
+ if(
+ hd->detail &&
+ hd->detail->type == hd_detail_bios &&
+ (bt = hd->detail->bios.data) &&
+ bt->mouse.type
+ ) break;
+ }
+
+ if(!bt) return;
+
+ for(hd = hd_data->hd; hd; hd = hd->next) {
+ if(
+ hd->base_class.id == bc_mouse &&
+ hd->sub_class.id == sc_mou_ps2 &&
+ hd->bus.id == bt->mouse.bus &&
+ hd->vendor.id == MAKE_ID(TAG_SPECIAL, 0x0200) &&
+ hd->device.id == MAKE_ID(TAG_SPECIAL, 0x0002)
+ ) {
+ hd->vendor.name = free_mem(hd->vendor.name);
+ hd->device.name = free_mem(hd->device.name);
+ hd->vendor.id = hd->device.id = 0;
+#if 0
+ hd->vendor.id = bt->mouse.compat_vend;
+ hd->device.id = bt->mouse.compat_dev;
+#else
+ hd->vendor.name = new_str(bt->mouse.vendor);
+ hd->device.name = new_str(bt->mouse.type);
+ hd->compat_vendor.id = bt->mouse.compat_vend;
+ hd->compat_device.id = bt->mouse.compat_dev;
+#endif
+ new_id(hd_data, hd);
+ }
+ }
+}
+
+
+void new_id(hd_data_t *hd_data, hd_t *hd)
+{
+#if 0
+ hd->unique_id = free_mem(hd->unique_id);
+ hd->unique_id1 = free_mem(hd->unique_id1);
+ hd->old_unique_id = free_mem(hd->old_unique_id);
+ hd_add_id(hd_data, hd);
+#endif
+}
+
+
+/*
+ * Assign device names to (win-)modems.
+ */
+void int_modem(hd_data_t *hd_data)
+{
+ hd_t *hd;
+ char *s;
+ hd_dev_num_t dev_num = { type: 'c', range: 1 };
+ unsigned cnt4 = 0;
+
+ for(hd = hd_data->hd; hd; hd = hd->next) {
+ if(
+ hd->base_class.id == bc_modem
+ ) {
+ s = NULL;
+ switch(hd->sub_class.id) {
+ case sc_mod_win1:
+ s = new_str("/dev/ham");
+ dev_num.major = 240;
+ dev_num.minor = 1;
+ break;
+ case sc_mod_win2:
+ s = new_str("/dev/536ep0");
+ dev_num.major = 240;
+ dev_num.minor = 1;
+ break;
+ case sc_mod_win3:
+ s = new_str("/dev/ttyLT0");
+ dev_num.major = 62;
+ dev_num.minor = 64;
+ break;
+ case sc_mod_win4:
+ if(cnt4 < 4) {
+ str_printf(&s, 0, "/dev/ttySL%u", cnt4);
+ dev_num.major = 212;
+ dev_num.minor = cnt4++;
+ }
+ break;
+ }
+ if(s) {
+ free_mem(hd->unix_dev_name);
+ hd->unix_dev_name = s;
+ s = NULL;
+ hd->unix_dev_num = dev_num;
+ }
+ }
+ }
+}
+
+
+/*
+ * Look for WLAN cards by checking module info.
+ */
+void int_wlan(hd_data_t *hd_data)
+{
+ hd_t *hd;
+ driver_info_t *di;
+ str_list_t *sl;
+ unsigned u, found;
+ static char *wlan_mods[] = {
+ "acx_pci",
+ "airo",
+ "airo_cs",
+ "aironet4500_card",
+ "aironet4500_cs",
+ "airport",
+ "adm8211",
+ "arlan",
+ "at76c503",
+ "at76c503-i3861",
+ "at76c503-i3863",
+ "at76c503-rfmd",
+ "at76c503-rfmd-acc",
+ "at76c505-rfmd",
+ "at76c505-rfmd2958",
+ "ath_hal",
+ "ath_pci",
+ "atmel",
+ "atmel_cs",
+ "atmel_pci",
+ "hermes",
+ "hostap",
+ "hostap_pci",
+ "hostap_plx",
+ "ipw2100",
+ "ipw2200",
+ "netwave_cs",
+ "orinoco_cs",
+ "orinoco_pci",
+ "orinoco_plx",
+ "p80211",
+ "prism2_cs",
+ "prism2_pci",
+ "prism2_plx",
+ "prism2_usb",
+ "prism54",
+ "ray_cs",
+ "rt2400",
+ "rt2500",
+ "usbdfu",
+ "wavelan",
+ "wavelan_cs",
+ "wl3501_cs"
+ };
+
+ for(hd = hd_data->hd; hd; hd = hd->next) {
+ for(found = 0, di = hd->driver_info; di && !found; di = di->next) {
+ if(di->any.type == di_module) {
+ for(sl = di->module.names; sl && !found; sl = sl->next) {
+ for(u = 0; u < sizeof wlan_mods / sizeof *wlan_mods; u++) {
+ if(!strcmp(sl->str, wlan_mods[u])) {
+ found = 1;
+ break;
+ }
+ }
+ }
+ }
+ }
+ if(found) {
+ hd->is.wlan = 1;
+ hd->base_class.id = bc_network;
+ hd->sub_class.id = 0x82; /* wlan */
+ hddb_add_info(hd_data, hd);
+ }
+ }
+}
+
+
+/*
+ * Add udev info.
+ */
+void int_udev(hd_data_t *hd_data)
+{
+ hd_udevinfo_t *ui;
+ hd_t *hd;
+ char *s = NULL;
+ str_list_t *sl;
+
+ if(!hd_data->udevinfo) read_udevinfo(hd_data);
+
+ if(!hd_data->udevinfo) return;
+
+ for(hd = hd_data->hd; hd; hd = hd->next) {
+ if(!hd->sysfs_id) continue;
+
+ for(ui = hd_data->udevinfo; ui; ui = ui->next) {
+ if(ui->name && !strcmp(ui->sysfs, hd->sysfs_id)) {
+ hd->unix_dev_names = free_str_list(hd->unix_dev_names);
+ hd->unix_dev_name = free_mem(hd->unix_dev_name);
+ str_printf(&s, 0, "%s%s", ui->type == 'n' ? "" : "/dev/", ui->name);
+ add_str_list(&hd->unix_dev_names, s);
+ for(sl = ui->links; sl; sl = sl->next) {
+ str_printf(&s, 0, "%s%s", ui->type == 'n' ? "" : "/dev/", sl->str);
+ add_str_list(&hd->unix_dev_names, s);
+ }
+ s = free_mem(s);
+
+ sl = hd->unix_dev_names;
+
+ if(hd_data->flags.udev) {
+ /* use first link as canonical device name */
+ if(ui->links) sl = sl->next;
+ }
+
+ hd->unix_dev_name = new_str(sl->str);
+
+ break;
+ }
+ }
+ }
+}
+
+
+/*
+ * If hd->unix_dev_name is not in hd->unix_dev_names, add it.
+ */
+void int_devicenames(hd_data_t *hd_data)
+{
+ hd_t *hd;
+
+ for(hd = hd_data->hd; hd; hd = hd->next) {
+ if(
+ hd->unix_dev_name &&
+ !search_str_list(hd->unix_dev_names, hd->unix_dev_name)
+ ) {
+ add_str_list(&hd->unix_dev_names, hd->unix_dev_name);
+ }
+ }
+}
+
+
+#if defined(__i386__) || defined (__x86_64__)
+/*
+ * Tag ide soft raid disks.
+ */
+void int_softraid(hd_data_t *hd_data)
+{
+ hd_t *hd;
+ str_list_t *raid, *sl, *raid_sysfs = NULL, *sl1;
+ size_t len;
+ char *s;
+
+ if(hd_data->flags.fast) return;
+
+ for(hd = hd_data->hd; hd; hd = hd->next) {
+ if(
+ hd->base_class.id == bc_storage_device &&
+ hd->status.available != status_no
+ ) break;
+ }
+
+ /* no disks -> no check necessary */
+ if(!hd) return;
+
+ raid = read_file("| /sbin/dmraid -rc 2>/dev/null", 0, 0);
+
+ for(sl = raid; sl; sl = sl->next) {
+ s = *sl->str ? strchr(sl->str + 1, '/') : NULL;
+ if(s) {
+ sl1 = add_str_list(&raid_sysfs, NULL);
+ str_printf(&sl1->str, 0, "/block%s", s);
+ len = strlen(sl1->str);
+ if(len) sl1->str[len - 1] = 0;
+ }
+ }
+
+ free_str_list(raid);
+
+ ADD2LOG("----- soft raid devices -----\n");
+ for(sl = raid_sysfs; sl; sl = sl->next) {
+ ADD2LOG(" %s\n", sl->str);
+ }
+ ADD2LOG("----- soft raid devices end -----\n");
+
+ for(hd = hd_data->hd; hd; hd = hd->next) {
+ if(search_str_list(raid_sysfs, hd->sysfs_id)) {
+ hd->is.softraiddisk = 1;
+ }
+ }
+
+ free_str_list(raid_sysfs);
+
+}
+
+
+/*
+ *
+ */
+void int_system(hd_data_t *hd_data)
+{
+ hd_t *hd_sys;
+ hd_smbios_t *sm;
+ struct {
+ unsigned notebook:1;
+ unsigned acpi_mods:1; /* *** evil hack *** */
+ enum { v_none = 0, v_ibm = 1, v_toshiba, v_sony } vendor;
+ } is = { };
+ char *s;
+
+ for(hd_sys = hd_data->hd; hd_sys; hd_sys = hd_sys->next) {
+ if(
+ hd_sys->base_class.id == bc_internal &&
+ hd_sys->sub_class.id == sc_int_sys
+ ) break;
+ }
+
+ if(!hd_sys) return;
+
+ if(
+ hd_sys->vendor.name &&
+ !strncasecmp(hd_sys->vendor.name, "sony", sizeof "sony" - 1)
+ ) {
+ is.vendor = v_sony;
+ }
+
+ if(
+ hd_sys->device.name &&
+ !strncmp(hd_sys->device.name, "PCG-", sizeof "PCG-" - 1)
+ ) {
+ is.notebook = 1;
+ }
+
+ for(sm = hd_data->smbios; sm; sm = sm->next) {
+ if(
+ sm->any.type == sm_sysinfo &&
+ sm->sysinfo.manuf &&
+ sm->sysinfo.product &&
+ !strcasecmp(sm->sysinfo.manuf, "Hewlett-Packard") &&
+ !strcasecmp(sm->sysinfo.product, "HP Compaq nc6220")
+ ) {
+ is.acpi_mods = 1;
+ }
+
+ if(
+ sm->any.type == sm_sysinfo &&
+ sm->sysinfo.manuf &&
+ !strcasecmp(sm->sysinfo.manuf, "ibm")
+ ) {
+ is.vendor = v_ibm;
+ }
+
+ if(
+ sm->any.type == sm_sysinfo &&
+ sm->sysinfo.manuf &&
+ !strcasecmp(sm->sysinfo.manuf, "toshiba")
+ ) {
+ is.vendor = v_toshiba;
+
+ if(!hd_sys->device.name && !hd_sys->device.id && sm->sysinfo.product) {
+ hd_sys->device.name = new_str(sm->sysinfo.product);
+ }
+ if(!hd_sys->vendor.name && !hd_sys->vendor.id) {
+ hd_sys->vendor.name = new_str("Toshiba");
+ }
+ }
+
+ if(
+ sm->any.type == sm_sysinfo &&
+ sm->sysinfo.manuf &&
+ !strncasecmp(sm->sysinfo.manuf, "sony", sizeof "sony" - 1)
+ ) {
+ is.vendor = v_sony;
+
+ if(!hd_sys->device.name && !hd_sys->device.id && sm->sysinfo.product) {
+ hd_sys->device.name = new_str(sm->sysinfo.product);
+ if(
+ (s = strchr(hd_sys->device.name, '(')) &&
+ hd_sys->device.name[strlen(hd_sys->device.name) - 1] == ')'
+ ) {
+ *s = 0;
+ }
+ }
+ if(!hd_sys->vendor.name && !hd_sys->vendor.id) {
+ hd_sys->vendor.name = new_str("Sony");
+ }
+ }
+
+ if(
+ sm->any.type == sm_chassis &&
+ (
+ (sm->chassis.ch_type.id >= 8 && sm->chassis.ch_type.id <= 11) ||
+ sm->chassis.ch_type.id == 14
+ )
+ ) {
+ is.notebook = 1;
+ }
+ }
+
+ ADD2LOG(
+ " system type:%s%s\n",
+ is.vendor == v_ibm ? " ibm" :
+ is.vendor == v_toshiba ? " toshiba" :
+ is.vendor == v_sony ? " sony" :
+ "",
+ is.notebook ? " notebook" : ""
+ );
+
+ if(is.notebook && is.vendor) {
+ hd_sys->compat_vendor.id = MAKE_ID(TAG_SPECIAL, 0xf001);
+ hd_sys->compat_device.id = MAKE_ID(TAG_SPECIAL, is.vendor);
+ }
+ else if(is.acpi_mods) {
+ hd_sys->compat_vendor.id = MAKE_ID(TAG_SPECIAL, 0xf001);
+ hd_sys->compat_device.id = MAKE_ID(TAG_SPECIAL, 4);
+ }
+}
+
+
+void int_legacy_geo(hd_data_t *hd_data)
+{
+ hd_t *hd;
+ hd_res_t *res;
+ int id;
+ char *s;
+ edd_info_t *ei;
+
+ if(!hd_data->edd) return;
+
+ for(hd = hd_data->hd; hd; hd = hd->next) {
+ if(
+ hd->base_class.id == bc_storage_device &&
+ hd->sub_class.id == sc_sdev_disk &&
+ hd->rom_id
+ ) {
+ id = strtol(hd->rom_id, &s, 0) - 0x80;
+ if(*s || id < 0 || id >= sizeof hd_data->edd / sizeof *hd_data->edd) continue;
+
+ ei = hd_data->edd + id;
+
+ if(ei->edd.cyls) {
+ res = add_res_entry(&hd->res, new_mem(sizeof *res));
+ res->disk_geo.type = res_disk_geo;
+ res->disk_geo.cyls = ei->edd.cyls;
+ res->disk_geo.heads = ei->edd.heads;
+ res->disk_geo.sectors = ei->edd.sectors;
+ res->disk_geo.size = ei->sectors;
+ res->disk_geo.geotype = geo_bios_edd;
+ }
+
+ if(ei->legacy.cyls) {
+ res = add_res_entry(&hd->res, new_mem(sizeof *res));
+ res->disk_geo.type = res_disk_geo;
+ res->disk_geo.cyls = ei->legacy.cyls;
+ res->disk_geo.heads = ei->legacy.heads;
+ res->disk_geo.sectors = ei->legacy.sectors;
+ res->disk_geo.geotype = geo_bios_legacy;
+ }
+
+ }
+ }
+
+
+}
+
+#endif
+
+
--- /dev/null
+void hd_scan_int(hd_data_t *hd_data);
--- /dev/null
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "hd.h"
+#include "hd_int.h"
+#include "isa.h"
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ * isa cards
+ *
+ * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ */
+
+#if defined(__i386__)
+
+static void scan_isa_isdn(hd_data_t *hd_data);
+static isa_isdn_t *free_isa_isdn(isa_isdn_t *ii);
+
+static void dump_isa_isdn_data(hd_data_t *hd_data, isa_isdn_t *ii);
+
+void hd_scan_isa(hd_data_t *hd_data)
+{
+ if(!hd_probe_feature(hd_data, pr_isa)) return;
+
+ hd_data->module = mod_isa;
+
+ /* some clean-up */
+ remove_hd_entries(hd_data);
+ // hd_data->isa = NULL;
+
+ if(hd_probe_feature(hd_data, pr_isa_isdn)) {
+ scan_isa_isdn(hd_data);
+ }
+
+}
+
+void scan_isa_isdn(hd_data_t *hd_data)
+{
+ isa_isdn_t *ii0, *ii;
+ hd_t *hd;
+ hd_res_t *res;
+
+ PROGRESS(1, 0, "isdn");
+
+ ii0 = isdn_detect();
+
+ dump_isa_isdn_data(hd_data, ii0);
+
+ PROGRESS(1, 1, "isdn");
+
+ for(ii = ii0; ii; ii = ii->next) {
+ hd = add_hd_entry(hd_data, __LINE__, 0);
+ hd->bus.id = bus_isa;
+ hd->base_class.id = bc_isdn;
+ hd->vendor.id = MAKE_ID(TAG_SPECIAL, 0x3000 + ii->type);
+ hd->device.id = MAKE_ID(TAG_SPECIAL, ((ii->type << 8) + (ii->subtype & 0xff)) & 0xffff);
+
+ if(ii->has_io) {
+ res = add_res_entry(&hd->res, new_mem(sizeof *res));
+ res->io.type = res_io;
+ res->io.enabled = 1;
+ res->io.base = ii->io;
+ res->io.access = acc_rw;
+ }
+
+ if(ii->has_irq) {
+ res = add_res_entry(&hd->res, new_mem(sizeof *res));
+ res->irq.type = res_irq;
+ res->irq.enabled = 1;
+ res->irq.base = ii->irq;
+ }
+
+ // #### ask libihw? -> isdn.c
+
+ }
+
+ free_isa_isdn(ii0);
+}
+
+isa_isdn_t *new_isa_isdn(isa_isdn_t **ii)
+{
+ while(*ii) ii = &(*ii)->next;
+
+ return *ii = new_mem(sizeof **ii);
+}
+
+isa_isdn_t *free_isa_isdn(isa_isdn_t *ii)
+{
+ isa_isdn_t *l;
+
+ for(; ii; ii = (l = ii)->next, free_mem(l));
+
+ return NULL;
+}
+
+void dump_isa_isdn_data(hd_data_t *hd_data, isa_isdn_t *ii)
+{
+ ADD2LOG("---------- ISA ISDN raw data ----------\n");
+
+ for(; ii; ii = ii->next) {
+ ADD2LOG(" type %d, subtype %d", ii->type, ii->subtype);
+ if(ii->has_mem) ADD2LOG(", mem 0x%04x", ii->mem);
+ if(ii->has_io) ADD2LOG(", io 0x%04x", ii->io);
+ if(ii->has_irq) ADD2LOG(", irq %d", ii->irq);
+ ADD2LOG("\n");
+ }
+
+ ADD2LOG("---------- ISA ISDN raw data end ----------\n");
+}
+
+
+#endif /* defined(__i386__) */
+
--- /dev/null
+
+typedef struct isa_isdn_s {
+ struct isa_isdn_s *next;
+ unsigned has_mem:1, has_io:1, has_irq:1;
+ unsigned type, subtype, mem, io, irq;
+} isa_isdn_t;
+
+isa_isdn_t *new_isa_isdn(isa_isdn_t **ii);
+
+void hd_scan_isa(hd_data_t *hd_data);
+
+isa_isdn_t *isdn_detect(void);
--- /dev/null
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "hd.h"
+#include "hd_int.h"
+#include "hddb.h"
+#include "isapnp.h"
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ * isapnp stuff
+ *
+ * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ */
+
+#if defined(__i386__) || defined(__alpha__)
+
+static void get_pnp_devs(hd_data_t *hd_data);
+
+#if 0
+static void get_read_port(hd_data_t *hd_data, isapnp_t *);
+static void build_list(hd_data_t *hd_data, str_list_t *isapnp_list);
+#endif
+
+void hd_scan_isapnp(hd_data_t *hd_data)
+{
+#if 0
+ hd_t *hd;
+ hd_res_t *res;
+ int isapnp_ok;
+ str_list_t *isapnp_list = NULL, *sl;
+#endif
+
+ if(!hd_probe_feature(hd_data, pr_isapnp)) return;
+
+ hd_data->module = mod_isapnp;
+
+ /* some clean-up */
+ remove_hd_entries(hd_data);
+
+ PROGRESS(1, 0, "pnp devices");
+
+ get_pnp_devs(hd_data);
+
+#if 0
+ PROGRESS(1, 0, "read port");
+
+ if(!hd_data->isapnp) {
+ hd_data->isapnp = new_mem(sizeof *hd_data->isapnp);
+ }
+ else {
+ hd_data->isapnp->cards = 0;
+ /* just in case... */
+ hd_data->isapnp->card = free_mem(hd_data->isapnp->card);
+ /* keep the port */
+ }
+
+ if(!hd_data->isapnp->read_port) get_read_port(hd_data, hd_data->isapnp);
+
+ PROGRESS(3, 0, "get pnp data");
+
+ isapnp_list = read_file(PROC_ISAPNP, 0, 0);
+
+ if((hd_data->debug & HD_DEB_ISAPNP)) {
+ ADD2LOG("----- %s -----\n", PROC_ISAPNP);
+ for(sl = isapnp_list; sl; sl = sl->next) {
+ ADD2LOG(" %s", sl->str);
+ }
+ ADD2LOG("----- %s end -----\n", PROC_ISAPNP);
+ }
+
+ isapnp_ok = isapnp_list && hd_data->isapnp->read_port ? 1 : 1;
+
+ PROGRESS(4, 0, "build list");
+
+ if(isapnp_ok) {
+ hd = add_hd_entry(hd_data, __LINE__, 0);
+ hd->bus.id = bus_isa;
+ hd->base_class.id = bc_internal;
+ hd->sub_class.id = sc_int_isapnp_if;
+
+ res = add_res_entry(&hd->res, new_mem(sizeof *res));
+ res->io.type = res_io;
+ res->io.enabled = 1;
+ res->io.base = ISAPNP_ADDR_PORT;
+ res->io.range = 1;
+ res->io.access = acc_wo;
+
+ res = add_res_entry(&hd->res, new_mem(sizeof *res));
+ res->io.type = res_io;
+ res->io.enabled = 1;
+ res->io.base = ISAPNP_DATA_PORT;
+ res->io.range = 1;
+ res->io.access = acc_wo;
+
+ res = add_res_entry(&hd->res, new_mem(sizeof *res));
+ res->io.type = res_io;
+ res->io.enabled = 1;
+ res->io.base = hd_data->isapnp->read_port;
+ res->io.range = 1;
+ res->io.access = acc_ro;
+ }
+
+ build_list(hd_data, isapnp_list);
+
+ free_str_list(isapnp_list);
+#endif
+
+}
+
+
+void get_pnp_devs(hd_data_t *hd_data)
+{
+ hd_t *hd;
+ char *s, *t, buf[4];
+ unsigned u1, u2, u3;
+
+ struct sysfs_bus *sf_bus;
+ struct dlist *sf_dev_list;
+ struct sysfs_device *sf_dev;
+ struct sysfs_device *sf_dev_2;
+
+ sf_bus = sysfs_open_bus("pnp");
+
+ if(!sf_bus) {
+ ADD2LOG("sysfs: no such bus: pnp\n");
+ return;
+ }
+
+ sf_dev_list = sysfs_get_bus_devices(sf_bus);
+
+
+ if(sf_dev_list) dlist_for_each_data(sf_dev_list, sf_dev, struct sysfs_device) {
+ ADD2LOG(
+ " pnp device: name = %s, bus_id = %s, bus = %s\n path = %s\n",
+ sf_dev->name,
+ sf_dev->bus_id,
+ sf_dev->bus,
+ hd_sysfs_id(sf_dev->path)
+ );
+
+ if((s = hd_attr_str(sysfs_get_device_attr(sf_dev, "id")))) {
+ if(sscanf(s, "%3s%4x", buf, &u1) == 2 && (u2 = name2eisa_id(buf))) {
+ ADD2LOG(" id = %s %04x\n", eisa_vendor_str(u2), u1);
+
+ hd = add_hd_entry(hd_data, __LINE__, 0);
+
+ hd->sysfs_id = new_str(hd_sysfs_id(sf_dev->path));
+ hd->sysfs_bus_id = new_str(sf_dev->bus_id);
+
+ hd->bus.id = bus_isa;
+ hd->is.isapnp = 1;
+
+ hd->sub_vendor.id = u2;
+ hd->sub_device.id = MAKE_ID(TAG_EISA, u1);
+
+ if(sscanf(hd->sysfs_bus_id, "%2x:%2x.%2x", &u1, &u2, &u3) == 3) {
+ hd->slot = u2;
+ hd->func = u3;
+ }
+
+ s = new_str(sf_dev->path);
+ if((t = strrchr(s, '/'))) *t = 0;
+
+ sf_dev_2 = sysfs_open_device_path(s);
+ if(sf_dev_2) {
+ if((t = hd_attr_str(sysfs_get_device_attr(sf_dev_2, "card_id")))) {
+ if(sscanf(t, "%3s%4x", buf, &u1) == 2 && (u2 = name2eisa_id(buf))) {
+ ADD2LOG(" card id = %s %04x\n", eisa_vendor_str(u2), u1);
+
+ hd->vendor.id = u2;
+ hd->device.id = MAKE_ID(TAG_EISA, u1);
+ }
+ }
+ if((t = hd_attr_str(sysfs_get_device_attr(sf_dev_2, "name")))) {
+ hd->device.name = canon_str(t, strlen(t));
+ if(!strcasecmp(hd->device.name, "unknown")) {
+ hd->device.name = free_mem(hd->device.name);
+ }
+ }
+
+ sysfs_close_device(sf_dev_2);
+ }
+
+
+ free_mem(s);
+
+
+ if(hd->sub_vendor.id == hd->vendor.id && hd->sub_device.id == hd->device.id) {
+ hd->sub_vendor.id = hd->sub_device.id = 0;
+ }
+
+ }
+ }
+
+ }
+
+
+ sysfs_close_bus(sf_bus);
+
+}
+
+
+#if 0
+unsigned char *add_isapnp_card_res(isapnp_card_t *ic, int len, int type)
+{
+ ic->res = add_mem(ic->res, sizeof *ic->res, ic->res_len);
+
+ ic->res[ic->res_len].len = len;
+ ic->res[ic->res_len].type = type;
+ ic->res[ic->res_len].data = new_mem(len);
+
+ if(type == RES_LOG_DEV_ID) { /* logical device id */
+ ic->log_devs++;
+ }
+
+ return ic->res[ic->res_len++].data;
+}
+
+
+isapnp_card_t *add_isapnp_card(isapnp_t *ip, int csn)
+{
+ isapnp_card_t *c;
+
+ ip->card = add_mem(ip->card, sizeof *ip->card, ip->cards);
+ c = ip->card + ip->cards++;
+
+ c->csn = csn;
+ c->serial = new_mem(sizeof *c->serial * 8);
+ c->card_regs = new_mem(sizeof *c->card_regs * 0x30);
+
+ return c;
+}
+
+
+void get_read_port(hd_data_t *hd_data, isapnp_t *p)
+{
+ hd_res_t *res;
+
+ p->read_port = 0;
+
+ res = NULL;
+ gather_resources(hd_data->misc, &res, "ISAPnP", W_IO);
+ if(res && res->any.type == res_io) p->read_port = res->io.base;
+ free_res_list(res);
+}
+
+
+void build_list(hd_data_t *hd_data, str_list_t *isapnp_list)
+{
+ hd_t *hd = NULL;
+ str_list_t *sl;
+ char s1[4], s2[100];
+ int card, ldev, cdev_id, ldev_active = 0;
+ char *dev_name = NULL, *ldev_name = NULL;
+ unsigned dev_id = 0, vend_id = 0, base_class = 0, sub_class = 0, ldev_id;
+ unsigned u, ux[5];
+ int i, j;
+ hd_res_t *res;
+
+ for(sl = isapnp_list; sl; sl = sl->next) {
+
+ if(sscanf(sl->str, "Card %d '%3s%4x:%99[^']", &card, s1, &dev_id, s2) == 4) {
+// ADD2LOG("\n\n** card %d >%s< %04x >%s<**\n", card, s1, dev_id, s2);
+
+ dev_name = free_mem(dev_name);
+ if(strcmp(s2, "Unknown")) dev_name = new_str(s2);
+
+ dev_id = MAKE_ID(TAG_EISA, dev_id);
+ vend_id = name2eisa_id(s1);
+
+ base_class = sub_class = 0;
+ if((u = device_class(hd_data, vend_id, dev_id))) {
+ base_class = u >> 8;
+ sub_class = u & 0xff;
+ }
+
+#if 0
+// ########## FIXME
+ if(
+ (ID_VALUE(vend_id) || ID_VALUE(dev_id)) &&
+ !((db_name = hd_device_name(hd_data, vend_id, dev_id)) && *db_name)
+ ) {
+ if(dev_name) {
+ add_device_name(hd_data, vend_id, dev_id, dev_name);
+ }
+ }
+#endif
+
+ continue;
+ }
+
+ if(sscanf(sl->str, " Logical device %d '%3s%4x:%99[^']", &ldev, s1, &ldev_id, s2) == 4) {
+// ADD2LOG("\n\n** ldev %d >%s< %04x >%s<**\n", ldev, s1, ldev_id, s2);
+
+ ldev_name = free_mem(ldev_name);
+ if(strcmp(s2, "Unknown")) ldev_name = new_str(s2);
+
+ hd = add_hd_entry(hd_data, __LINE__, 0);
+
+ hd->bus.id = bus_isa;
+ hd->is.isapnp = 1;
+ hd->slot = card;
+ hd->func = ldev;
+
+ hd->vendor.id = vend_id;
+ hd->device.id = dev_id;
+
+ hd->base_class.id = base_class;
+ hd->sub_class.id = sub_class;
+
+ hd->sub_device.id = MAKE_ID(TAG_EISA, ldev_id);
+ hd->sub_vendor.id = name2eisa_id(s1);
+
+ if(hd->sub_vendor.id == hd->vendor.id && hd->sub_device.id == hd->device.id) {
+ hd->sub_vendor.id = hd->sub_device.id = 0;
+ }
+
+ if((u = sub_device_class(hd_data, hd->vendor.id, hd->device.id, hd->sub_vendor.id, hd->sub_device.id))) {
+ hd->base_class.id = u >> 8;
+ hd->sub_class.id = u & 0xff;
+ }
+
+#if 0
+# ############# FIXME
+ if(
+ (ID_VALUE(hd->sub_vendor.id) || ID_VALUE(hd->sub_device.id)) &&
+ !hd_sub_device_name(hd_data, hd->vend, hd->dev, hd->sub_vend, hd->sub_device.id)
+ ) {
+ if(ldev_name) {
+ add_sub_device_name(hd_data, hd->vend, hd->dev, hd->sub_vend, hd->sub_device.id, ldev_name);
+ }
+ }
+#endif
+
+ continue;
+ }
+
+ if(strstr(sl->str, "Device is not active")) {
+ ldev_active = 0;
+ continue;
+ }
+
+ if(strstr(sl->str, "Device is active")) {
+ ldev_active = 1;
+ continue;
+ }
+
+ if(hd && sscanf(sl->str, " Compatible device %3s%4x", s1, &cdev_id) == 2) {
+// ADD2LOG("\n\n** cdev >%s< %04x **\n", s1, cdev_id);
+
+ hd->compat_device.id = MAKE_ID(TAG_EISA, cdev_id);
+ hd->compat_vendor.id = name2eisa_id(s1);
+
+ if(!(hd->base_class.id || hd->sub_class.id)) {
+ if((u = device_class(hd_data, hd->compat_vendor.id, hd->compat_device.id))) {
+ hd->base_class.id = u >> 8;
+ hd->sub_class.id = u & 0xff;
+ }
+ else if(hd->compat_vendor.id == MAKE_ID(TAG_EISA, 0x41d0)) {
+ /* 0x41d0 is 'PNP' */
+ switch((hd->compat_device.id >> 12) & 0xf) {
+ case 8:
+ hd->base_class.id = bc_network;
+ hd->sub_class.id = 0x80;
+ break;
+ case 0xa:
+ hd->base_class.id = bc_storage;
+ hd->sub_class.id = 0x80;
+ break;
+ case 0xb:
+ hd->base_class.id = bc_multimedia;
+ hd->sub_class.id = 0x80;
+ break;
+ case 0xc:
+ case 0xd:
+ hd->base_class.id = bc_modem;
+ break;
+ }
+ }
+ }
+
+ continue;
+ }
+
+ if(
+ hd &&
+ (j = sscanf(sl->str,
+ " Active port %x, %x, %x, %x, %x, %x",
+ ux, ux + 1, ux + 2, ux + 3, ux + 4, ux + 5
+ )) >= 1
+ ) {
+
+ for(i = 0; i < j; i++) {
+ res = add_res_entry(&hd->res, new_mem(sizeof *res));
+ res->io.type = res_io;
+ res->io.enabled = ldev_active ? 1 : 0;
+ res->io.base = ux[i];
+ res->io.access = acc_rw;
+ }
+
+ continue;
+ }
+
+ if(hd && (j = sscanf(sl->str, " Active IRQ %d [%x], %d [%x]", ux, ux + 1, ux + 2, ux + 3)) >= 1) {
+ for(i = 0; i < j; i += 2) {
+ res = add_res_entry(&hd->res, new_mem(sizeof *res));
+ res->irq.type = res_irq;
+ res->irq.enabled = ldev_active ? 1 : 0;
+ res->irq.base = ux[i];
+ }
+
+ continue;
+ }
+
+ if(hd && (j = sscanf(sl->str, " Active DMA %d, %d", ux, ux + 1)) >= 1) {
+ for(i = 0; i < j; i++) {
+ res = add_res_entry(&hd->res, new_mem(sizeof *res));
+ res->dma.type = res_dma;
+ res->dma.enabled = ldev_active ? 1 : 0;
+ res->dma.base = ux[i];
+ }
+
+ continue;
+ }
+
+
+ }
+
+ free_mem(dev_name);
+ free_mem(ldev_name);
+}
+#endif
+
+
+#endif /* defined(__i386__) || defined(__alpha__) */
+
--- /dev/null
+/*
+ * These are fixed and write only. Reads are done from a port with a
+ * relocatable address...
+ */
+#define ISAPNP_ADDR_PORT 0x279
+#define ISAPNP_DATA_PORT 0xa79
+
+
+/*
+ * ISA PnP resource types
+ */
+#define RES_PNP_VERSION 0x01
+#define RES_LOG_DEV_ID 0x02
+#define RES_COMPAT_DEV_ID 0x03
+#define RES_IRQ 0x04
+#define RES_DMA 0x05
+#define RES_START_DEP 0x06
+#define RES_END_DEP 0x07
+#define RES_IO 0x08
+#define RES_FIXED_IO 0x09
+#define RES_VENDOR_SMALL 0x0e
+#define RES_END 0x0f
+
+#define RES_MEM_RANGE 0x81
+#define RES_ANSI_NAME 0x82
+#define RES_UNICODE_NAME 0x83
+#define RES_VENDOR_LARGE 0x84
+#define RES_MEM32_RANGE 0x85
+#define RES_FIXED_MEM32_RANGE 0x86
+
+
+/*
+ * ISA PnP configuration regs
+ */
+#define CFG_MEM24 0x40
+#define CFG_MEM32_0 0x76
+#define CFG_MEM32_1 0x80
+#define CFG_MEM32_2 0x90
+#define CFG_MEM32_3 0xa0
+#define CFG_IO_HI_BASE 0x60
+#define CFG_IO_LO_BASE 0x61
+#define CFG_IRQ 0x70
+#define CFG_IRQ_TYPE 0x71
+#define CFG_DMA 0x74
+
+
+/* gather ISA-PnP info */
+void hd_scan_isapnp(hd_data_t *hd_data);
+
+
+/*
+ * Interface functions to the pnpdump lib.
+ */
+int pnpdump(hd_data_t *hd_data, int read_boards);
+unsigned char *add_isapnp_card_res(isapnp_card_t *, int, int);
+isapnp_card_t *add_isapnp_card(isapnp_t *, int);
+
--- /dev/null
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "hd.h"
+#include "hd_int.h"
+#include "isdn.h"
+
+#undef ISDN_TEST
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ * identify isdn cards
+ *
+ * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ */
+
+#ifndef LIBHD_TINY
+
+#if !defined(__s390__) && !defined(__s390x__) && !defined(__alpha__)
+
+void hd_scan_isdn(hd_data_t *hd_data)
+{
+ hd_t *hd;
+ cdb_isdn_card *cic;
+
+ if(!hd_probe_feature(hd_data, pr_isdn)) return;
+
+ hd_data->module = mod_isdn;
+
+ /* some clean-up */
+ remove_hd_entries(hd_data);
+
+ PROGRESS(1, 0, "list");
+
+#ifdef ISDN_TEST
+ {
+ hd_res_t *res;
+
+ hd = add_hd_entry(hd_data, __LINE__, 0);
+ hd->bus.id = bus_isa;
+ hd->base_class.id = bc_isdn;
+ hd->vendor.id = MAKE_ID(TAG_SPECIAL, 0x3005);
+ hd->device.id = MAKE_ID(TAG_SPECIAL, 0x0500); // type, subtype
+ res = add_res_entry(&hd->res, new_mem(sizeof *res));
+ res->io.type = res_io;
+ res->io.enabled = 1;
+ res->io.base = 0x0300;
+ res->io.access = acc_rw;
+
+ hd = add_hd_entry(hd_data, __LINE__, 0);
+ hd->bus.id = bus_isa;
+ hd->base_class.id = bc_isdn;
+ hd->vendor.id = MAKE_ID(TAG_EISA, 0x1593);
+ hd->device.id = MAKE_ID(TAG_EISA, 0x0133); // type, subtype
+ res = add_res_entry(&hd->res, new_mem(sizeof *res));
+ res->io.type = res_io;
+ res->io.enabled = 1;
+ res->io.base = 0x0240;
+ res->io.access = acc_rw;
+ res = add_res_entry(&hd->res, new_mem(sizeof *res));
+ res->irq.type = res_irq;
+ res->irq.enabled = 1;
+ res->irq.base = 99;
+
+ hd = add_hd_entry(hd_data, __LINE__, 0);
+ hd->bus.id = bus_isa;
+ hd->base_class.id = bc_isdn;
+ hd->vendor.id = MAKE_ID(TAG_EISA, 0x0e98);
+ hd->device.id = MAKE_ID(TAG_EISA, 0x0000); // type, subtype
+ res = add_res_entry(&hd->res, new_mem(sizeof *res));
+ res->io.type = res_io;
+ res->io.enabled = 1;
+ res->io.base = 0x0180;
+ res->io.access = acc_rw;
+ res = add_res_entry(&hd->res, new_mem(sizeof *res));
+ res->io.type = res_io;
+ res->io.enabled = 1;
+ res->io.base = 0x0540;
+ res->io.access = acc_rw;
+ res = add_res_entry(&hd->res, new_mem(sizeof *res));
+ res->irq.type = res_irq;
+ res->irq.enabled = 1;
+ res->irq.base = 77;
+
+ hd = add_hd_entry(hd_data, __LINE__, 0);
+ hd->bus.id = bus_pci;
+ hd->base_class.id = bc_isdn;
+ hd->vendor.id = MAKE_ID(TAG_PCI, 0x1244);
+ hd->device.id = MAKE_ID(TAG_PCI, 0x0a00); // type, subtype
+ res = add_res_entry(&hd->res, new_mem(sizeof *res));
+ res->io.type = res_io;
+ res->io.enabled = 1;
+ res->io.base = 0xe000;
+ res->io.access = acc_rw;
+
+ hd = add_hd_entry(hd_data, __LINE__, 0);
+ hd->bus.id = bus_isa;
+ hd->base_class.id = bc_isdn;
+ hd->vendor.id = MAKE_ID(TAG_SPECIAL, 0x3001);
+ hd->device.id = MAKE_ID(TAG_SPECIAL, 0x0100); // type, subtype
+ res = add_res_entry(&hd->res, new_mem(sizeof *res));
+ res->io.type = res_io;
+ res->io.enabled = 1;
+ res->io.base = 0xe80;
+ res->io.access = acc_rw;
+
+ hd = add_hd_entry(hd_data, __LINE__, 0);
+ hd->bus.id = bus_isa;
+ hd->base_class.id = bc_isdn;
+ hd->vendor.id = MAKE_ID(TAG_SPECIAL, 0x3000);
+ hd->device.id = MAKE_ID(TAG_SPECIAL, 0x1a00); // type, subtype
+ res = add_res_entry(&hd->res, new_mem(sizeof *res));
+ res->io.type = res_io;
+ res->io.enabled = 1;
+ res->io.base = 0x400;
+ res->io.access = acc_rw;
+
+
+ }
+#endif
+
+ for(hd = hd_data->hd; hd; hd = hd->next) {
+ if((cic = get_isdn_info(hd))) {
+ hd->base_class.id = bc_isdn;
+ hd->sub_class.id = 0;
+ free_mem(cic);
+ }
+ }
+
+
+}
+
+cdb_isdn_card *get_isdn_info(hd_t *hd)
+{
+ cdb_isdn_card *cic0, *cic;
+ unsigned u0, u1;
+
+ if(hd->bus.id == bus_pci ||
+ hd->bus.id == bus_isa ||
+ hd->bus.id == bus_usb ||
+ hd->bus.id == bus_pcmcia ||
+ hd->bus.id == bus_cardbus) {
+
+ cic = NULL;
+ u0 = ID_VALUE(hd->vendor.id);
+ if(
+ hd->bus.id == bus_isa &&
+ ID_TAG(hd->vendor.id) == TAG_SPECIAL &&
+ u0 >= 0x3000 && u0 <= 0x3006 &&
+ ID_TAG(hd->device.id) == TAG_SPECIAL
+ ) {
+ u0 = ID_VALUE(hd->device.id);
+ cic = hd_cdbisdn_get_card_from_type(u0 >> 8, u0 & 0xff);
+ }
+
+ if(
+ hd->bus.id == bus_isa &&
+ ID_TAG(hd->vendor.id) == TAG_EISA &&
+ ID_TAG(hd->device.id) == TAG_EISA
+ ) {
+ u0 = ID_VALUE(hd->vendor.id);
+ u1 = ID_VALUE(hd->device.id);
+ cic = hd_cdbisdn_get_card_from_id(((u0 & 0xff) << 8) + ((u0 >> 8) & 0xff),
+ ((u1 & 0xff) << 8) + ((u1 >> 8) & 0xff),
+ 0xffff,0xffff);
+ }
+
+ if(hd->bus.id == bus_pci) {
+ cic = hd_cdbisdn_get_card_from_id(ID_VALUE(hd->vendor.id), ID_VALUE(hd->device.id),
+ ID_VALUE(hd->sub_vendor.id), ID_VALUE(hd->sub_device.id));
+ }
+
+ if(hd->bus.id == bus_usb &&
+ ID_TAG(hd->vendor.id) == TAG_USB &&
+ ID_TAG(hd->device.id) == TAG_USB) {
+
+ if (hd->revision.id == 0 && hd->revision.name) {
+ /* the revision is usually saved as string (1.00) */
+ sscanf(hd->revision.name, "%x.%x", &u1, &u0);
+ u0 = u0 | u1 << 8;
+ } else
+ u0 = ID_VALUE(hd->revision.id);
+
+ cic = hd_cdbisdn_get_card_from_id(ID_VALUE(hd->vendor.id), ID_VALUE(hd->device.id),
+ u0, 0xffff);
+ if (!cic) /* to get cards without revision info in database */
+ cic = hd_cdbisdn_get_card_from_id(ID_VALUE(hd->vendor.id), ID_VALUE(hd->device.id),
+ 0xffff, 0xffff);
+ }
+
+ if((hd->bus.id == bus_pcmcia || hd->bus.id == bus_cardbus) &&
+ (hd->base_class.id == bc_network || hd->base_class.id == bc_isdn)) {
+ if (hd->drivers && hd->drivers->str) {
+ if (0 == strcmp(hd->drivers->str, "teles_cs")) {
+ cic = hd_cdbisdn_get_card_from_type(8, 0);
+ } else if (0 == strcmp(hd->drivers->str, "sedlbauer_cs")) {
+ cic = hd_cdbisdn_get_card_from_type(22, 2);
+ } else if (0 == strcmp(hd->drivers->str, "avma1_cs")) {
+ cic = hd_cdbisdn_get_card_from_type(26, 0);
+ } else if (0 == strcmp(hd->drivers->str, "fcpcmcia_cs")) {
+ cic = hd_cdbisdn_get_card_from_type(8002, 5);
+ } else if (0 == strcmp(hd->drivers->str, "elsa_cs")) {
+ cic = hd_cdbisdn_get_card_from_type(10, 11);
+ } else if (0 == strcmp(hd->drivers->str, "avm_cs")) {
+ cic = hd_cdbisdn_get_card_from_type(8001, 2);
+ }
+ }
+ }
+
+ if (cic && cic->Class && strcmp(cic->Class, "DSL")) {
+ cic0 = new_mem(sizeof *cic0);
+ memcpy(cic0, cic, sizeof *cic0);
+ return cic0;
+ }
+ }
+ return NULL;
+}
+
+void hd_scan_dsl(hd_data_t *hd_data)
+{
+ hd_t *hd;
+ cdb_isdn_card *cic;
+
+ if(!hd_probe_feature(hd_data, pr_isdn)) return;
+
+ hd_data->module = mod_dsl;
+
+ /* some clean-up */
+ remove_hd_entries(hd_data);
+
+ PROGRESS(1, 0, "list");
+
+#ifdef DSL_TEST
+ {
+ hd_res_t *res;
+
+ hd = add_hd_entry(hd_data, __LINE__, 0);
+ hd->bus.id = bus_pci;
+ hd->base_class.id = bc_dsl;
+ hd->vendor.id = MAKE_ID(TAG_SPECIAL, 0x1244);
+ hd->device.id = MAKE_ID(TAG_SPECIAL, 0x2700); // type, subtype
+
+ }
+#endif
+
+ for(hd = hd_data->hd; hd; hd = hd->next) {
+ if((cic = get_dsl_info(hd))) {
+ free_mem(cic);
+ }
+ }
+
+
+}
+
+cdb_isdn_card *get_dsl_info(hd_t *hd)
+{
+ cdb_isdn_card *cic0, *cic;
+ cdb_isdn_vario *civ;
+ unsigned u0, u1;
+
+ if(hd->bus.id == bus_pci ||
+ hd->bus.id == bus_usb) {
+
+ cic = NULL;
+
+ if(hd->bus.id == bus_pci) {
+ cic = hd_cdbisdn_get_card_from_id(ID_VALUE(hd->vendor.id), ID_VALUE(hd->device.id),
+ ID_VALUE(hd->sub_vendor.id), ID_VALUE(hd->sub_device.id));
+ }
+
+ if(hd->bus.id == bus_usb &&
+ ID_TAG(hd->vendor.id) == TAG_USB &&
+ ID_TAG(hd->device.id) == TAG_USB) {
+
+ if (hd->revision.id == 0 && hd->revision.name) {
+ /* the revision is usually saved as string (1.00) */
+ sscanf(hd->revision.name, "%x.%x", &u1, &u0);
+ u0 = u0 | u1 << 8;
+ } else
+ u0 = ID_VALUE(hd->revision.id);
+
+ cic = hd_cdbisdn_get_card_from_id(ID_VALUE(hd->vendor.id), ID_VALUE(hd->device.id),
+ u0, 0xffff);
+ if (!cic) /* to get cards without revision info in database */
+ cic = hd_cdbisdn_get_card_from_id(ID_VALUE(hd->vendor.id), ID_VALUE(hd->device.id),
+ 0xffff, 0xffff);
+ }
+
+ if (cic && cic->Class && !strcmp(cic->Class, "DSL")) {
+ hd->base_class.id = bc_dsl;
+ hd->sub_class.id = sc_dsl_unknown;
+ civ = hd_cdbisdn_get_vario(cic->vario);
+ if (civ && civ->interface) {
+ if (0 == strncmp(civ->interface, "CAPI20", 6)) {
+ hd->sub_class.id = sc_dsl_capi;
+ } else if (0 == strncmp(civ->interface, "pppoe", 5)) {
+ hd->sub_class.id = sc_dsl_pppoe;
+ }
+ }
+ cic0 = new_mem(sizeof *cic0);
+ memcpy(cic0, cic, sizeof *cic0);
+ return cic0;
+ }
+ }
+ return NULL;
+}
+
+#endif /* !defined(__s390__) && !defined(__s390x__) && !defined(__alpha__) */
+
+#endif /* !defined(LIBHD_TINY) */
+
--- /dev/null
+void hd_scan_isdn(hd_data_t *hd_data);
+void hd_scan_dsl(hd_data_t *hd_data);
+cdb_isdn_card *get_isdn_info(hd_t *hd);
+cdb_isdn_card *get_dsl_info(hd_t *hd);
--- /dev/null
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <termios.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <sys/time.h>
+#include <sys/ioctl.h>
+#include <linux/serial.h>
+
+#ifdef __sparc__
+
+struct serial_struct {
+ int type;
+ int line;
+ unsigned long port;
+ int irq;
+ int flags;
+ int xmit_fifo_size;
+ int custom_divisor;
+ int baud_base;
+ unsigned short close_delay;
+ char io_type;
+ char reserved_char[1];
+ int hub6;
+ unsigned short closing_wait; /* time to wait before closing */
+ unsigned short closing_wait2; /* no longer used... */
+ unsigned char *iomem_base;
+ unsigned short iomem_reg_shift;
+ int reserved[2];
+};
+
+#ifdef DIET
+typedef unsigned int u_int;
+#endif
+
+#include <asm/kbio.h>
+#include <asm/openpromio.h>
+#endif
+
+#include "hd.h"
+#include "hd_int.h"
+#include "kbd.h"
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ *
+ * Look for keyboards not covered by kernel input device driver, mainly
+ * some sort of serial consoles.
+ *
+ * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ */
+
+#ifdef __sparc__
+static void add_sun_console(hd_data_t *hd_data);
+#else
+static void add_serial_console(hd_data_t *hd_data);
+#endif
+
+
+void hd_scan_kbd(hd_data_t *hd_data)
+{
+ hd_t *hd;
+
+ if(!hd_probe_feature(hd_data, pr_kbd)) return;
+
+ hd_data->module = mod_kbd;
+
+ /* some clean-up */
+ remove_hd_entries(hd_data);
+
+ PROGRESS(2, 0, "uml");
+
+ if(hd_is_uml(hd_data)) {
+ hd = add_hd_entry(hd_data, __LINE__, 0);
+ hd->base_class.id = bc_keyboard;
+ hd->sub_class.id = sc_keyboard_kbd;
+ hd->bus.id = bus_none;
+ hd->vendor.id = MAKE_ID(TAG_SPECIAL, 0x0201);
+ hd->device.id = MAKE_ID(TAG_SPECIAL, 2);
+ }
+
+ PROGRESS(3, 0, "serial console");
+
+#ifdef __sparc__
+ add_sun_console(hd_data);
+#else
+ add_serial_console(hd_data);
+#endif
+}
+
+
+#ifndef __sparc__
+
+void add_serial_console(hd_data_t *hd_data)
+{
+ hd_t *hd;
+ hd_res_t *res = NULL;
+ int fd, i;
+ str_list_t *cmd, *cmd0, *sl;
+ unsigned u, u1;
+ struct serial_struct ser_info;
+ unsigned tty_major = 0, tty_minor = 0;
+ char c, *dev = NULL, *s;
+
+ /* first, try console= option */
+ cmd = cmd0 = get_cmdline(hd_data, "console");
+
+ /* use last console entry */
+ if(cmd) while(cmd->next) cmd = cmd->next;
+
+ if(
+ cmd &&
+ (
+ /* everything != "ttyN" */
+ strncmp(cmd->str, "tty", 3) ||
+ !(cmd->str[3] == 0 || (cmd->str[3] >= '0' && cmd->str[3] <= '9'))
+ )
+ ) {
+ sl = hd_split(',', cmd->str);
+ s = sl->str;
+ if(!strncmp(s, "/dev/", sizeof "/dev/" - 1)) s += sizeof "/dev/" - 1;
+ dev = new_str(s);
+ if(sl->next && (i = sscanf(sl->next->str, "%u%c%u", &u, &c, &u1)) >= 1) {
+ res = add_res_entry(&res, new_mem(sizeof *res));
+ res->baud.type = res_baud;
+ res->baud.speed = u;
+ if(i >= 2) res->baud.parity = c;
+ if(i >= 3) res->baud.bits = u1;
+ }
+ free_str_list(sl);
+ }
+
+#ifdef __UCLIBC__
+ if(!dev && (fd = open(DEV_CONSOLE, O_RDWR | O_NONBLOCK | O_NOCTTY)) >= 0) {
+/*
+ if(ioctl(fd, TIOCGDEV, &u) != -1) {
+ tty_major = (u >> 8) & 0xfff;
+ tty_minor = (u & 0xff) | ((u >> 12) & 0xfff00);
+ ADD2LOG(DEV_CONSOLE ": major %u, minor %u\n", tty_major, tty_minor);
+ }
+*/
+
+ if(tty_major == 229 /* iseries hvc */) {
+ if (tty_minor >= 128) {
+ str_printf(&dev, 0, "hvsi%u", tty_minor-128);
+ } else {
+ str_printf(&dev, 0, "hvc%u", tty_minor);
+ }
+ }
+ else if(!ioctl(fd, TIOCGSERIAL, &ser_info)) {
+ ADD2LOG("serial console at line %d\n", ser_info.line);
+ str_printf(&dev, 0, "ttyS%d", ser_info.line);
+ }
+ close(fd);
+ }
+#endif
+
+ if(dev) {
+
+ hd = add_hd_entry(hd_data, __LINE__, 0);
+ hd->base_class.id = bc_keyboard;
+ hd->sub_class.id = sc_keyboard_console;
+ hd->bus.id = bus_serial;
+ hd->device.name = new_str("serial console");
+
+ if(*dev) str_printf(&hd->unix_dev_name, 0, "/dev/%s", dev);
+
+ hd->res = res;
+
+ free_mem(dev);
+ }
+
+ free_str_list(cmd0);
+}
+
+
+#else /* defined(__sparc__) */
+
+
+void add_sun_console(hd_data_t *hd_data)
+{
+ int fd, kid, kid2, klay, ser_cons, i;
+ unsigned u, u1, u2;
+ char c1, c2;
+ struct serial_struct ser_info;
+ unsigned char buf[OPROMMAXPARAM];
+ struct openpromio *opio = (struct openpromio *) buf;
+ hd_t *hd;
+ hd_res_t *res;
+
+ if((fd = open(DEV_CONSOLE, O_RDWR | O_NONBLOCK | O_NOCTTY)) >= 0)
+ {
+ if(ioctl(fd, TIOCGSERIAL, &ser_info))
+ {
+ ser_cons = -1;
+ }
+ else
+ {
+ ser_cons = ser_info.line;
+ ADD2LOG("serial console at line %d\n", ser_cons);
+ }
+ close(fd);
+
+ if(ser_cons >= 0 && (fd = open(DEV_OPENPROM, O_RDWR | O_NONBLOCK)) >= 0)
+ {
+ sprintf(opio->oprom_array, "tty%c-mode", (ser_cons & 1) + 'a');
+ opio->oprom_size = sizeof buf - 0x100;
+ if(!ioctl(fd, OPROMGETOPT, opio))
+ {
+ if(opio->oprom_size < 0x100)
+ {
+ opio->oprom_array[opio->oprom_size] = 0;
+ ADD2LOG(
+ "prom(tty%c-mode) = \"%s\" (%d bytes)\n",
+ (ser_cons & 1) + 'a', opio->oprom_array,
+ opio->oprom_size
+ );
+ hd = add_hd_entry(hd_data, __LINE__, 0);
+ hd->base_class.id = bc_keyboard;
+ hd->sub_class.id = sc_keyboard_console;
+ hd->bus.id = bus_serial;
+ hd->vendor.id = MAKE_ID(TAG_SPECIAL, 0x0203);
+ hd->device.id = MAKE_ID(TAG_SPECIAL, 0x0000);
+ str_printf(&hd->unix_dev_name, 0, "/dev/ttyS%d", ser_cons);
+ if((i = sscanf(opio->oprom_array, "%u,%u,%c,%u,%c",
+ &u, &u1, &c1, &u2, &c2)) >= 1)
+ {
+ res = add_res_entry(&hd->res, new_mem(sizeof *res));
+ res->baud.type = res_baud;
+ res->baud.speed = u;
+ if(i >= 2) res->baud.bits = u1;
+ if(i >= 3) res->baud.parity = c1;
+ if(i >= 4) res->baud.stopbits = u2;
+ if(i >= 5) res->baud.handshake = c2;
+ }
+ }
+ }
+ close(fd);
+ /* We have a serial console, so don't test for keyboard. Else
+ we will always find a PS/2 keyboard */
+ return;
+ }
+ }
+
+ PROGRESS(1, 0, "sun kbd");
+
+ if((fd = open(DEV_KBD, O_RDWR | O_NONBLOCK | O_NOCTTY)) >= 0)
+ {
+ if(ioctl(fd, KIOCTYPE, &kid)) kid = -1;
+ if(ioctl(fd, KIOCLAYOUT, &klay)) klay = -1;
+ close(fd);
+
+ if(kid != -1)
+ {
+ ADD2LOG("sun keyboard: type %d, layout %d\n", kid, klay);
+
+ hd = add_hd_entry(hd_data, __LINE__, 0);
+ hd->base_class.id = bc_keyboard;
+ hd->sub_class.id = sc_keyboard_kbd;
+ hd->bus.id = bus_serial;
+ if(kid == 4 && klay >= 0)
+ hd->prog_if.id = klay;
+
+ hd->vendor.id = MAKE_ID(TAG_SPECIAL, 0x0202);
+ kid2 = kid;
+ if(kid == 4 && klay > 0x20)
+ kid2 = 5;
+ hd->device.id = MAKE_ID(TAG_SPECIAL, kid2);
+ if(kid2 == 5) {
+ if(klay == 0x22 || klay == 0x51)
+ {
+ hd->sub_vendor.id = MAKE_ID(TAG_SPECIAL, 0x0202);
+ hd->sub_device.id = MAKE_ID(TAG_SPECIAL, 0x0001);
+ }
+ else if(!(
+ klay == 0x21 || (klay >= 0x2f && klay <= 0x31) ||
+ klay == 0x50 || (klay >= 0x5e && klay <= 0x60)
+ ))
+ {
+ hd->sub_vendor.id = MAKE_ID(TAG_SPECIAL, 0x0202);
+ hd->sub_device.id = MAKE_ID(TAG_SPECIAL, 0x0002);
+ }
+ }
+ }
+ }
+ else
+ {
+ for(hd = hd_data->hd; hd; hd = hd->next) {
+ if(hd->base_class.id == bc_keyboard) break;
+ }
+ if(!hd) {
+ /* We must have a PS/2 Keyboard */
+ hd = add_hd_entry(hd_data, __LINE__, 0);
+ hd->base_class.id = bc_keyboard;
+ hd->sub_class.id = sc_keyboard_kbd;
+ hd->bus.id = bus_ps2;
+ hd->vendor.id = MAKE_ID(TAG_SPECIAL, 0x0201);
+ hd->device.id = MAKE_ID(TAG_SPECIAL, 1);
+ }
+ }
+}
+
+#endif /* __sparc__ */
+
+
--- /dev/null
+void hd_scan_kbd(hd_data_t *hd_data);
--- /dev/null
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/klog.h>
+
+#include "hd.h"
+#include "hd_int.h"
+#include "klog.h"
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ * kernel log info
+ *
+ * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ */
+
+static int str_ok(str_list_t *sl);
+static int str_list_cmp(str_list_t *sl1, str_list_t *sl2);
+
+
+/*
+ * Check if a string starts with '<[0-9]>'.
+ */
+int str_ok(str_list_t *sl)
+{
+ return sl->str[0] == '<' && sl->str[2] == '>' && sl->str[1] >= '0' && sl->str[1] <= '9';
+}
+
+/*
+ * Check if sl1 is idential to sl2; sl1 may be shorter as sl2.
+ *
+ * Returns 0/1 if they are equal/not equal. If sl1 is NULL, 0 is returned.
+ */
+int str_list_cmp(str_list_t *sl1, str_list_t *sl2)
+{
+ for(; sl1; sl1 = sl1->next, sl2 = sl2->next) {
+ if(!sl2 || strcmp(sl1->str, sl2->str)) return 1;
+ }
+
+ return 0;
+}
+
+/*
+ * Read kernel log info. Combine with /var/log/boot.msg.
+ */
+void read_klog(hd_data_t *hd_data)
+{
+ char buf[0x2000 + 1], *s;
+ int i, j, len, n;
+ str_list_t *sl, *sl1, *sl2, *sl_last, **ssl, *sl_next;
+
+ /* some clean-up */
+ hd_data->klog = free_str_list(hd_data->klog);
+
+ sl1 = read_file(KLOG_BOOT, 0, 0);
+ sl2 = NULL;
+
+ /*
+ * remove non-canonical lines (not starting with <[0-9]>) at the start and
+ * at the end
+ */
+
+ /* note: the implementations assumes that at least *one* line is ok */
+ for(sl_last = NULL, sl = sl1; sl; sl = (sl_last = sl)->next) {
+ if(str_ok(sl)) {
+ if(sl_last) {
+ sl_last->next = NULL;
+ free_str_list(sl1);
+ sl1 = sl;
+ }
+ break;
+ }
+ }
+
+ for(sl_last = NULL, sl = sl1; sl; sl = (sl_last = sl)->next) {
+ if(!str_ok(sl)) {
+ if(sl_last) {
+ sl_last->next = NULL;
+ free_str_list(sl);
+ }
+ break;
+ }
+ }
+
+ n = klogctl(3, buf, sizeof buf - 1);
+ if(n <= 0) {
+ hd_data->klog = sl1;
+ return;
+ }
+
+ if(n > (int) sizeof buf - 1) n = sizeof buf - 1;
+ buf[n] = 0;
+ for(i = j = 0; i < n; i++) {
+ if(buf[i] == '\n') {
+ len = i - j + 1;
+ s = new_mem(len + 1);
+ memcpy(s, buf + j, len);
+ add_str_list(&sl2, s);
+ s = free_mem(s);
+ j = i + 1;
+ }
+ }
+
+ /* the 1st line may be incomplete */
+ if(sl2 && !str_ok(sl2)) {
+ sl_next = sl2->next;
+ sl2->next = NULL;
+ free_str_list(sl2);
+ sl2 = sl_next;
+ }
+
+ if(!sl1) {
+ hd_data->klog = sl2;
+ return;
+ }
+
+ if(sl1 && !sl2) {
+ hd_data->klog = sl1;
+ return;
+ }
+
+ /* now, try to join sl1 & sl2 */
+ for(sl_last = NULL, sl = sl1; sl; sl = (sl_last = sl)->next) {
+ if(!str_list_cmp(sl, sl2)) {
+ free_str_list(sl);
+ if(sl_last)
+ sl_last->next = NULL;
+ else
+ sl1 = NULL;
+ break;
+ }
+ }
+
+ /* append sl2 to sl1 */
+ for(ssl = &sl1; *ssl; ssl = &(*ssl)->next);
+ *ssl = sl2;
+
+ hd_data->klog = sl1;
+}
+
+
+/*
+ * Add some klog data to the global log.
+ */
+void dump_klog(hd_data_t *hd_data)
+{
+ str_list_t *sl;
+
+ ADD2LOG("----- kernel log -----\n");
+ for(sl = hd_data->klog; sl; sl = sl->next) {
+ ADD2LOG(" %s", sl->str);
+ }
+ ADD2LOG("----- kernel log end -----\n");
+}
--- /dev/null
+void read_klog(hd_data_t *hd_data);
+void dump_klog(hd_data_t *hd_data);
--- /dev/null
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <dirent.h>
+#include <ctype.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#include "hd.h"
+#include "hd_int.h"
+#include "manual.h"
+#include "hddb.h"
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ *
+ * hardware in /var/lib/hardware/
+ *
+ * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ */
+
+typedef struct {
+ int key;
+ char *value;
+} hash_t;
+
+/* corresponds to hd_status_value_t */
+static hash_t status_names[] = {
+ { status_no, "no" },
+ { status_yes, "yes" },
+ { status_unknown, "unknown" },
+ { status_new, "new" },
+ { 0, NULL }
+};
+
+/* corresponds to hd_hw_item_t */
+static hash_t hw_items[] = {
+ { hw_sys, "system" },
+ { hw_cpu, "cpu" },
+ { hw_keyboard, "keyboard" },
+ { hw_braille, "braille" },
+ { hw_mouse, "mouse" },
+ { hw_joystick, "joystick" },
+ { hw_printer, "printer" },
+ { hw_scanner, "scanner" },
+ { hw_chipcard, "chipcard" },
+ { hw_monitor, "monitor" },
+ { hw_tv, "tv card" },
+ { hw_display, "graphics card" },
+ { hw_framebuffer, "framebuffer" },
+ { hw_camera, "camera" },
+ { hw_sound, "sound" },
+ { hw_storage_ctrl, "storage" },
+ { hw_network_ctrl, "network" },
+ { hw_isdn, "isdn adapter" },
+ { hw_modem, "modem" },
+ { hw_network, "network interface" },
+ { hw_disk, "disk" },
+ { hw_partition, "partition" },
+ { hw_cdrom, "cdrom" },
+ { hw_floppy, "floppy" },
+ { hw_manual, "manual" },
+ { hw_usb_ctrl, "usb controller" },
+ { hw_usb, "usb" },
+ { hw_bios, "bios" },
+ { hw_pci, "pci" },
+ { hw_isapnp, "isapnp" },
+ { hw_bridge, "bridge" },
+ { hw_hub, "hub" },
+ { hw_scsi, "scsi" },
+ { hw_ide, "ide" },
+ { hw_memory, "memory" },
+ { hw_dvb, "dvb card" },
+ { hw_pcmcia, "pcmcia" },
+ { hw_pcmcia_ctrl, "pcmcia controller" },
+ { hw_ieee1394, "firewire" },
+ { hw_ieee1394_ctrl, "firewire controller" },
+ { hw_hotplug, "hotplug" },
+ { hw_hotplug_ctrl, "hotplug controller" },
+ { hw_zip, "zip" },
+ { hw_pppoe, "pppoe" },
+ { hw_wlan, "wlan card" },
+ { hw_dsl, "DSL adapter" },
+ { hw_block, "block device" },
+ { hw_tape, "tape" },
+ { hw_vbe, "vesa bios" },
+ { hw_bluetooth, "bluetooth" },
+ { hw_unknown, "unknown" },
+ { 0, NULL }
+};
+
+typedef enum {
+ hw_id_unique = 1, hw_id_parent, hw_id_child, hw_id_hwclass, hw_id_model,
+ hw_id_configured, hw_id_available, hw_id_needed, hw_id_cfgstring, hw_id_active
+} hw_id_t;
+
+#ifndef LIBHD_TINY
+
+#define MAN_SECT_GENERAL "General"
+#define MAN_SECT_STATUS "Status"
+#define MAN_SECT_HARDWARE "Hardware"
+
+static hash_t hw_ids_general[] = {
+ { hw_id_unique, "UniqueID" },
+ { hw_id_parent, "ParentID" },
+ { hw_id_child, "ChildIDs" },
+ { hw_id_hwclass, "HWClass" },
+ { hw_id_model, "Model" },
+ { 0, NULL }
+};
+
+static hash_t hw_ids_status[] = {
+ { hw_id_configured, "Configured" },
+ { hw_id_available, "Available" },
+ { hw_id_needed, "Needed" },
+ { hw_id_cfgstring, "ConfigString" },
+ { hw_id_active, "Active" },
+ { 0, NULL }
+};
+
+/* structure elements from hd_t */
+typedef enum {
+ hwdi_bus = 1, hwdi_slot, hwdi_func, hwdi_base_class, hwdi_sub_class,
+ hwdi_prog_if, hwdi_dev, hwdi_vend, hwdi_sub_dev, hwdi_sub_vend, hwdi_rev,
+ hwdi_compat_dev, hwdi_compat_vend, hwdi_dev_name, hwdi_vend_name,
+ hwdi_sub_dev_name, hwdi_sub_vend_name, hwdi_rev_name, hwdi_serial,
+ hwdi_unix_dev_name, hwdi_unix_dev_name2, hwdi_unix_dev_names, hwdi_rom_id,
+ hwdi_broken, hwdi_usb_guid, hwdi_res_mem, hwdi_res_phys_mem, hwdi_res_io,
+ hwdi_res_irq, hwdi_res_dma, hwdi_res_size, hwdi_res_baud, hwdi_res_cache,
+ hwdi_res_disk_geo, hwdi_res_monitor, hwdi_res_framebuffer, hwdi_features,
+ hwdi_hotplug, hwdi_class_list, hwdi_drivers, hwdi_sysfs_id,
+ hwdi_sysfs_busid, hwdi_sysfs_link
+} hw_hd_items_t;
+
+static hash_t hw_ids_hd_items[] = {
+ { hwdi_bus, "Bus" },
+ { hwdi_slot, "Slot" },
+ { hwdi_func, "Function" },
+ { hwdi_base_class, "BaseClass" },
+ { hwdi_sub_class, "SubClass" },
+ { hwdi_prog_if, "ProgIF" },
+ { hwdi_dev, "DeviceID" },
+ { hwdi_vend, "VendorID" },
+ { hwdi_sub_dev, "SubDeviceID" },
+ { hwdi_sub_vend, "SubVendorID" },
+ { hwdi_rev, "RevisionID" },
+ { hwdi_compat_dev, "CompatDeviceID" },
+ { hwdi_compat_vend, "CompatVendorID" },
+ { hwdi_dev_name, "DeviceName" },
+ { hwdi_vend_name, "VendorName" },
+ { hwdi_sub_dev_name, "SubDeviceName" },
+ { hwdi_sub_vend_name, "SubVendorName" },
+ { hwdi_rev_name, "RevisionName" },
+ { hwdi_serial, "Serial" },
+ { hwdi_unix_dev_name, "UnixDevice" },
+ { hwdi_unix_dev_name2, "UnixDeviceAlt" },
+ { hwdi_unix_dev_names, "UnixDeviceList" },
+ { hwdi_rom_id, "ROMID" },
+ { hwdi_broken, "Broken" },
+ { hwdi_usb_guid, "USBGUID" },
+ { hwdi_res_phys_mem, "Res.PhysMemory" },
+ { hwdi_res_mem, "Res.Memory" },
+ { hwdi_res_io, "Res.IO" },
+ { hwdi_res_irq, "Res.Interrupts" },
+ { hwdi_res_dma, "Res.DMA" },
+ { hwdi_res_size, "Res.Size" },
+ { hwdi_res_baud, "Res.Baud" },
+ { hwdi_res_cache, "Res.Cache" },
+ { hwdi_res_disk_geo, "Res.DiskGeometry" },
+ { hwdi_res_monitor, "Res.Monitor" },
+ { hwdi_res_framebuffer, "Res.Framebuffer" },
+ { hwdi_features, "Features" },
+ { hwdi_hotplug, "Hotplug" },
+ { hwdi_class_list, "HWClassList" },
+ { hwdi_drivers, "Drivers" },
+ { hwdi_sysfs_id, "SysfsID" },
+ { hwdi_sysfs_busid, "SysfsBusID" },
+ { hwdi_sysfs_link, "SysfsLink" },
+ { 0, NULL }
+};
+#endif
+
+static char *key2value(hash_t *hash, int id);
+
+#ifndef LIBHD_TINY
+
+static int value2key(hash_t *hash, char *str);
+static void dump_manual(hd_data_t *hd_data);
+static unsigned str2id(char *str);
+static void manual2hd(hd_data_t *hd_data, hd_manual_t *entry, hd_t *hd);
+static void hd2manual(hd_t *hd, hd_manual_t *entry);
+
+void hd_scan_manual(hd_data_t *hd_data)
+{
+ DIR *dir;
+ struct dirent *de;
+ hd_manual_t *entry, **entry_next;
+ int i;
+ hd_t *hd, *hd1;
+
+ if(!hd_probe_feature(hd_data, pr_manual)) return;
+
+ hd_data->module = mod_manual;
+
+ /* some clean-up */
+ remove_hd_entries(hd_data);
+
+ hd_data->manual = hd_free_manual(hd_data->manual);
+ entry_next = &hd_data->manual;
+
+ if((dir = opendir(HARDWARE_UNIQUE_KEYS))) {
+ i = 0;
+ while((de = readdir(dir))) {
+ if(*de->d_name == '.') continue;
+ PROGRESS(1, ++i, "read");
+ if((entry = hd_manual_read_entry(hd_data, de->d_name))) {
+ ADD2LOG(" got %s\n", entry->unique_id);
+ *entry_next = entry;
+ entry_next = &entry->next;
+ }
+ }
+ closedir(dir);
+ }
+
+ /* for compatibility: read old files, too */
+ if((dir = opendir(HARDWARE_DIR))) {
+ i = 0;
+ while((de = readdir(dir))) {
+ if(*de->d_name == '.') continue;
+ for(entry = hd_data->manual; entry; entry = entry->next) {
+ if(entry->unique_id && !strcmp(entry->unique_id, de->d_name)) break;
+ }
+ if(entry) continue;
+ PROGRESS(2, ++i, "read");
+ if((entry = hd_manual_read_entry(hd_data, de->d_name))) {
+ ADD2LOG(" got %s\n", entry->unique_id);
+ *entry_next = entry;
+ entry_next = &entry->next;
+ }
+ }
+ closedir(dir);
+ }
+
+ if(hd_data->debug) dump_manual(hd_data);
+
+ /* initialize some useful status value */
+ for(hd = hd_data->hd; hd; hd = hd->next) {
+ if(
+ !hd->status.configured &&
+ !hd->status.available &&
+ !hd->status.needed &&
+ !hd->status.active &&
+ !hd->status.invalid
+ ) {
+ hd->status.configured = status_new;
+ hd->status.available = hd->module == mod_manual ? status_unknown : status_yes;
+ hd->status.needed = status_no;
+ hd->status.active = status_unknown;
+ }
+ }
+
+ hd_data->flags.keep_kmods = 1;
+ for(entry = hd_data->manual; entry; entry = entry->next) {
+
+ for(hd = hd_data->hd; hd; hd = hd->next) {
+ if(hd->unique_id && !strcmp(hd->unique_id, entry->unique_id)) break;
+ }
+
+ if(hd) {
+ /* just update config status */
+ hd->status = entry->status;
+ hd->status.available = status_yes;
+
+ hd->config_string = new_str(entry->config_string);
+ }
+ else {
+ /* add new entry */
+ hd = add_hd_entry(hd_data, __LINE__, 0);
+
+ manual2hd(hd_data, entry, hd);
+
+ if(hd->status.available != status_unknown) hd->status.available = status_no;
+
+ if(hd->parent_id) {
+ for(hd1 = hd_data->hd; hd1; hd1 = hd1->next) {
+ if(hd1->unique_id && !strcmp(hd1->unique_id, hd->parent_id)) {
+ hd->attached_to = hd1->idx;
+ break;
+ }
+ }
+ }
+ }
+ }
+ hd_data->flags.keep_kmods = 0;
+
+}
+
+
+void hd_scan_manual2(hd_data_t *hd_data)
+{
+ hd_t *hd, *hd1;
+
+ /* check if it's necessary to reconfigure this hardware */
+ for(hd = hd_data->hd; hd; hd = hd->next) {
+ hd->status.reconfig = status_no;
+
+ if(hd->status.needed != status_yes) continue;
+
+ if(hd->status.available == status_no) {
+ hd->status.reconfig = status_yes;
+ continue;
+ }
+
+ if(hd->status.available != status_unknown) continue;
+
+ for(hd1 = hd_data->hd; hd1; hd1 = hd1->next) {
+ if(hd1 == hd) continue;
+
+ if(
+ hd1->hw_class == hd->hw_class &&
+ hd1->status.configured == status_new &&
+ hd1->status.available == status_yes
+ ) break;
+ }
+
+ if(hd1) hd->status.reconfig = status_yes;
+ }
+}
+
+
+int value2key(hash_t *hash, char *str)
+{
+ for(; hash->value; hash++) {
+ if(!strcmp(hash->value, str)) break;
+ }
+
+ return hash->key;
+}
+
+#endif
+
+char *key2value(hash_t *hash, int id)
+{
+ for(; hash->value; hash++) {
+ if(hash->key == id) break;
+ }
+
+ return hash->value;
+}
+
+char *hd_hw_item_name(hd_hw_item_t item)
+{
+ return key2value(hw_items, item);
+}
+
+
+#ifndef LIBHD_TINY
+
+char *hd_status_value_name(hd_status_value_t status)
+{
+ return key2value(status_names, status);
+}
+
+/*
+ * read an entry
+ */
+hd_manual_t *hd_manual_read_entry(hd_data_t *hd_data, const char *id)
+{
+ char path[PATH_MAX];
+ int i, j, line;
+ str_list_t *sl, *sl0;
+ hd_manual_t *entry;
+ hash_t *sect;
+ char *s, *s1, *s2;
+ int err = 0;
+
+ snprintf(path, sizeof path, "%s/%s", HARDWARE_UNIQUE_KEYS, id);
+
+ if(!(sl0 = read_file(path, 0, 0))) {
+ /* try old location, too */
+ snprintf(path, sizeof path, "%s/%s", HARDWARE_DIR, id);
+ if(!(sl0 = read_file(path, 0, 0))) return NULL;
+ }
+
+ entry = new_mem(sizeof *entry);
+
+ // default list: no valid entries
+ sect = hw_ids_general + sizeof hw_ids_general / sizeof *hw_ids_general - 1;
+
+ for(line = 1, sl = sl0; sl; sl = sl->next, line++) {
+ s = sl->str;
+ while(isspace(*s)) s++;
+ if(!*s || *s == '#' || *s == ';') continue; /* empty lines & comments */
+
+ s2 = s;
+ s1 = strsep(&s2, "=");
+
+ if(!s2 && *s == '[') {
+ s2 = s + 1;
+ s1 = strsep(&s2, "]");
+ if(s1) {
+ if(!strcmp(s1, MAN_SECT_GENERAL)) {
+ sect = hw_ids_general;
+ continue;
+ }
+ if(!strcmp(s1, MAN_SECT_STATUS)) {
+ sect = hw_ids_status;
+ continue;
+ }
+ if(!strcmp(s1, MAN_SECT_HARDWARE)) {
+ sect = NULL;
+ continue;
+ }
+ }
+ s2 = NULL;
+ }
+
+ if(!s2) {
+ ADD2LOG(" %s: invalid line %d\n", id, line);
+ err = 1;
+ break;
+ }
+
+ if(sect) {
+ i = value2key(sect, s1);
+ if(!i) {
+ ADD2LOG(" %s: invalid line %d\n", id, line);
+ err = 1;
+ break;
+ }
+ s = canon_str(s2, strlen(s2));
+ switch(i) {
+ case hw_id_unique:
+ entry->unique_id = s;
+ s = NULL;
+ break;
+
+ case hw_id_parent:
+ entry->parent_id = s;
+ s = NULL;
+ break;
+
+ case hw_id_child:
+ entry->child_ids = s;
+ s = NULL;
+ break;
+
+ case hw_id_hwclass:
+ j = value2key(hw_items, s);
+ entry->hw_class = j;
+ if(!j) err = 1;
+ break;
+
+ case hw_id_model:
+ entry->model = s;
+ s = NULL;
+ break;
+
+ case hw_id_configured:
+ j = value2key(status_names, s);
+ entry->status.configured = j;
+ if(!j) err = 1;
+ break;
+
+ case hw_id_available:
+ j = value2key(status_names, s);
+ entry->status.available_orig =
+ entry->status.available = j;
+ if(!j) err = 1;
+ break;
+
+ case hw_id_needed:
+ j = value2key(status_names, s);
+ entry->status.needed = j;
+ if(!j) err = 1;
+ break;
+
+ case hw_id_active:
+ j = value2key(status_names, s);
+ entry->status.active = j;
+ if(!j) err = 1;
+ break;
+
+ case hw_id_cfgstring:
+ entry->config_string = s;
+ s = NULL;
+ break;
+
+ default:
+ err = 1;
+ }
+
+ free_mem(s);
+
+ if(err) {
+ ADD2LOG(" %s: invalid line %d\n", id, line);
+ break;
+ }
+ }
+ else {
+ add_str_list(&entry->key, s1);
+ s = canon_str(s2, strlen(s2));
+ add_str_list(&entry->value, s);
+ free_mem(s);
+ }
+ }
+
+ free_str_list(sl0);
+
+ /*
+ * do some basic consistency checks
+ */
+
+ if(!entry->unique_id || strcmp(entry->unique_id, id)) {
+ ADD2LOG(" %s: unique id does not match file name\n", id);
+ err = 1;
+ }
+
+ /*
+ * if the status info is completely missing, fake some:
+ * new hardware, not autodetectable, not needed
+ */
+ if(
+ !entry->status.configured &&
+ !entry->status.available &&
+ !entry->status.needed &&
+ !entry->status.invalid
+ ) {
+ entry->status.configured = status_new;
+ entry->status.available = status_unknown;
+ entry->status.needed = status_no;
+ }
+
+ if(!entry->status.active) entry->status.active = status_unknown;
+
+ if(
+ !entry->status.configured ||
+ !entry->status.available ||
+ !entry->status.needed ||
+ !entry->status.active
+ ) {
+ ADD2LOG(" %s: incomplete status\n", id);
+ err = 1;
+ }
+
+ if(!entry->hw_class) {
+ ADD2LOG(" %s: no class\n", id);
+ err = 1;
+ }
+
+ if(!entry->model) {
+ ADD2LOG(" %s: no model\n", id);
+ err = 1;
+ }
+
+ if(err) {
+ entry = hd_free_manual(entry);
+ }
+
+ return entry;
+}
+
+
+/*
+ * write an entry
+ */
+
+int hd_manual_write_entry(hd_data_t *hd_data, hd_manual_t *entry)
+{
+ FILE *f;
+ char path[PATH_MAX];
+ int error = 0;
+ struct stat sbuf;
+ str_list_t *sl1, *sl2;
+
+ if(!entry) return 0;
+ if(!entry->unique_id || entry->status.invalid) return 1;
+
+ snprintf(path, sizeof path, "%s/%s", HARDWARE_UNIQUE_KEYS, entry->unique_id);
+
+ if(!(f = fopen(path, "w"))) {
+ /* maybe we have to create the HARDWARE_UNIQUE_KEYS directory first... */
+
+ if(lstat(HARDWARE_DIR, &sbuf)) {
+ mkdir(HARDWARE_DIR, 0755);
+ }
+
+ if(lstat(HARDWARE_UNIQUE_KEYS, &sbuf)) {
+ mkdir(HARDWARE_UNIQUE_KEYS, 0755);
+ }
+
+ if(!(f = fopen(path, "w"))) return 2;
+ }
+
+ fprintf(f, "[%s]\n", MAN_SECT_GENERAL);
+
+ if(
+ !fprintf(f, "%s=%s\n",
+ key2value(hw_ids_general, hw_id_unique),
+ entry->unique_id
+ )
+ ) error = 3;
+
+ if(
+ entry->parent_id &&
+ !fprintf(f, "%s=%s\n",
+ key2value(hw_ids_general, hw_id_parent),
+ entry->parent_id
+ )
+ ) error = 3;
+
+ if(
+ entry->child_ids &&
+ !fprintf(f, "%s=%s\n",
+ key2value(hw_ids_general, hw_id_child),
+ entry->child_ids
+ )
+ ) error = 3;
+
+ if(
+ (entry->hw_class && key2value(hw_items, entry->hw_class)) &&
+ !fprintf(f, "%s=%s\n",
+ key2value(hw_ids_general, hw_id_hwclass),
+ key2value(hw_items, entry->hw_class)
+ )
+ ) error = 3;
+
+ if(
+ entry->model &&
+ !fprintf(f, "%s=%s\n",
+ key2value(hw_ids_general, hw_id_model),
+ entry->model
+ )
+ ) error = 3;
+
+ fprintf(f, "\n[%s]\n", MAN_SECT_STATUS);
+
+ if(
+ (entry->status.configured && key2value(status_names, entry->status.configured)) &&
+ !fprintf(f, "%s=%s\n",
+ key2value(hw_ids_status, hw_id_configured),
+ key2value(status_names, entry->status.configured)
+ )
+ ) error = 4;
+
+ if(
+ (entry->status.available && key2value(status_names, entry->status.available)) &&
+ !fprintf(f, "%s=%s\n",
+ key2value(hw_ids_status, hw_id_available),
+ key2value(status_names, entry->status.available)
+ )
+ ) error = 4;
+
+ if(
+ (entry->status.needed && key2value(status_names, entry->status.needed)) &&
+ !fprintf(f, "%s=%s\n",
+ key2value(hw_ids_status, hw_id_needed),
+ key2value(status_names, entry->status.needed)
+ )
+ ) error = 4;
+
+ if(
+ (entry->status.active && key2value(status_names, entry->status.active)) &&
+ !fprintf(f, "%s=%s\n",
+ key2value(hw_ids_status, hw_id_active),
+ key2value(status_names, entry->status.active)
+ )
+ ) error = 4;
+
+ if(
+ entry->config_string &&
+ !fprintf(f, "%s=%s\n",
+ key2value(hw_ids_status, hw_id_cfgstring),
+ entry->config_string
+ )
+ ) error = 4;
+
+ fprintf(f, "\n[%s]\n", MAN_SECT_HARDWARE);
+
+ for(
+ sl1 = entry->key, sl2 = entry->value;
+ sl1 && sl2;
+ sl1 = sl1->next, sl2 = sl2->next
+ ) {
+ if(!fprintf(f, "%s=%s\n", sl1->str, sl2->str)) {
+ error = 5;
+ break;
+ }
+ }
+
+ fputs("\n", f);
+
+ fclose(f);
+
+ /* remove old file */
+ if(!error) {
+ snprintf(path, sizeof path, "%s/%s", HARDWARE_DIR, entry->unique_id);
+ unlink(path);
+ }
+
+ return error;
+}
+
+
+void dump_manual(hd_data_t *hd_data)
+{
+ hd_manual_t *entry;
+ static const char *txt = "manually configured hardware";
+ str_list_t *sl1, *sl2;
+
+ if(!hd_data->manual) return;
+
+ ADD2LOG("----- %s -----\n", txt);
+ for(entry = hd_data->manual; entry; entry = entry->next) {
+ ADD2LOG(" %s=%s\n",
+ key2value(hw_ids_general, hw_id_unique),
+ entry->unique_id
+ );
+ if(entry->parent_id)
+ ADD2LOG(" %s=%s\n",
+ key2value(hw_ids_general, hw_id_parent),
+ entry->parent_id
+ );
+ if(entry->child_ids)
+ ADD2LOG(" %s=%s\n",
+ key2value(hw_ids_general, hw_id_child),
+ entry->child_ids
+ );
+ ADD2LOG(" %s=%s\n",
+ key2value(hw_ids_general, hw_id_hwclass),
+ key2value(hw_items, entry->hw_class)
+ );
+ ADD2LOG(" %s=%s\n",
+ key2value(hw_ids_general, hw_id_model),
+ entry->model
+ );
+ ADD2LOG(" %s=%s\n",
+ key2value(hw_ids_status, hw_id_configured),
+ key2value(status_names, entry->status.configured)
+ );
+ ADD2LOG(" %s=%s\n",
+ key2value(hw_ids_status, hw_id_available),
+ key2value(status_names, entry->status.available)
+ );
+ ADD2LOG(" %s=%s\n",
+ key2value(hw_ids_status, hw_id_needed),
+ key2value(status_names, entry->status.needed)
+ );
+ ADD2LOG(" %s=%s\n",
+ key2value(hw_ids_status, hw_id_active),
+ key2value(status_names, entry->status.active)
+ );
+ if(entry->config_string)
+ ADD2LOG(" %s=%s\n",
+ key2value(hw_ids_status, hw_id_cfgstring),
+ entry->config_string
+ );
+ for(
+ sl1 = entry->key, sl2 = entry->value;
+ sl1 && sl2;
+ sl1 = sl1->next, sl2 = sl2->next
+ ) {
+ ADD2LOG(" %s=%s\n", sl1->str, sl2->str);
+ }
+ }
+ ADD2LOG("----- %s end -----\n", txt);
+}
+
+
+unsigned str2id(char *str)
+{
+ unsigned id;
+ unsigned tag = 0;
+
+ if(strlen(str) == 3) return name2eisa_id(str);
+
+ switch(*str) {
+ case 'p':
+ tag = TAG_PCI; str++; break;
+
+ case 'r':
+ str++; break;
+
+ case 'u':
+ tag = TAG_USB; str++; break;
+
+ case 's':
+ tag = TAG_SPECIAL; str++; break;
+
+ case 'P':
+ tag = TAG_PCMCIA; str++; break;
+
+ }
+
+ id = strtoul(str, &str, 16);
+ if(*str) return 0;
+
+ return MAKE_ID(tag, ID_VALUE(id));
+}
+
+
+/*
+ * move info from hd_manual_t to hd_t
+ */
+void manual2hd(hd_data_t *hd_data, hd_manual_t *entry, hd_t *hd)
+{
+ str_list_t *sl1, *sl2;
+ hw_hd_items_t item;
+ unsigned tag, u0, u1, u2, u3, u4;
+ hd_res_t *res;
+ uint64_t u64_0, u64_1;
+ char *s;
+ int i;
+
+ if(!hd || !entry) return;
+
+ hd->unique_id = new_str(entry->unique_id);
+ hd->parent_id = new_str(entry->parent_id);
+ hd->child_ids = hd_split(',', entry->child_ids);
+ hd->model = new_str(entry->model);
+ hd->hw_class = entry->hw_class;
+
+ hd->config_string = new_str(entry->config_string);
+
+ hd->status = entry->status;
+
+ for(
+ sl1 = entry->key, sl2 = entry->value;
+ sl1 && sl2;
+ sl1 = sl1->next, sl2 = sl2->next
+ ) {
+ switch(item = value2key(hw_ids_hd_items, sl1->str)) {
+ case hwdi_bus:
+ hd->bus.id = strtoul(sl2->str, NULL, 0);
+ break;
+
+ case hwdi_slot:
+ hd->slot = strtoul(sl2->str, NULL, 0);
+ break;
+
+ case hwdi_func:
+ hd->func = strtoul(sl2->str, NULL, 0);
+ break;
+
+ case hwdi_base_class:
+ hd->base_class.id = strtoul(sl2->str, NULL, 0);
+ break;
+
+ case hwdi_sub_class:
+ hd->sub_class.id = strtoul(sl2->str, NULL, 0);
+ break;
+
+ case hwdi_prog_if:
+ hd->prog_if.id = strtoul(sl2->str, NULL, 0);
+ break;
+
+ case hwdi_dev:
+ hd->device.id = str2id(sl2->str);
+ break;
+
+ case hwdi_vend:
+ hd->vendor.id = str2id(sl2->str);
+ break;
+
+ case hwdi_sub_dev:
+ hd->sub_device.id = str2id(sl2->str);
+ break;
+
+ case hwdi_sub_vend:
+ hd->sub_vendor.id = str2id(sl2->str);
+ break;
+
+ case hwdi_rev:
+ hd->revision.id = strtoul(sl2->str, NULL, 0);
+ break;
+
+ case hwdi_compat_dev:
+ hd->compat_device.id = str2id(sl2->str);
+ break;
+
+ case hwdi_compat_vend:
+ hd->compat_vendor.id = str2id(sl2->str);
+ break;
+
+ case hwdi_dev_name:
+ hd->device.name = new_str(sl2->str);
+ break;
+
+ case hwdi_vend_name:
+ hd->vendor.name = new_str(sl2->str);
+ break;
+
+ case hwdi_sub_dev_name:
+ hd->sub_device.name = new_str(sl2->str);
+ break;
+
+ case hwdi_sub_vend_name:
+ hd->sub_vendor.name = new_str(sl2->str);
+ break;
+
+ case hwdi_rev_name:
+ hd->revision.name = new_str(sl2->str);
+ break;
+
+ case hwdi_serial:
+ hd->serial = new_str(sl2->str);
+ break;
+
+ case hwdi_unix_dev_name:
+ hd->unix_dev_name = new_str(sl2->str);
+ break;
+
+ case hwdi_unix_dev_name2:
+ hd->unix_dev_name2 = new_str(sl2->str);
+ break;
+
+ case hwdi_unix_dev_names:
+ hd->unix_dev_names = hd_split(' ', sl2->str);
+ break;
+
+ case hwdi_drivers:
+ hd->drivers = hd_split('|', sl2->str);
+ break;
+
+ case hwdi_sysfs_id:
+ hd->sysfs_id = new_str(sl2->str);
+ break;
+
+ case hwdi_sysfs_busid:
+ hd->sysfs_bus_id = new_str(sl2->str);
+ break;
+
+ case hwdi_sysfs_link:
+ hd->sysfs_device_link = new_str(sl2->str);
+ break;
+
+ case hwdi_rom_id:
+ hd->rom_id = new_str(sl2->str);
+ break;
+
+ case hwdi_broken:
+ hd->broken = strtoul(sl2->str, NULL, 0);
+ break;
+
+ case hwdi_usb_guid:
+ hd->usb_guid = new_str(sl2->str);
+ break;
+
+ case hwdi_hotplug:
+ hd->hotplug = strtol(sl2->str, NULL, 0);
+ break;
+
+ case hwdi_class_list:
+ for(
+ u0 = 0, s = sl2->str;
+ u0 < sizeof hd->hw_class_list / sizeof *hd->hw_class_list;
+ u0++
+ ) {
+ if(*s && s[1] && (i = hex(s, 2)) >= 0) {
+ hd->hw_class_list[u0] = i;
+ s += 2;
+ }
+ else {
+ break;
+ }
+ }
+ break;
+
+ case hwdi_res_mem:
+ res = add_res_entry(&hd->res, new_mem(sizeof *res));
+ res->any.type = res_mem;
+ if(sscanf(sl2->str, "0x%"SCNx64",0x%"SCNx64",%u,%u,%u", &u64_0, &u64_1, &u0, &u1, &u2) == 5) {
+ res->mem.base = u64_0;
+ res->mem.range = u64_1;
+ res->mem.enabled = u0;
+ res->mem.access = u1;
+ res->mem.prefetch = u2;
+ }
+ break;
+
+ case hwdi_res_phys_mem:
+ res = add_res_entry(&hd->res, new_mem(sizeof *res));
+ res->any.type = res_phys_mem;
+ if(sscanf(sl2->str, "0x%"SCNx64"", &u64_0) == 1) {
+ res->phys_mem.range = u64_0;
+ }
+ break;
+
+ case hwdi_res_io:
+ res = add_res_entry(&hd->res, new_mem(sizeof *res));
+ res->any.type = res_io;
+ if(sscanf(sl2->str, "0x%"SCNx64",0x%"SCNx64",%u,%u", &u64_0, &u64_1, &u0, &u1) == 4) {
+ res->io.base = u64_0;
+ res->io.range = u64_1;
+ res->io.enabled = u0;
+ res->io.access = u1;
+ }
+ break;
+
+ case hwdi_res_irq:
+ res = add_res_entry(&hd->res, new_mem(sizeof *res));
+ res->any.type = res_irq;
+ if(sscanf(sl2->str, "%u,%u,%u", &u0, &u1, &u2) == 3) {
+ res->irq.base = u0;
+ res->irq.triggered = u1;
+ res->irq.enabled = u2;
+ }
+ break;
+
+ case hwdi_res_dma:
+ res = add_res_entry(&hd->res, new_mem(sizeof *res));
+ res->any.type = res_dma;
+ if(sscanf(sl2->str, "%u,%u", &u0, &u1) == 2) {
+ res->dma.base = u0;
+ res->dma.enabled = u1;
+ }
+ break;
+
+ case hwdi_res_size:
+ res = add_res_entry(&hd->res, new_mem(sizeof *res));
+ res->any.type = res_size;
+ if(sscanf(sl2->str, "%u,%u,%u", &u0, &u1, &u2) == 3) {
+ res->size.unit = u0;
+ res->size.val1 = u1;
+ res->size.val2 = u2;
+ }
+ break;
+
+ case hwdi_res_baud:
+ res = add_res_entry(&hd->res, new_mem(sizeof *res));
+ res->any.type = res_baud;
+ if(sscanf(sl2->str, "%u,%u,%u,%u,%u", &u0, &u1, &u2, &u3, &u4) == 5) {
+ res->baud.speed = u0;
+ res->baud.bits = u1;
+ res->baud.stopbits = u2;
+ res->baud.parity = (char) u3;
+ res->baud.handshake = (char) u4;
+ }
+ break;
+
+ case hwdi_res_cache:
+ res = add_res_entry(&hd->res, new_mem(sizeof *res));
+ res->any.type = res_cache;
+ if(sscanf(sl2->str, "%u", &u0) == 1) {
+ res->cache.size = u0;
+ }
+ break;
+
+ case hwdi_res_disk_geo:
+ res = add_res_entry(&hd->res, new_mem(sizeof *res));
+ res->any.type = res_disk_geo;
+ if(sscanf(sl2->str, "%u,%u,%u,%u", &u0, &u1, &u2, &u3) == 4) {
+ res->disk_geo.cyls = u0;
+ res->disk_geo.heads = u1;
+ res->disk_geo.sectors = u2;
+ res->disk_geo.geotype = u3;
+ }
+ break;
+
+ case hwdi_res_monitor:
+ res = add_res_entry(&hd->res, new_mem(sizeof *res));
+ res->any.type = res_monitor;
+ if(sscanf(sl2->str, "%u,%u,%u,%u", &u0, &u1, &u2, &u3) == 4) {
+ res->monitor.width = u0;
+ res->monitor.height = u1;
+ res->monitor.vfreq = u2;
+ res->monitor.interlaced = u3;
+ }
+ break;
+
+ case hwdi_res_framebuffer:
+ res = add_res_entry(&hd->res, new_mem(sizeof *res));
+ res->any.type = res_framebuffer;
+ if(sscanf(sl2->str, "%u,%u,%u,%u,%u", &u0, &u1, &u2, &u3, &u4) == 5) {
+ res->framebuffer.width = u0;
+ res->framebuffer.height = u1;
+ res->framebuffer.bytes_p_line = u2;
+ res->framebuffer.colorbits = u3;
+ res->framebuffer.mode = u4;
+ }
+ break;
+
+ case hwdi_features:
+ u0 = strtoul(sl2->str, NULL, 0);
+ if(u0 & (1 << 0)) hd->is.agp = 1;
+ if(u0 & (1 << 1)) hd->is.isapnp = 1;
+ if(u0 & (1 << 2)) hd->is.softraiddisk = 1;
+ if(u0 & (1 << 3)) hd->is.zip = 1;
+ if(u0 & (1 << 4)) hd->is.cdr = 1;
+ if(u0 & (1 << 5)) hd->is.cdrw = 1;
+ if(u0 & (1 << 6)) hd->is.dvd = 1;
+ if(u0 & (1 << 7)) hd->is.dvdr = 1;
+ if(u0 & (1 << 8)) hd->is.dvdram = 1;
+ if(u0 & (1 << 9)) hd->is.pppoe = 1;
+ if(u0 & (1 << 10)) hd->is.wlan = 1;
+ break;
+ }
+ }
+
+ if(hd->device.id || hd->vendor.id) {
+ tag = ID_TAG(hd->device.id);
+ tag = tag ? tag : ID_TAG(hd->vendor.id);
+ tag = tag ? tag : TAG_PCI;
+ hd->device.id = MAKE_ID(tag, ID_VALUE(hd->device.id));
+ hd->vendor.id = MAKE_ID(tag, ID_VALUE(hd->vendor.id));
+ }
+
+ if(hd->sub_device.id || hd->sub_vendor.id) {
+ tag = ID_TAG(hd->sub_device.id);
+ tag = tag ? tag : ID_TAG(hd->sub_vendor.id);
+ tag = tag ? tag : TAG_PCI;
+ hd->sub_device.id = MAKE_ID(tag, ID_VALUE(hd->sub_device.id));
+ hd->sub_vendor.id = MAKE_ID(tag, ID_VALUE(hd->sub_vendor.id));
+ }
+
+ if(hd->compat_device.id || hd->compat_vendor.id) {
+ tag = ID_TAG(hd->compat_device.id);
+ tag = tag ? tag : ID_TAG(hd->compat_vendor.id);
+ tag = tag ? tag : TAG_PCI;
+ hd->compat_device.id = MAKE_ID(tag, ID_VALUE(hd->compat_device.id));
+ hd->compat_vendor.id = MAKE_ID(tag, ID_VALUE(hd->compat_vendor.id));
+ }
+
+ if(hd->status.available == status_unknown) hd->is.manual = 1;
+
+ /* create some entries, if missing */
+
+ if(!hd->device.id && !hd->vendor.id && !hd->device.name) {
+ hd->device.name = new_str(hd->model);
+ }
+
+ if(hd->hw_class && !hd->base_class.id) {
+ switch(hd->hw_class) {
+ case hw_cdrom:
+ hd->base_class.id = bc_storage_device;
+ hd->sub_class.id = sc_sdev_cdrom;
+ break;
+
+ case hw_mouse:
+ hd->base_class.id = bc_mouse;
+ hd->sub_class.id = sc_mou_other;
+ break;
+
+ default:
+ break;
+ }
+ }
+
+ hddb_add_info(hd_data, hd);
+}
+
+
+void hd2manual(hd_t *hd, hd_manual_t *entry)
+{
+ char *s, *t;
+ hd_res_t *res;
+ str_list_t *sl;
+ unsigned u;
+
+ if(!hd || !entry) return;
+
+ entry->unique_id = new_str(hd->unique_id);
+ entry->parent_id = new_str(hd->parent_id);
+ entry->child_ids = hd_join(",", hd->child_ids);
+ entry->model = new_str(hd->model);
+ entry->hw_class = hd->hw_class;
+
+ entry->config_string = new_str(hd->config_string);
+
+ entry->status = hd->status;
+
+ if(
+ !entry->status.configured &&
+ !entry->status.available &&
+ !entry->status.needed &&
+ !entry->status.active &&
+ !entry->status.invalid
+ ) {
+ entry->status.configured = status_new;
+ entry->status.available = hd->module == mod_manual ? status_unknown : status_yes;
+ entry->status.needed = status_no;
+ entry->status.active = status_unknown;
+ }
+
+ s = NULL;
+
+ if(hd->broken) {
+ add_str_list(&entry->key, key2value(hw_ids_hd_items, hwdi_broken));
+ str_printf(&s, 0, "0x%x", hd->broken);
+ add_str_list(&entry->value, s);
+ }
+
+ if(hd->bus.id) {
+ add_str_list(&entry->key, key2value(hw_ids_hd_items, hwdi_bus));
+ str_printf(&s, 0, "0x%x", hd->bus.id);
+ add_str_list(&entry->value, s);
+ }
+
+ if(hd->slot) {
+ add_str_list(&entry->key, key2value(hw_ids_hd_items, hwdi_slot));
+ str_printf(&s, 0, "0x%x", hd->slot);
+ add_str_list(&entry->value, s);
+ }
+
+ if(hd->func) {
+ add_str_list(&entry->key, key2value(hw_ids_hd_items, hwdi_func));
+ str_printf(&s, 0, "0x%x", hd->func);
+ add_str_list(&entry->value, s);
+ }
+
+ if(hd->base_class.id) {
+ add_str_list(&entry->key, key2value(hw_ids_hd_items, hwdi_base_class));
+ str_printf(&s, 0, "0x%x", hd->base_class.id);
+ add_str_list(&entry->value, s);
+ }
+
+ if(hd->sub_class.id) {
+ add_str_list(&entry->key, key2value(hw_ids_hd_items, hwdi_sub_class));
+ str_printf(&s, 0, "0x%x", hd->sub_class.id);
+ add_str_list(&entry->value, s);
+ }
+
+ if(hd->prog_if.id) {
+ add_str_list(&entry->key, key2value(hw_ids_hd_items, hwdi_prog_if));
+ str_printf(&s, 0, "0x%x", hd->prog_if.id);
+ add_str_list(&entry->value, s);
+ }
+
+ if(hd->device.id || hd->vendor.id) {
+ add_str_list(&entry->key, key2value(hw_ids_hd_items, hwdi_vend));
+ add_str_list(&entry->value, vend_id2str(hd->vendor.id));
+ add_str_list(&entry->key, key2value(hw_ids_hd_items, hwdi_dev));
+ str_printf(&s, 0, "%04x", ID_VALUE(hd->device.id));
+ add_str_list(&entry->value, s);
+ }
+
+ if(hd->sub_device.id || hd->sub_vendor.id) {
+ add_str_list(&entry->key, key2value(hw_ids_hd_items, hwdi_sub_vend));
+ add_str_list(&entry->value, vend_id2str(hd->sub_vendor.id));
+ add_str_list(&entry->key, key2value(hw_ids_hd_items, hwdi_sub_dev));
+ str_printf(&s, 0, "%04x", ID_VALUE(hd->sub_device.id));
+ add_str_list(&entry->value, s);
+ }
+
+ if(hd->revision.id) {
+ add_str_list(&entry->key, key2value(hw_ids_hd_items, hwdi_rev));
+ str_printf(&s, 0, "0x%x", hd->revision.id);
+ add_str_list(&entry->value, s);
+ }
+
+ if(hd->compat_device.id || hd->compat_vendor.id) {
+ add_str_list(&entry->key, key2value(hw_ids_hd_items, hwdi_compat_vend));
+ add_str_list(&entry->value, vend_id2str(hd->compat_vendor.id));
+ add_str_list(&entry->key, key2value(hw_ids_hd_items, hwdi_compat_dev));
+ str_printf(&s, 0, "%04x", ID_VALUE(hd->compat_device.id));
+ add_str_list(&entry->value, s);
+ }
+
+ if(hd->device.name) {
+ add_str_list(&entry->key, key2value(hw_ids_hd_items, hwdi_dev_name));
+ add_str_list(&entry->value, hd->device.name);
+ }
+
+ if(hd->vendor.name) {
+ add_str_list(&entry->key, key2value(hw_ids_hd_items, hwdi_vend_name));
+ add_str_list(&entry->value, hd->vendor.name);
+ }
+
+ if(hd->sub_device.name) {
+ add_str_list(&entry->key, key2value(hw_ids_hd_items, hwdi_sub_dev_name));
+ add_str_list(&entry->value, hd->sub_device.name);
+ }
+
+ if(hd->sub_vendor.name) {
+ add_str_list(&entry->key, key2value(hw_ids_hd_items, hwdi_sub_vend_name));
+ add_str_list(&entry->value, hd->sub_vendor.name);
+ }
+
+ if(hd->revision.name) {
+ add_str_list(&entry->key, key2value(hw_ids_hd_items, hwdi_rev_name));
+ add_str_list(&entry->value, hd->revision.name);
+ }
+
+ if(hd->serial) {
+ add_str_list(&entry->key, key2value(hw_ids_hd_items, hwdi_serial));
+ add_str_list(&entry->value, hd->serial);
+ }
+
+ if(hd->unix_dev_name) {
+ add_str_list(&entry->key, key2value(hw_ids_hd_items, hwdi_unix_dev_name));
+ add_str_list(&entry->value, hd->unix_dev_name);
+ }
+
+ if(hd->unix_dev_name2) {
+ add_str_list(&entry->key, key2value(hw_ids_hd_items, hwdi_unix_dev_name2));
+ add_str_list(&entry->value, hd->unix_dev_name2);
+ }
+
+ if(hd->unix_dev_names) {
+ add_str_list(&entry->key, key2value(hw_ids_hd_items, hwdi_unix_dev_names));
+ s = free_mem(s);
+ s = hd_join(" ", hd->unix_dev_names);
+ add_str_list(&entry->value, s);
+ }
+
+ if(hd->drivers) {
+ add_str_list(&entry->key, key2value(hw_ids_hd_items, hwdi_drivers));
+ s = free_mem(s);
+ s = hd_join("|", hd->drivers);
+ add_str_list(&entry->value, s);
+ }
+
+ if(hd->sysfs_id) {
+ add_str_list(&entry->key, key2value(hw_ids_hd_items, hwdi_sysfs_id));
+ add_str_list(&entry->value, hd->sysfs_id);
+ }
+
+ if(hd->sysfs_bus_id) {
+ add_str_list(&entry->key, key2value(hw_ids_hd_items, hwdi_sysfs_busid));
+ add_str_list(&entry->value, hd->sysfs_bus_id);
+ }
+
+ if(hd->sysfs_device_link) {
+ add_str_list(&entry->key, key2value(hw_ids_hd_items, hwdi_sysfs_link));
+ add_str_list(&entry->value, hd->sysfs_device_link);
+ }
+
+ if(hd->rom_id) {
+ add_str_list(&entry->key, key2value(hw_ids_hd_items, hwdi_rom_id));
+ add_str_list(&entry->value, hd->rom_id);
+ }
+
+ if(hd->usb_guid) {
+ add_str_list(&entry->key, key2value(hw_ids_hd_items, hwdi_usb_guid));
+ add_str_list(&entry->value, hd->usb_guid);
+ }
+
+ if(hd->hotplug) {
+ add_str_list(&entry->key, key2value(hw_ids_hd_items, hwdi_hotplug));
+ str_printf(&s, 0, "%d", hd->hotplug);
+ add_str_list(&entry->value, s);
+ }
+
+ s = free_mem(s);
+ for(u = 0; u < sizeof hd->hw_class_list / sizeof *hd->hw_class_list; u++) {
+ str_printf(&s, -1, "%02x", hd->hw_class_list[u]);
+ }
+ add_str_list(&entry->key, key2value(hw_ids_hd_items, hwdi_class_list));
+ add_str_list(&entry->value, s);
+
+ u = 0;
+ if(hd->is.agp) u |= 1 << 0;
+ if(hd->is.isapnp) u |= 1 << 1;
+ if(hd->is.softraiddisk) u |= 1 << 2;
+ if(hd->is.zip) u |= 1 << 3;
+ if(hd->is.cdr) u |= 1 << 4;
+ if(hd->is.cdrw) u |= 1 << 5;
+ if(hd->is.dvd) u |= 1 << 6;
+ if(hd->is.dvdr) u |= 1 << 7;
+ if(hd->is.dvdram) u |= 1 << 8;
+ if(hd->is.pppoe) u |= 1 << 9;
+ if(hd->is.wlan) u |= 1 << 10;
+
+ if(u) {
+ add_str_list(&entry->key, key2value(hw_ids_hd_items, hwdi_features));
+ str_printf(&s, 0, "0x%x", u);
+ add_str_list(&entry->value, s);
+ }
+
+ for(res = hd->res; res; res = res->next) {
+ sl = NULL;
+ switch(res->any.type) {
+ case res_mem:
+ add_str_list(&entry->key, key2value(hw_ids_hd_items, hwdi_res_mem));
+ str_printf(&s, 0, "0x%"PRIx64"", res->mem.base);
+ add_str_list(&sl, s);
+ str_printf(&s, 0, "0x%"PRIx64"", res->mem.range);
+ add_str_list(&sl, s);
+ str_printf(&s, 0, "%u", res->mem.enabled);
+ add_str_list(&sl, s);
+ str_printf(&s, 0, "%u", res->mem.access);
+ add_str_list(&sl, s);
+ str_printf(&s, 0, "%u", res->mem.prefetch);
+ add_str_list(&sl, s);
+ break;
+
+ case res_phys_mem:
+ add_str_list(&entry->key, key2value(hw_ids_hd_items, hwdi_res_phys_mem));
+ str_printf(&s, 0, "0x%"PRIx64"", res->phys_mem.range);
+ add_str_list(&sl, s);
+ break;
+
+ case res_io:
+ add_str_list(&entry->key, key2value(hw_ids_hd_items, hwdi_res_io));
+ str_printf(&s, 0, "0x%"PRIx64"", res->io.base);
+ add_str_list(&sl, s);
+ str_printf(&s, 0, "0x%"PRIx64"", res->io.range);
+ add_str_list(&sl, s);
+ str_printf(&s, 0, "%u", res->io.enabled);
+ add_str_list(&sl, s);
+ str_printf(&s, 0, "%u", res->io.access);
+ add_str_list(&sl, s);
+ break;
+
+ case res_irq:
+ add_str_list(&entry->key, key2value(hw_ids_hd_items, hwdi_res_irq));
+ str_printf(&s, 0, "%u", res->irq.base);
+ add_str_list(&sl, s);
+ str_printf(&s, 0, "%u", res->irq.triggered);
+ add_str_list(&sl, s);
+ str_printf(&s, 0, "%u", res->irq.enabled);
+ add_str_list(&sl, s);
+ break;
+
+ case res_dma:
+ add_str_list(&entry->key, key2value(hw_ids_hd_items, hwdi_res_dma));
+ str_printf(&s, 0, "%u", res->dma.base);
+ add_str_list(&sl, s);
+ str_printf(&s, 0, "%u", res->dma.enabled);
+ add_str_list(&sl, s);
+ break;
+
+ case res_size:
+ add_str_list(&entry->key, key2value(hw_ids_hd_items, hwdi_res_size));
+ str_printf(&s, 0, "%u", res->size.unit);
+ add_str_list(&sl, s);
+ str_printf(&s, 0, "%"PRIu64, res->size.val1);
+ add_str_list(&sl, s);
+ str_printf(&s, 0, "%"PRIu64, res->size.val2);
+ add_str_list(&sl, s);
+ break;
+
+ case res_baud:
+ add_str_list(&entry->key, key2value(hw_ids_hd_items, hwdi_res_baud));
+ str_printf(&s, 0, "%u", res->baud.speed);
+ add_str_list(&sl, s);
+ str_printf(&s, 0, "%u", res->baud.bits);
+ add_str_list(&sl, s);
+ str_printf(&s, 0, "%u", res->baud.stopbits);
+ add_str_list(&sl, s);
+ str_printf(&s, 0, "0x%02x", (unsigned) res->baud.parity);
+ add_str_list(&sl, s);
+ str_printf(&s, 0, "0x%02x", (unsigned) res->baud.handshake);
+ add_str_list(&sl, s);
+ break;
+
+ case res_cache:
+ add_str_list(&entry->key, key2value(hw_ids_hd_items, hwdi_res_cache));
+ str_printf(&s, 0, "%u", res->cache.size);
+ add_str_list(&sl, s);
+ break;
+
+ case res_disk_geo:
+ add_str_list(&entry->key, key2value(hw_ids_hd_items, hwdi_res_disk_geo));
+ str_printf(&s, 0, "%u", res->disk_geo.cyls);
+ add_str_list(&sl, s);
+ str_printf(&s, 0, "%u", res->disk_geo.heads);
+ add_str_list(&sl, s);
+ str_printf(&s, 0, "%u", res->disk_geo.sectors);
+ add_str_list(&sl, s);
+ str_printf(&s, 0, "%u", res->disk_geo.geotype);
+ add_str_list(&sl, s);
+ break;
+
+ case res_monitor:
+ add_str_list(&entry->key, key2value(hw_ids_hd_items, hwdi_res_monitor));
+ str_printf(&s, 0, "%u", res->monitor.width);
+ add_str_list(&sl, s);
+ str_printf(&s, 0, "%u", res->monitor.height);
+ add_str_list(&sl, s);
+ str_printf(&s, 0, "%u", res->monitor.vfreq);
+ add_str_list(&sl, s);
+ str_printf(&s, 0, "%u", res->monitor.interlaced);
+ add_str_list(&sl, s);
+ break;
+
+ case res_framebuffer:
+ add_str_list(&entry->key, key2value(hw_ids_hd_items, hwdi_res_framebuffer));
+ str_printf(&s, 0, "%u", res->framebuffer.width);
+ add_str_list(&sl, s);
+ str_printf(&s, 0, "%u", res->framebuffer.height);
+ add_str_list(&sl, s);
+ str_printf(&s, 0, "%u", res->framebuffer.bytes_p_line);
+ add_str_list(&sl, s);
+ str_printf(&s, 0, "%u", res->framebuffer.colorbits);
+ add_str_list(&sl, s);
+ str_printf(&s, 0, "%u", res->framebuffer.mode);
+ add_str_list(&sl, s);
+ break;
+
+ default:
+ break;
+ }
+ /* keep entry->key & entry->value symmetrical! */
+ if(sl) {
+ t = hd_join(",", sl);
+ add_str_list(&entry->value, t);
+ free_mem(t);
+ free_str_list(sl);
+ }
+ }
+
+ free_mem(s);
+}
+
+
+hd_t *hd_read_config(hd_data_t *hd_data, const char *id)
+{
+ hd_t *hd = NULL;
+ hd_manual_t *entry;
+
+ hddb_init(hd_data);
+
+ entry = hd_manual_read_entry(hd_data, id);
+
+ if(entry) {
+ hd = new_mem(sizeof *hd);
+ hd->module = hd_data->module;
+ hd->line = __LINE__;
+ hd->tag.freeit = 1; /* make it a 'stand alone' entry */
+ manual2hd(hd_data, entry, hd);
+ hd_free_manual(entry);
+ }
+
+ return hd;
+}
+
+
+int hd_write_config(hd_data_t *hd_data, hd_t *hd)
+{
+ int err = 0;
+ hd_manual_t *entry;
+
+ if(!hd_report_this(hd_data, hd)) return 0;
+
+ entry = new_mem(sizeof *entry);
+
+ hd2manual(hd, entry);
+
+ err = entry->unique_id ? hd_manual_write_entry(hd_data, entry) : 5;
+
+ hd_free_manual(entry);
+
+ return err;
+}
+
+
+#endif /* LIBHD_TINY */
+
--- /dev/null
+void hd_scan_manual(hd_data_t *hd_data);
+void hd_scan_manual2(hd_data_t *hd_data);
--- /dev/null
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/stat.h>
+
+#include "hd.h"
+#include "hd_int.h"
+#include "memory.h"
+#include "klog.h"
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ * memory stuff
+ *
+ * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ */
+
+uint64_t kcore_mem(hd_data_t *hd_data);
+uint64_t klog_mem(hd_data_t *hd_data, uint64_t *alt);
+uint64_t klog_mem2(hd_data_t *hd_data);
+uint64_t meminfo_mem(hd_data_t *hd_data);
+
+void hd_scan_memory(hd_data_t *hd_data)
+{
+ hd_t *hd;
+ uint64_t kcore, klog, klog_alt, klog2, meminfo, msize0, msize1, u;
+ hd_res_t *res;
+ int i;
+ int exact;
+
+ if(!hd_probe_feature(hd_data, pr_memory)) return;
+
+ hd_data->module = mod_memory;
+
+ /* some clean-up */
+ remove_hd_entries(hd_data);
+
+ PROGRESS(1, 0, "main memory size");
+
+ kcore = kcore_mem(hd_data);
+ klog = klog_mem(hd_data, &klog_alt);
+ klog2 = klog_mem2(hd_data);
+ if(klog2 > klog) klog = klog2;
+ meminfo = meminfo_mem(hd_data);
+
+ msize0 = meminfo > klog ? meminfo : klog;
+ if(!msize0) msize0 = kcore;
+
+ exact = 0;
+ if(msize0 && kcore >= msize0 && ((kcore - msize0) << 4) / msize0 == 0) {
+ /* trust kcore value if it's approx. msize0 */
+ msize0 = kcore;
+ exact = 1;
+ }
+ msize1 = msize0;
+ if(meminfo > msize1) { msize1 = meminfo; exact = 0; }
+ if(klog_alt > msize0) msize0 = klog_alt;
+
+ hd = add_hd_entry(hd_data, __LINE__, 0);
+ hd->base_class.id = bc_internal;
+ hd->sub_class.id = sc_int_main_mem;
+
+ res = add_res_entry(&hd->res, new_mem(sizeof *res));
+ res->mem.type = res_mem;
+ res->mem.range = msize0;
+ res->mem.access = acc_rw;
+ res->mem.enabled = 1;
+
+ /* round it somewhat */
+ for(i = 0, u = msize1; u; i++) {
+ u >>= 1;
+ }
+ if(i > 10) { /* We *do* have at least 1k memory, do we? */
+ msize1 >>= i - (exact ? 8 : 5);
+ msize1++;
+ msize1 >>= 1;
+ msize1 <<= i - (exact ? 7 : 4);
+ }
+
+ res = add_res_entry(&hd->res, new_mem(sizeof *res));
+ res->phys_mem.type = res_phys_mem;
+ res->phys_mem.range = msize1;
+}
+
+uint64_t kcore_mem(hd_data_t *hd_data)
+{
+ uint64_t u = 0;
+ size_t ps = getpagesize();
+ struct stat sb;
+
+ if(!stat(PROC_KCORE, &sb)) {
+ u = sb.st_size;
+ if(u > ps) u -= ps;
+
+#if 0
+ /* we'll assume no mem modules with less than 256k */
+ u += 1 << 17;
+ u &= -1 << 18;
+#endif
+ }
+
+ ADD2LOG(" kcore mem: 0x%"PRIx64"\n", u);
+
+ return u;
+}
+
+
+uint64_t klog_mem(hd_data_t *hd_data, uint64_t *alt)
+{
+ uint64_t u = 0, u0, u1, u2, u3, mem0 = 0, mem1 = 0;
+ str_list_t *sl;
+ char *s;
+ int i;
+
+ if(!hd_data->klog) read_klog(hd_data);
+
+ for(sl = hd_data->klog; sl; sl = sl->next) {
+ if(strstr(sl->str, "<6>Memory: ") == sl->str) {
+ if(sscanf(sl->str, "<6>Memory: %"SCNu64"k/%"SCNu64"k", &u0, &u1) == 2) {
+ mem0 = u1 << 10;
+ }
+ if(
+ (i = sscanf(sl->str, "<6>Memory: %"SCNu64"k available (%"SCNu64"k kernel code, %"SCNu64"k data, %"SCNu64"k", &u0, &u1, &u2, &u3)) == 4 || i == 1
+ ) {
+ mem0 = (i == 1 ? u0 : u0 + u1 + u2 + u3) << 10;
+ }
+ if(
+ (s = strstr(sl->str, "[")) &&
+ sscanf(s, "[%"SCNx64",%"SCNx64"]", &u0, &u1) == 2 &&
+ u1 > u0
+ ) {
+ mem1 = u1 - u0;
+ }
+ break;
+ }
+ }
+
+ u = mem0 ? mem0 : mem1;
+
+#if 0
+ /* round it somewhat */
+ for(i = 0, u0 = u; u0; i++) {
+ u0 >>= 1;
+ }
+ if(i > 10) { /* We *do* have at least 1k memory, do we? */
+ u >>= i - 6;
+ u++;
+ u >>= 1;
+ u <<= i - 5;
+ }
+#endif
+
+ ADD2LOG(" klog mem 0: 0x%"PRIx64"\n", mem0);
+ ADD2LOG(" klog mem 1: 0x%"PRIx64"\n", mem1);
+ ADD2LOG(" klog mem: 0x%"PRIx64"\n", u);
+
+ *alt = mem1;
+
+ return u;
+}
+
+uint64_t klog_mem2(hd_data_t *hd_data)
+{
+ uint64_t u0, u1, mem = 0;
+ str_list_t *sl;
+ char buf[64];
+
+ if(!hd_data->klog) read_klog(hd_data);
+
+ for(sl = hd_data->klog; sl; sl = sl->next) {
+ if(strstr(sl->str, "<6>BIOS-provided physical RAM map:") == sl->str) {
+ for(sl = sl->next ; sl; sl = sl->next) {
+ ADD2LOG(" -- %s", sl->str);
+ if(sscanf(sl->str, "<4> BIOS-e820: %"SCNx64" - %"SCNx64" (%63s", &u0, &u1, buf) != 3) break;
+ if(strcmp(buf, "usable)")) continue;
+ if(u1 < u0) break;
+ mem += u1 - u0;
+ }
+ break;
+ }
+ }
+
+ ADD2LOG(" bios mem: 0x%"PRIx64"\n", mem);
+
+ return mem;
+}
+
+uint64_t meminfo_mem(hd_data_t *hd_data)
+{
+ uint64_t u = 0, u0;
+ str_list_t *sl;
+
+ sl = read_file(PROC_MEMINFO, 0, 1);
+
+ if(sl && sscanf(sl->str, "MemTotal: %"SCNu64"", &u0) == 1) {
+ u = u0 << 10;
+ }
+
+ free_str_list(sl);
+
+ ADD2LOG(" meminfo: 0x%"PRIx64"\n", u);
+
+ return u;
+}
+
+
--- /dev/null
+void hd_scan_memory(hd_data_t *hd_data);
--- /dev/null
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/ioctl.h>
+
+#include <linux/hdreg.h>
+
+#include "hd.h"
+#include "hd_int.h"
+#include "misc.h"
+#include "klog.h"
+
+static void read_ioports(misc_t *m);
+static void read_dmas(misc_t *m);
+static void read_irqs(misc_t *m);
+static int active_vga_card(hd_t *);
+
+static void dump_misc_proc_data(hd_data_t *hd_data);
+static void dump_misc_data(hd_data_t *hd_data);
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ * misc info
+ *
+ * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ */
+
+void hd_scan_misc(hd_data_t *hd_data)
+{
+ hd_t *hd;
+ hd_res_t *res;
+ int fd, i;
+ char *s = NULL;
+ bios_info_t *bt = NULL;
+ char par[] = "parport0";
+ int fd_ser0, fd_ser1;
+
+ if(!hd_probe_feature(hd_data, pr_misc)) return;
+
+ hd_data->module = mod_misc;
+
+ /* some clean-up */
+ remove_hd_entries(hd_data);
+ hd_data->misc = free_misc(hd_data->misc);
+
+ PROGRESS(9, 0, "kernel log");
+ read_klog(hd_data);
+ if((hd_data->debug & HD_DEB_MISC)) dump_klog(hd_data);
+
+ PROGRESS(1, 0, "misc data");
+ hd_data->misc = new_mem(sizeof *hd_data->misc);
+
+ /* this is enough to load the module */
+ fd_ser0 = fd_ser1 = -1;
+
+#if !defined(__sparc__)
+ /* On sparc, the close needs too long */
+ if(hd_probe_feature(hd_data, pr_misc_serial)) {
+ PROGRESS(1, 1, "open serial");
+ fd_ser0 = open("/dev/ttyS0", O_RDONLY | O_NONBLOCK);
+ fd_ser1 = open("/dev/ttyS1", O_RDONLY | O_NONBLOCK);
+ /* keep the devices open until the resources have been read */
+ }
+#endif
+
+ /* this is enough to load the module */
+ if(!hd_data->flags.no_parport && hd_probe_feature(hd_data, pr_misc_par)) {
+ PROGRESS(1, 2, "open parallel");
+ /* what can the BIOS tell us? */
+ for(hd = hd_data->hd; hd; hd = hd->next) {
+ if(
+ hd->base_class.id == bc_internal &&
+ hd->sub_class.id == sc_int_bios &&
+ hd->detail &&
+ hd->detail->type == hd_detail_bios &&
+ hd->detail->bios.data
+ ) break;
+ }
+ if(hd) {
+ bt = hd->detail->bios.data;
+ if(bt->par_port0) {
+ str_printf(&s, 0, "io=0x%x", bt->par_port0);
+ if(bt->par_port1) {
+ str_printf(&s, -1, ",0x%x", bt->par_port1);
+ if(bt->par_port2) str_printf(&s, -1, ",0x%x", bt->par_port2);
+ }
+ str_printf(&s, -1, " irq=none,none,none");
+ }
+ unload_module(hd_data, "parport_probe");
+ unload_module(hd_data, "lp");
+ unload_module(hd_data, "parport_pc");
+ unload_module(hd_data, "parport");
+
+ /* now load it with the right io */
+ load_module(hd_data, "parport");
+ load_module_with_params(hd_data, "parport_pc", s);
+ free_mem(s);
+ }
+ /* now load the rest of the modules */
+ fd = open("/dev/lp0", O_RDONLY | O_NONBLOCK);
+ if(fd >= 0) close(fd);
+ }
+
+ /*
+ * floppy driver resources are allocated only temporarily,
+ * so we access it just before we read the resources
+ */
+ if(hd_probe_feature(hd_data, pr_misc_floppy)) {
+ /* look for a floppy *device* entry... */
+ for(hd = hd_data->hd; hd; hd = hd->next) {
+ if(
+ hd->base_class.id == bc_storage_device &&
+ hd->sub_class.id == sc_sdev_floppy &&
+ hd->unix_dev_name &&
+ !strncmp(hd->unix_dev_name, "/dev/fd", sizeof "/dev/fd" - 1)
+ ) {
+
+ PROGRESS(1, 3, "read floppy");
+ i = 5;
+ hd->block0 = read_block0(hd_data, hd->unix_dev_name, &i);
+ hd->is.notready = hd->block0 ? 0 : 1;
+ if(i < 0) {
+ hd->tag.remove = 1;
+ ADD2LOG("misc.floppy: removing floppy entry %u (timed out)\n", hd->idx);
+ }
+
+ if(!hd->is.notready) {
+ struct hd_geometry geo;
+ int fd;
+ unsigned size, blk_size = 0x200;
+
+ fd = open(hd->unix_dev_name, O_RDONLY | O_NONBLOCK);
+ if(fd >= 0) {
+ if(!ioctl(fd, HDIO_GETGEO, &geo)) {
+ ADD2LOG("floppy ioctl(geo) ok\n");
+ res = add_res_entry(&hd->res, new_mem(sizeof *res));
+ res->disk_geo.type = res_disk_geo;
+ res->disk_geo.cyls = geo.cylinders;
+ res->disk_geo.heads = geo.heads;
+ res->disk_geo.sectors = geo.sectors;
+ res->disk_geo.geotype = geo_logical;
+ size = geo.cylinders * geo.heads * geo.sectors;
+ for(res = hd->res; res; res = res->next) {
+ if(res->any.type == res_size && res->size.unit == size_unit_sectors) {
+ res->size.val1 = size; res->size.val2 = blk_size;
+ break;
+ }
+ }
+ if(!res) {
+ res = add_res_entry(&hd->res, new_mem(sizeof *res));
+ res->size.type = res_size;
+ res->size.unit = size_unit_sectors;
+ res->size.val1 = size; res->size.val2 = blk_size;
+ }
+ }
+ close(fd);
+ }
+ }
+
+ break;
+ }
+ }
+ remove_tagged_hd_entries(hd_data);
+ }
+
+ PROGRESS(2, 1, "io");
+ read_ioports(hd_data->misc);
+
+ PROGRESS(2, 2, "dma");
+ read_dmas(hd_data->misc);
+
+ PROGRESS(2, 3, "irq");
+ read_irqs(hd_data->misc);
+
+ if((hd_data->debug & HD_DEB_MISC)) dump_misc_proc_data(hd_data);
+
+ if(fd_ser0 >= 0) close(fd_ser0);
+ if(fd_ser1 >= 0) close(fd_ser1);
+
+ /* now create some system generic entries */
+
+ /* FPU */
+ PROGRESS(3, 0, "FPU");
+ res = NULL;
+ gather_resources(hd_data->misc, &res, "fpu", 0);
+ if(res) {
+ hd = add_hd_entry(hd_data, __LINE__, 0);
+ hd->base_class.id = bc_internal;
+ hd->sub_class.id = sc_int_fpu;
+ hd->res = res;
+ }
+
+ /* DMA */
+ PROGRESS(3, 1, "DMA");
+ res = NULL;
+ gather_resources(hd_data->misc, &res, "dma1", 0);
+ gather_resources(hd_data->misc, &res, "dma2", 0);
+ gather_resources(hd_data->misc, &res, "dma page reg", 0);
+ gather_resources(hd_data->misc, &res, "cascade", W_DMA);
+ if(res) {
+ hd = add_hd_entry(hd_data, __LINE__, 0);
+ hd->base_class.id = bc_system;
+ hd->sub_class.id = sc_sys_dma;
+ hd->res = res;
+ }
+
+ /* PIC */
+ PROGRESS(3, 2, "PIC");
+ res = NULL;
+ gather_resources(hd_data->misc, &res, "pic1", 0);
+ gather_resources(hd_data->misc, &res, "pic2", 0);
+ gather_resources(hd_data->misc, &res, "cascade", W_IRQ);
+ if(res) {
+ hd = add_hd_entry(hd_data, __LINE__, 0);
+ hd->base_class.id = bc_system;
+ hd->sub_class.id = sc_sys_pic;
+ hd->res = res;
+ }
+
+ /* timer */
+ PROGRESS(3, 3, "timer");
+ res = NULL;
+ gather_resources(hd_data->misc, &res, "timer", 0);
+ if(res) {
+ hd = add_hd_entry(hd_data, __LINE__, 0);
+ hd->base_class.id = bc_system;
+ hd->sub_class.id = sc_sys_timer;
+ hd->res = res;
+ }
+
+ /* real time clock */
+ PROGRESS(3, 4, "RTC");
+ res = NULL;
+ gather_resources(hd_data->misc, &res, "rtc", 0);
+ if(res) {
+ hd = add_hd_entry(hd_data, __LINE__, 0);
+ hd->base_class.id = bc_system;
+ hd->sub_class.id = sc_sys_rtc;
+ hd->res = res;
+ }
+
+ /* keyboard */
+ res = NULL;
+ gather_resources(hd_data->misc, &res, "keyboard", 0);
+ if(res) {
+ hd = add_hd_entry(hd_data, __LINE__, 0);
+ hd->base_class.id = bc_input;
+ hd->sub_class.id = sc_inp_keyb;
+ hd->res = res;
+ }
+
+ /* parallel ports */
+ for(i = 0; i < 1; i++, par[sizeof par - 2]++) {
+ res = NULL;
+ gather_resources(hd_data->misc, &res, par, 0);
+ if(res) {
+ hd = add_hd_entry(hd_data, __LINE__, 0);
+ hd->base_class.id = bc_comm;
+ hd->sub_class.id = sc_com_par;
+ str_printf(&hd->unix_dev_name, 0, "/dev/lp%d", i);
+ hd->res = res;
+ }
+ }
+
+ /* floppy controller */
+ res = NULL;
+ gather_resources(hd_data->misc, &res, "floppy", 0);
+ gather_resources(hd_data->misc, &res, "floppy DIR", 0);
+ if(res) {
+ /* look for an existing entry */
+ for(hd = hd_data->hd; hd; hd = hd->next) {
+ if(hd->base_class.id == bc_storage && hd->sub_class.id == sc_sto_floppy) break;
+ }
+
+ /* missing, so create one */
+ if(!hd) {
+ hd = add_hd_entry(hd_data, __LINE__, 0);
+ hd->base_class.id = bc_storage;
+ hd->sub_class.id = sc_sto_floppy;
+ }
+
+ hd->res = res;
+ }
+
+ /*
+ * look for PS/2 port
+ *
+ * The catch is, that sometimes /dev/psaux is accessible only for root,
+ * so the open() may fail but there are irq events registered.
+ *
+ */
+ fd = open(DEV_PSAUX, O_RDONLY | O_NONBLOCK);
+ if(fd >= 0) close(fd);
+
+ res = NULL;
+ gather_resources(hd_data->misc, &res, "PS/2 Mouse", 0);
+
+ if(res || fd >= 0) {
+ hd = add_hd_entry(hd_data, __LINE__, 0);
+ hd->base_class.id = bc_ps2;
+
+ if(res) {
+ hd->res = res;
+ }
+ }
+}
+
+
+void hd_scan_misc2(hd_data_t *hd_data)
+{
+ hd_t *hd, *hd1;
+ misc_t *m;
+ hd_res_t *res, *res1, *res2;
+ int i;
+
+ if(!hd_probe_feature(hd_data, pr_misc)) return;
+
+ hd_data->module = mod_misc;
+
+ PROGRESS(5, 0, "misc data");
+
+ /* create some more system generic entries */
+
+ /* IDE */
+
+// ###### add special ide detail to hd_t!!!
+ res = NULL;
+ gather_resources(hd_data->misc, &res, "ide0", 0);
+ gather_resources(hd_data->misc, &res, "ide1", 0);
+ gather_resources(hd_data->misc, &res, "ide2", 0);
+ gather_resources(hd_data->misc, &res, "ide3", 0);
+ if(res) {
+ for(hd = hd_data->hd; hd; hd = hd->next) {
+ if(
+ hd->base_class.id == bc_storage &&
+ hd->sub_class.id == sc_sto_ide &&
+ have_common_res(hd->res, res)
+ ) break;
+ }
+ if(!hd) {
+ /* eg. non-PCI IDE controller */
+ hd = add_hd_entry(hd_data, __LINE__, 0);
+ hd->base_class.id = bc_storage;
+ hd->sub_class.id = sc_sto_ide;
+ /* use join_res to join the i/o ranges of ide0/1 */
+ join_res_io(&hd->res, res);
+ join_res_irq(&hd->res, res);
+ join_res_dma(&hd->res, res);
+ free_res_list(res);
+ }
+ else {
+ /* eg. PCI IDE controller, add resources */
+ join_res_io(&hd->res, res);
+ join_res_irq(&hd->res, res);
+ join_res_dma(&hd->res, res);
+ free_res_list(res);
+ }
+ }
+
+ /* VGA */
+ res = NULL;
+ gather_resources(hd_data->misc, &res, "vga+", 0);
+ gather_resources(hd_data->misc, &res, "vesafb", 0);
+ if(res) {
+ for(i = 0, hd1 = NULL, hd = hd_data->hd; hd; hd = hd->next) {
+ if(hd->base_class.id == bc_display && hd->sub_class.id == sc_dis_vga) {
+ i++;
+ hd1 = hd;
+ }
+ }
+ if(i == 0) {
+ /* non-PCI VGA card ??? - really, we shouldn't care... */
+ /* FIX THIS !!! ############### */
+#ifdef __alpha__
+ free_res_list(res);
+#else
+ hd = add_hd_entry(hd_data, __LINE__, 0);
+ hd->base_class.id = bc_display;
+ hd->sub_class.id = sc_dis_vga;
+ hd->res = res;
+#endif
+ }
+ else if(i == 1) {
+ /* 1 PCI vga card, add resources */
+ join_res_io(&hd1->res, res);
+ join_res_irq(&hd1->res, res);
+ join_res_dma(&hd1->res, res);
+ free_res_list(res);
+ hd_data->display = hd1->idx;
+ }
+ else {
+ /* more than 1: look again, now only 'active' cards */
+ for(i = 0, hd1 = NULL, hd = hd_data->hd; hd; hd = hd->next) {
+ if(
+ hd->base_class.id == bc_display &&
+ hd->sub_class.id == sc_dis_vga &&
+ active_vga_card(hd)
+ ) {
+ i++;
+ hd1 = hd;
+ }
+ }
+ if(i == 1) {
+ /* 'the' active PCI vga card, add resources */
+ join_res_io(&hd1->res, res);
+ join_res_irq(&hd1->res, res);
+ join_res_dma(&hd1->res, res);
+ hd_data->display = hd1->idx;
+ }
+ else {
+ /* now, what??? */
+ ADD2LOG("Oopy, could not figure out *the* active display adapter!\n");
+ }
+ free_res_list(res);
+ }
+ }
+
+ /* serial ports */
+ res = NULL;
+ gather_resources(hd_data->misc, &res, "serial(auto)", 0);
+ gather_resources(hd_data->misc, &res, "serial(set)", 0);
+ gather_resources(hd_data->misc, &res, "serial", 0);
+ for(hd = hd_data->hd; hd; hd = hd->next) {
+ if(hd->base_class.id == bc_comm && hd->sub_class.id == sc_com_ser) {
+ for(res1 = hd->res; res1; res1 = res1->next) {
+ for(res2 = res; res2; res2 = res2->next) {
+ if(res1->any.type == res2->any.type) {
+ switch(res1->any.type) {
+ case res_irq:
+ if(res1->irq.base == res2->irq.base) {
+ res2->any.type = res_any;
+ }
+ break;
+ case res_io:
+ if(
+ res1->io.base == res2->io.base &&
+ (!res1->io.range || res1->io.range == res2->io.range)
+ ) {
+ res1->io.range = res2->io.range;
+ res2->any.type = res_any;
+ }
+ break;
+ default: /* gcc -Wall */
+ break;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ /* if any of the serial resources are unaccounted for, make an extra entry */
+ for(res2 = res; res2; res2 = res2->next) {
+ if(res2->any.type != res_any) {
+ hd = add_hd_entry(hd_data, __LINE__, 0);
+ hd->base_class.id = bc_comm;
+ hd->sub_class.id = sc_com_ser;
+ hd->prog_if.id = 0x80;
+ for(; res2; res2 = res2->next) {
+ if(res2->any.type != res_any) {
+ res1 = add_res_entry(&hd->res, new_mem(sizeof *res));
+ *res1 = *res2;
+ res1->next = NULL;
+ }
+ }
+ break;
+ }
+ }
+ free_res_list(res);
+
+ /* go through our list and assign event counts to irq entries */
+ m = hd_data->misc;
+ for(hd = hd_data->hd; hd; hd = hd->next) {
+ for(res = hd->res; res; res = res->next) {
+ if(res->irq.type == res_irq) {
+ for(i = 0; (unsigned) i < m->irq_len; i++) {
+ if(res->irq.base == m->irq[i].irq) {
+ res->irq.triggered = m->irq[i].events;
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ /* look for entries with matching start address */
+ m = hd_data->misc;
+ for(hd = hd_data->hd; hd; hd = hd->next) {
+ for(res = hd->res; res; res = res->next) {
+ if(res->io.type == res_io) {
+ for(i = 0; (unsigned) i < m->io_len; i++) {
+ if(res->io.base == m->io[i].addr && res->io.range < m->io[i].size) {
+ res->io.range = m->io[i].size;
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ if((hd_data->debug & HD_DEB_MISC)) dump_misc_data(hd_data);
+}
+
+
+/*
+ * read /proc/ioports
+ */
+void read_ioports(misc_t *m)
+{
+ char buf[100];
+ misc_io_t *r;
+ uint64_t u, v;
+ str_list_t *sl;
+
+ if(!(m->proc_io = read_file(PROC_IOPORTS, 0, 0))) return;
+
+ for(sl = m->proc_io; sl; sl = sl->next) {
+ if(sscanf(sl->str, " %"PRIx64" - %"PRIx64" : %99[^\n]", &u, &v, buf) == 3) {
+ m->io = add_mem(m->io, sizeof *m->io, m->io_len);
+ r = m->io + m->io_len++;
+ r->addr = u;
+ r->size = v >= u ? v - u + 1 : 0;
+ r->dev = new_str(buf);
+ }
+ }
+}
+
+/*
+ * read /proc/dma
+ */
+void read_dmas(misc_t *m)
+{
+ char buf[100];
+ misc_dma_t *d;
+ unsigned u;
+ str_list_t *sl;
+
+ if(!(m->proc_dma = read_file(PROC_DMA, 0, 0))) return;
+
+ for(sl = m->proc_dma; sl; sl = sl->next) {
+ if(sscanf(sl->str, " %u : %99[^\n]", &u, buf) == 2) {
+ m->dma = add_mem(m->dma, sizeof *m->dma, m->dma_len);
+ d = m->dma + m->dma_len++;
+ d->channel = u;
+ d->dev = new_str(buf);
+ }
+ }
+}
+
+
+/*
+ * read /proc/interrupts
+ *
+ * This is somewhat more tricky, as the irq event counts are done separately
+ * per cpu *and* there may be irq sharing.
+ */
+void read_irqs(misc_t *m)
+{
+ char buf[100], buf2[100], *s;
+ misc_irq_t *ir;
+ int i, j;
+ unsigned u, v, k;
+ str_list_t *sl;
+
+ if(!(m->proc_irq = read_file(PROC_INTERRUPTS, 1, 0))) return;
+
+ for(sl = m->proc_irq; sl; sl = sl->next) {
+ /* irq */
+ i = 0;
+ if(sscanf(sl->str, " %u: %n", &u, &i) < 1) continue;
+ v = 0;
+ j = i;
+ /* add up all event counters */
+ while(j < (int) strlen(sl->str) && sscanf(sl->str + j, " %u %n", &k, &i) >= 1) {
+ if(!i) break;
+ v += k;
+ j += i;
+ }
+ /* device driver name string */
+#if defined(__PPC__)
+ if(
+ sscanf(sl->str + j, " %*s Edge %99[^\n]", buf) == 1 ||
+ sscanf(sl->str + j, " %*s Level %99[^\n]", buf) == 1 ||
+ sscanf(sl->str + j, " %*s %99[^\n]", buf) == 1
+ ) {
+#else
+#if defined(__alpha__) || defined(__sparc__)
+ if(sscanf(sl->str + j, " %99[^\n]", buf) == 1) {
+#else /* __i386__ || __x86_64__ || __ia64__ */
+ if(sscanf(sl->str + j, " %*s %99[^\n]", buf) == 1) {
+#endif
+#endif
+ m->irq = add_mem(m->irq, sizeof *m->irq, m->irq_len);
+ ir = m->irq + m->irq_len++;
+ ir->irq = u;
+ ir->events = v;
+
+ /* split device driver names (separated by ',') */
+ s = buf;
+ while(*s && sscanf(s, " %99[^,] %n", buf2, &j) >= 1) {
+ ir->dev = add_mem(ir->dev, sizeof *ir->dev, ir->devs);
+ ir->dev[ir->devs++] = new_str(buf2);
+ s += j;
+ if(*s) s++; /* skip ',' */
+ }
+ }
+ }
+}
+
+void gather_resources(misc_t *m, hd_res_t **r, char *name, unsigned which)
+{
+ int i, j;
+ hd_res_t *res;
+
+ if(!m) return;
+
+ if(!which) which = W_IO | W_DMA | W_IRQ;
+
+ if((which & W_IO)) for(i = 0; (unsigned) i < m->io_len; i++) {
+ if(!strcmp(name, m->io[i].dev)) {
+ res = add_res_entry(r, new_mem(sizeof **r));
+ res->io.type = res_io;
+ res->io.enabled = 1;
+ res->io.base = m->io[i].addr;
+ res->io.range = m->io[i].size;
+ res->io.access = acc_rw;
+ m->io[i].tag++;
+ }
+ }
+
+ if((which & W_DMA)) for(i = 0; (unsigned) i < m->dma_len; i++) {
+ if(!strcmp(name, m->dma[i].dev)) {
+ res = add_res_entry(r, new_mem(sizeof **r));
+ res->dma.type = res_dma;
+ res->dma.enabled = 1;
+ res->dma.base = m->dma[i].channel;
+ m->dma[i].tag++;
+ }
+ }
+
+ if((which & W_IRQ)) for(i = 0; (unsigned) i < m->irq_len; i++) {
+ for(j = 0; j < m->irq[i].devs; j++) {
+ if(!strcmp(name, m->irq[i].dev[j])) {
+ res = add_res_entry(r, new_mem(sizeof **r));
+ res->irq.type = res_irq;
+ res->irq.enabled = 1;
+ res->irq.base = m->irq[i].irq;
+ res->irq.triggered = m->irq[i].events;
+ m->irq[i].tag++;
+ }
+ }
+ }
+}
+
+
+int active_vga_card(hd_t *hd)
+{
+ hd_res_t *res;
+
+ if(hd->bus.id != bus_pci) return 1;
+
+ for(res = hd->res; res; res = res->next) {
+ if(
+ (res->mem.type == res_mem && res->mem.enabled) ||
+ (res->io.type == res_io && res->io.enabled)
+ ) return 1;
+ }
+
+ return 0;
+}
+
+
+/*
+ * Add some proc info to the global log.
+ */
+void dump_misc_proc_data(hd_data_t *hd_data)
+{
+ str_list_t *sl;
+
+ ADD2LOG("----- /proc/ioports -----\n");
+ for(sl = hd_data->misc->proc_io; sl; sl = sl->next) {
+ ADD2LOG(" %s", sl->str);
+ }
+ ADD2LOG("----- /proc/ioports end -----\n");
+
+ ADD2LOG("----- /proc/interrupts -----\n");
+ for(sl = hd_data->misc->proc_irq; sl; sl = sl->next) {
+ ADD2LOG(" %s", sl->str);
+ }
+ ADD2LOG("----- /proc/interrupts end -----\n");
+
+ ADD2LOG("----- /proc/dma -----\n");
+ for(sl = hd_data->misc->proc_dma; sl; sl = sl->next) {
+ ADD2LOG(" %s", sl->str);
+ }
+ ADD2LOG("----- /proc/dma end -----\n");
+
+}
+
+
+/*
+ * Add the resource usage to the global log.
+ */
+void dump_misc_data(hd_data_t *hd_data)
+{
+ misc_t *m = hd_data->misc;
+ int i, j;
+
+ ADD2LOG("----- misc resources -----\n");
+
+ for(i = 0; (unsigned) i < m->io_len; i++) {
+ ADD2LOG(
+ "i/o:%u 0x%04"PRIx64" - 0x%04"PRIx64" (0x%02"PRIx64") \"%s\"\n",
+ m->io[i].tag,
+ m->io[i].addr, m->io[i].addr + m->io[i].size - 1,
+ m->io[i].size, m->io[i].dev
+ );
+ }
+
+ for(i = 0; (unsigned) i < m->irq_len; i++) {
+ ADD2LOG(
+ "irq:%u %2u (%9u)",
+ m->irq[i].tag, m->irq[i].irq, m->irq[i].events
+ );
+ for(j = 0; j < m->irq[i].devs; j++) {
+ ADD2LOG(" \"%s\"", m->irq[i].dev[j]);
+ }
+ ADD2LOG("\n");
+ }
+
+ for(i = 0; (unsigned) i < m->dma_len; i++) {
+ ADD2LOG(
+ "dma:%u %u \"%s\"\n",
+ m->dma[i].tag, m->dma[i].channel, m->dma[i].dev
+ );
+ }
+
+ ADD2LOG("----- misc resources end -----\n");
+}
--- /dev/null
+void hd_scan_misc(hd_data_t *hd_data);
+void hd_scan_misc2(hd_data_t *hd_data);
--- /dev/null
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <termios.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <sys/time.h>
+#include <sys/ioctl.h>
+
+#include "hd.h"
+#include "hd_int.h"
+#include "hddb.h"
+#include "modem.h"
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ * modem info
+ *
+ *
+ * Note: what about modem speed?
+ *
+ * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ */
+
+#ifndef LIBHD_TINY
+
+static struct speeds_s {
+ unsigned baud;
+ speed_t mask;
+} speeds[] = {
+ { 1200, B1200 },
+ { 1800, B1800 },
+ { 2400, B2400 },
+ { 4800, B4800 },
+ { 9600, B9600 },
+ { 19200, B19200 },
+ { 38400, B38400 },
+ { 57600, B57600 },
+ { 115200, B115200 }
+#if !defined(__sparc__)
+ ,{ 230400, B230400 }
+ ,{ 460800, B460800 }
+ ,{ 500000, B500000 }
+ ,{ 1000000, B1000000 }
+ ,{ 2000000, B2000000 }
+ ,{ 4000000, B4000000 }
+#endif
+};
+
+#define MAX_SPEED (sizeof speeds / sizeof *speeds)
+
+static char *init_strings[] = {
+ "Q0 V1 E1",
+ "S0=0",
+ "&C1",
+ "&D2",
+ "+FCLASS=0"
+};
+
+#define MAX_INIT_STRING (sizeof init_strings / sizeof *init_strings)
+
+static void get_serial_modem(hd_data_t* hd_data);
+static void add_serial_modem(hd_data_t* hd_data);
+static int dev_name_duplicate(hd_data_t *hd_data, char *dev_name);
+static void guess_modem_name(hd_data_t *hd_data, ser_device_t *sm);
+static void at_cmd(hd_data_t *hd_data, char *at, int raw, int log_it);
+static void write_modem(hd_data_t *hd_data, char *msg);
+static void read_modem(hd_data_t *hd_data);
+static ser_device_t *add_ser_modem_entry(ser_device_t **sm, ser_device_t *new_sm);
+static int set_modem_speed(ser_device_t *sm, unsigned baud);
+static int init_modem(ser_device_t *mi);
+static unsigned chk4id(ser_device_t *mi);
+static void dump_ser_modem_data(hd_data_t *hd_data);
+
+void hd_scan_modem(hd_data_t *hd_data)
+{
+ ser_device_t *sm, *sm_next;
+
+ if(!hd_probe_feature(hd_data, pr_modem)) return;
+
+ hd_data->module = mod_modem;
+
+ /* some clean-up */
+ remove_hd_entries(hd_data);
+ hd_data->ser_modem = NULL;
+
+ PROGRESS(1, 0, "serial");
+
+ hd_fork(hd_data, 15, 120);
+
+ if(hd_data->flags.forked) {
+ get_serial_modem(hd_data);
+ hd_move_to_shm(hd_data);
+ if((hd_data->debug & HD_DEB_MODEM)) dump_ser_modem_data(hd_data);
+ }
+ else {
+ /* take data from shm */
+ hd_data->ser_modem = ((hd_data_t *) (hd_data->shm.data))->ser_modem;
+ if((hd_data->debug & HD_DEB_MODEM)) dump_ser_modem_data(hd_data);
+ }
+
+ hd_fork_done(hd_data);
+
+ add_serial_modem(hd_data);
+
+ hd_shm_clean(hd_data);
+
+ for(sm = hd_data->ser_modem; sm; sm = sm_next) {
+ sm_next = sm->next;
+
+ free_str_list(sm->at_resp);
+
+ free_mem(sm->dev_name);
+ free_mem(sm->serial);
+ free_mem(sm->class_name);
+ free_mem(sm->dev_id);
+ free_mem(sm->user_name);
+ free_mem(sm->vend);
+ free_mem(sm->init_string1);
+ free_mem(sm->init_string2);
+
+ free_mem(sm);
+ }
+ hd_data->ser_modem = NULL;
+
+}
+
+int check_for_responce(str_list_t *str_list, char *str, int len)
+{
+ for(; str_list != NULL; str_list = str_list->next) {
+ if(!strncmp(str_list->str, str, len)) return 1;
+ }
+
+ return 0;
+}
+
+str_list_t *str_list_dup(str_list_t *orig)
+{
+ str_list_t *dup = NULL;
+
+ for(; orig != NULL; orig = orig->next) {
+ add_str_list(&dup, orig->str);
+ }
+
+ return dup;
+}
+
+void get_serial_modem(hd_data_t *hd_data)
+{
+ hd_t *hd;
+ int i, j, fd;
+ unsigned modem_info, baud;
+ char *command;
+ ser_device_t *sm;
+ int chk_usb = hd_probe_feature(hd_data, pr_modem_usb);
+
+ /* serial modems & usb modems */
+ for(hd = hd_data->hd; hd; hd = hd->next) {
+ if(
+ (
+ (
+ hd->base_class.id == bc_comm &&
+ hd->sub_class.id == sc_com_ser &&
+ !hd->tag.ser_skip &&
+ hd->tag.ser_device != 2 && /* cf. serial.c */
+ !has_something_attached(hd_data, hd)
+ ) ||
+ (
+ chk_usb &&
+ hd->bus.id == bus_usb &&
+ hd->base_class.id == bc_modem
+ )
+ ) && hd->unix_dev_name
+ ) {
+ if(dev_name_duplicate(hd_data, hd->unix_dev_name)) continue;
+ if((fd = open(hd->unix_dev_name, O_RDWR | O_NONBLOCK)) >= 0) {
+ sm = add_ser_modem_entry(&hd_data->ser_modem, new_mem(sizeof *sm));
+ sm->dev_name = new_str(hd->unix_dev_name);
+ sm->fd = fd;
+ sm->hd_idx = hd->idx;
+ sm->do_io = 1;
+ init_modem(sm);
+ }
+ }
+ }
+
+ if(!hd_data->ser_modem) return;
+
+ PROGRESS(2, 0, "init");
+
+ usleep(300000); /* PnP protocol; 200ms seems to be too fast */
+
+ for(sm = hd_data->ser_modem; sm; sm = sm->next) {
+ modem_info = TIOCM_DTR | TIOCM_RTS;
+ ioctl(sm->fd, TIOCMBIS, &modem_info);
+ ioctl(sm->fd, TIOCMGET, &modem_info);
+ if(!(modem_info & (TIOCM_DSR | TIOCM_CD))) {
+ sm->do_io = 0;
+ }
+ }
+
+ /* just a quick test if we get a response to an AT command */
+
+ for(i = 0; i < 4; i++) {
+ PROGRESS(3, i + 1, "at test");
+
+ for(sm = hd_data->ser_modem; sm; sm = sm->next) {
+ if(!sm->is_modem)
+ set_modem_speed(sm, i == 0 ? 115200 : i == 1 ? 38400 : i == 2 ? 9600 : 1200);
+ }
+
+ at_cmd(hd_data, "AT\r", 1, 1);
+
+ for(sm = hd_data->ser_modem; sm; sm = sm->next) {
+ if(strstr(sm->buf, "OK") || strstr(sm->buf, "0")) {
+ sm->is_modem = 1;
+ sm->do_io = 0;
+ }
+ sm->buf_len = 0; /* clear buffer */
+ }
+ }
+
+ for(sm = hd_data->ser_modem; sm; sm = sm->next) {
+ if((sm->do_io = sm->is_modem)) {
+ sm->max_baud = sm->cur_baud;
+ }
+ }
+
+ /* check for init string */
+ PROGRESS(4, 0, "init string");
+
+ command = NULL;
+ for(i = 0; (unsigned) i < MAX_INIT_STRING; i++) {
+ str_printf(&command, 0, "AT %s\r", init_strings[i]);
+ at_cmd(hd_data, command, 1, 1);
+
+ for(sm = hd_data->ser_modem; sm; sm = sm->next) {
+ if(strstr(sm->buf, "OK") || strstr(sm->buf, "0")) {
+ str_printf(&sm->init_string2, -1,
+ "%s %s", sm->init_string2 ? "" : "AT", init_strings[i]
+ );
+ }
+ }
+ }
+ command = free_mem(command);
+
+ for(sm = hd_data->ser_modem; sm; sm = sm->next)
+ if(sm->is_modem)
+ str_printf(&sm->init_string1, -1, "ATZ");
+
+ {
+ int cmds[] = { 1, 3, 4, 5, 6 };
+ char at[10];
+ int i, j, ModemsCount = 0;
+ str_list_t **responces = NULL;
+ for(sm = hd_data->ser_modem; sm; sm = sm->next)
+ if(sm->is_modem)
+ ModemsCount++;
+ responces = new_mem(ModemsCount * sizeof *responces);
+
+ at_cmd(hd_data, "ATI\r", 0, 1);
+ for(j = 0, sm = hd_data->ser_modem; sm; sm = sm->next) {
+ if(sm->is_modem)
+ responces[j++] = str_list_dup(sm->at_resp);
+ }
+
+ for(i = 0; (unsigned) i < sizeof cmds / sizeof *cmds; i++) {
+ int atx = cmds[i];
+ sprintf(at, "ATI%d\r", atx);
+ at_cmd(hd_data, at, 0, 1);
+ for(j = 0, sm = hd_data->ser_modem; sm; sm = sm->next) {
+ if(sm->is_modem) {
+ if(atx == 1 && check_for_responce(responces[j], "Hagenuk", 7) &&
+ (check_for_responce(sm->at_resp, "Speed Dragon", 12) ||
+ check_for_responce(sm->at_resp, "Power Dragon", 12))) {
+ free_mem(sm->init_string1);
+ free_mem(sm->init_string2);
+ sm->init_string1 = new_str("AT&F");
+ sm->init_string2 = new_str("ATB8");
+ }
+ if(atx == 3 && check_for_responce(responces[j], "346900", 6) &&
+ check_for_responce(sm->at_resp, "3Com U.S. Robotics ISDN", 23)) {
+ free_mem(sm->init_string1);
+ free_mem(sm->init_string2);
+ sm->init_string1 = new_str("AT&F");
+ sm->init_string2 = new_str("AT*PPP=1");
+ }
+ if(atx == 4 && check_for_responce(responces[j], "SP ISDN", 7) &&
+ check_for_responce(sm->at_resp, "Sportster ISDN TA", 17)) {
+ free_mem(sm->init_string1);
+ free_mem(sm->init_string2);
+ sm->init_string1 = new_str("AT&F");
+ sm->init_string2 = new_str("ATB3");
+ }
+ if(atx == 6 && check_for_responce(responces[j], "644", 3) &&
+ check_for_responce(sm->at_resp, "ELSA MicroLink ISDN", 19)) {
+ free_mem(sm->init_string1);
+ free_mem(sm->init_string2);
+ sm->init_string1 = new_str("AT&F");
+ sm->init_string2 = new_str("AT$IBP=HDLCP");
+ free_mem(sm->pppd_option);
+ sm->pppd_option = new_str("default-asyncmap");
+ }
+ if(atx == 6 && check_for_responce(responces[j], "643", 3) &&
+ check_for_responce(sm->at_resp, "MicroLink ISDN/TLV.34", 21)) {
+ free_mem(sm->init_string1);
+ free_mem(sm->init_string2);
+ sm->init_string1 = new_str("AT&F");
+ sm->init_string2 = new_str("AT\\N10%P1");
+ }
+ if(atx == 5 && check_for_responce(responces[j], "ISDN TA", 6) &&
+ check_for_responce(sm->at_resp, "ISDN TA;ASU", 4)) {
+ free_mem(sm->vend);
+ sm->vend = new_str("ASUS");
+ free_mem(sm->user_name);
+ sm->user_name = new_str("ISDNLink TA");
+ free_mem(sm->init_string1);
+ free_mem(sm->init_string2);
+ sm->init_string1 = new_str("AT&F");
+ sm->init_string2 = new_str("ATB40");
+ }
+ if(atx==3 && check_for_responce(responces[j], "128000", 6) &&
+ check_for_responce(sm->at_resp, "Lasat Speed", 11)) {
+ free_mem(sm->init_string1);
+ free_mem(sm->init_string2);
+ sm->init_string1 = new_str("AT&F");
+ sm->init_string2 = new_str("AT\\P1&B2X3");
+ }
+ if(atx == 1 &&
+ (check_for_responce(responces[j], "28642", 5) ||
+ check_for_responce(responces[j], "1281", 4) ||
+ check_for_responce(responces[j], "1282", 4) ||
+ check_for_responce(responces[j], "1283", 4) ||
+ check_for_responce(responces[j], "1291", 4) ||
+ check_for_responce(responces[j], "1292", 4) ||
+ check_for_responce(responces[j], "1293", 4)) &&
+ (check_for_responce(sm->at_resp, "Elite 2864I", 11) ||
+ check_for_responce(sm->at_resp, "ZyXEL omni", 10))) {
+ free_mem(sm->init_string1);
+ free_mem(sm->init_string2);
+ sm->init_string1 = new_str("AT&F");
+ sm->init_string2 = new_str("AT&O2B40");
+ }
+ j++;
+ }
+ }
+ }
+
+ for(i = 0; i < ModemsCount; i++) free_str_list(responces[i]);
+ free_mem(responces);
+ }
+
+ /* now, go for the maximum speed... */
+ PROGRESS(5, 0, "speed");
+
+ for(i = MAX_SPEED - 1; i >= 0; i--) {
+ baud = speeds[i].baud;
+ for(j = 0, sm = hd_data->ser_modem; sm; sm = sm->next) {
+ if(sm->is_modem) {
+ if(baud > sm->max_baud) {
+ sm->do_io = set_modem_speed(sm, baud) ? 0 : 1;
+ if(sm->do_io) j++;
+ }
+ }
+ }
+
+ /* no modems */
+ if(!j) continue;
+
+ at_cmd(hd_data, "AT\r", 1, 0);
+
+ for(sm = hd_data->ser_modem; sm; sm = sm->next) {
+ if(strstr(sm->buf, "OK") || strstr(sm->buf, "0")) {
+ sm->max_baud = sm->cur_baud;
+ }
+ else {
+ sm->do_io = 0;
+ }
+ sm->buf_len = 0; /* clear buffer */
+ }
+ }
+
+ /* now, fix it all up... */
+ for(sm = hd_data->ser_modem; sm; sm = sm->next) {
+ if(sm->is_modem) {
+ set_modem_speed(sm, sm->max_baud);
+ sm->do_io = 1;
+ }
+ }
+
+#if 0
+ /* just for testing */
+ if((hd_data->debug & HD_DEB_MODEM)) {
+ int i;
+ int cmds[] = { 0, 1, 2, 3, 6 };
+ char at[10];
+
+ PROGRESS(8, 0, "testing");
+
+ at_cmd(hd_data, "ATI\r", 0, 1);
+ for(i = 0; (unsigned) i < sizeof cmds / sizeof *cmds; i++) {
+ sprintf(at, "ATI%d\r", cmds[i]);
+ at_cmd(hd_data, at, 0, 1);
+ }
+ at_cmd(hd_data, "AT\r", 0, 1);
+ }
+#endif
+
+ PROGRESS(5, 0, "pnp id");
+
+ at_cmd(hd_data, "ATI9\r", 1, 1);
+
+ for(sm = hd_data->ser_modem; sm; sm = sm->next) {
+ if(sm->is_modem) {
+ chk4id(sm);
+
+ if(!sm->user_name) guess_modem_name(hd_data, sm);
+ }
+
+ /* reset serial lines */
+ tcflush(sm->fd, TCIOFLUSH);
+ tcsetattr(sm->fd, TCSAFLUSH, &sm->tio);
+ close(sm->fd);
+ }
+}
+
+
+void add_serial_modem(hd_data_t *hd_data)
+{
+ hd_t *hd;
+ char buf[4];
+ ser_device_t *sm;
+ hd_res_t *res;
+
+ for(sm = hd_data->ser_modem; sm; sm = sm->next) {
+ if(!sm->is_modem) continue;
+
+ hd = hd_get_device_by_idx(hd_data, sm->hd_idx);
+ if(hd && hd->base_class.id == bc_modem) {
+ /* just *add* info */
+
+ }
+ else {
+ hd = add_hd_entry(hd_data, __LINE__, 0);
+ hd->base_class.id = bc_modem;
+ hd->bus.id = bus_serial;
+ hd->unix_dev_name = new_str(sm->dev_name);
+ hd->attached_to = sm->hd_idx;
+ res = add_res_entry(&hd->res, new_mem(sizeof *res));
+ res->baud.type = res_baud;
+ res->baud.speed = sm->max_baud;
+ if(sm->pppd_option) {
+ res = add_res_entry(&hd->res, new_mem(sizeof *res));
+ res->pppd_option.type = res_pppd_option;
+ res->pppd_option.option = new_str(sm->pppd_option);
+ }
+ if(*sm->pnp_id) {
+ strncpy(buf, sm->pnp_id, 3);
+ buf[3] = 0;
+ hd->vendor.id = name2eisa_id(buf);
+ hd->device.id = MAKE_ID(TAG_EISA, strtol(sm->pnp_id + 3, NULL, 16));
+ }
+ hd->serial = new_str(sm->serial);
+ if(sm->user_name) hd->device.name = new_str(sm->user_name);
+ if(sm->vend) hd->vendor.name = new_str(sm->vend);
+
+ if(sm->dev_id && strlen(sm->dev_id) >= 7) {
+ char buf[5], *s;
+ unsigned u1, u2;
+
+ u1 = name2eisa_id(sm->dev_id);
+ if(u1) {
+ strncpy(buf, sm->dev_id + 3, 4);
+ buf[4] = 0;
+ u2 = strtol(sm->dev_id + 3, &s, 16);
+ if(!*s) {
+ hd->compat_vendor.id = u1;
+ hd->compat_device.id = MAKE_ID(TAG_EISA, u2);
+ }
+ }
+ }
+
+ if(!(hd->device.id || hd->device.name || hd->vendor.id || hd->vendor.name)) {
+ hd->vendor.id = MAKE_ID(TAG_SPECIAL, 0x2000);
+ hd->device.id = MAKE_ID(TAG_SPECIAL, 0x0001);
+ }
+ }
+ res = add_res_entry(&hd->res, new_mem(sizeof *res));
+ res->init_strings.type = res_init_strings;
+ res->init_strings.init1 = new_str(sm->init_string1);
+ res->init_strings.init2 = new_str(sm->init_string2);
+ }
+}
+
+
+int dev_name_duplicate(hd_data_t *hd_data, char *dev_name)
+{
+ ser_device_t *sm;
+
+ for(sm = hd_data->ser_modem; sm; sm = sm->next) {
+ if(!strcmp(sm->dev_name, dev_name)) return 1;
+ }
+
+ return 0;
+}
+
+void guess_modem_name(hd_data_t *hd_data, ser_device_t *modem)
+{
+ ser_device_t *sm;
+ str_list_t *sl;
+ char *s;
+#ifdef __PPC__
+ char *s1, *s2;
+ unsigned u;
+#endif
+
+ for(sm = hd_data->ser_modem; sm; sm = sm->next) sm->do_io = 0;
+
+ (sm = modem)->do_io = 1;
+
+#ifdef __PPC__
+ at_cmd(hd_data, "ATI0\r", 0, 1);
+ sl = sm->at_resp;
+ if(sl && !strcmp(sl->str, "ATI0")) sl = sl->next; /* skip AT cmd echo */
+
+ s1 = NULL;
+ if(sl) {
+ if(strstr(sl->str, "PowerBook")) {
+ sm->vend = new_str("Apple");
+ sm->user_name = new_str(sl->str);
+
+ return;
+ }
+ s1 = new_str(sl->str);
+ }
+
+ at_cmd(hd_data, "ATI1\r", 0, 1);
+ sl = sm->at_resp;
+ if(sl && !strcmp(sl->str, "ATI1")) sl = sl->next; /* skip AT cmd echo */
+
+ if(sl) {
+ if(strstr(sl->str, "APPLE")) {
+ sm->vend = new_str("Apple");
+ str_printf(&sm->user_name, 0, "AT Modem");
+ if(s1) {
+ u = strtoul(s1, &s2, 10);
+ if(u && !*s2 && !(u % 1000)) {
+ str_printf(&sm->user_name, 0, "%uk AT Modem", u / 1000);
+ }
+ }
+ s1 = free_mem(s1);
+
+ return;
+ }
+ }
+ s1 = free_mem(s1);
+
+#endif
+
+ /* ATI3 command */
+ at_cmd(hd_data, "ATI3\r", 0, 1);
+ sl = sm->at_resp;
+ if(sl && !strcmp(sl->str, "ATI3")) sl = sl->next; /* skip AT cmd echo */
+
+ if(sl) {
+ if(*sl->str == 'U' && strstr(sl->str, "Robotics ")) {
+ /* looks like an U.S. Robotics... */
+
+ sm->vend = new_str("U.S. Robotics, Inc.");
+ /* strip revision code */
+ if((s = strstr(sl->str, " Rev. "))) *s = 0;
+ sm->user_name = canon_str(sl->str, strlen(sl->str));
+
+ return;
+ }
+
+ if(strstr(sl->str, "3Com U.S. Robotics ") == sl->str) {
+ /* looks like an 3Com U.S. Robotics... */
+
+ sm->vend = new_str("3Com U.S. Robotics, Inc.");
+ sm->user_name = canon_str(sl->str, strlen(sl->str));
+
+ return;
+ }
+
+ if(strstr(sl->str, "-V34_DS -d Z201 2836")) {
+ /* looks like a Zoom V34X */
+
+ sm->vend = new_str("Zoom Telephonics, Inc.");
+ sm->user_name = new_str("Zoom FaxModem V.34X Plus Model 2836");
+
+ return;
+ }
+
+ if(strstr(sl->str, "FM560 VER 3.01 V.90")) {
+ /* looks like a Microcom DeskPorte 56K Voice ... */
+
+ sm->vend = new_str("Microcom");
+ sm->user_name = new_str("TravelCard 56K");
+
+ return;
+ }
+
+ if(strstr(sl->str, "Compaq Microcom 550 56K Modem")) {
+ /* looks like a Microcom DeskPorte Pocket ... */
+
+ sm->vend = new_str("Compaq");
+ sm->user_name = new_str("Microcom 550 56K Modem");
+
+ return;
+ }
+ }
+
+ /* ATI0 command */
+ at_cmd(hd_data, "ATI0\r", 0, 1);
+ sl = sm->at_resp;
+ if(sl && !strcmp(sl->str, "ATI0")) sl = sl->next; /* skip AT cmd echo */
+
+ if(sl) {
+ if(strstr(sl->str, "DP Pocket")) {
+ /* looks like a Microcom DeskPorte Pocket ... */
+
+ sm->vend = new_str("Microcom");
+ sm->user_name = new_str("DeskPorte Pocket");
+
+ return;
+ }
+ }
+
+ /* ATI6 command */
+ at_cmd(hd_data, "ATI6\r", 0, 1);
+ sl = sm->at_resp;
+ if(sl && !strcmp(sl->str, "ATI6")) sl = sl->next; /* skip AT cmd echo */
+
+ if(sl) {
+ if(strstr(sl->str, "RCV56DPF-PLL L8571A")) {
+ /* looks like a Microcom DeskPorte 56K Voice ... */
+
+ sm->vend = new_str("Microcom");
+ sm->user_name = new_str("DeskPorte 56K Voice");
+
+ return;
+ }
+ }
+
+ /* ATI2 command */
+ at_cmd(hd_data, "ATI2\r", 0, 1);
+ sl = sm->at_resp;
+ if(sl && !strcmp(sl->str, "ATI2")) sl = sl->next; /* skip AT cmd echo */
+
+ if(sl) {
+ if(strstr(sl->str, "ZyXEL ")) {
+ /* looks like a ZyXEL... */
+
+ sm->vend = new_str("ZyXEL");
+
+ at_cmd(hd_data, "ATI1\r", 0, 1);
+ sl = sm->at_resp;
+ if(sl && !strcmp(sl->str, "ATI1")) sl = sl->next;
+
+ if(sl && sl->next) {
+ sl = sl->next;
+ if((s = strstr(sl->str, " V "))) *s = 0;
+ sm->user_name = canon_str(sl->str, strlen(sl->str));
+ }
+
+ return;
+ }
+ }
+
+}
+
+void at_cmd(hd_data_t *hd_data, char *at, int raw, int log_it)
+{
+ static unsigned u = 1;
+ char *s, *s0;
+ ser_device_t *sm;
+ str_list_t *sl;
+ int modems = 0;
+
+ for(sm = hd_data->ser_modem; sm; sm = sm->next) {
+ if(sm->do_io) {
+ sm->buf_len = 0;
+ modems++;
+ }
+ }
+
+ if(modems == 0) return;
+
+ PROGRESS(9, u, "write at cmd");
+ write_modem(hd_data, at);
+ PROGRESS(9, u, "read at resp");
+ usleep (200000);
+ read_modem(hd_data);
+ PROGRESS(9, u, "read ok");
+ u++;
+
+ for(sm = hd_data->ser_modem; sm; sm = sm->next) {
+ if(sm->do_io) {
+ sm->at_resp = free_str_list(sm->at_resp);
+ if(sm->buf_len == 0 || raw) continue;
+ s0 = sm->buf;
+ while((s = strsep(&s0, "\r\n"))) {
+ if(*s) add_str_list(&sm->at_resp, s);
+ }
+ }
+ }
+
+ if(!(hd_data->debug & HD_DEB_MODEM) || !log_it) return;
+
+ for(sm = hd_data->ser_modem; sm; sm = sm->next) {
+ if(sm->do_io) {
+ ADD2LOG("%s@%u: %s\n", sm->dev_name, sm->cur_baud, at);
+ if(raw) {
+ ADD2LOG(" ");
+ hexdump(&hd_data->log, 1, sm->buf_len, sm->buf);
+ ADD2LOG("\n");
+ }
+ else {
+ for(sl = sm->at_resp; sl; sl = sl->next) ADD2LOG(" %s\n", sl->str);
+ }
+ }
+ }
+}
+
+
+void write_modem(hd_data_t *hd_data, char *msg)
+{
+ ser_device_t *sm;
+ int i, len = strlen(msg);
+
+ for(sm = hd_data->ser_modem; sm; sm = sm->next) {
+ if(sm->do_io) {
+ i = write(sm->fd, msg, len);
+ if(i != len) {
+ ADD2LOG("%s write oops: %d/%d (\"%s\")\n", sm->dev_name, i, len, msg);
+ }
+ }
+ }
+}
+
+void read_modem(hd_data_t *hd_data)
+{
+ int i, sel, fd_max = -1;
+ fd_set set, set0;
+ struct timeval to;
+ ser_device_t *sm;
+
+ FD_ZERO(&set0);
+
+ for(i = 0, sm = hd_data->ser_modem; sm; sm = sm->next) {
+ if(sm->do_io) {
+ FD_SET(sm->fd, &set0);
+ if(sm->fd > fd_max) fd_max = sm->fd;
+ i++;
+ }
+ }
+
+ if(!i) return; /* nothing selected */
+
+ for(;;) {
+ to.tv_sec = 0; to.tv_usec = 1000000;
+ set = set0;
+ if((sel = select(fd_max + 1, &set, NULL, NULL, &to)) > 0) {
+// fprintf(stderr, "sel: %d\n", sel);
+ for(sm = hd_data->ser_modem; sm; sm = sm->next) {
+ if(FD_ISSET(sm->fd, &set)) {
+ if((i = read(sm->fd, sm->buf + sm->buf_len, sizeof sm->buf - sm->buf_len)) > 0)
+ sm->buf_len += i;
+// fprintf(stderr, "%s: got %d\n", sm->dev_name, i);
+ if(i <= 0) FD_CLR(sm->fd, &set0);
+ }
+ }
+ }
+ else {
+ break;
+ }
+ }
+
+ /* make the strings \000 terminated */
+ for(sm = hd_data->ser_modem; sm; sm = sm->next) {
+ if(sm->buf_len == sizeof sm->buf) sm->buf_len--;
+ sm->buf[sm->buf_len] = 0;
+ }
+}
+
+int set_modem_speed(ser_device_t *sm, unsigned baud)
+{
+ int i;
+ speed_t st;
+ struct termios tio;
+
+ for(i = 0; (unsigned) i < MAX_SPEED; i++) if(speeds[i].baud == baud) break;
+
+ if(i == MAX_SPEED) return 1;
+
+ if(tcgetattr(sm->fd, &tio)) return errno;
+
+ cfsetospeed(&tio, speeds[i].mask);
+ cfsetispeed(&tio, speeds[i].mask);
+
+ if(tcsetattr(sm->fd, TCSAFLUSH, &tio)) return errno;
+
+ /* tcsetattr() returns ok even if it couldn't set the speed... */
+
+ if(tcgetattr(sm->fd, &tio)) return errno;
+
+ st = cfgetospeed(&tio);
+
+ for(i = 0; (unsigned) i < MAX_SPEED; i++) if(speeds[i].mask == st) break;
+
+ if(i == MAX_SPEED) return 2;
+
+ sm->cur_baud = speeds[i].baud;
+
+ return baud == speeds[i].baud ? 0 : 3;
+}
+
+
+int init_modem(ser_device_t *sm)
+{
+ struct termios tio;
+
+ if(tcgetattr(sm->fd, &tio)) return errno;
+
+ sm->tio = tio;
+
+ tio.c_iflag = IGNBRK | IGNPAR;
+ tio.c_oflag = 0;
+ tio.c_lflag = 0;
+ tio.c_line = 0;
+ tio.c_cc[VTIME] = 0;
+ tio.c_cc[VMIN] = 1;
+
+ tio.c_cflag = CREAD | CLOCAL | HUPCL | B1200 | CS8;
+
+ if(tcsetattr(sm->fd, TCSAFLUSH, &tio)) return errno;
+
+ return 0;
+}
+
+
+/*
+ * Check for a PnP info field starting at ofs;
+ * returns either the length of the field or 0 if none was found.
+ *
+ * the minfo_t struct is updated with the PnP data
+ */
+int is_pnpinfo(ser_device_t *mi, int ofs)
+{
+ int i, j, k, l;
+ unsigned char c, *s = mi->buf + ofs, *t;
+ int len = mi->buf_len - ofs;
+ unsigned serial, class_name, dev_id, user_name;
+
+ if(len <= 0) return 0;
+
+ switch(*s) {
+ case 0x08:
+ mi->bits = 6; break;
+ case 0x28:
+ mi->bits = 7; break;
+ default:
+ return 0;
+ }
+
+ if(len < 11) return 0;
+
+ i = 1;
+
+ /* six bit values */
+ if((s[i] & ~0x3f) || (s[i + 1] & ~0x3f)) return 0;
+ mi->pnp_rev = (s[i] << 6) + s[i + 1];
+
+ /* pnp_rev may *optionally* be given as a string!!! (e.g. "1.0")*/
+ if(mi->bits == 7) {
+ j = 0;
+ if(s[i + 2] < 'A') {
+ j++;
+ if(s[i + 3] < 'A') j++;
+ }
+ if(j) {
+ if(s[i] < '0' || s[i] > '9') return 0;
+ if(s[i + 1] != '.') return 0;
+ for(k = 0; k < j; k++)
+ if(s[i + 2 + k] < '0' || s[i + 2 + k] > '9') return 0;
+ mi->pnp_rev = (s[i] - '0') * 100;
+ mi->pnp_rev += s[i + 2] * 10;
+ if(j == 2) mi->pnp_rev += s[i + 3];
+ i += j;
+ }
+ }
+
+ i += 2;
+
+ /* the eisa id */
+ for(j = 0; j < 7; j++) {
+ mi->pnp_id[j] = s[i + j];
+ if(mi->bits == 6) mi->pnp_id[j] += 0x20;
+ }
+ mi->pnp_id[7] = 0;
+
+ i += 7;
+
+ /* now check the id */
+ for(j = 0; j < 3; j++) {
+ if(
+ /* numbers are not really allowed, but... */
+ (mi->pnp_id[j] < '0' || mi->pnp_id[j] > '9') &&
+ (mi->pnp_id[j] < 'A' || mi->pnp_id[j] > 'Z') &&
+ mi->pnp_id[j] != '_'
+ ) return 0;
+ }
+
+ for(j = 3; j < 7; j++) {
+ if(
+ (mi->pnp_id[j] < '0' || mi->pnp_id[j] > '9') &&
+ (mi->pnp_id[j] < 'A' || mi->pnp_id[j] > 'F')
+ ) return 0;
+ }
+
+
+ if((mi->bits == 6 && s[i] == 0x09) || (mi->bits == 7 && s[i] == 0x29)) {
+ return i + 1;
+ }
+
+ if((mi->bits != 6 || s[i] != 0x3c) && (mi->bits != 7 || s[i] != 0x5c)) {
+ return 0;
+ }
+
+ /* parse extended info */
+ serial = class_name = dev_id = user_name = 0;
+ for(j = 0; i < len; i++) {
+ if((mi->bits == 6 && s[i] == 0x09) || (mi->bits == 7 && s[i] == 0x29)) {
+
+ if(serial) for(k = serial; k < len; k++) {
+ c = s[k];
+ if(mi->bits == 6) c += 0x20;
+ if(c == '\\') break;
+ str_printf(&mi->serial, -1, "%c", c);
+ }
+
+ if(class_name) for(k = class_name; k < len; k++) {
+ c = s[k];
+ if(mi->bits == 6) c += 0x20;
+ if(c == '\\') break;
+ str_printf(&mi->class_name, -1, "%c", c);
+ }
+
+ if(dev_id) for(k = dev_id; k < len; k++) {
+ c = s[k];
+ if(mi->bits == 6) c += 0x20;
+ if(c == '\\') break;
+ str_printf(&mi->dev_id, -1, "%c", c);
+ }
+
+ if(user_name) {
+ for(k = user_name; k < len; k++) {
+ c = s[k];
+ if(mi->bits == 6) c += 0x20;
+ if(c == '\\' || c == ')') break;
+ str_printf(&mi->user_name, -1, "%c", c);
+ }
+ if(mi->user_name && (l = strlen(mi->user_name)) >= 2) {
+ /* skip *optional*(!!!) 2 char checksum */
+ t = mi->user_name + l - 2;
+ if(
+ ((t[0] >= '0' && t[0] <= '9') || (t[0] >= 'A' && t[0] <= 'F')) &&
+ ((t[1] >= '0' && t[1] <= '9') || (t[1] >= 'A' && t[1] <= 'F'))
+ ) {
+ /* OK, *might* be a hex number... */
+ mi->user_name[l - 2] = 0;
+
+ /*
+ * A better check would be to look for the complete name string
+ * in the output from another AT command, e.g AT3, AT6 or AT11.
+ * If it's there -> no checksum field.
+ */
+ }
+ }
+ }
+
+ return i + 1;
+ }
+
+ if(((mi->bits == 6 && s[i] == 0x3c) || (mi->bits == 7 && s[i] == 0x5c)) && i < len - 1) {
+ switch(j) {
+ case 0:
+ serial = i + 1; j++; break;
+ case 1:
+ class_name = i + 1; j++; break;
+ case 2:
+ dev_id = i + 1; j++; break;
+ case 3:
+ user_name = i + 1; j++; break;
+ default:
+ fprintf(stderr, "PnP-ID oops\n");
+ }
+ }
+ }
+
+ /* no end token... */
+
+ return 0;
+}
+
+
+unsigned chk4id(ser_device_t *mi)
+{
+ int i;
+
+ if(!mi->buf_len) return 0;
+
+ for(i = 0; i < mi->buf_len; i++) {
+ if((mi->pnp = is_pnpinfo(mi, i))) break;
+ }
+ if(i == mi->buf_len) return 0;
+
+ mi->garbage = i;
+
+ return 1;
+}
+
+ser_device_t *add_ser_modem_entry(ser_device_t **sm, ser_device_t *new_sm)
+{
+ while(*sm) sm = &(*sm)->next;
+ return *sm = new_sm;
+}
+
+void dump_ser_modem_data(hd_data_t *hd_data)
+{
+ int j;
+ ser_device_t *sm;
+
+ if(!(sm = hd_data->ser_modem)) return;
+
+ ADD2LOG("----- serial modems -----\n");
+
+ for(; sm; sm = sm->next) {
+ ADD2LOG("%s\n", sm->dev_name);
+ if(sm->serial) ADD2LOG("serial: \"%s\"\n", sm->serial);
+ if(sm->class_name) ADD2LOG("class_name: \"%s\"\n", sm->class_name);
+ if(sm->dev_id) ADD2LOG("dev_id: \"%s\"\n", sm->dev_id);
+ if(sm->user_name) ADD2LOG("user_name: \"%s\"\n", sm->user_name);
+
+ if(sm->garbage) {
+ ADD2LOG(" pre_garbage[%u]: ", sm->garbage);
+ hexdump(&hd_data->log, 1, sm->garbage, sm->buf);
+ ADD2LOG("\n");
+ }
+
+ if(sm->pnp) {
+ ADD2LOG(" pnp[%u]: ", sm->pnp);
+ hexdump(&hd_data->log, 1, sm->pnp, sm->buf + sm->garbage);
+ ADD2LOG("\n");
+ }
+
+ if((j = sm->buf_len - (sm->garbage + sm->pnp))) {
+ ADD2LOG(" post_garbage[%u]: ", j);
+ hexdump(&hd_data->log, 1, j, sm->buf + sm->garbage + sm->pnp);
+ ADD2LOG("\n");
+ }
+
+ if(sm->is_modem)
+ ADD2LOG(" is modem\n");
+ else
+ ADD2LOG(" not a modem\n");
+
+ if(sm->pnp) {
+ ADD2LOG(" bits: %u\n", sm->bits);
+ ADD2LOG(" PnP Rev: %u.%02u\n", sm->pnp_rev / 100, sm->pnp_rev % 100);
+ ADD2LOG(" PnP ID: \"%s\"\n", sm->pnp_id);
+ }
+
+ if(sm->next) ADD2LOG("\n");
+ }
+
+ ADD2LOG("----- serial modems end -----\n");
+}
+
+#endif /* ifndef LIBHD_TINY */
--- /dev/null
+void hd_scan_modem(hd_data_t *hd_data);
--- /dev/null
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "hd.h"
+#include "hd_int.h"
+#include "hddb.h"
+#include "monitor.h"
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ * monitor info
+ *
+ * Read the info out of the 'SuSE=' entry in /proc/cmdline. It contains
+ * (among others) info from the EDID record got by our syslinux extension.
+ *
+ * We will try to look up our monitor id in the id file to get additional
+ * info.
+ * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ */
+
+#ifdef __PPC__
+static void add_old_mac_monitor(hd_data_t *hd_data);
+static void add_monitor(hd_data_t *hd_data, devtree_t *dt);
+#endif
+static int chk_edid_info(hd_data_t *hd_data, unsigned char *edid);
+#if !defined(__PPC__)
+static void add_lcd_info(hd_data_t *hd_data, hd_t *hd, bios_info_t *bt);
+#endif
+static void add_edid_info(hd_data_t *hd_data, hd_t *hd, unsigned char *edid);
+static void add_monitor_res(hd_t *hd, unsigned x, unsigned y, unsigned hz, unsigned il);
+static void fix_edid_info(hd_data_t *hd_data, unsigned char *edid);
+
+#if !defined(__PPC__)
+void hd_scan_monitor(hd_data_t *hd_data)
+{
+ hd_t *hd;
+ int i, j, k;
+ char *s, *s0, *s1, *se, m[8], *t;
+ unsigned u;
+ hd_res_t *res;
+ monitor_info_t *mi = NULL;
+ bios_info_t *bt;
+
+ if(!hd_probe_feature(hd_data, pr_monitor)) return;
+
+ hd_data->module = mod_monitor;
+
+ /* some clean-up */
+ remove_hd_entries(hd_data);
+
+ PROGRESS(1, 0, "ddc");
+
+ for(hd = hd_data->hd; hd; hd = hd->next) {
+ if(hd->base_class.id == bc_internal && hd->sub_class.id == sc_int_bios) break;
+ }
+
+ /* first, see if we got the full edid record from bios */
+ bt = NULL;
+
+#if 0
+ /* for testing: LIBHD_EDID points to a file with valid edid record */
+ {
+ char *s = getenv("LIBHD_EDID");
+ unsigned char edid[0x80];
+ FILE *f;
+
+ if(s && (f = fopen(s, "r"))) {
+ if(fread(edid, sizeof edid, 1, f) == 1) {
+ hd = add_hd_entry(hd_data, __LINE__, 0);
+ hd->base_class.id = bc_monitor;
+ add_edid_info(hd_data, hd, edid);
+ }
+ fclose(f);
+ return;
+ }
+ }
+#endif
+
+ if(
+ hd &&
+ hd->detail &&
+ hd->detail->type == hd_detail_bios &&
+ (bt = hd->detail->bios.data) &&
+ bt->vbe.ok
+ ) {
+ if(chk_edid_info(hd_data, bt->vbe.ddc)) {
+ hd = add_hd_entry(hd_data, __LINE__, 0);
+ hd->base_class.id = bc_monitor;
+
+ hd_set_hw_class(hd, hw_vbe);
+
+ add_edid_info(hd_data, hd, bt->vbe.ddc);
+
+ return;
+ }
+ }
+
+ /* Maybe a LCD panel? */
+ if(bt && bt->lcd.width) {
+ hd = add_hd_entry(hd_data, __LINE__, 0);
+ hd->base_class.id = bc_monitor;
+ hd->sub_class.id = sc_mon_lcd;
+
+ hd_set_hw_class(hd, hw_vbe);
+
+ add_lcd_info(hd_data, hd, bt);
+
+ return;
+ }
+
+ /* Maybe we have hidden edid info here? */
+ if(!(s = s0 = t = get_cmd_param(hd_data, 0))) return; /* no :-( */
+
+ s = strsep(&t, "^");
+
+ se = s + strlen(s);
+
+ if(se - s < 7 + 2 * 4) {
+ free_mem(s0);
+ return;
+ }
+
+ /* Ok, we've got it. Now we split the fields. */
+
+ memcpy(m, s, 7); m[7] = 0; s += 7;
+
+ hd = add_hd_entry(hd_data, __LINE__, 0);
+
+ hd->base_class.id = bc_monitor;
+ hd->vendor.id = name2eisa_id(m);
+ if(sscanf(m + 3, "%x", &u) == 1) hd->device.id = MAKE_ID(TAG_EISA, u);
+ if((u = device_class(hd_data, hd->vendor.id, hd->device.id))) {
+ if((u >> 8) == bc_monitor) hd->sub_class.id = u & 0xff;
+ }
+
+ i = hex(s, 2); j = hex(s + 2, 2); s += 4;
+ if(i > 0 && j > 0) {
+ res = add_res_entry(&hd->res, new_mem(sizeof *res));
+ res->size.type = res_size;
+ res->size.unit = size_unit_cm;
+ res->size.val1 = i; /* width */
+ res->size.val2 = j; /* height */
+ }
+
+ i = hex(s, 2); s+= 2;
+ if(i & (1 << 7)) add_monitor_res(hd, 720, 400, 70, 0);
+ if(i & (1 << 6)) add_monitor_res(hd, 720, 400, 88, 0);
+ if(i & (1 << 5)) add_monitor_res(hd, 640, 480, 60, 0);
+ if(i & (1 << 4)) add_monitor_res(hd, 640, 480, 67, 0);
+ if(i & (1 << 3)) add_monitor_res(hd, 640, 480, 72, 0);
+ if(i & (1 << 2)) add_monitor_res(hd, 640, 480, 75, 0);
+ if(i & (1 << 1)) add_monitor_res(hd, 800, 600, 56, 0);
+ if(i & (1 << 0)) add_monitor_res(hd, 800, 600, 60, 0);
+
+ i = hex(s, 2); s+= 2;
+ if(i & (1 << 7)) add_monitor_res(hd, 800, 600, 72, 0);
+ if(i & (1 << 6)) add_monitor_res(hd, 800, 600, 75, 0);
+ if(i & (1 << 5)) add_monitor_res(hd, 832, 624, 75, 0);
+ if(i & (1 << 4)) add_monitor_res(hd, 1024, 768, 87, 1);
+ if(i & (1 << 3)) add_monitor_res(hd, 1024, 768, 60, 0);
+ if(i & (1 << 2)) add_monitor_res(hd, 1024, 768, 70, 0);
+ if(i & (1 << 1)) add_monitor_res(hd, 1024, 768, 75, 0);
+ if(i & (1 << 0)) add_monitor_res(hd, 1280, 1024, 75, 0);
+
+ if(((se - s) & 1) || se - s > 8 * 4 + 2) {
+ ADD2LOG(" ddc oops: %d bytes left?\n", (int) (se - s));
+ free_mem(s0);
+ return;
+ }
+
+ while(s + 4 <= se) {
+ i = (hex(s, 2) + 31) * 8; j = hex(s + 2, 2); s += 4;
+ k = 0;
+ switch((j >> 6) & 3) {
+ case 1: k = (i * 3) / 4; break;
+ case 2: k = (i * 4) / 5; break;
+ case 3: k = (i * 9) / 16; break;
+ }
+ if(k) add_monitor_res(hd, i, k, (j & 0x3f) + 60, 0);
+ }
+
+ u = 0;
+ if(se - s == 2) u = hex(s, 2) + 1990;
+
+ if(u || t) {
+ mi = new_mem(sizeof *mi);
+ if(u) mi->manu_year = u;
+ while((s = strsep(&t, "^"))) {
+ for(s1 = s; *s1++; ) if(*s1 == '_') *s1 = ' ';
+ switch(*s) {
+ case '0':
+ if(!mi->name && s[1]) mi->name = canon_str(s + 1, strlen(s + 1));
+ break;
+ case '1':
+ u = 0;
+ if(strlen(s) == 9) {
+ i = hex(s + 1, 2);
+ j = hex(s + 3, 2);
+ if(i > j || !i) u = 1;
+ mi->min_vsync = i;
+ mi->max_vsync = j;
+ i = hex(s + 5, 2);
+ j = hex(s + 7, 2);
+ if(i > j || !i) u = 1;
+ mi->min_hsync = i;
+ mi->max_hsync = j;
+ }
+ else {
+ u = 1;
+ }
+ if(u) {
+ mi->min_vsync = mi->max_vsync = mi->min_hsync = mi->max_hsync = 0;
+ ADD2LOG(" ddc oops: invalid freq data\n");
+ }
+ break;
+ case '2':
+ if(!mi->vendor && s[1]) mi->vendor = canon_str(s + 1, strlen(s + 1));
+ break;
+ case '3':
+ if(!mi->serial && s[1]) mi->serial = canon_str(s + 1, strlen(s + 1));
+ break;
+ default:
+ ADD2LOG(" ddc oops: invalid tag 0x%02x\n", *s);
+ }
+ }
+ }
+
+ if(mi) {
+ hd->detail = new_mem(sizeof *hd->detail);
+ hd->detail->type = hd_detail_monitor;
+ hd->detail->monitor.data = mi;
+
+ hd->serial = new_str(mi->serial);
+
+#if 0
+// ########### FIXME
+ if(
+ mi->vendor &&
+ ID_VALUE(hd->vendor.id) &&
+ !hd_vendor_name(hd_data, hd->vendor.id)
+ ) {
+ add_vendor_name(hd_data, hd->vend, mi->vendor);
+ }
+#endif
+
+#if 0
+// ########### FIXME
+ if(
+ mi->name &&
+ (ID_VALUE(hd->vendor.id) || ID_VALUE(hd->device.id)) &&
+ !hd_device_name(hd_data, hd->vend, hd->device.id)
+ ) {
+ add_device_name(hd_data, hd->vend, hd->dev, mi->name);
+ }
+#endif
+
+ if(hd_data->debug) {
+ ADD2LOG("----- DDC info -----\n");
+ if(mi->vendor) {
+ ADD2LOG(" vendor: \"%s\"\n", mi->vendor);
+ }
+ if(mi->name) {
+ ADD2LOG(" model: \"%s\"\n", mi->name);
+ }
+ if(mi->serial) {
+ ADD2LOG(" serial: \"%s\"\n", mi->serial);
+ }
+ if(mi->min_hsync) {
+ ADD2LOG(" hsync: %u-%u kHz\n", mi->min_hsync, mi->max_hsync);
+ }
+ if(mi->min_vsync) {
+ ADD2LOG(" vsync: %u-%u Hz\n", mi->min_vsync, mi->max_vsync);
+ }
+ if(mi->manu_year) {
+ ADD2LOG(" manu. year: %u\n", mi->manu_year);
+ }
+ ADD2LOG("----- DDC info end -----\n");
+ }
+ }
+
+ free_mem(s0);
+}
+#endif /* !defined(__PPC__) */
+
+#if defined(__PPC__)
+void hd_scan_monitor(hd_data_t *hd_data)
+{
+ devtree_t *dt;
+ int found;
+
+ if(!hd_probe_feature(hd_data, pr_monitor)) return;
+
+ hd_data->module = mod_monitor;
+
+ /* some clean-up */
+ remove_hd_entries(hd_data);
+
+ PROGRESS(1, 0, "prom");
+
+ found = 0;
+ for(dt = hd_data->devtree; dt; dt = dt->next) {
+ if(dt->edid) {
+ add_monitor(hd_data, dt);
+ found = 1;
+ }
+ }
+
+ if(!found) {
+ add_old_mac_monitor(hd_data);
+ }
+}
+
+void add_old_mac_monitor(hd_data_t *hd_data)
+{
+ hd_t *hd;
+ unsigned u1, u2;
+ str_list_t *sl;
+ static struct {
+ unsigned width, height, vfreq, interlaced;
+ } mode_list[20] = {
+ { 512, 384, 60, 1 },
+ { 512, 384, 60, 0 },
+ { 640, 480, 50, 1 },
+ { 640, 480, 60, 1 },
+ { 640, 480, 60, 0 },
+ { 640, 480, 67, 0 },
+ { 640, 870, 75, 0 },
+ { 768, 576, 50, 1 },
+ { 800, 600, 56, 0 },
+ { 800, 600, 60, 0 },
+ { 800, 600, 72, 0 },
+ { 800, 600, 75, 0 },
+ { 832, 624, 75, 0 },
+ { 1024, 768, 60, 0 },
+ { 1024, 768, 70, 0 },
+ { 1024, 768, 75, 0 },
+ { 1024, 768, 75, 0 },
+ { 1152, 870, 75, 0 },
+ { 1280, 960, 75, 0 },
+ { 1280, 1024, 75, 0 }
+ };
+
+ for(sl = hd_data->klog; sl; sl = sl->next) {
+ if(sscanf(sl->str, "<%*d>Monitor sense value = %i, using video mode %i", &u1, &u2) == 2) {
+ u2--;
+ hd = add_hd_entry(hd_data, __LINE__, 0);
+ hd->base_class.id = bc_monitor;
+
+ hd->vendor.id = MAKE_ID(TAG_SPECIAL, 0x0401);
+ hd->device.id = MAKE_ID(TAG_SPECIAL, (u1 & 0xfff) + 0x1000);
+
+ if((u1 = hd_display_adapter(hd_data))) {
+ hd->attached_to = u1;
+ }
+
+ if(u2 < sizeof mode_list / sizeof *mode_list) {
+ add_monitor_res(hd, mode_list[u2].width, mode_list[u2].height, mode_list[u2].vfreq, mode_list[u2].interlaced);
+ }
+
+ break;
+ }
+ }
+
+}
+
+void add_monitor(hd_data_t *hd_data, devtree_t *dt)
+{
+ hd_t *hd, *hd2;
+ unsigned char *edid = dt->edid;
+
+ if(!chk_edid_info(hd_data, edid)) return;
+
+ hd = add_hd_entry(hd_data, __LINE__, 0);
+
+ hd->base_class.id = bc_monitor;
+
+ for(hd2 = hd_data->hd; hd2; hd2 = hd2->next) {
+ if(
+ hd2->detail &&
+ hd2->detail->type == hd_detail_devtree &&
+ hd2->detail->devtree.data == dt
+ ) {
+ hd->attached_to = hd2->idx;
+ break;
+ }
+ }
+
+ add_edid_info(hd_data, hd, edid);
+}
+
+#endif /* defined(__PPC__) */
+
+/* do some checks to ensure we got a reasonable block */
+int chk_edid_info(hd_data_t *hd_data, unsigned char *edid)
+{
+ // no vendor or model info
+ if(!(edid[0x08] || edid[0x09] || edid[0x0a] || edid[0x0b])) return 0;
+
+ // no edid version or revision
+ if(!(edid[0x12] || edid[0x13])) return 0;
+
+ return 1;
+}
+
+#if !defined(__PPC__)
+void add_lcd_info(hd_data_t *hd_data, hd_t *hd, bios_info_t *bt)
+{
+ monitor_info_t *mi = NULL;
+
+ hd->vendor.name = new_str(bt->lcd.vendor);
+ hd->device.name = new_str(bt->lcd.name);
+
+ add_monitor_res(hd, bt->lcd.width, bt->lcd.height, 60, 0);
+
+ mi = new_mem(sizeof *mi);
+ hd->detail = new_mem(sizeof *hd->detail);
+ hd->detail->type = hd_detail_monitor;
+ hd->detail->monitor.data = mi;
+
+ mi->min_vsync = 50;
+ mi->min_hsync = 31;
+ mi->max_vsync = 75;
+ mi->max_hsync = (mi->max_vsync * bt->lcd.height * 12) / 10000;
+}
+#endif
+
+void add_edid_info(hd_data_t *hd_data, hd_t *hd, unsigned char *edid)
+{
+ hd_res_t *res;
+ monitor_info_t *mi = NULL;
+ int i;
+ unsigned u, u1, u2;
+
+ fix_edid_info(hd_data, edid);
+
+ u = (edid[8] << 8) + edid[9];
+ hd->vendor.id = MAKE_ID(TAG_EISA, u);
+ u = (edid[0xb] << 8) + edid[0xa];
+ hd->device.id = MAKE_ID(TAG_EISA, u);
+ if((u = device_class(hd_data, hd->vendor.id, hd->device.id))) {
+ if((u >> 8) == bc_monitor) hd->sub_class.id = u & 0xff;
+ }
+
+ if(edid[0x15] > 0 && edid[0x16] > 0) {
+ res = add_res_entry(&hd->res, new_mem(sizeof *res));
+ res->size.type = res_size;
+ res->size.unit = size_unit_cm;
+ res->size.val1 = edid[0x15]; /* width */
+ res->size.val2 = edid[0x16]; /* height */
+ }
+
+ u = edid[0x23];
+ if(u & (1 << 7)) add_monitor_res(hd, 720, 400, 70, 0);
+ if(u & (1 << 6)) add_monitor_res(hd, 720, 400, 88, 0);
+ if(u & (1 << 5)) add_monitor_res(hd, 640, 480, 60, 0);
+ if(u & (1 << 4)) add_monitor_res(hd, 640, 480, 67, 0);
+ if(u & (1 << 3)) add_monitor_res(hd, 640, 480, 72, 0);
+ if(u & (1 << 2)) add_monitor_res(hd, 640, 480, 75, 0);
+ if(u & (1 << 1)) add_monitor_res(hd, 800, 600, 56, 0);
+ if(u & (1 << 0)) add_monitor_res(hd, 800, 600, 60, 0);
+
+ u = edid[0x24];
+ if(u & (1 << 7)) add_monitor_res(hd, 800, 600, 72, 0);
+ if(u & (1 << 6)) add_monitor_res(hd, 800, 600, 75, 0);
+ if(u & (1 << 5)) add_monitor_res(hd, 832, 624, 75, 0);
+ if(u & (1 << 4)) add_monitor_res(hd, 1024, 768, 87, 1);
+ if(u & (1 << 3)) add_monitor_res(hd, 1024, 768, 60, 0);
+ if(u & (1 << 2)) add_monitor_res(hd, 1024, 768, 70, 0);
+ if(u & (1 << 1)) add_monitor_res(hd, 1024, 768, 75, 0);
+ if(u & (1 << 0)) add_monitor_res(hd, 1280, 1024, 75, 0);
+
+ for(i = 0; i < 4; i++) {
+ u1 = (edid[0x26 + 2 * i] + 31) * 8;
+ u2 = edid[0x27 + 2 * i];
+ u = 0;
+ switch((u2 >> 6) & 3) {
+ case 1: u = (u1 * 3) / 4; break;
+ case 2: u = (u1 * 4) / 5; break;
+ case 3: u = (u1 * 9) / 16; break;
+ }
+ if(u) add_monitor_res(hd, u1, u, (u2 & 0x3f) + 60, 0);
+ }
+
+ mi = new_mem(sizeof *mi);
+ mi->manu_year = 1990 + edid[0x11];
+
+ for(i = 0x36; i < 0x36 + 4 * 0x12; i += 0x12) {
+ if(!(edid[i] || edid[i + 1] || edid[i + 2])) {
+ switch(edid[i + 3]) {
+ case 0xfc:
+ if(edid[i + 5]) {
+ /* the name entry is splitted some times */
+ str_printf(&mi->name, -1, "%s%s", mi->name ? " " : "", canon_str(edid + i + 5, 0xd));
+ }
+ break;
+
+ case 0xfd:
+ u = 0;
+ u1 = edid[i + 5];
+ u2 = edid[i + 6];
+ if(u1 > u2 || !u1) u = 1;
+ mi->min_vsync = u1;
+ mi->max_vsync = u2;
+ u1 = edid[i + 7];
+ u2 = edid[i + 8];
+ if(u1 > u2 || !u1) u = 1;
+ mi->min_hsync = u1;
+ mi->max_hsync = u2;
+ if(u) {
+ mi->min_vsync = mi->max_vsync = mi->min_hsync = mi->max_hsync = 0;
+ ADD2LOG(" ddc oops: invalid freq data\n");
+ }
+ break;
+
+ case 0xfe:
+ if(!mi->vendor && edid[i + 5]) mi->vendor = canon_str(edid + i + 5, 0xd);
+ break;
+
+ case 0xff:
+ if(!mi->serial && edid[i + 5]) mi->serial = canon_str(edid + i + 5, 0xd);
+ break;
+
+ default:
+ ADD2LOG(" ddc oops: invalid tag 0x%02x\n", edid[i + 3]);
+ }
+ }
+ }
+
+ if(mi) {
+ hd->detail = new_mem(sizeof *hd->detail);
+ hd->detail->type = hd_detail_monitor;
+ hd->detail->monitor.data = mi;
+
+ hd->serial = new_str(mi->serial);
+ hd->vendor.name = new_str(mi->vendor);
+ hd->device.name = new_str(mi->name);
+
+ if(hd_data->debug) {
+ ADD2LOG("----- DDC info -----\n");
+ if(mi->vendor) {
+ ADD2LOG(" vendor: \"%s\"\n", mi->vendor);
+ }
+ if(mi->name) {
+ ADD2LOG(" model: \"%s\"\n", mi->name);
+ }
+ if(mi->serial) {
+ ADD2LOG(" serial: \"%s\"\n", mi->serial);
+ }
+ if(mi->min_hsync) {
+ ADD2LOG(" hsync: %u-%u kHz\n", mi->min_hsync, mi->max_hsync);
+ }
+ if(mi->min_vsync) {
+ ADD2LOG(" vsync: %u-%u Hz\n", mi->min_vsync, mi->max_vsync);
+ }
+ if(mi->manu_year) {
+ ADD2LOG(" manu. year: %u\n", mi->manu_year);
+ }
+ ADD2LOG("----- DDC info end -----\n");
+ }
+ }
+}
+
+void add_monitor_res(hd_t *hd, unsigned width, unsigned height, unsigned vfreq, unsigned il)
+{
+ hd_res_t *res;
+
+ res = add_res_entry(&hd->res, new_mem(sizeof *res));
+ res->monitor.type = res_monitor;
+ res->monitor.width = width;
+ res->monitor.height = height;
+ res->monitor.vfreq = vfreq;
+ res->monitor.interlaced = il;
+}
+
+/*
+ * This looks evil, but some Mac displays really lie at us.
+ */
+void fix_edid_info(hd_data_t *hd_data, unsigned char *edid)
+{
+ unsigned vend, dev;
+ unsigned timing;
+ int fix = 0;
+
+ vend = (edid[8] << 8) + edid[9];
+ dev = (edid[0xb] << 8) + edid[0xa];
+
+ timing = (edid[0x24] << 8) + edid[0x23];
+
+ /* APP9214: Apple Studio Display */
+ if(vend == 0x0610 && dev == 0x9214 && timing == 0x0800) {
+ timing = 0x1000;
+ fix = 1;
+ }
+
+ if(fix) {
+ edid[0x23] = timing & 0xff;
+ edid[0x24] = (timing >> 8) & 0xff;
+ }
+}
+
--- /dev/null
+void hd_scan_monitor(hd_data_t *hd_data);
--- /dev/null
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <termios.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <sys/time.h>
+#include <sys/ioctl.h>
+
+#include "hd.h"
+#include "hd_int.h"
+#include "mouse.h"
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ * mouse info
+ *
+ * TODO: reset serial lines to old values (cf. modem.c)
+ *
+ * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ */
+
+#ifndef LIBHD_TINY
+
+#if 0
+static unsigned read_data(hd_data_t *hd_data, int fd, unsigned char *buf, unsigned buf_size);
+static void get_ps2_mouse(hd_data_t *hd_data);
+static void test_ps2_open(void *arg);
+#endif
+
+static void get_serial_mouse(hd_data_t* hd_data);
+static void add_serial_mouse(hd_data_t* hd_data);
+static int _setspeed(int fd, int old, int new, int needtowrite, unsigned short flags);
+static void setspeed(int fd, int new, int needtowrite, unsigned short flags);
+static unsigned chk4id(ser_device_t *mi);
+static ser_device_t *add_ser_mouse_entry(ser_device_t **sm, ser_device_t *new_sm);
+static void dump_ser_mouse_data(hd_data_t *hd_data);
+#if 0
+static void get_sunmouse(hd_data_t *hd_data);
+#endif
+
+void hd_scan_mouse(hd_data_t *hd_data)
+{
+ ser_device_t *sm, *sm_next;
+
+ if(!hd_probe_feature(hd_data, pr_mouse)) return;
+
+ hd_data->module = mod_mouse;
+
+ /* some clean-up */
+ remove_hd_entries(hd_data);
+ hd_data->ser_mouse = NULL;
+
+#if 0
+ PROGRESS(1, 0, "ps/2");
+
+ get_ps2_mouse(hd_data);
+#endif
+
+ PROGRESS(2, 0, "serial");
+
+ hd_fork(hd_data, 20, 20);
+
+ if(hd_data->flags.forked) {
+ get_serial_mouse(hd_data);
+ hd_move_to_shm(hd_data);
+ if((hd_data->debug & HD_DEB_MOUSE)) dump_ser_mouse_data(hd_data);
+ }
+ else {
+ /* take data from shm */
+ hd_data->ser_mouse = ((hd_data_t *) (hd_data->shm.data))->ser_mouse;
+ if((hd_data->debug & HD_DEB_MOUSE)) dump_ser_mouse_data(hd_data);
+ }
+
+ hd_fork_done(hd_data);
+
+ add_serial_mouse(hd_data);
+
+ hd_shm_clean(hd_data);
+
+ for(sm = hd_data->ser_mouse; sm; sm = sm_next) {
+ sm_next = sm->next;
+
+ free_mem(sm->dev_name);
+ free_mem(sm);
+ }
+ hd_data->ser_mouse = NULL;
+
+#if 0
+ PROGRESS(3, 0, "sunmouse");
+
+ get_sunmouse(hd_data);
+#endif
+}
+
+
+#if 0
+unsigned read_data(hd_data_t *hd_data, int fd, unsigned char *buf, unsigned buf_size)
+{
+ int k, len = 0;
+ unsigned char *bp;
+
+ while(
+ (unsigned) len < buf_size &&
+ (k = read(fd, buf + len, buf_size - len)) >= 0
+ ) len += k;
+
+ bp = buf;
+ if(len && (*bp == 0xfe || *bp == 0xfa)) { bp++; len--; }
+
+ for(k = 0; k < len; k++) buf[k] = bp[k];
+
+ if((hd_data->debug & HD_DEB_MOUSE)) {
+ ADD2LOG("ps/2[%d]: ", len);
+ hexdump(&hd_data->log, 1, len, buf);
+ ADD2LOG("\n");
+ }
+
+ return len;
+}
+
+
+/*
+ * How it works:
+ *
+ * 1. There must exist a PS/2 controller entry (-> there is a PS/2 port).
+ * 2. If there are PS/2 mouse irq events, assume a PS/2 mouse is attached.
+ * 3. Otherwise:
+ * - open /dev/psaux
+ * - write the "get mouse info" command (0xe9)
+ * - read back the response, which should be either 0xfe "resend data"
+ * or, e.g. (0xfa) 0x20 0x02 0x3c (0xfa = "ACK" (should be swallowed
+ * by the psaux driver, but isn't), the rest are settings)
+ * - ignore the first byte if it is 0xfa or 0xfe
+ * - if there are at least 2 bytes left, assume a mouse is attached.
+ *
+ * Note1: we could use the command 0xfe "get mouse ID" instead. But that turned
+ * out to be less reliable, as this command returns only one byte, which
+ * is even 0.
+ * Note2: step 2 is mainly relevant if the mouse is already in use. In that
+ * case we would have problems reading back the respose of our command.
+ * (Typically the mouse driver will get it (and choke on it).)
+ */
+
+static void get_ps2_mouse(hd_data_t *hd_data)
+{
+ hd_t *hd, *hd1;
+ hd_res_t *res;
+ int fd;
+ fd_set set;
+ struct timeval tv;
+ unsigned char cmd_mouse_info = 0xe9; /* read mouse info (3 bytes) */
+ unsigned char cmd_mouse_id = 0xf2; /* read mouse id (1 byte) */
+ unsigned char buf[100];
+ unsigned mouse_id = -1;
+ static unsigned char intelli_init[] = { 0xf3, 200, 0xf3, 100, 0xf3, 80 };
+ int buf_len = 0;
+#ifdef __PPC__
+ int always_ps2_mouse = 0;
+#endif
+
+ for(hd1 = hd_data->hd; hd1; hd1 = hd1->next) {
+ /* look for a PS/2 controller entry... */
+ if(hd1->base_class.id == bc_ps2) {
+ /* ...and see if there were irq events... */
+ for(res = hd1->res; res; res = res->next) {
+ if(res->irq.type == res_irq && res->irq.triggered) break;
+ }
+
+#ifdef __PPC__
+ /*
+ * On PReP & CHRP, assume a PS/2 mouse to be attached.
+ * There seems to be no way to actually *detect* it.
+ */
+ if(!res) {
+ hd_t *hd;
+ sys_info_t *st;
+
+ if((hd = hd_list(hd_data, hw_sys, 0, NULL))) {
+ if(
+ hd->detail &&
+ hd->detail->type == hd_detail_sys &&
+ (st = hd->detail->sys.data) &&
+ (
+ !strcmp(st->system_type, "PReP") ||
+ strstr(st->system_type, "CHRP") == st->system_type /* CHRP && CHRP64 */
+ )
+ ) {
+ always_ps2_mouse = 1;
+ }
+ }
+ }
+#endif
+
+ PROGRESS(1, 1, "ps/2");
+
+ /* open the mouse device... */
+ if(hd_timeout(test_ps2_open, NULL, 2) > 0) {
+ ADD2LOG("ps/2: open(%s) timed out\n", DEV_PSAUX);
+ fd = -2;
+ }
+ else {
+ fd = open(DEV_PSAUX, O_RDWR | O_NONBLOCK);
+ }
+
+ PROGRESS(1, 2, "ps/2");
+
+ if(fd >= 0) {
+ /* ...write the id command... */
+
+ PROGRESS(1, 3, "ps/2");
+
+ write(fd, intelli_init, sizeof intelli_init);
+ usleep(25000);
+ read_data(hd_data, fd, buf, sizeof buf);
+
+ if(write(fd, &cmd_mouse_id, 1) == 1) {
+
+ PROGRESS(1, 4, "ps/2");
+ usleep(50000); /* ...give it a chance to react... */
+
+ /* ...read the response... */
+ buf_len = read_data(hd_data, fd, buf, sizeof buf);
+
+ if(buf_len >= 1) mouse_id = buf[buf_len - 1];
+
+ // if we didn't get any response, try this
+ if(buf_len == 0 || (hd_data->debug & HD_DEB_MOUSE)) {
+ PROGRESS(1, 5, "ps/2");
+ if(write(fd, &cmd_mouse_info, 1) == 1) {
+ usleep(50000);
+ buf_len = read_data(hd_data, fd, buf, sizeof buf);
+ /*
+ * Assume a mouse to be attached if at least 2 bytes are
+ * returned.
+ */
+ if(mouse_id == -1u && buf_len >= 2) mouse_id = 0;
+ }
+ }
+
+ PROGRESS(1, 6, "ps/2");
+ }
+ close(fd);
+
+ PROGRESS(1, 7, "ps/2");
+
+ /*
+ * The following code is apparently necessary on some board/mouse
+ * combinations. Otherwise the PS/2 mouse won't work.
+ */
+ if((fd = open(DEV_PSAUX, O_RDONLY | O_NONBLOCK)) >= 0) {
+ PROGRESS(1, 8, "ps/2");
+
+ FD_ZERO(&set);
+ FD_SET(fd, &set);
+ tv.tv_sec = 0; tv.tv_usec = 1;
+ if(select(fd + 1, &set, NULL, NULL, &tv) == 1) {
+ PROGRESS(1, 9, "ps/2");
+
+ read(fd, buf, sizeof buf);
+
+ PROGRESS(1, 10, "ps/2");
+ }
+ PROGRESS(1, 11, "ps/2");
+
+ close(fd);
+
+ PROGRESS(1, 12, "ps/2");
+ }
+ }
+ else {
+ ADD2LOG("open(" DEV_PSAUX "): %s\n", fd == -1 ? strerror(errno) : "timeout");
+ }
+
+ if(mouse_id == -1u) {
+
+ /*
+ * Assume a PS/2 mouse is attached if the ps/2 controller has
+ * genetrated some events.
+ */
+
+ if(
+ res
+#ifdef __PPC__
+ || always_ps2_mouse
+#endif
+ ) {
+ PROGRESS(1, 13, "ps/2");
+ mouse_id = 0;
+ }
+ }
+
+ if(mouse_id != -1u) {
+ PROGRESS(1, 14, "ps/2");
+
+ hd = add_hd_entry(hd_data, __LINE__, 0);
+ hd->base_class.id = bc_mouse;
+ hd->sub_class.id = sc_mou_ps2;
+ hd->bus.id = bus_ps2;
+ hd->unix_dev_name = new_str(DEV_MICE);
+ hd->attached_to = hd1->idx;
+
+ hd->vendor.id = MAKE_ID(TAG_SPECIAL, 0x0200);
+ switch(mouse_id) {
+ case 3: /* 3 buttons + wheel */
+ hd->device.id = MAKE_ID(TAG_SPECIAL, 0x0004);
+ break;
+
+ case 4: /* 5 buttons + wheel */
+ hd->device.id = MAKE_ID(TAG_SPECIAL, 0x0005);
+ break;
+
+ default: /* 0 */
+ hd->device.id = MAKE_ID(TAG_SPECIAL, 0x0002);
+ }
+ }
+
+ /* there can only be one... */
+ break;
+ }
+ }
+}
+
+void test_ps2_open(void *arg)
+{
+ open(DEV_PSAUX, O_RDWR | O_NONBLOCK);
+}
+#endif
+
+#if 0
+static void get_sunmouse(hd_data_t *hd_data)
+{
+ hd_t *hd;
+ int fd;
+ int found;
+
+ found = 0;
+
+ /* Only search for Sun mouse if we have a Sun keyboard */
+ for(hd = hd_data->hd; hd; hd = hd->next)
+ {
+ if(hd->base_class.id == bc_keyboard &&
+ hd->sub_class.id == sc_keyboard_kbd &&
+ ID_TAG(hd->vendor.id) == TAG_SPECIAL && ID_VALUE(hd->vendor.id) == 0x0202)
+ found = 1;
+ }
+
+ if (found)
+ {
+ if ((fd = open(DEV_SUNMOUSE, O_RDONLY)) != -1)
+ {
+ /* FIXME: Should probably talk to the mouse to see
+ if the connector is not empty. */
+ close (fd);
+
+ PROGRESS(1, 1, "Sun Mouse");
+
+ hd = add_hd_entry (hd_data, __LINE__, 0);
+ hd->base_class.id = bc_mouse;
+ hd->sub_class.id = sc_mou_sun;
+ hd->bus.id = bus_serial;
+ hd->unix_dev_name = new_str(DEV_SUNMOUSE);
+
+ hd->vendor.id = MAKE_ID(TAG_SPECIAL, 0x0202);
+ hd->device.id = MAKE_ID(TAG_SPECIAL, 0x0000);
+ }
+ }
+}
+#endif
+
+/*
+ * Gather serial mouse data and put it into hd_data->ser_mouse.
+ */
+void get_serial_mouse(hd_data_t *hd_data)
+{
+ hd_t *hd;
+ int j, fd, fd_max = 0, sel, max_len;
+ unsigned modem_info;
+ fd_set set, set0;
+ struct timeval to;
+ ser_device_t *sm;
+ struct termios tio;
+
+ FD_ZERO(&set);
+
+ for(hd = hd_data->hd; hd; hd = hd->next) {
+ if(
+ hd->base_class.id == bc_comm &&
+ hd->sub_class.id == sc_com_ser &&
+ hd->unix_dev_name &&
+ !hd->tag.ser_skip &&
+ !has_something_attached(hd_data, hd)
+ ) {
+ if((fd = open(hd->unix_dev_name, O_RDWR | O_NONBLOCK)) >= 0) {
+ if(tcgetattr(fd, &tio)) continue;
+ sm = add_ser_mouse_entry(&hd_data->ser_mouse, new_mem(sizeof *sm));
+ sm->dev_name = new_str(hd->unix_dev_name);
+ sm->fd = fd;
+ sm->tio = tio;
+ sm->hd_idx = hd->idx;
+ if(fd > fd_max) fd_max = fd;
+ FD_SET(fd, &set);
+
+ /*
+ * PnP COM spec black magic...
+ */
+ setspeed(fd, 1200, 1, CS7);
+ modem_info = TIOCM_DTR | TIOCM_RTS;
+ ioctl(fd, TIOCMBIC, &modem_info);
+ }
+ }
+ }
+
+ if(!hd_data->ser_mouse) return;
+
+ /*
+ * 200 ms seems to be too fast for some mice...
+ */
+ usleep(300000); /* PnP protocol */
+
+ for(sm = hd_data->ser_mouse; sm; sm = sm->next) {
+ modem_info = TIOCM_DTR | TIOCM_RTS;
+ ioctl(sm->fd, TIOCMBIS, &modem_info);
+ }
+
+ /* smaller buffer size, otherwise we might wait really long... */
+ max_len = sizeof sm->buf < 128 ? sizeof sm->buf : 128;
+
+ to.tv_sec = 0; to.tv_usec = 300000;
+
+ set0 = set;
+ for(;;) {
+ to.tv_sec = 0; to.tv_usec = 300000;
+ set = set0;
+ if((sel = select(fd_max + 1, &set, NULL, NULL, &to)) > 0) {
+ for(sm = hd_data->ser_mouse; sm; sm = sm->next) {
+ if(FD_ISSET(sm->fd, &set)) {
+ if((j = read(sm->fd, sm->buf + sm->buf_len, max_len - sm->buf_len)) > 0)
+ sm->buf_len += j;
+ if(j <= 0) FD_CLR(sm->fd, &set0); // #####
+ }
+ }
+ }
+ else {
+ break;
+ }
+ }
+
+ for(sm = hd_data->ser_mouse; sm; sm = sm->next) {
+ chk4id(sm);
+ /* reset serial lines */
+ tcflush(sm->fd, TCIOFLUSH);
+ tcsetattr(sm->fd, TCSAFLUSH, &sm->tio);
+ close(sm->fd);
+ }
+}
+
+
+/*
+ * Go through serial mouse data and add hd entries.
+ */
+void add_serial_mouse(hd_data_t *hd_data)
+{
+ hd_t *hd;
+ char buf[4];
+ ser_device_t *sm;
+
+ for(sm = hd_data->ser_mouse; sm; sm = sm->next) {
+ if(sm->is_mouse) {
+ hd = add_hd_entry(hd_data, __LINE__, 0);
+ hd->base_class.id = bc_mouse;
+ hd->sub_class.id = sc_mou_ser;
+ hd->bus.id = bus_serial;
+ hd->unix_dev_name = new_str(sm->dev_name);
+ hd->attached_to = sm->hd_idx;
+ if(*sm->pnp_id) {
+ strncpy(buf, sm->pnp_id, 3);
+ buf[3] = 0;
+ hd->vendor.id = name2eisa_id(buf);
+ if(!hd->vendor.id) { /* in case it's a really strange one... */
+ hd->vendor.name = new_str(buf);
+ }
+ hd->device.id = MAKE_ID(TAG_EISA, strtol(sm->pnp_id + 3, NULL, 16));
+
+ hd->serial = new_str(sm->serial);
+ if(sm->user_name) hd->device.name = new_str(sm->user_name);
+ if(sm->vend) {
+ free_mem(hd->vendor.name);
+ hd->vendor.name = new_str(sm->vend);
+ }
+
+ if(sm->dev_id && strlen(sm->dev_id) >= 7) {
+ char buf[5], *s;
+ unsigned u1, u2;
+
+ u1 = name2eisa_id(sm->dev_id);
+ if(u1) {
+ strncpy(buf, sm->dev_id + 3, 4);
+ buf[4] = 0;
+ u2 = strtol(sm->dev_id + 3, &s, 16);
+ if(!*s) {
+ hd->compat_vendor.id = u1;
+ hd->compat_device.id = MAKE_ID(TAG_EISA, u2);
+ }
+ }
+ }
+ }
+ else {
+ hd->vendor.id = MAKE_ID(TAG_SPECIAL, 0x0200);
+ hd->device.id = MAKE_ID(TAG_SPECIAL, 0x0003);
+ }
+ }
+ }
+}
+
+
+/*
+ * Baud setting magic taken from gpm.
+ */
+
+int _setspeed(int fd, int old, int new, int needtowrite, unsigned short flags)
+{
+ struct termios tty;
+ char *c;
+ int err = 0;
+
+ flags |= CREAD | CLOCAL | HUPCL;
+
+ if(tcgetattr(fd, &tty)) return errno;
+
+ tty.c_iflag = IGNBRK | IGNPAR;
+ tty.c_oflag = 0;
+ tty.c_lflag = 0;
+ tty.c_line = 0;
+ tty.c_cc[VTIME] = 0;
+ tty.c_cc[VMIN] = 1;
+
+ switch (old)
+ {
+ case 9600: tty.c_cflag = flags | B9600; break;
+ case 4800: tty.c_cflag = flags | B4800; break;
+ case 2400: tty.c_cflag = flags | B2400; break;
+ case 1200:
+ default: tty.c_cflag = flags | B1200; break;
+ }
+
+ if(tcsetattr(fd, TCSAFLUSH, &tty)) return errno;
+
+ switch (new)
+ {
+ case 9600: c = "*q"; tty.c_cflag = flags | B9600; break;
+ case 4800: c = "*p"; tty.c_cflag = flags | B4800; break;
+ case 2400: c = "*o"; tty.c_cflag = flags | B2400; break;
+ case 1200:
+ default: c = "*n"; tty.c_cflag = flags | B1200; break;
+ }
+
+ if(needtowrite) {
+ err = 2 - write(fd, c, 2);
+ }
+
+ usleep(100000);
+
+ if(tcsetattr(fd, TCSAFLUSH, &tty)) return errno;
+
+ return err;
+}
+
+
+void setspeed(int fd, int new, int needtowrite, unsigned short flags)
+{
+ int i, err;
+
+ for(i = 9600; i >= 1200; i >>= 1) {
+ err = _setspeed(fd, i, new, needtowrite, flags);
+#if 0
+ if(err) {
+ fprintf(stderr, "%d, %d ", i, err);
+ perror("");
+ }
+#endif
+ }
+}
+
+
+#if 0
+/*
+ * Check for a PnP info field starting at ofs;
+ * returns either the length of the field or 0 if none was found.
+ *
+ * the minfo_t struct is updated with the PnP data
+ */
+int is_pnpinfo(ser_device_t *mi, int ofs)
+{
+ int i;
+ unsigned char *s = mi->buf + ofs;
+ int len = mi->buf_len - ofs;
+
+ if(len <= 0) return 0;
+
+ switch(*s) {
+ case 0x08:
+ mi->bits = 6; break;
+ case 0x28:
+ mi->bits = 7; break;
+ default:
+ return 0;
+ }
+
+ if(len < 11) return 0;
+
+ /* six bit values */
+ if((s[1] & ~0x3f) || (s[2] & ~0x3f)) return 0;
+ mi->pnp_rev = (s[1] << 6) + s[2];
+
+ /* the eisa id */
+ for(i = 0; i < 7; i++) {
+ mi->pnp_id[i] = s[i + 3];
+ if(mi->bits == 6) mi->pnp_id[i] += 0x20;
+ }
+ mi->pnp_id[7] = 0;
+
+ /* now check the id */
+ for(i = 0; i < 3; i++) {
+ if(
+ (mi->pnp_id[i] < 'A' || mi->pnp_id[i] > 'Z') &&
+ mi->pnp_id[i] != '_'
+ ) return 0;
+ }
+
+ for(i = 3; i < 7; i++) {
+ if(
+ (mi->pnp_id[i] < '0' || mi->pnp_id[i] > '9') &&
+ (mi->pnp_id[i] < 'A' || mi->pnp_id[i] > 'F')
+ ) return 0;
+ }
+
+ if(
+ (mi->bits == 6 && s[10] == 0x09) ||
+ (mi->bits == 7 && s[10] == 0x29)
+ ) {
+ return 11;
+ }
+
+ if(
+ (mi->bits != 6 || s[10] != 0x3c) &&
+ (mi->bits != 7 || s[10] != 0x5c)
+ ) {
+ return 0;
+ }
+
+ /* skip extended info */
+ for(i = 11; i < len; i++) {
+ if(
+ (mi->bits == 6 && s[i] == 0x09) ||
+ (mi->bits == 7 && s[i] == 0x29)
+ ) {
+ return i + 1;
+ }
+ }
+
+ /*
+ * some mice have problems providing the extended info -> return ok in
+ * these cases too
+ */
+ if(
+ (mi->bits == 6 && s[10] == 0x3c) ||
+ (mi->bits == 7 && s[10] == 0x5c)
+ ) {
+ return 11;
+ }
+
+ /* no end token... */
+
+ return 0;
+}
+#endif
+
+unsigned chk4id(ser_device_t *mi)
+{
+ int i;
+
+#if 0
+ unsigned char fake[] =
+ {
+ // fake pnp data
+ };
+
+ mi->buf_len = sizeof fake;
+ memcpy(mi->buf, fake, mi->buf_len);
+ // for(i = 0; i < mi->buf_len; i++) mi->buf[i] += ' ';
+#endif
+
+ if(!mi->buf_len) return 0;
+
+ for(i = 0; i < mi->buf_len; i++) {
+ if((mi->pnp = is_pnpinfo(mi, i))) break;
+ }
+ if(i == mi->buf_len) {
+ /* non PnP, but MS compatible */
+ if(*mi->buf == 'M')
+ mi->non_pnp = mi->buf_len - 1;
+ else
+ return 0;
+ }
+
+ mi->garbage = i;
+
+ for(i = 0; i < mi->garbage; i++) {
+ if(mi->buf[i] == 'M') {
+ mi->non_pnp = mi->garbage - i;
+ mi->garbage = i;
+ break;
+ }
+ }
+
+ if(mi->non_pnp || mi->bits == 6) mi->is_mouse = 1;
+
+ return mi->is_mouse;
+}
+
+ser_device_t *add_ser_mouse_entry(ser_device_t **sm, ser_device_t *new_sm)
+{
+ while(*sm) sm = &(*sm)->next;
+ return *sm = new_sm;
+}
+
+
+void dump_ser_mouse_data(hd_data_t *hd_data)
+{
+ int j;
+ ser_device_t *sm;
+
+ if(!(sm = hd_data->ser_mouse)) return;
+
+ ADD2LOG("----- serial mice -----\n");
+
+ for(; sm; sm = sm->next) {
+ ADD2LOG("%s\n", sm->dev_name);
+ if(sm->serial) ADD2LOG("serial: \"%s\"\n", sm->serial);
+ if(sm->class_name) ADD2LOG("class_name: \"%s\"\n", sm->class_name);
+ if(sm->dev_id) ADD2LOG("dev_id: \"%s\"\n", sm->dev_id);
+ if(sm->user_name) ADD2LOG("user_name: \"%s\"\n", sm->user_name);
+
+ if(sm->garbage) {
+ ADD2LOG(" garbage[%u]: ", sm->garbage);
+ hexdump(&hd_data->log, 1, sm->garbage, sm->buf);
+ ADD2LOG("\n");
+ }
+
+ if(sm->non_pnp) {
+ ADD2LOG(" non-pnp[%u]: ", sm->non_pnp);
+ hexdump(&hd_data->log, 1, sm->non_pnp, sm->buf + sm->garbage);
+ ADD2LOG("\n");
+ }
+
+ if(sm->pnp) {
+ ADD2LOG(" pnp[%u]: ", sm->pnp);
+ hexdump(&hd_data->log, 1, sm->pnp, sm->buf + sm->garbage + sm->non_pnp);
+ ADD2LOG("\n");
+ }
+
+ if((j = sm->buf_len - (sm->garbage + sm->non_pnp + sm->pnp))) {
+ ADD2LOG(" moves[%u]: ", j);
+ hexdump(&hd_data->log, 1, j, sm->buf + sm->garbage + sm->non_pnp + sm->pnp);
+ ADD2LOG("\n");
+ }
+
+ if(sm->is_mouse) ADD2LOG(" is mouse\n");
+
+ if(sm->pnp) {
+ ADD2LOG(" bits: %u\n", sm->bits);
+ ADD2LOG(" PnP Rev: %u.%02u\n", sm->pnp_rev / 100, sm->pnp_rev % 100);
+ ADD2LOG(" PnP ID: \"%s\"\n", sm->pnp_id);
+ }
+
+ if(sm->next) ADD2LOG("\n");
+ }
+
+ ADD2LOG("----- serial mice end -----\n");
+}
+
+#endif /* !defined(LIBHD_TINY) */
--- /dev/null
+void hd_scan_mouse(hd_data_t *hd_data);
--- /dev/null
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <inttypes.h>
+#include <errno.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <sys/ioctl.h>
+#include <sys/socket.h>
+
+#define u8 uint8_t
+#define u16 uint16_t
+#define u32 uint32_t
+#define u64 uint64_t
+#include <linux/if.h>
+#include <linux/sockios.h>
+#include <linux/ethtool.h>
+#include <linux/if_arp.h>
+
+#include "hd.h"
+#include "hd_int.h"
+#include "net.h"
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ * gather network interface info
+ *
+ * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ */
+
+static void get_driverinfo(hd_data_t *hd_data, hd_t *hd);
+static void get_linkstate(hd_data_t *hd_data, hd_t *hd);
+static void add_xpnet(hd_data_t *hdata);
+static void add_iseries(hd_data_t *hdata);
+static void add_uml(hd_data_t *hdata);
+
+/*
+ * This is independent of the other scans.
+ */
+
+void hd_scan_net(hd_data_t *hd_data)
+{
+ unsigned u;
+ int if_type;
+ hd_t *hd, *hd_card;
+ char *s, *hw_addr;
+ hd_res_t *res, *res1;
+ uint64_t ul0;
+
+ struct sysfs_class *sf_class;
+ struct sysfs_class_device *sf_cdev;
+ struct sysfs_device *sf_dev;
+ struct sysfs_driver *sf_drv;
+ struct dlist *sf_cdev_list;
+
+ if(!hd_probe_feature(hd_data, pr_net)) return;
+
+ hd_data->module = mod_net;
+
+ /* some clean-up */
+ remove_hd_entries(hd_data);
+ hd_data->net = free_str_list(hd_data->net);
+
+ PROGRESS(1, 0, "get network data");
+
+ sf_class = sysfs_open_class("net");
+
+ if(!sf_class) {
+ ADD2LOG("sysfs: no such class: net\n");
+ return;
+ }
+
+ sf_cdev_list = sysfs_get_class_devices(sf_class);
+ if(sf_cdev_list) dlist_for_each_data(sf_cdev_list, sf_cdev, struct sysfs_class_device) {
+ hd_card = NULL;
+
+ ADD2LOG(
+ " net interface: name = %s, classname = %s, path = %s\n",
+ sf_cdev->name,
+ sf_cdev->classname,
+ hd_sysfs_id(sf_cdev->path)
+ );
+
+ if_type = -1;
+ if(hd_attr_uint(sysfs_get_classdev_attr(sf_cdev, "type"), &ul0, 0)) {
+ if_type = ul0;
+ ADD2LOG(" type = %d\n", if_type);
+ }
+
+ hw_addr = NULL;
+ if((s = hd_attr_str(sysfs_get_classdev_attr(sf_cdev, "address")))) {
+ hw_addr = canon_str(s, strlen(s));
+ ADD2LOG(" hw_addr = %s\n", hw_addr);
+ }
+
+ sf_dev = sysfs_get_classdev_device(sf_cdev);
+ if(sf_dev) {
+ ADD2LOG(" net device: path = %s\n", hd_sysfs_id(sf_dev->path));
+ }
+
+ sf_drv = sysfs_get_classdev_driver(sf_cdev);
+ if(sf_drv) {
+ ADD2LOG(
+ " net driver: name = %s, path = %s\n",
+ sf_drv->name,
+ hd_sysfs_id(sf_drv->path)
+ );
+ }
+
+ hd = add_hd_entry(hd_data, __LINE__, 0);
+ hd->base_class.id = bc_network_interface;
+ hd->sub_class.id = sc_nif_other;
+
+ res1 = NULL;
+ if(hw_addr && strspn(hw_addr, "0:") != strlen(hw_addr)) {
+ res1 = new_mem(sizeof *res1);
+ res1->hwaddr.type = res_hwaddr;
+ res1->hwaddr.addr = new_str(hw_addr);
+ add_res_entry(&hd->res, res1);
+ }
+
+ hw_addr = free_mem(hw_addr);
+
+ hd->unix_dev_name = new_str(sf_cdev->name);
+ hd->sysfs_id = new_str(hd_sysfs_id(sf_cdev->path));
+
+ if(sf_drv) {
+ add_str_list(&hd->drivers, sf_drv->name);
+ }
+ else if(hd->res) {
+ get_driverinfo(hd_data, hd);
+ }
+
+ if(sf_dev) {
+ hd->sysfs_device_link = new_str(hd_sysfs_id(sf_dev->path));
+
+ hd_card = hd_find_sysfs_id(hd_data, hd_sysfs_id(sf_dev->path));
+ if(hd_card) {
+ hd->attached_to = hd_card->idx;
+
+ /* for cards with strange pci classes */
+ hd_set_hw_class(hd_card, hw_network_ctrl);
+
+ /* add hw addr to network card */
+ if(res1) {
+ u = 0;
+ for(res = hd_card->res; res; res = res->next) {
+ if(
+ res->any.type == res_hwaddr &&
+ !strcmp(res->hwaddr.addr, res1->hwaddr.addr)
+ ) {
+ u = 1;
+ break;
+ }
+ }
+ if(!u) {
+ res = new_mem(sizeof *res);
+ res->hwaddr.type = res_hwaddr;
+ res->hwaddr.addr = new_str(res1->hwaddr.addr);
+ add_res_entry(&hd_card->res, res);
+ }
+ }
+ /* add interface names */
+ if(hd->unix_dev_name) {
+ if(!search_str_list(hd_card->unix_dev_names, hd->unix_dev_name)) {
+ add_str_list(&hd_card->unix_dev_names, hd->unix_dev_name);
+ }
+ if(!hd_card->unix_dev_name) {
+ hd_card->unix_dev_name = new_str(hd->unix_dev_name);
+ }
+ }
+ }
+ }
+
+#if 0
+ "ctc" sc_nif_ctc
+ "iucv" sc_nif_iucv
+ "hsi" sc_nif_hsi
+ "qeth" sc_nif_qeth
+ "escon" sc_nif_escon
+ "myri" sc_nif_myrinet
+ "wlan" sc_nif_wlan
+ "xp" sc_nif_xp
+ "usb" sc_nif_usb
+#endif
+ switch(if_type) {
+ case ARPHRD_ETHER: /* eth */
+ hd->sub_class.id = sc_nif_ethernet;
+ break;
+ case ARPHRD_LOOPBACK: /* lo */
+ hd->sub_class.id = sc_nif_loopback;
+ break;
+ case ARPHRD_SIT: /* sit */
+ hd->sub_class.id = sc_nif_sit;
+ break;
+ case ARPHRD_FDDI: /* fddi */
+ hd->sub_class.id = sc_nif_fddi;
+ break;
+ case ARPHRD_IEEE802_TR: /* tr */
+ hd->sub_class.id = sc_nif_tokenring;
+ break;
+#if 0
+ case ARPHRD_IEEE802: /* fc */
+ hd->sub_class.id = sc_nif_fc;
+ break;
+#endif
+ }
+
+ if(!strcmp(hd->unix_dev_name, "lo")) {
+ hd->sub_class.id = sc_nif_loopback;
+ }
+ else if(sscanf(hd->unix_dev_name, "eth%u", &u) == 1) {
+ hd->sub_class.id = sc_nif_ethernet;
+ hd->slot = u;
+ }
+ else if(sscanf(hd->unix_dev_name, "tr%u", &u) == 1) {
+ hd->sub_class.id = sc_nif_tokenring;
+ hd->slot = u;
+ }
+ else if(sscanf(hd->unix_dev_name, "fddi%u", &u) == 1) {
+ hd->sub_class.id = sc_nif_fddi;
+ hd->slot = u;
+ }
+ else if(sscanf(hd->unix_dev_name, "ctc%u", &u) == 1) {
+ hd->sub_class.id = sc_nif_ctc;
+ hd->slot = u;
+ }
+ else if(sscanf(hd->unix_dev_name, "iucv%u", &u) == 1) {
+ hd->sub_class.id = sc_nif_iucv;
+ hd->slot = u;
+ }
+ else if(sscanf(hd->unix_dev_name, "hsi%u", &u) == 1) {
+ hd->sub_class.id = sc_nif_hsi;
+ hd->slot = u;
+ }
+ else if(sscanf(hd->unix_dev_name, "qeth%u", &u) == 1) {
+ hd->sub_class.id = sc_nif_qeth;
+ hd->slot = u;
+ }
+ else if(sscanf(hd->unix_dev_name, "escon%u", &u) == 1) {
+ hd->sub_class.id = sc_nif_escon;
+ hd->slot = u;
+ }
+ else if(sscanf(hd->unix_dev_name, "myri%u", &u) == 1) {
+ hd->sub_class.id = sc_nif_myrinet;
+ hd->slot = u;
+ }
+ else if(sscanf(hd->unix_dev_name, "sit%u", &u) == 1) {
+ hd->sub_class.id = sc_nif_sit; /* ipv6 over ipv4 tunnel */
+ hd->slot = u;
+ }
+ else if(sscanf(hd->unix_dev_name, "wlan%u", &u) == 1) {
+ hd->sub_class.id = sc_nif_wlan;
+ hd->slot = u;
+ }
+ else if(sscanf(hd->unix_dev_name, "xp%u", &u) == 1) {
+ hd->sub_class.id = sc_nif_xp;
+ hd->slot = u;
+ }
+ else if(sscanf(hd->unix_dev_name, "usb%u", &u) == 1) {
+ hd->sub_class.id = sc_nif_usb;
+ hd->slot = u;
+ }
+ /* ##### add more interface names here */
+
+ hd->bus.id = bus_none;
+
+ /* fix card type */
+ if(hd_card) {
+ if(
+ (hd_card->base_class.id == 0 && hd_card->sub_class.id == 0) ||
+ (hd_card->base_class.id == bc_network && hd_card->sub_class.id == 0x80)
+ ) {
+ switch(hd->sub_class.id) {
+ case sc_nif_ethernet:
+ hd_card->base_class.id = bc_network;
+ hd_card->sub_class.id = 0;
+ break;
+
+ case sc_nif_usb:
+ hd_card->base_class.id = bc_network;
+ hd_card->sub_class.id = 0x91;
+ break;
+ }
+ }
+ }
+ }
+
+ sysfs_close_class(sf_class);
+
+ if(hd_is_sgi_altix(hd_data)) add_xpnet(hd_data);
+ if(hd_is_iseries(hd_data)) add_iseries(hd_data);
+ add_uml(hd_data);
+
+ /* add link status info */
+ for(hd = hd_data->hd ; hd; hd = hd->next) {
+ if(
+ hd->module == hd_data->module &&
+ hd->base_class.id == bc_network_interface
+ ) {
+ get_linkstate(hd_data, hd);
+
+ if(!(hd_card = hd_get_device_by_idx(hd_data, hd->attached_to))) continue;
+
+ for(res = hd->res; res; res = res->next) {
+ if(res->any.type == res_link) break;
+ }
+
+ if(res) {
+ for(res1 = hd_card->res; res1; res1 = res1->next) {
+ if(res1->any.type == res_link) break;
+ }
+ if(res && !res1) {
+ res1 = new_mem(sizeof *res1);
+ res1->link.type = res_link;
+ res1->link.state = res->link.state;
+ add_res_entry(&hd_card->res, res1);
+ }
+ }
+ }
+ }
+}
+
+
+/*
+ * Get it the classical way, for drivers that don't support sysfs (veth).
+ */
+void get_driverinfo(hd_data_t *hd_data, hd_t *hd)
+{
+ int fd;
+ struct ethtool_drvinfo drvinfo = { cmd:ETHTOOL_GDRVINFO };
+ struct ifreq ifr;
+
+ if(!hd->unix_dev_name) return;
+
+ if(strlen(hd->unix_dev_name) > sizeof ifr.ifr_name - 1) return;
+
+ if((fd = socket(PF_INET, SOCK_DGRAM, 0)) == -1) return;
+
+ /* get driver info */
+ memset(&ifr, 0, sizeof ifr);
+ strcpy(ifr.ifr_name, hd->unix_dev_name);
+ ifr.ifr_data = (caddr_t) &drvinfo;
+ if(ioctl(fd, SIOCETHTOOL, &ifr) == 0) {
+ ADD2LOG(" ethtool driver: %s\n", drvinfo.driver);
+ ADD2LOG(" ethtool bus: %s\n", drvinfo.bus_info);
+
+ add_str_list(&hd->drivers, drvinfo.driver);
+ }
+ else {
+ ADD2LOG(" GDRVINFO ethtool error: %s\n", strerror(errno));
+ }
+
+ close(fd);
+}
+
+
+/*
+ * Check network link status.
+ */
+void get_linkstate(hd_data_t *hd_data, hd_t *hd)
+{
+ int fd;
+ struct ethtool_value linkstatus = { cmd:ETHTOOL_GLINK };
+ struct ifreq ifr;
+ hd_res_t *res;
+
+ if(!hd->unix_dev_name) return;
+
+ if(strlen(hd->unix_dev_name) > sizeof ifr.ifr_name - 1) return;
+
+ if((fd = socket(PF_INET, SOCK_DGRAM, 0)) == -1) return;
+
+ /* get driver info */
+ memset(&ifr, 0, sizeof ifr);
+ strcpy(ifr.ifr_name, hd->unix_dev_name);
+ ifr.ifr_data = (caddr_t) &linkstatus;
+ if(ioctl(fd, SIOCETHTOOL, &ifr) == 0) {
+ ADD2LOG(" %s: ethtool link state: %d\n", hd->unix_dev_name, linkstatus.data);
+ res = new_mem(sizeof *res);
+ res->link.type = res_link;
+ res->link.state = linkstatus.data ? 1 : 0;
+ add_res_entry(&hd->res, res);
+ }
+ else {
+ ADD2LOG(" %s: GLINK ethtool error: %s\n", hd->unix_dev_name, strerror(errno));
+ }
+
+ close(fd);
+}
+
+
+/*
+ * SGI Altix cross partition network.
+ */
+void add_xpnet(hd_data_t *hd_data)
+{
+ hd_t *hd, *hd_card;
+ hd_res_t *res, *res2;
+
+ hd_card = add_hd_entry(hd_data, __LINE__, 0);
+ hd_card->base_class.id = bc_network;
+ hd_card->sub_class.id = 0x83;
+
+ hd_card->vendor.id = MAKE_ID(TAG_SPECIAL, 0x4002);
+ hd_card->device.id = MAKE_ID(TAG_SPECIAL, 1);
+
+ if(hd_module_is_active(hd_data, "xpnet")) {
+ add_str_list(&hd_card->drivers, "xpnet");
+ }
+
+ for(hd = hd_data->hd ; hd; hd = hd->next) {
+ if(
+ hd->module == hd_data->module &&
+ hd->base_class.id == bc_network_interface &&
+ hd->sub_class.id == sc_nif_xp
+ ) {
+ hd->attached_to = hd_card->idx;
+
+ for(res = hd->res; res; res = res->next) {
+ if(res->any.type == res_hwaddr) break;
+ }
+
+ if(res) {
+ res2 = new_mem(sizeof *res2);
+ res2->hwaddr.type = res_hwaddr;
+ res2->hwaddr.addr = new_str(res->hwaddr.addr);
+ add_res_entry(&hd_card->res, res2);
+ }
+
+ break;
+ }
+ }
+}
+
+
+/*
+ * iSeries veth devices.
+ */
+void add_iseries(hd_data_t *hd_data)
+{
+ hd_t *hd, *hd_card;
+ hd_res_t *res, *res2;
+ unsigned i, cardmask = 0, card_cnt = 0;
+ str_list_t *sl0, *sl;
+
+ for(hd = hd_data->hd ; hd; hd = hd->next) {
+ if(
+ hd->module == hd_data->module &&
+ hd->base_class.id == bc_network_interface &&
+ search_str_list(hd->drivers, "veth")
+ ) {
+ hd_card = add_hd_entry(hd_data, __LINE__, 0);
+ hd_card->base_class.id = bc_network;
+ hd_card->sub_class.id = 0x00;
+ hd_card->vendor.id = MAKE_ID(TAG_SPECIAL, 0x6001); // IBM
+ hd_card->device.id = MAKE_ID(TAG_SPECIAL, 0x1000);
+ add_str_list(&hd_card->drivers, "iseries_veth");
+ hd_card->slot = card_cnt++;
+ str_printf(&hd_card->device.name, 0, "Virtual Ethernet card");
+ hd->attached_to = hd_card->idx;
+
+ for(res = hd->res; res; res = res->next) {
+ if(res->any.type == res_hwaddr) break;
+ }
+
+ if(res) {
+ unsigned int slotno;
+
+ res2 = new_mem(sizeof *res2);
+ res2->hwaddr.type = res_hwaddr;
+ res2->hwaddr.addr = new_str(res->hwaddr.addr);
+ add_res_entry(&hd_card->res, res2);
+ if (sscanf(res->hwaddr.addr, "02:01:ff:%x:ff:", &slotno)) {
+ hd_card->slot = slotno;
+ str_printf(&hd_card->device.name, 0, "Virtual Ethernet card %d", hd_card->slot);
+ }
+ }
+ }
+ }
+
+ if(!card_cnt) {
+ sl0 = read_file("/proc/iSeries/config", 0, 0);
+ for(sl = sl0; sl; sl = sl->next) {
+ if(sscanf(sl->str, "AVAILABLE_VETH=%x", &cardmask) == 1)
+ break;
+ }
+ free_str_list(sl0);
+
+ for (i = 0; i < 16; i++) {
+ if ((0x8000 >> i) & cardmask) {
+ hd_card = add_hd_entry(hd_data, __LINE__, 0);
+ hd_card->base_class.id = bc_network;
+ hd_card->sub_class.id = 0x00;
+ hd_card->vendor.id = MAKE_ID(TAG_SPECIAL, 0x6001); // IBM
+ hd_card->device.id = MAKE_ID(TAG_SPECIAL, 0x1000);
+ hd_card->slot = i;
+ str_printf(&hd_card->device.name, 0, "Virtual Ethernet card %d", i);
+ }
+ }
+ }
+}
+
+
+/*
+ * UML veth devices.
+ */
+void add_uml(hd_data_t *hd_data)
+{
+ hd_t *hd, *hd_card;
+ hd_res_t *res, *res2;
+ unsigned card_cnt = 0;
+
+ for(hd = hd_data->hd ; hd; hd = hd->next) {
+ if(
+ hd->module == hd_data->module &&
+ hd->base_class.id == bc_network_interface &&
+ search_str_list(hd->drivers, "uml virtual ethernet")
+ ) {
+ hd_card = add_hd_entry(hd_data, __LINE__, 0);
+ hd_card->base_class.id = bc_network;
+ hd_card->sub_class.id = 0x00;
+ hd_card->vendor.id = MAKE_ID(TAG_SPECIAL, 0x6010); // UML
+ hd_card->device.id = MAKE_ID(TAG_SPECIAL, 0x0001);
+ hd_card->slot = card_cnt++;
+ str_printf(&hd_card->device.name, 0, "Virtual Ethernet card %d", hd_card->slot);
+// add_str_list(&hd_card->drivers, "veth");
+
+ hd->attached_to = hd_card->idx;
+
+ for(res = hd->res; res; res = res->next) {
+ if(res->any.type == res_hwaddr) break;
+ }
+
+ if(res) {
+ res2 = new_mem(sizeof *res2);
+ res2->hwaddr.type = res_hwaddr;
+ res2->hwaddr.addr = new_str(res->hwaddr.addr);
+ add_res_entry(&hd_card->res, res2);
+ }
+ }
+ }
+}
+
+
--- /dev/null
+void hd_scan_net(hd_data_t *hd_data);
--- /dev/null
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+
+#include "hd.h"
+#include "hd_int.h"
+#include "parallel.h"
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ * parallel port device info
+ *
+ * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ */
+
+#ifndef LIBHD_TINY
+
+static void do_lp(hd_data_t *hd_data);
+static void do_zip(hd_data_t *hd_data);
+static void dump_parallel_data(hd_data_t *hd_data, str_list_t *sl);
+
+void hd_scan_parallel(hd_data_t *hd_data)
+{
+ if(!hd_probe_feature(hd_data, pr_parallel)) return;
+
+ hd_data->module = mod_parallel;
+
+ /* some clean-up */
+ remove_hd_entries(hd_data);
+
+ if(hd_probe_feature(hd_data, pr_parallel_lp)) do_lp(hd_data);
+
+ if(hd_probe_feature(hd_data, pr_parallel_zip)) do_zip(hd_data);
+}
+
+void do_lp(hd_data_t *hd_data)
+{
+ hd_t *hd, *hd_i;
+ str_list_t *sl, *sl0;
+ hd_res_t *res;
+ char *pp = NULL, buf[256], unix_dev[] = "/dev/lp0", *s = NULL;
+ char *base_class, *device, *vendor, *cmd_set;
+ int i, j, port;
+ str_list_t *log = NULL;
+
+ PROGRESS(1, 0, "pp mod");
+
+ for(hd = hd_data->hd; hd; hd = hd->next) {
+ if(hd->base_class.id == bc_comm && hd->sub_class.id == sc_com_par) break;
+ }
+
+ /* ... if there seems to be a parallel interface, try to load it */
+ if(hd || 1) { /* always load it */
+ if(hd_data->kernel_version == KERNEL_22) {
+ unload_module(hd_data, "parport_probe");
+ probe_module(hd_data, "parport_probe");
+ } else {
+ unload_module(hd_data, "lp");
+ unload_module(hd_data, "parport_pc");
+ probe_module(hd_data, "parport_pc");
+ }
+ }
+
+ for(i = 0; i < 3; i++, unix_dev[sizeof unix_dev - 2]++) {
+ PROGRESS(2, 1 + i, "lp read info");
+
+ port = 0;
+ // ##### read modes as well? (e.g: SPP,ECP,ECPEPP,ECPPS2)
+ if(hd_data->kernel_version == KERNEL_22)
+ str_printf(&pp, 0, PROC_PARPORT_22 "%d/hardware", i);
+ else
+ str_printf(&pp, 0, PROC_PARPORT_24 "%d/base-addr", i);
+ sl0 = read_file(pp, 0, 0);
+ if(!sl0) continue; /* file doesn't exist -> no parport entry */
+ str_printf(&s, 0, "%s\n", pp);
+ add_str_list(&log, s);
+ for(sl = sl0; sl; sl = sl->next) {
+ str_printf(&s, 0, " %s", sl->str);
+ add_str_list(&log, s);
+ if(hd_data->kernel_version == KERNEL_22) {
+ if(sscanf(sl->str, "base: %i", &j) == 1) port = j;
+ } else {
+ if(sscanf(sl->str, "%i", &j) == 1) port = j;
+ }
+ }
+ free_str_list(sl0);
+
+ if(hd_data->kernel_version == KERNEL_22)
+ str_printf(&pp, 0, PROC_PARPORT_22 "%d/autoprobe", i);
+ else
+ str_printf(&pp, 0, PROC_PARPORT_24 "%d/autoprobe", i);
+ sl0 = read_file(pp, 0, 0);
+ str_printf(&s, 0, "%s\n", pp);
+ add_str_list(&log, s);
+ base_class = device = vendor = cmd_set = NULL;
+ for(sl = sl0; sl; sl = sl->next) {
+ str_printf(&s, 0, " %s", sl->str);
+ add_str_list(&log, s);
+// fprintf(stderr, "str = \"%s\"\n", sl->str);
+ if(sscanf(sl->str, "CLASS: %255[^\n;]", buf) == 1) base_class = new_str(buf);
+ if(sscanf(sl->str, "MODEL: %255[^\n;]", buf) == 1) device = new_str(buf);
+ if(sscanf(sl->str, "MANUFACTURER: %255[^\n;]", buf) == 1) vendor = new_str(buf);
+ if(sscanf(sl->str, "COMMAND SET: %255[^\n;]", buf) == 1) cmd_set = new_str(buf);
+ }
+ free_str_list(sl0);
+
+ /* default to printer */
+ if(!base_class && vendor && device) base_class = new_str("printer");
+
+ s = free_mem(s);
+
+// fprintf(stderr, "port <0x%x\n", port);
+// fprintf(stderr, "class <%s>\n", base_class);
+// fprintf(stderr, "device <%s>\n", device);
+// fprintf(stderr, "vendor <%s>\n", vendor);
+// fprintf(stderr, "cmds <%s>\n", cmd_set);
+
+ for(hd = hd_data->hd; hd; hd = hd->next) {
+ if(
+ hd->base_class.id == bc_comm &&
+ hd->sub_class.id == sc_com_par &&
+ hd->unix_dev_name &&
+ !strcmp(hd->unix_dev_name, unix_dev)
+ ) break;
+ }
+
+ if(!hd) {
+ /* no entry ??? */
+ hd = add_hd_entry(hd_data, __LINE__, 0);
+ hd->base_class.id = bc_comm;
+ hd->sub_class.id = sc_com_par;
+ hd->unix_dev_name = new_str(unix_dev);
+ if(port) {
+ res = add_res_entry(&hd->res, new_mem(sizeof *res));
+ res->io.type = res_io;
+ res->io.enabled = 1;
+ res->io.base = port;
+ res->io.access = acc_rw;
+ }
+ }
+
+ // ##### check if ports match?
+
+ if(
+ base_class ||
+ (device && strcmp(device, "Unknown device")) ||
+ (vendor && strcmp(vendor, "Unknown vendor"))
+ ) {
+ hd_i = hd;
+ hd = add_hd_entry(hd_data, __LINE__, 0);
+ hd->attached_to = hd_i->idx;
+ hd->unix_dev_name = new_str(hd_i->unix_dev_name);
+ hd->base_class.id = bc_none;
+ if(base_class && !strcasecmp(base_class, "printer")) hd->base_class.id = bc_printer;
+ hd->bus.id = bus_parallel;
+
+ hd->vendor.name = new_str(vendor);
+ hd->device.name = new_str(device);
+ }
+
+ free_mem(base_class);
+ free_mem(device);
+ free_mem(vendor);
+ free_mem(cmd_set);
+ }
+
+ pp = free_mem(pp);
+
+ if((hd_data->debug & HD_DEB_PARALLEL)) dump_parallel_data(hd_data, log);
+
+ free_str_list(log);
+
+}
+
+void do_zip(hd_data_t *hd_data)
+{
+ hd_t *hd, *hd_i;
+ int i, j, port, is_imm, is_ppa, is_imm0, is_ppa0;
+ char *pp = NULL, *s = NULL, *unix_dev = NULL;
+ str_list_t *log = NULL, *sl, *sl0;
+ int do_imm = hd_probe_feature(hd_data, pr_parallel_imm);
+
+ is_imm = is_imm0 = hd_module_is_active(hd_data, "imm");
+ is_ppa = is_ppa0 = hd_module_is_active(hd_data, "ppa");
+
+ if(!(is_imm || is_ppa)) {
+ for(hd = hd_data->hd; hd; hd = hd->next) {
+ if(hd->base_class.id == bc_comm && hd->sub_class.id == sc_com_par) break;
+ }
+ /* ... if there seems to be a parallel interface, try to load it */
+ if(hd) {
+ if(do_imm) {
+ PROGRESS(5, 0, "imm mod");
+ load_module(hd_data, "imm");
+ }
+ PROGRESS(5, 0, "ppa mod");
+ load_module(hd_data, "ppa");
+ is_imm = hd_module_is_active(hd_data, "imm");
+ is_ppa = hd_module_is_active(hd_data, "ppa");
+ if(do_imm && !is_imm) {
+ int fd;
+ char flush[2] = { 4, 12 };
+
+ fd = open("/dev/lp0", O_NONBLOCK | O_WRONLY);
+ if(fd != -1) {
+ write(fd, flush, sizeof flush);
+ close(fd);
+ }
+ }
+ }
+ }
+
+ if(!(is_imm || is_ppa)) return;
+
+ PROGRESS(6, 0, "zip read info");
+
+ for(i = 0; i < 16; i++) {
+ str_printf(&pp, 0, PROC_SCSI "/%s/%d", (i % 2) ? "ppa" : "imm", i / 2);
+ sl0 = read_file(pp, 0, 0);
+ if(!sl0) continue;
+ str_printf(&s, 0, "%s\n", pp);
+ add_str_list(&log, s);
+ port = -1;
+ for(sl = sl0; sl; sl = sl->next) {
+ str_printf(&s, 0, " %s", sl->str);
+ add_str_list(&log, s);
+ if(sscanf(sl->str, "Parport : parport%d", &j) == 1) port = j;
+ }
+ free_str_list(sl0);
+ pp = free_mem(pp);
+ s = free_mem(s);
+
+ unix_dev = free_mem(unix_dev);
+ if(port >= 0) {
+ str_printf(&unix_dev, 0, "/dev/lp%d", port);
+ }
+
+ hd = NULL;
+ if(unix_dev) {
+ for(hd = hd_data->hd; hd; hd = hd->next) {
+ if(
+ hd->base_class.id == bc_comm &&
+ hd->sub_class.id == sc_com_par &&
+ hd->unix_dev_name &&
+ !strcmp(hd->unix_dev_name, unix_dev)
+ ) break;
+ }
+
+ if(!hd) {
+ /* no entry ??? */
+ hd = add_hd_entry(hd_data, __LINE__, 0);
+ hd->base_class.id = bc_comm;
+ hd->sub_class.id = sc_com_par;
+ hd->unix_dev_name = new_str(unix_dev);
+ }
+ }
+
+ hd_i = hd;
+ hd = add_hd_entry(hd_data, __LINE__, 0);
+ if(hd_i) {
+ hd->attached_to = hd_i->idx;
+ hd->unix_dev_name = new_str(hd_i->unix_dev_name);
+ }
+ hd->base_class.id = bc_storage;
+ hd->sub_class.id = sc_sto_scsi;
+ hd->bus.id = bus_parallel;
+ hd->vendor.id = MAKE_ID(TAG_SPECIAL, 0x1800);
+ hd->device.id = MAKE_ID(TAG_SPECIAL, (i % 2) ? 2 : 1);
+ }
+
+ if(!is_imm0) unload_module(hd_data, "imm");
+ if(!is_ppa0) unload_module(hd_data, "ppa");
+
+ if((hd_data->debug & HD_DEB_PARALLEL)) dump_parallel_data(hd_data, log);
+
+ free_mem(unix_dev);
+
+ free_str_list(log);
+
+}
+
+void dump_parallel_data(hd_data_t *hd_data, str_list_t *sl)
+{
+ ADD2LOG("----- parallel info -----\n");
+ for(; sl; sl = sl->next) {
+ ADD2LOG("%s", sl->str);
+ }
+ ADD2LOG("----- parallel info end -----\n");
+}
+
+#endif /* ifndef LIBHD_TINY */
+
--- /dev/null
+void hd_scan_parallel(hd_data_t *hd_data);
--- /dev/null
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <ctype.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+typedef unsigned long kernel_ulong_t;
+#include <linux/types.h>
+#ifdef __UCLIBC__
+#include <linux/pci.h>
+#else
+#include <sys/pci.h>
+#endif
+
+#include "hd.h"
+#include "hd_int.h"
+#include "hddb.h"
+#include "pci.h"
+
+/*
+ * linux/ioport.h
+ */
+#define IORESOURCE_BITS 0x000000ff
+#define IORESOURCE_IO 0x00000100
+#define IORESOURCE_MEM 0x00000200
+#define IORESOURCE_IRQ 0x00000400
+#define IORESOURCE_DMA 0x00000800
+#define IORESOURCE_PREFETCH 0x00001000
+#define IORESOURCE_READONLY 0x00002000
+#define IORESOURCE_CACHEABLE 0x00004000
+#define IORESOURCE_DISABLED 0x10000000
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ * pci stuff
+ *
+ * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ */
+
+static struct sysfs_attribute *hd_read_single_sysfs_attribute(char *path, char *name);
+static void get_pci_data(hd_data_t *hd_data);
+static void add_pci_data(hd_data_t *hd_data);
+static void add_driver_info(hd_data_t *hd_data);
+static pci_t *add_pci_entry(hd_data_t *hd_data, pci_t *new_pci);
+static unsigned char pci_cfg_byte(pci_t *pci, int fd, unsigned idx);
+static void dump_pci_data(hd_data_t *hd_data);
+
+void hd_scan_sysfs_pci(hd_data_t *hd_data)
+{
+ if(!hd_probe_feature(hd_data, pr_pci)) return;
+
+ hd_data->module = mod_pci;
+
+ /* some clean-up */
+ remove_hd_entries(hd_data);
+ hd_data->pci = NULL;
+
+ PROGRESS(1, 0, "sysfs drivers");
+
+ hd_sysfs_driver_list(hd_data);
+
+ PROGRESS(2, 0, "get sysfs pci data");
+
+ get_pci_data(hd_data);
+ if(hd_data->debug) dump_pci_data(hd_data);
+
+ add_pci_data(hd_data);
+}
+
+
+/*
+ * sysfs_get_device_attr() reads *all* device attributes, then returns the
+ * requested one.
+ *
+ * This leads to problems where some attribute *must not* be read.
+ */
+struct sysfs_attribute *hd_read_single_sysfs_attribute(char *path, char *name)
+{
+ char *attr_path = NULL;
+ struct sysfs_attribute *attr;
+
+ str_printf(&attr_path, 0, "%s/%s", path, name);
+ attr = sysfs_open_attribute(attr_path);
+ free_mem(attr_path);
+
+ sysfs_read_attribute(attr);
+
+ return attr;
+}
+
+
+/*
+ * Get the (raw) PCI data, taken from /sys/bus/pci/.
+ *
+ * Note: non-root users can only read the first 64 bytes (of 256)
+ * of the device headers.
+ */
+void get_pci_data(hd_data_t *hd_data)
+{
+ uint64_t ul0, ul1, ul2;
+ unsigned u, u0, u1, u2, u3;
+ unsigned char nxt;
+ str_list_t *sl;
+ char *s;
+ pci_t *pci;
+ int fd;
+
+ struct sysfs_bus *sf_bus;
+ struct dlist *sf_dev_list;
+ struct sysfs_device *sf_dev;
+ struct sysfs_attribute *attr;
+
+ sf_bus = sysfs_open_bus("pci");
+
+ if(!sf_bus) {
+ ADD2LOG("sysfs: no such bus: pci\n");
+ return;
+ }
+
+ sf_dev_list = sysfs_get_bus_devices(sf_bus);
+ if(sf_dev_list) dlist_for_each_data(sf_dev_list, sf_dev, struct sysfs_device) {
+ ADD2LOG(
+ " pci device: name = %s, bus_id = %s, bus = %s\n path = %s\n",
+ sf_dev->name,
+ sf_dev->bus_id,
+ sf_dev->bus,
+ hd_sysfs_id(sf_dev->path)
+ );
+
+ if(sscanf(sf_dev->bus_id, "%x:%x:%x.%x", &u0, &u1, &u2, &u3) != 4) continue;
+
+ pci = add_pci_entry(hd_data, new_mem(sizeof *pci));
+
+ pci->sysfs_id = new_str(sf_dev->path);
+ pci->sysfs_bus_id = new_str(sf_dev->bus_id);
+
+ pci->bus = (u0 << 8) + u1;
+ pci->slot = u2;
+ pci->func = u3;
+
+ if(hd_attr_uint(attr = hd_read_single_sysfs_attribute(sf_dev->path, "class"), &ul0, 0)) {
+ ADD2LOG(" class = 0x%x\n", (unsigned) ul0);
+ pci->prog_if = ul0 & 0xff;
+ pci->sub_class = (ul0 >> 8) & 0xff;
+ pci->base_class = (ul0 >> 16) & 0xff;
+ }
+ sysfs_close_attribute(attr);
+
+ if(hd_attr_uint(attr = hd_read_single_sysfs_attribute(sf_dev->path, "vendor"), &ul0, 0)) {
+ ADD2LOG(" vendor = 0x%x\n", (unsigned) ul0);
+ pci->vend = ul0 & 0xffff;
+ }
+ sysfs_close_attribute(attr);
+
+ if(hd_attr_uint(attr = hd_read_single_sysfs_attribute(sf_dev->path, "device"), &ul0, 0)) {
+ ADD2LOG(" device = 0x%x\n", (unsigned) ul0);
+ pci->dev = ul0 & 0xffff;
+ }
+ sysfs_close_attribute(attr);
+
+ if(hd_attr_uint(attr = hd_read_single_sysfs_attribute(sf_dev->path, "subsystem_vendor"), &ul0, 0)) {
+ ADD2LOG(" subvendor = 0x%x\n", (unsigned) ul0);
+ pci->sub_vend = ul0 & 0xffff;
+ }
+ sysfs_close_attribute(attr);
+
+ if(hd_attr_uint(attr = hd_read_single_sysfs_attribute(sf_dev->path, "subsystem_device"), &ul0, 0)) {
+ ADD2LOG(" subdevice = 0x%x\n", (unsigned) ul0);
+ pci->sub_dev = ul0 & 0xffff;
+ }
+ sysfs_close_attribute(attr);
+
+ if(hd_attr_uint(attr = hd_read_single_sysfs_attribute(sf_dev->path, "irq"), &ul0, 0)) {
+ ADD2LOG(" irq = %d\n", (unsigned) ul0);
+ pci->irq = ul0;
+ }
+ sysfs_close_attribute(attr);
+
+ sl = hd_attr_list(attr = hd_read_single_sysfs_attribute(sf_dev->path, "resource"));
+ for(u = 0; sl; sl = sl->next, u++) {
+ if(
+ sscanf(sl->str, "0x%"SCNx64" 0x%"SCNx64" 0x%"SCNx64, &ul0, &ul1, &ul2) == 3 &&
+ ul1 &&
+ u < sizeof pci->base_addr / sizeof *pci->base_addr
+ ) {
+ ADD2LOG(" res[%u] = 0x%"PRIx64" 0x%"PRIx64" 0x%"PRIx64"\n", u, ul0, ul1, ul2);
+ pci->base_addr[u] = ul0;
+ pci->base_len[u] = ul1 + 1 - ul0;
+ pci->addr_flags[u] = ul2;
+ }
+ }
+ sysfs_close_attribute(attr);
+
+ s = NULL;
+ str_printf(&s, 0, "%s/config", sf_dev->path);
+ if((fd = open(s, O_RDONLY)) != -1) {
+ pci->data_len = pci->data_ext_len = read(fd, pci->data, 0x40);
+ ADD2LOG(" config[%u]\n", pci->data_len);
+
+ if(pci->data_len >= 0x40) {
+ pci->hdr_type = pci->data[PCI_HEADER_TYPE] & 0x7f;
+ pci->cmd = pci->data[PCI_COMMAND] + (pci->data[PCI_COMMAND + 1] << 8);
+
+ if(pci->hdr_type == 1 || pci->hdr_type == 2) { /* PCI or CB bridge */
+ pci->secondary_bus = pci->data[PCI_SECONDARY_BUS];
+ /* PCI_SECONDARY_BUS == PCI_CB_CARD_BUS */
+ }
+
+ for(u = 0; u < sizeof pci->base_addr / sizeof *pci->base_addr; u++) {
+ if((pci->addr_flags[u] & IORESOURCE_IO)) {
+ if(!(pci->cmd & PCI_COMMAND_IO)) pci->addr_flags[u] |= IORESOURCE_DISABLED;
+ }
+
+ if((pci->addr_flags[u] & IORESOURCE_MEM)) {
+ if(!(pci->cmd & PCI_COMMAND_MEMORY)) pci->addr_flags[u] |= IORESOURCE_DISABLED;
+ }
+ }
+
+ /* let's get through the capability list */
+ if(
+ pci->hdr_type == PCI_HEADER_TYPE_NORMAL &&
+ (nxt = pci->data[PCI_CAPABILITY_LIST])
+ ) {
+ /*
+ * Cut out after 16 capabilities to avoid infinite recursion due
+ * to (potentially) malformed data. 16 is more or less
+ * arbitrary, though (the capabilities are bits in a byte, so 8 entries
+ * should suffice).
+ */
+ for(u = 0; u < 16 && nxt && nxt <= 0xfe; u++) {
+ switch(pci_cfg_byte(pci, fd, nxt)) {
+ case PCI_CAP_ID_PM:
+ pci->flags |= (1 << pci_flag_pm);
+ break;
+
+ case PCI_CAP_ID_AGP:
+ pci->flags |= (1 << pci_flag_agp);
+ break;
+ }
+ nxt = pci_cfg_byte(pci, fd, nxt + 1);
+ }
+ }
+ }
+
+ close(fd);
+ }
+ s = free_mem(s);
+
+ pci->rev = pci->data[PCI_REVISION_ID];
+
+ if((pci->addr_flags[6] & IORESOURCE_MEM)) {
+ if(!(pci->data[PCI_ROM_ADDRESS] & PCI_ROM_ADDRESS_ENABLE)) {
+ pci->addr_flags[6] |= IORESOURCE_DISABLED;
+ }
+ }
+
+ pci->flags |= (1 << pci_flag_ok);
+ }
+
+ sysfs_close_bus(sf_bus);
+}
+
+
+void add_pci_data(hd_data_t *hd_data)
+{
+ hd_t *hd, *hd2;
+ pci_t *pci, *pnext;
+ hd_res_t *res;
+ unsigned u;
+ char *s, *t;
+
+ PROGRESS(4, 0, "build list");
+
+ for(pci = hd_data->pci; pci; pci = pnext) {
+ pnext = pci->next;
+ hd = add_hd_entry(hd_data, __LINE__, 0);
+
+ hd->sysfs_id = new_str(hd_sysfs_id(pci->sysfs_id));
+ s = hd_sysfs_find_driver(hd_data, hd->sysfs_id, 1);
+ if(s) add_str_list(&hd->drivers, s);
+
+ if(pci->sysfs_bus_id && *pci->sysfs_bus_id) {
+ hd->sysfs_bus_id = new_str(pci->sysfs_bus_id);
+ }
+
+ hd->bus.id = bus_pci;
+ hd->slot = pci->slot + (pci->bus << 8);
+ hd->func = pci->func;
+ hd->base_class.id = pci->base_class;
+ hd->sub_class.id = pci->sub_class;
+ hd->prog_if.id = pci->prog_if;
+
+ /* fix up old VGA's entries */
+ if(hd->base_class.id == bc_none && hd->sub_class.id == 0x01) {
+ hd->base_class.id = bc_display;
+ hd->sub_class.id = sc_dis_vga;
+ }
+
+ if(pci->dev || pci->vend) {
+ hd->device.id = MAKE_ID(TAG_PCI, pci->dev);
+ hd->vendor.id = MAKE_ID(TAG_PCI, pci->vend);
+ }
+ if(pci->sub_dev || pci->sub_vend) {
+ hd->sub_device.id = MAKE_ID(TAG_PCI, pci->sub_dev);
+ hd->sub_vendor.id = MAKE_ID(TAG_PCI, pci->sub_vend);
+ }
+ hd->revision.id = pci->rev;
+
+ if((u = device_class(hd_data, hd->vendor.id, hd->device.id))) {
+ hd->base_class.id = u >> 8;
+ hd->sub_class.id = u & 0xff;
+ }
+
+ for(u = 0; u < sizeof pci->base_addr / sizeof *pci->base_addr; u++) {
+ if((pci->addr_flags[u] & IORESOURCE_IO)) {
+ res = new_mem(sizeof *res);
+ res->io.type = res_io;
+ res->io.enabled = pci->addr_flags[u] & IORESOURCE_DISABLED ? 0 : 1;
+ res->io.base = pci->base_addr[u];
+ res->io.range = pci->base_len[u];
+ res->io.access = pci->addr_flags[u] & IORESOURCE_READONLY ? acc_ro : acc_rw;
+ add_res_entry(&hd->res, res);
+ }
+
+ if((pci->addr_flags[u] & IORESOURCE_MEM)) {
+ res = new_mem(sizeof *res);
+ res->mem.type = res_mem;
+ res->mem.enabled = pci->addr_flags[u] & IORESOURCE_DISABLED ? 0 : 1;
+ res->mem.base = pci->base_addr[u];
+ res->mem.range = pci->base_len[u];
+ res->mem.access = pci->addr_flags[u] & IORESOURCE_READONLY ? acc_ro : acc_rw;
+ res->mem.prefetch = pci->addr_flags[u] & IORESOURCE_PREFETCH ? flag_yes : flag_no;
+ add_res_entry(&hd->res, res);
+ }
+ }
+
+ if(pci->irq) {
+ res = new_mem(sizeof *res);
+ res->irq.type = res_irq;
+ res->irq.enabled = 1;
+ res->irq.base = pci->irq;
+ add_res_entry(&hd->res, res);
+ }
+
+ hd->detail = new_mem(sizeof *hd->detail);
+ hd->detail->type = hd_detail_pci;
+ hd->detail->pci.data = pci;
+ if(pci->flags & (1 << pci_flag_agp)) hd->is.agp = 1;
+ pci->next = NULL;
+ }
+ hd_data->pci = NULL;
+
+ for(hd = hd_data->hd; hd; hd = hd->next) {
+ if(hd->bus.id == bus_pci && hd->sysfs_id) {
+ s = new_str(hd->sysfs_id);
+
+ if((t = strrchr(s, '/'))) {
+ *t = 0;
+ if((hd2 = hd_find_sysfs_id(hd_data, s))) {
+ hd->attached_to = hd2->idx;
+ }
+ }
+ free_mem(s);
+ }
+ }
+
+ add_driver_info(hd_data);
+}
+
+
+/*
+ * Add driver info in some special cases.
+ */
+void add_driver_info(hd_data_t *hd_data)
+{
+ hd_t *hd;
+ hd_res_t *res;
+
+ for(hd = hd_data->hd; hd; hd = hd->next) {
+ if(hd->bus.id != bus_pci) continue;
+
+ if(
+ (
+ hd->base_class.id == bc_serial &&
+ hd->sub_class.id == sc_ser_fire
+ ) ||
+ (
+ hd->base_class.id == bc_serial &&
+ hd->sub_class.id == sc_ser_usb
+ )
+ ) {
+ for(res = hd->res; res; res = res->next) {
+ if(res->any.type == res_irq) break;
+ }
+ if(!res) hd->is.notready = 1;
+ continue;
+ }
+ }
+}
+
+
+#if 1
+/*
+ * Store a raw PCI entry; just for convenience.
+ */
+pci_t *add_pci_entry(hd_data_t *hd_data, pci_t *new_pci)
+{
+ pci_t **pci = &hd_data->pci;
+
+ while(*pci) pci = &(*pci)->next;
+
+ return *pci = new_pci;
+}
+
+#else
+
+/*
+ * Store a raw PCI entry; just for convenience.
+ *
+ * Reverse order.
+ */
+pci_t *add_pci_entry(hd_data_t *hd_data, pci_t *new_pci)
+{
+ new_pci->next = hd_data->pci;
+
+ return hd_data->pci = new_pci;
+}
+#endif
+
+
+/*
+ * get a byte from pci config space
+ */
+unsigned char pci_cfg_byte(pci_t *pci, int fd, unsigned idx)
+{
+ unsigned char uc;
+
+ if(idx >= sizeof pci->data) return 0;
+ if(idx < pci->data_len) return pci->data[idx];
+ if(idx < pci->data_ext_len && pci->data[idx]) return pci->data[idx];
+ if(lseek(fd, idx, SEEK_SET) != (off_t) idx) return 0;
+ if(read(fd, &uc, 1) != 1) return 0;
+ pci->data[idx] = uc;
+
+ if(idx >= pci->data_ext_len) pci->data_ext_len = idx + 1;
+
+ return uc;
+}
+/*
+ * Add a dump of all raw PCI data to the global log.
+ */
+void dump_pci_data(hd_data_t *hd_data)
+{
+ pci_t *pci;
+ char *s = NULL;
+ char buf[32];
+ int i, j;
+
+ ADD2LOG("---------- PCI raw data ----------\n");
+
+ for(pci = hd_data->pci; pci; pci = pci->next) {
+
+ if(!(pci->flags & (1 << pci_flag_ok))) str_printf(&s, -1, "oops");
+ if(pci->flags & (1 << pci_flag_pm)) str_printf(&s, -1, ",pm");
+ if(pci->flags & (1 << pci_flag_agp)) str_printf(&s, -1, ",agp");
+ if(!s) str_printf(&s, 0, "%s", "");
+
+ *buf = 0;
+ if(pci->secondary_bus) {
+ sprintf(buf, "->%02x", pci->secondary_bus);
+ }
+
+ ADD2LOG(
+ "bus %02x%s, slot %02x, func %x, vend:dev:s_vend:s_dev:rev %04x:%04x:%04x:%04x:%02x\n",
+ pci->bus, buf, pci->slot, pci->func, pci->vend, pci->dev, pci->sub_vend, pci->sub_dev, pci->rev
+ );
+ ADD2LOG(
+ "class %02x, sub_class %02x prog_if %02x, hdr %x, flags <%s>, irq %u\n",
+ pci->base_class, pci->sub_class, pci->prog_if, pci->hdr_type, *s == ',' ? s + 1 : s, pci->irq
+ );
+
+ s = free_mem(s);
+
+ for(i = 0; i < 6; i++) {
+ if(pci->base_addr[i] || pci->base_len[i])
+ ADD2LOG(" addr%d %08"PRIx64", size %08"PRIx64"\n", i, pci->base_addr[i], pci->base_len[i]);
+ }
+ if(pci->rom_base_addr)
+ ADD2LOG(" rom %08"PRIx64"\n", pci->rom_base_addr);
+
+ if(pci->log) ADD2LOG("%s", pci->log);
+
+ for(i = 0; (unsigned) i < pci->data_ext_len; i += 0x10) {
+ ADD2LOG(" %02x: ", i);
+ j = pci->data_ext_len - i;
+ hexdump(&hd_data->log, 1, j > 0x10 ? 0x10 : j, pci->data + i);
+ ADD2LOG("\n");
+ }
+
+ if(pci->next) ADD2LOG("\n");
+ }
+
+ ADD2LOG("---------- PCI raw data end ----------\n");
+}
+
+
+/*
+ * Parse attribute and return integer value.
+ */
+int hd_attr_uint(struct sysfs_attribute *attr, uint64_t *u, int base)
+{
+ char *s;
+ uint64_t u2;
+ int ok;
+
+ if(!(s = hd_attr_str(attr))) return 0;
+
+ u2 = strtoull(s, &s, base);
+ ok = !*s || isspace(*s) ? 1 : 0;
+
+ if(ok && u) *u = u2;
+
+ return ok;
+}
+
+
+/*
+ * Return attribute as string list.
+ */
+str_list_t *hd_attr_list(struct sysfs_attribute *attr)
+{
+ static str_list_t *sl = NULL;
+
+ free_str_list(sl);
+
+ return sl = hd_split('\n', hd_attr_str(attr));
+}
+
+
+/*
+ * Return attribute as string.
+ */
+char *hd_attr_str(struct sysfs_attribute *attr)
+{
+ return attr ? attr->value : NULL;
+}
+
+
+/*
+ * Remove leading "/sys" from path.
+ */
+char *hd_sysfs_id(char *path)
+{
+ if(!path || !*path) return NULL;
+
+ return strchr(path + 1, '/');
+}
+
+
+/*
+ * Convert '!' to '/'.
+ */
+char *hd_sysfs_name2_dev(char *str)
+{
+ static char *s = NULL;
+
+ if(!str) return NULL;
+
+ free_mem(s);
+ s = str = new_str(str);
+
+ while(*str) {
+ if(*str == '!') *str = '/';
+ str++;
+ }
+
+ return s;
+}
+
+
+/*
+ * Convert '/' to '!'.
+ */
+char *hd_sysfs_dev2_name(char *str)
+{
+ static char *s = NULL;
+
+ if(!str) return NULL;
+
+ free_mem(s);
+ s = str = new_str(str);
+
+ while(*str) {
+ if(*str == '/') *str = '!';
+ str++;
+ }
+
+ return s;
+}
+
+
--- /dev/null
+void hd_scan_sysfs_pci(hd_data_t *hd_data);
--- /dev/null
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <dirent.h>
+#include <sys/ioctl.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/mount.h>
+#include <linux/hdreg.h>
+
+#include "hd.h"
+#include "hd_int.h"
+#include "pcmcia.h"
+
+static void read_cardinfo(hd_data_t *hd_data);
+static void assign_bridges(hd_data_t *hd_data);
+static void add_sysfs_stuff(hd_data_t *hd_data, hd_t *hd);
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ * PCMCIA info via cardctl
+ *
+ * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ */
+
+
+void hd_scan_pcmcia(hd_data_t *hd_data)
+{
+ if(!hd_probe_feature(hd_data, pr_pcmcia)) return;
+
+ hd_data->module = mod_pcmcia;
+
+ /* some clean-up */
+ remove_hd_entries(hd_data);
+
+ read_cardinfo(hd_data);
+
+ assign_bridges(hd_data);
+
+}
+
+
+void read_cardinfo(hd_data_t *hd_data)
+{
+ str_list_t *sl, *sl0, *sl1;
+ int i0, i1, pcmcia_sock, manf_id0, manf_id1, func, prod_info;
+ char buf0[256], buf1[256], buf2[256], buf3[256];
+ hd_t *hd;
+ unsigned cardbus = 0; /* bitmask: cardbus vs. pc-card */
+
+ sl0 = read_file("| /sbin/cardctl status 2>/dev/null", 0, 0);
+
+ ADD2LOG("----- cardctl status -----\n");
+ for(sl = sl0; sl; sl = sl->next) {
+ ADD2LOG(" %s", sl->str);
+ }
+ ADD2LOG("----- cardctl status end -----\n");
+
+ for(pcmcia_sock = -1, sl = sl0; sl; sl = sl->next) {
+ if(sscanf(sl->str, " Socket %d:", &i0) == 1) {
+ pcmcia_sock = i0;
+ continue;
+ }
+
+ if(strstr(sl->str, " CardBus card")) {
+ if(pcmcia_sock >= 0 && pcmcia_sock < 8 * (int) sizeof cardbus) {
+ cardbus |= 1 << pcmcia_sock;
+ }
+ pcmcia_sock = -1;
+ continue;
+ }
+ }
+
+ free_str_list(sl0);
+
+ sl0 = read_file("| /sbin/cardctl ident 2>/dev/null", 0, 0);
+
+ ADD2LOG("----- cardctl ident -----\n");
+ for(sl = sl0; sl; sl = sl->next) {
+ ADD2LOG(" %s", sl->str);
+ }
+ ADD2LOG("----- cardctl ident end -----\n");
+
+ for(
+ pcmcia_sock = manf_id0 = manf_id1 = func = prod_info = -1, sl = sl0;
+ sl;
+ sl = sl->next
+ ) {
+ if(sscanf(sl->str, " manfid: %i, %i", &i0, &i1) == 2) {
+ manf_id0 = i0;
+ manf_id1 = i1;
+ }
+
+ if(sscanf(sl->str, " function: %d", &i0) == 1) {
+ /*
+ * "multifunction", "memory", "serial", "parallel",
+ * "fixed disk", "video", "network", "AIMS",
+ * "SCSI"
+ */
+ func = i0;
+ }
+
+ if(
+ (i0 = sscanf(
+ sl->str,
+ " product info: \"%255[^\"]\", \"%255[^\"]\", \"%255[^\"]\", \"%255[^\"]\"",
+ buf0, buf1, buf2, buf3
+ )) >= 1
+ ) {
+ prod_info = i0;
+ }
+
+ if(sscanf(sl->str, " Socket %d:", &i0) == 1) {
+ i1 = 1;
+ }
+ else {
+ i1 = 0;
+ }
+
+ if(i1 || !sl->next) {
+ if(pcmcia_sock >= 0 && (prod_info >= 1 || manf_id0 != -1)) {
+ hd = add_hd_entry(hd_data, __LINE__, 0);
+ hd->bus.id = bus_pcmcia;
+ hd->slot = pcmcia_sock;
+ hd->hotplug_slot = pcmcia_sock + 1;
+ if(manf_id0 != -1 && manf_id1 != -1) {
+ hd->vendor.id = MAKE_ID(TAG_PCMCIA, manf_id0);
+ hd->device.id = MAKE_ID(TAG_PCMCIA, manf_id1);
+ }
+ if(pcmcia_sock < 8 * (int) sizeof cardbus && (cardbus & (1 << pcmcia_sock))) {
+ hd->hotplug = hp_cardbus;
+ }
+ else {
+ hd->hotplug = hp_pcmcia;
+ }
+
+ if(func == 6) {
+ hd->base_class.id = bc_network;
+ hd->sub_class.id = 0x80; /* other */
+ }
+ if(prod_info >= 1) add_str_list(&hd->extra_info, buf0);
+ if(prod_info >= 2) add_str_list(&hd->extra_info, buf1);
+ if(prod_info >= 3) add_str_list(&hd->extra_info, buf2);
+ if(prod_info >= 4) add_str_list(&hd->extra_info, buf3);
+ if(prod_info >= 2) {
+ hd->vendor.name = new_str(buf0);
+ hd->device.name = new_str(buf1);
+ }
+ for(sl1 = hd->extra_info; sl1 ; sl1 = sl1->next) {
+ if(strstr(sl1->str, "Ethernet")) hd->sub_class.id = 0; /* ethernet */
+ if(
+ !hd->revision.name &&
+ !sl1->next &&
+ (
+ !strncasecmp(sl1->str, "rev.", sizeof "rev." - 1) ||
+ (
+ (sl1->str[0] == 'V' || sl1->str[0] == 'v') &&
+ (sl1->str[1] >= '0' && sl1->str[1] <= '9')
+ )
+ )
+ ) {
+ hd->revision.name = new_str(sl1->str);
+ }
+ }
+ }
+
+ manf_id0 = manf_id1 = func = prod_info = -1;
+ }
+
+ if(i1) pcmcia_sock = i0;
+
+ }
+
+ free_str_list(sl0);
+}
+
+
+/*
+ * Identify hotpluggable devices.
+ */
+void assign_bridges(hd_data_t *hd_data)
+{
+ hd_t *hd, *hd1, *bridge_hd;
+ unsigned p_sock[8], p_socks, u = 0;
+
+ for(hd = hd_data->hd; hd; hd = hd->next) {
+ if((bridge_hd = hd_get_device_by_idx(hd_data, hd->attached_to))) {
+ if(
+ bridge_hd->base_class.id == bc_bridge &&
+ bridge_hd->sub_class.id == sc_bridge_cardbus
+ ) {
+ hd->hotplug = hp_cardbus;
+ }
+ else if(
+ bridge_hd->base_class.id == bc_bridge &&
+ bridge_hd->sub_class.id == sc_bridge_pcmcia
+ ) {
+ hd->hotplug = hp_pcmcia;
+ }
+ }
+ }
+
+ for(p_socks = 0, hd = hd_data->hd; hd; hd = hd->next) {
+ if(
+ u < sizeof p_sock / sizeof *p_sock &&
+ is_pcmcia_ctrl(hd_data, hd)
+ ) {
+ p_sock[p_socks++] = hd->idx;
+ }
+ }
+
+ if(p_socks) {
+ for(hd = hd_data->hd; hd; hd = hd->next) {
+ if(
+ !hd->tag.remove &&
+ hd->bus.id == bus_pcmcia &&
+ hd->slot < p_socks &&
+ p_sock[hd->slot]
+ ) {
+ for(u = p_sock[hd->slot], hd1 = hd_data->hd; hd1; hd1 = hd1->next) {
+ if(hd1->tag.remove) continue;
+ if(hd1->status.available == status_no) continue;
+ if(hd1->attached_to == u) break;
+ }
+ if(hd1) {
+ hd1->hotplug = hd->hotplug;
+ hd1->hotplug_slot = hd->hotplug_slot;
+ if(!hd1->extra_info) {
+ hd1->extra_info = hd->extra_info;
+ hd->extra_info = NULL;
+ }
+ hd->tag.remove = 1;
+ }
+ else {
+ hd->attached_to = p_sock[hd->slot];
+ add_sysfs_stuff(hd_data, hd);
+ }
+ p_sock[hd->slot] = 0;
+ }
+ }
+
+ remove_tagged_hd_entries(hd_data);
+ }
+}
+
+
+void add_sysfs_stuff(hd_data_t *hd_data, hd_t *hd)
+{
+ hd_t *hd_par;
+ char *s = NULL, *s1;
+ struct sysfs_device *sf_dev;
+
+ hd_par = hd_get_device_by_idx(hd_data, hd->attached_to);
+
+ if(!hd_par || !hd_par->sysfs_id || hd->sysfs_id) return;
+
+ str_printf(&s, 0, "/sys%s/%d.0", hd_par->sysfs_id, hd->slot);
+
+ sf_dev = sysfs_open_device_path(s);
+
+ if(sf_dev) {
+ hd->sysfs_id = new_str(hd_sysfs_id(s));
+ s1 = hd_sysfs_find_driver(hd_data, hd->sysfs_id, 1);
+ if(s1) add_str_list(&hd->drivers, s1);
+ }
+
+ sysfs_close_device(sf_dev);
+
+ s = free_mem(s);
+}
+
--- /dev/null
+void hd_scan_pcmcia(hd_data_t *hd_data);
--- /dev/null
+
+/*
+ * License: GPL
+ *
+ * Much inspired by rp-pppoe from Roaring Penguin Software Inc.
+ * which itself is inspired by earlier code from Luke Stras.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/ioctl.h>
+#include <sys/socket.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <string.h>
+#include <linux/if.h>
+#include <net/ethernet.h>
+#include <net/if_arp.h>
+#include <netinet/in.h>
+#include <netpacket/packet.h>
+
+#include "hd.h"
+#include "hd_int.h"
+#include "pppoe.h"
+
+static hd_data_t *hd_data;
+
+/* Ethernet Frame Types */
+#define ETH_PPPOE_DISCOVERY 0x8863
+#define ETH_PPPOE_SESSION 0x8864
+
+/* PPPoE Codes */
+#define CODE_PADI 0x09
+#define CODE_PADO 0x07
+#define CODE_PADR 0x19
+#define CODE_PADS 0x65
+#define CODE_PADT 0xA7
+
+/* PPPoE Tags */
+#define TAG_END_OF_LIST 0x0000
+#define TAG_SERVICE_NAME 0x0101
+#define TAG_AC_NAME 0x0102
+#define TAG_HOST_UNIQ 0x0103
+#define TAG_AC_COOKIE 0x0104
+#define TAG_VENDOR_SPECIFIC 0x0105
+#define TAG_RELAY_SESSION_ID 0x0110
+#define TAG_SERVICE_NAME_ERROR 0x0201
+#define TAG_AC_SYSTEM_ERROR 0x0202
+#define TAG_GENERIC_ERROR 0x0203
+
+/* Number of Attempts */
+#define MAX_ATTEMPTS 2
+
+/* Timeout for PADO Packets */
+#define PADO_TIMEOUT 3
+
+/* A PPPoE Packet, including Ethernet headers */
+typedef struct PPPoEPacketStruct {
+ struct ethhdr ethHdr; /* Ethernet header */
+ unsigned int ver:4; /* PPPoE Version (must be 1) */
+ unsigned int type:4; /* PPPoE Type (must be 1) */
+ unsigned int code:8; /* PPPoE code */
+ unsigned int session:16; /* PPPoE session */
+ unsigned int length:16; /* Payload length */
+ unsigned char payload[ETH_DATA_LEN]; /* A bit of room to spare */
+} PPPoEPacket;
+
+/* Header size of a PPPoE Packet */
+#define PPPOE_OVERHEAD 6 /* type, code, session, length */
+#define HDR_SIZE (sizeof (struct ethhdr) + PPPOE_OVERHEAD)
+#define MAX_PPPOE_PAYLOAD (ETH_DATA_LEN - PPPOE_OVERHEAD)
+
+/* PPPoE Tag */
+typedef struct PPPoETagStruct {
+ unsigned int type:16; /* tag type */
+ unsigned int length:16; /* Length of payload */
+ unsigned char payload[ETH_DATA_LEN]; /* A LOT of room to spare */
+} PPPoETag;
+
+/* Header size of a PPPoE Tag */
+#define TAG_HDR_SIZE 4
+
+/* Function passed to parse_packet */
+typedef void parse_func (uint16_t type, uint16_t len,
+ unsigned char* data, void* extra);
+
+/* Keep track of the state of a connection */
+typedef struct PPPoEConnectionStruct {
+ char* ifname; /* Interface name */
+ int fd; /* Raw socket for discovery frames */
+ int received_pado; /* Where we are in discovery */
+ unsigned char my_mac[ETH_ALEN]; /* My MAC address */
+ unsigned char peer_mac[ETH_ALEN]; /* Peer's MAC address */
+ hd_t *hd;
+} PPPoEConnection;
+
+/* Structure used to determine acceptable PADO packet */
+typedef struct PacketCriteriaStruct {
+ PPPoEConnection* conn;
+ int acname_ok;
+ int servicename_ok;
+ int error;
+} PacketCriteria;
+
+/* True if Ethernet address is broadcast or multicast */
+#define NOT_UNICAST(e) ((e[0] & 0x01) != 0)
+
+
+static int
+check_room (PPPoEConnection* conn, unsigned char* cursor, unsigned char* start,
+ uint16_t len)
+{
+ if (cursor - start + len > MAX_PPPOE_PAYLOAD) {
+ ADD2LOG ("%s: Would create too-long packet\n", conn->ifname);
+ return 0;
+ }
+ return 1;
+}
+
+
+static int
+parse_packet (PPPoEConnection* conn, PPPoEPacket* packet, parse_func* func,
+ void* extra)
+{
+ uint16_t len = ntohs (packet->length);
+ unsigned char* curTag;
+ uint16_t tagType, tagLen;
+
+ if (packet->ver != 1) {
+ ADD2LOG ("%s: Invalid PPPoE version (%d)\n", conn->ifname,
+ (int) packet->ver);
+ return 0;
+ }
+
+ if (packet->type != 1) {
+ ADD2LOG ("%s: Invalid PPPoE type (%d)\n", conn->ifname,
+ (int) packet->type);
+ return 0;
+ }
+
+ /* Do some sanity checks on packet. */
+ if (len > ETH_DATA_LEN - 6) { /* 6-byte overhead for PPPoE header */
+ ADD2LOG ("%s: Invalid PPPoE packet length (%u)\n", conn->ifname, len);
+ return 0;
+ }
+
+ /* Step through the tags. */
+ curTag = packet->payload;
+ while (curTag - packet->payload < len) {
+ /* Alignment is not guaranteed, so do this by hand. */
+ tagType = (((uint16_t) curTag[0]) << 8) + (uint16_t) curTag[1];
+ tagLen = (((uint16_t) curTag[2]) << 8) + (uint16_t) curTag[3];
+ if (tagType == TAG_END_OF_LIST)
+ break;
+ if ((curTag - packet->payload) + tagLen + TAG_HDR_SIZE > len) {
+ ADD2LOG ("%s: Invalid PPPoE tag length (%u)\n", conn->ifname,
+ tagLen);
+ return 0;
+ }
+ func (tagType, tagLen, curTag + TAG_HDR_SIZE, extra);
+ curTag = curTag + TAG_HDR_SIZE + tagLen;
+ }
+
+ return 1;
+}
+
+
+static int
+open_interfaces (int n, PPPoEConnection* conns)
+{
+ int ret = 0, i;
+
+ for (i = 0; i < n; i++)
+ {
+ PPPoEConnection* conn = &conns[i];
+
+ conn->fd = socket (PF_PACKET, SOCK_RAW, htons (ETH_PPPOE_DISCOVERY));
+ if (conn->fd < 0) {
+ ADD2LOG ("%s: socket failed: %m\n", conn->ifname);
+ continue;
+ }
+
+ int one = 1;
+ if (setsockopt (conn->fd, SOL_SOCKET, SO_BROADCAST, &one,
+ sizeof (one)) < 0) {
+ ADD2LOG ("%s: setsockopt failed: %m\n", conn->ifname);
+ goto error;
+ }
+
+ /* Fill in hardware address */
+ struct ifreq ifr;
+ struct sockaddr_ll sa;
+ memset (&sa, 0, sizeof (sa));
+ strncpy (ifr.ifr_name, conn->ifname, sizeof (ifr.ifr_name));
+ if (ioctl (conn->fd, SIOCGIFHWADDR, &ifr) < 0) {
+ ADD2LOG ("%s: ioctl (SIOCGIFHWADDR) failed: %m\n", conn->ifname);
+ goto error;
+ }
+
+ memcpy (conn->my_mac, ifr.ifr_hwaddr.sa_data, ETH_ALEN);
+ if (ifr.ifr_hwaddr.sa_family != ARPHRD_ETHER) {
+ ADD2LOG ("%s: Interface is not ethernet\n", conn->ifname);
+ goto error;
+ }
+
+ if (NOT_UNICAST (conn->my_mac)) {
+ ADD2LOG ("%s: Interface has broadcast/multicast MAC address?\n",
+ conn->ifname);
+ goto error;
+ }
+
+ /* Sanity check on MTU */
+ strncpy (ifr.ifr_name, conn->ifname, sizeof (ifr.ifr_name));
+ if (ioctl (conn->fd, SIOCGIFMTU, &ifr) < 0) {
+ ADD2LOG ("%s: ioctl (SIOCGIFMTU) failed: %m\n", conn->ifname);
+ goto error;
+ }
+ if (ifr.ifr_mtu < ETH_DATA_LEN) {
+ ADD2LOG ("%s: Interface has to low MTU\n", conn->ifname);
+ goto error;
+ }
+
+ /* Get interface index */
+ sa.sll_family = AF_PACKET;
+ sa.sll_protocol = htons (ETH_PPPOE_DISCOVERY);
+ strncpy (ifr.ifr_name, conn->ifname, sizeof (ifr.ifr_name));
+ if (ioctl (conn->fd, SIOCGIFINDEX, &ifr) < 0) {
+ ADD2LOG ("%s: ioctl (SIOCFIGINDEX) failed: Could not get interface "
+ "index\n", conn->ifname);
+ goto error;
+ }
+ sa.sll_ifindex = ifr.ifr_ifindex;
+
+ /* We're only interested in packets on specified interface */
+ if (bind (conn->fd, (struct sockaddr*) &sa, sizeof (sa)) < 0) {
+ ADD2LOG ("%s: bind failed: %m\n", conn->ifname);
+ goto error;
+ }
+
+ ret = 1;
+ continue;
+
+error:
+
+ close (conn->fd);
+ conn->fd = -1;
+
+ }
+
+ return ret;
+}
+
+
+static void
+close_intefaces (int n, PPPoEConnection* conns)
+{
+ int i;
+
+ for (i = 0; i < n; i++)
+ {
+ PPPoEConnection* conn = &conns[i];
+
+ if (conn->fd != -1) {
+ close (conn->fd);
+ conn->fd = -1;
+ }
+ }
+}
+
+
+static int
+send_packet (int fd, PPPoEPacket* pkt, size_t size)
+{
+ if (send (fd, pkt, size, 0) < 0) {
+ ADD2LOG ("send failed: %m\n");
+ return 0;
+ }
+
+ return 1;
+}
+
+
+static int
+receive_packet (int fd, PPPoEPacket* pkt, size_t* size)
+{
+ int r = recv (fd, pkt, sizeof (PPPoEPacket), 0);
+ if (r < 0) {
+ ADD2LOG ("recv failed: %m\n");
+ return 0;
+ }
+
+ *size = r;
+ return 1;
+}
+
+
+static void
+parse_hostuniq (uint16_t type, uint16_t len, unsigned char* data, void* extra)
+{
+ if (type == TAG_HOST_UNIQ && len == sizeof (pid_t)) {
+ pid_t tmp;
+ memcpy (&tmp, data, len);
+ if (tmp == getpid ()) {
+ int* val = (int*) extra;
+ *val = 1;
+ }
+ }
+}
+
+
+static int
+packet_for_me (PPPoEConnection* conn, PPPoEPacket* packet)
+{
+ /* If packet is not directed to our MAC address, forget it. */
+ if (memcmp (packet->ethHdr.h_dest, conn->my_mac, ETH_ALEN))
+ return 0;
+
+ /* Check for HostUniq tag. */
+ int for_me = 0;
+ parse_packet (conn, packet, parse_hostuniq, &for_me);
+ return for_me;
+}
+
+
+static void
+parse_pado_tags (uint16_t type, uint16_t len, unsigned char* data, void* extra)
+{
+ PacketCriteria* pc = (PacketCriteria*) extra;
+ PPPoEConnection *conn = pc->conn;
+
+ switch (type) {
+ case TAG_AC_NAME:
+ pc->acname_ok = 1;
+ ADD2LOG ("%s: Service-Name is: %.*s\n", conn->ifname, (int) len,
+ data);
+ break;
+ case TAG_SERVICE_NAME:
+ pc->servicename_ok = len == 0;
+ break;
+ case TAG_SERVICE_NAME_ERROR:
+ ADD2LOG ("%s: Service-Name-Error: %.*s\n", conn->ifname, (int) len,
+ data);
+ pc->error = 1;
+ break;
+ case TAG_AC_SYSTEM_ERROR:
+ ADD2LOG ("%s: System-Error: %.*s\n", conn->ifname, (int) len, data);
+ pc->error = 1;
+ break;
+ case TAG_GENERIC_ERROR:
+ ADD2LOG ("%s: Generic-Error: %.*s\n", conn->ifname, (int) len, data);
+ pc->error = 1;
+ break;
+ }
+}
+
+
+static int
+send_padi (int n, PPPoEConnection* conns)
+{
+ int ret = 0, i;
+
+ for (i = 0; i < n; i++)
+ {
+ PPPoEConnection* conn = &conns[i];
+
+ if (conn->fd == -1 || conn->received_pado)
+ continue;
+
+ PPPoEPacket packet;
+ unsigned char* cursor = packet.payload;
+ PPPoETag* svc = (PPPoETag*) (&packet.payload);
+ uint16_t namelen = 0;
+ uint16_t plen;
+
+ namelen = 0;
+ plen = TAG_HDR_SIZE + namelen;
+ if (!check_room (conn, cursor, packet.payload, TAG_HDR_SIZE))
+ continue;
+
+ /* Set destination to Ethernet broadcast address */
+ memset (packet.ethHdr.h_dest, 0xFF, ETH_ALEN);
+ memcpy (packet.ethHdr.h_source, conn->my_mac, ETH_ALEN);
+
+ packet.ethHdr.h_proto = htons (ETH_PPPOE_DISCOVERY);
+ packet.ver = 1;
+ packet.type = 1;
+ packet.code = CODE_PADI;
+ packet.session = 0;
+
+ svc->type = TAG_SERVICE_NAME;
+ svc->length = htons (0);
+ if (!check_room (conn, cursor, packet.payload, namelen + TAG_HDR_SIZE))
+ continue;
+
+ cursor += namelen + TAG_HDR_SIZE;
+
+ PPPoETag hostUniq;
+ pid_t pid = getpid ();
+ hostUniq.type = htons (TAG_HOST_UNIQ);
+ hostUniq.length = htons (sizeof (pid));
+ memcpy (hostUniq.payload, &pid, sizeof (pid));
+ if (!check_room (conn, cursor, packet.payload, sizeof (pid) + TAG_HDR_SIZE))
+ continue;
+ memcpy (cursor, &hostUniq, sizeof (pid) + TAG_HDR_SIZE);
+ cursor += sizeof (pid) + TAG_HDR_SIZE;
+ plen += sizeof (pid) + TAG_HDR_SIZE;
+
+ packet.length = htons (plen);
+
+ ADD2LOG ("%s: Sending PADI packet\n", conn->ifname);
+
+ if (send_packet (conn->fd, &packet, (int) (plen + HDR_SIZE)))
+ ret = 1;
+ }
+
+ return ret;
+}
+
+
+static int
+wait_for_pado (int n, PPPoEConnection* conns)
+{
+ int r, i, all;
+ size_t len;
+ fd_set readable;
+ PPPoEPacket packet;
+ PacketCriteria pc;
+
+ struct timeval tv;
+ tv.tv_sec = PADO_TIMEOUT;
+ tv.tv_usec = 0;
+
+ while (1)
+ {
+ FD_ZERO (&readable);
+ for (i = 0; i < n; i++)
+ if (conns[i].fd != -1)
+ FD_SET (conns[i].fd, &readable);
+
+ do {
+ r = select (FD_SETSIZE, &readable, NULL, NULL, &tv);
+ } while (r == -1 && errno == EINTR);
+
+ if (r < 0) {
+ ADD2LOG ("select: %m\n");
+ return 0;
+ }
+
+ if (r == 0) {
+ ADD2LOG ("Timeout waiting for PADO packets\n");
+ return 0;
+ }
+
+ for (i = 0; i < n; i++)
+ {
+ PPPoEConnection* conn = &conns[i];
+
+ if (conn->fd == -1 || !FD_ISSET (conn->fd, &readable))
+ continue;
+
+ pc.conn = conn;
+ pc.acname_ok = 0;
+ pc.servicename_ok = 0;
+ pc.error = 0;
+
+ /* Get the packet */
+ if (!receive_packet (conn->fd, &packet, &len))
+ continue;
+
+ /* Check length */
+ if (ntohs (packet.length) + HDR_SIZE > len) {
+ ADD2LOG ("%s: Bogus PPPoE length field (%u)\n", conn->ifname,
+ (unsigned int) ntohs (packet.length));
+ continue;
+ }
+
+ /* If it's not for us, loop again */
+ if (!packet_for_me (conn, &packet))
+ continue;
+
+ if (packet.code != CODE_PADO)
+ continue;
+
+ if (NOT_UNICAST (packet.ethHdr.h_source)) {
+ ADD2LOG ("%s: Ignoring PADO packet from non-unicast MAC "
+ "address\n", conn->ifname);
+ continue;
+ }
+
+ parse_packet (conn, &packet, parse_pado_tags, &pc);
+
+ if (!pc.acname_ok) {
+ ADD2LOG ("%s: Wrong or missing AC-Name tag\n", conn->ifname);
+ continue;
+ }
+
+ if (!pc.servicename_ok) {
+ ADD2LOG ("%s: Wrong or missing Service-Name tag\n",
+ conn->ifname);
+ continue;
+ }
+
+ if (pc.error) {
+ ADD2LOG ("%s: Ignoring PADO packet with some Error tag\n",
+ conn->ifname);
+ continue;
+ }
+
+ memcpy (conn->peer_mac, packet.ethHdr.h_source, ETH_ALEN);
+ ADD2LOG ("%s: Received correct PADO packet\n", conn->ifname);
+ conn->received_pado = 1;
+ }
+
+ all = 1;
+ for (i = 0; i < n; i++)
+ if (conns[i].fd != -1 && !conns[i].received_pado)
+ all = 0;
+ if (all)
+ return 1;
+ }
+}
+
+
+static void
+discovery (int n, PPPoEConnection* conns)
+{
+ int a;
+
+ if (open_interfaces (n, conns))
+ {
+ for (a = 0; a < MAX_ATTEMPTS; a++)
+ {
+ ADD2LOG ("Attempt number %d\n", a + 1);
+
+ if (!send_padi (n, conns))
+ break;
+
+ if (wait_for_pado (n, conns))
+ break;
+ }
+ }
+
+ close_intefaces (n, conns);
+}
+
+
+void hd_scan_pppoe(hd_data_t *hd_data2)
+{
+ hd_t *hd;
+ int cnt, interfaces;
+ PPPoEConnection *conn;
+
+ hd_data = hd_data2;
+
+ if(!hd_probe_feature(hd_data, pr_pppoe)) return;
+
+ hd_data->module = mod_pppoe;
+
+ PROGRESS(1, 0, "looking for pppoe");
+
+ for(interfaces = 0, hd = hd_data->hd; hd; hd = hd->next) {
+ if(
+ hd->base_class.id == bc_network_interface &&
+ hd->sub_class.id == sc_nif_ethernet &&
+ hd->unix_dev_name
+ ) {
+ interfaces++;
+ }
+ }
+
+ if(!interfaces) return;
+
+ conn = new_mem(interfaces * sizeof *conn);
+
+ for(cnt = 0, hd = hd_data->hd; hd && cnt < interfaces; hd = hd->next) {
+ if(
+ hd->base_class.id == bc_network_interface &&
+ hd->sub_class.id == sc_nif_ethernet &&
+ hd->unix_dev_name
+ ) {
+ conn[cnt].hd = hd;
+ conn[cnt].fd = -1;
+ conn[cnt].ifname = hd->unix_dev_name;
+ cnt++;
+ }
+ }
+
+ PROGRESS(2, 0, "discovery");
+
+ discovery(interfaces, conn);
+
+ for(cnt = 0; cnt < interfaces; cnt++) {
+ conn[cnt].hd->is.pppoe = 0;
+
+ if(conn[cnt].received_pado) {
+ conn[cnt].hd->is.pppoe = 1;
+ ADD2LOG(
+ "pppoe %s: my mac %02x:%02x:%02x:%02x:%02x:%02x, "
+ "peer mac %02x:%02x:%02x:%02x:%02x:%02x\n",
+ conn[cnt].ifname,
+ conn[cnt].my_mac[0], conn[cnt].my_mac[1], conn[cnt].my_mac[2],
+ conn[cnt].my_mac[3], conn[cnt].my_mac[4], conn[cnt].my_mac[5],
+ conn[cnt].peer_mac[0], conn[cnt].peer_mac[1], conn[cnt].peer_mac[2],
+ conn[cnt].peer_mac[3], conn[cnt].peer_mac[4], conn[cnt].peer_mac[5]
+ );
+ }
+ }
+}
--- /dev/null
+void hd_scan_pppoe(hd_data_t *hd_data);
--- /dev/null
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <dirent.h>
+#include <sys/stat.h>
+
+#include "hd.h"
+#include "hd_int.h"
+#include "hddb.h"
+#include "prom.h"
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ * prom info
+ *
+ * Note: make sure that hd_scan_sysfs_pci() has been run!
+ * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ */
+
+#if defined(__PPC__)
+
+static devtree_t *add_devtree_entry(devtree_t **devtree, devtree_t *new);
+static devtree_t *new_devtree_entry(devtree_t *parent);
+static void read_str(char *path, char *name, char **str);
+static void read_mem(char *path, char *name, unsigned char **mem, unsigned len);
+static void read_int(char *path, char *name, int *val);
+static void read_devtree(hd_data_t *hd_data);
+static void add_pci_prom_devices(hd_data_t *hd_data, hd_t *hd_parent, devtree_t *parent);
+static void add_legacy_prom_devices(hd_data_t *hd_data, devtree_t *dt);
+static int add_prom_display(hd_data_t *hd_data, devtree_t *dt);
+static int add_prom_vscsi(hd_data_t *hd_data, devtree_t *dt);
+static int add_prom_veth(hd_data_t *hd_data, devtree_t *dt);
+static void add_devices(hd_data_t *hd_data);
+static void dump_devtree_data(hd_data_t *hd_data);
+
+static unsigned veth_cnt, vscsi_cnt;
+
+int detect_smp_prom(hd_data_t *hd_data)
+{
+ unsigned cpus;
+ devtree_t *devtree;
+
+ if(!(devtree = hd_data->devtree)) return -1; /* hd_scan_prom() not called */
+
+ for(cpus = 0; devtree; devtree = devtree->next) {
+ if(devtree->device_type && !strcmp(devtree->device_type, "cpu")) cpus++;
+ }
+
+ return cpus > 1 ? cpus : 0;
+}
+
+void hd_scan_prom(hd_data_t *hd_data)
+{
+ hd_t *hd;
+ unsigned char buf[16];
+ FILE *f;
+ prom_info_t *pt;
+
+ if(!hd_probe_feature(hd_data, pr_prom)) return;
+
+ hd_data->module = mod_prom;
+
+ /* some clean-up */
+ remove_hd_entries(hd_data);
+ hd_data->devtree = free_devtree(hd_data);
+
+ veth_cnt = vscsi_cnt = 0;
+
+ PROGRESS(1, 0, "devtree");
+
+ read_devtree(hd_data);
+ if(hd_data->debug) dump_devtree_data(hd_data);
+ add_devices(hd_data);
+
+ PROGRESS(2, 0, "color");
+
+ hd = add_hd_entry(hd_data, __LINE__, 0);
+ hd->base_class.id = bc_internal;
+ hd->sub_class.id = sc_int_prom;
+ hd->detail = new_mem(sizeof *hd->detail);
+ hd->detail->type = hd_detail_prom;
+ hd->detail->prom.data = pt = new_mem(sizeof *pt);
+
+ if((f = fopen(PROC_PROM "/color-code", "r"))) {
+ if(fread(buf, 1, 2, f) == 2) {
+ pt->has_color = 1;
+ pt->color = buf[1];
+ hd_data->color_code = pt->color | 0x10000;
+ ADD2LOG("color-code: 0x%04x\n", (buf[0] << 8) + buf[1]);
+ }
+
+ fclose(f);
+ }
+
+}
+
+/* store a device tree entry */
+devtree_t *add_devtree_entry(devtree_t **devtree, devtree_t *new)
+{
+ while(*devtree) devtree = &(*devtree)->next;
+ return *devtree = new;
+}
+
+/* create a new device tree entry */
+devtree_t *new_devtree_entry(devtree_t *parent)
+{
+ static unsigned idx = 0;
+ devtree_t *devtree = new_mem(sizeof *devtree);
+
+ if(!parent) idx = 0;
+ devtree->idx = ++idx;
+ devtree->parent = parent;
+
+ devtree->interrupt = devtree->class_code =
+ devtree->device_id = devtree->vendor_id =
+ devtree->subdevice_id = devtree->subvendor_id =
+ devtree->revision_id = -1;
+
+ return devtree;
+}
+
+void read_str(char *path, char *name, char **str)
+{
+ char *s = NULL;
+ str_list_t *sl;
+
+ str_printf(&s, 0, "%s/%s", path, name);
+ if((sl = read_file(s, 0, 1))) {
+ *str = sl->str;
+ sl->str = NULL;
+ sl = free_str_list(sl);
+ }
+ free_mem(s);
+}
+
+void read_mem(char *path, char *name, unsigned char **mem, unsigned len)
+{
+ FILE *f;
+ char *s = NULL;
+ unsigned char *m = new_mem(len);
+
+ str_printf(&s, 0, "%s/%s", path, name);
+ if((f = fopen(s, "r"))) {
+ if(fread(m, len, 1, f) == 1) {
+ *mem = m;
+ m = NULL;
+ }
+ fclose(f);
+ }
+ free_mem(s);
+ free_mem(m);
+}
+
+void read_int(char *path, char *name, int *val)
+{
+ unsigned char *p = NULL;
+
+ read_mem(path, name, &p, sizeof (int));
+ if(p) memcpy(val, p, sizeof (int));
+ free_mem(p);
+}
+
+void read_devtree_entry(hd_data_t *hd_data, devtree_t *parent, char *dirname)
+{
+ DIR *dir;
+ struct dirent *de;
+ struct stat sbuf;
+ char *path, *s;
+ devtree_t *devtree, *dt2;
+
+ devtree = add_devtree_entry(&hd_data->devtree, new_devtree_entry(parent));
+
+ devtree->filename = new_str(dirname);
+
+ str_printf(&devtree->path, 0, "%s%s%s",
+ parent ? parent->path : "", parent && *parent->path ? "/" : "", dirname
+ );
+
+ path = 0;
+ str_printf(&path, 0, PROC_PROM "/%s", devtree->path);
+
+ if((dir = opendir(path))) {
+ while((de = readdir(dir))) {
+ if(!strcmp(de->d_name, ".") || !strcmp(de->d_name, "..")) continue;
+ s = NULL;
+ str_printf(&s, 0, "%s/%s", path, de->d_name);
+ if(!lstat(s, &sbuf)) {
+ if(S_ISDIR(sbuf.st_mode)) {
+ /* prom entries don't always have unique names, unfortunately... */
+ for(dt2 = hd_data->devtree; dt2; dt2 = dt2->next) {
+ if(
+ dt2->parent == devtree &&
+ !strcmp(dt2->filename, de->d_name)
+ ) break;
+ }
+ if(!dt2) read_devtree_entry(hd_data, devtree, de->d_name);
+ }
+ }
+ s = free_mem(s);
+ }
+ closedir(dir);
+ }
+
+ read_str(path, "name", &devtree->name);
+ read_str(path, "model", &devtree->model);
+ read_str(path, "device_type", &devtree->device_type);
+ read_str(path, "compatible", &devtree->compatible);
+
+ read_int(path, "interrupts", &devtree->interrupt);
+ read_int(path, "AAPL,interrupts", &devtree->interrupt);
+ read_int(path, "class-code", &devtree->class_code);
+ read_int(path, "vendor-id", &devtree->vendor_id);
+ read_int(path, "device-id", &devtree->device_id);
+ read_int(path, "subsystem-vendor-id", &devtree->subvendor_id);
+ read_int(path, "subsystem-id", &devtree->subdevice_id);
+ read_int(path, "revision-id", &devtree->revision_id);
+
+ read_mem(path, "EDID", &devtree->edid, 0x80);
+ if(!devtree->edid) read_mem(path, "DFP,EDID", &devtree->edid, 0x80);
+
+ if(
+ devtree->class_code != -1 && devtree->vendor_id != -1 &&
+ devtree->device_id != -1
+ ) {
+ devtree->pci = 1;
+ }
+
+ path = free_mem(path);
+}
+
+void read_devtree(hd_data_t *hd_data)
+{
+ read_devtree_entry(hd_data, NULL, "");
+
+}
+
+void add_pci_prom_devices(hd_data_t *hd_data, hd_t *hd_parent, devtree_t *parent)
+{
+ hd_t *hd;
+ hd_res_t *res;
+ devtree_t *dt, *dt2;
+ int irq, floppy_ctrl_idx;
+ unsigned sound_ok = 0, net_ok = 0, scsi_ok = 0;
+ unsigned id;
+ char *s;
+
+ for(dt = hd_data->devtree; dt; dt = dt->next) {
+ if(
+ dt->parent == parent ||
+ (
+ /* special magic to reach some sound chips */
+ dt->parent &&
+ dt->parent->parent == parent &&
+ !dt->parent->pci
+ )
+ ) {
+
+ if(
+ dt->device_type &&
+ (!strcmp(dt->device_type, "block") || !strcmp(dt->device_type, "swim3"))
+ ) {
+ /* block devices */
+
+ s = dt->compatible ? dt->compatible : dt->name;
+ id = 0;
+
+ if(s) {
+ if(strstr(s, "swim3")) {
+ id = MAKE_ID(TAG_SPECIAL, 0x0040);
+ }
+ }
+
+ if(id) {
+ hd = add_hd_entry(hd_data, __LINE__, 0);
+ hd->bus.id = bus_none;
+ hd->base_class.id = bc_storage;
+ hd->sub_class.id = sc_sto_floppy;
+
+ hd->vendor.id = MAKE_ID(TAG_SPECIAL, 0x0401);
+ hd->device.id = id;
+ hd->attached_to = hd_parent->idx;
+ hd->rom_id = new_str(dt->path);
+ if(dt->interrupt) {
+ res = add_res_entry(&hd->res, new_mem(sizeof *res));
+ res->irq.type = res_irq;
+ res->irq.enabled = 1;
+ res->irq.base = dt->interrupt;
+ }
+ floppy_ctrl_idx = hd->idx;
+
+ hd = add_hd_entry(hd_data, __LINE__, 0);
+ hd->base_class.id = bc_storage_device;
+ hd->sub_class.id = sc_sdev_floppy;
+ hd->bus.id = bus_floppy;
+ hd->unix_dev_name = new_str("/dev/fd0");
+
+ res = add_res_entry(&hd->res, new_mem(sizeof *res));
+ res->size.type = res_size;
+ res->size.val1 = str2float("3.5", 2);
+ res->size.unit = size_unit_cinch;
+
+ res = add_res_entry(&hd->res, new_mem(sizeof *res));
+ res->size.type = res_size;
+ res->size.val1 = 2880;
+ res->size.val2 = 0x200;
+ res->size.unit = size_unit_sectors;
+
+ hd->attached_to = floppy_ctrl_idx;
+ }
+ }
+
+ if(
+ !scsi_ok &&
+ dt->device_type &&
+ !strcmp(dt->device_type, "scsi")
+ ) {
+ /* scsi */
+ scsi_ok = 1; /* max. 1 controller */
+
+ s = dt->compatible ? dt->compatible : dt->name;
+ id = 0;
+
+ if(s) {
+ if(strstr(s, "mesh")) { /* mesh || chrp,mesh0 */
+ id = MAKE_ID(TAG_SPECIAL, 0x0030);
+ }
+ else if(!strcmp(s, "53c94")) {
+ id = MAKE_ID(TAG_SPECIAL, 0x0031);
+ }
+ }
+
+ if(id) {
+ hd = add_hd_entry(hd_data, __LINE__, 0);
+ hd->bus.id = bus_none;
+ hd->base_class.id = bc_storage;
+ hd->sub_class.id = sc_sto_scsi;
+
+ hd->vendor.id = MAKE_ID(TAG_SPECIAL, 0x0401);
+ hd->device.id = id;
+ hd->attached_to = hd_parent->idx;
+ hd->rom_id = new_str(dt->path);
+ if(dt->interrupt) {
+ res = add_res_entry(&hd->res, new_mem(sizeof *res));
+ res->irq.type = res_irq;
+ res->irq.enabled = 1;
+ res->irq.base = dt->interrupt;
+ }
+ }
+ }
+
+ if(
+ !net_ok &&
+ dt->device_type &&
+ !strcmp(dt->device_type, "network")
+ ) {
+ /* network */
+ net_ok = 1; /* max. 1 controller */
+
+ s = dt->compatible ? dt->compatible : dt->name;
+ id = 0;
+
+ if(s) {
+ if(!strcmp(s, "mace")) {
+ id = MAKE_ID(TAG_SPECIAL, 0x0020);
+ }
+ else if(!strcmp(s, "bmac")) {
+ id = MAKE_ID(TAG_SPECIAL, 0x0021);
+ }
+ else if(!strcmp(s, "bmac+")) {
+ id = MAKE_ID(TAG_SPECIAL, 0x0022);
+ }
+ }
+
+ if(id) {
+ hd = add_hd_entry(hd_data, __LINE__, 0);
+ hd->bus.id = bus_none;
+ hd->base_class.id = bc_network;
+ hd->sub_class.id = 0; /* ethernet */
+
+ hd->vendor.id = MAKE_ID(TAG_SPECIAL, 0x0401);
+ hd->device.id = id;
+ hd->attached_to = hd_parent->idx;
+ hd->rom_id = new_str(dt->path);
+ if(dt->interrupt) {
+ res = add_res_entry(&hd->res, new_mem(sizeof *res));
+ res->irq.type = res_irq;
+ res->irq.enabled = 1;
+ res->irq.base = dt->interrupt;
+ }
+ }
+ }
+
+ if(
+ !sound_ok &&
+ dt->device_type &&
+ strstr(dt->device_type, "sound") == dt->device_type
+ ) {
+ /* sound */
+ sound_ok = 1; /* max 1 controller */
+
+ for(dt2 = dt; dt2; dt2 = dt2->next) {
+ if(
+ (
+ dt2 == dt ||
+ (dt2->parent && dt2->parent == dt)
+ ) &&
+ (
+ !strcmp(dt2->device_type, "sound") ||
+ !strcmp(dt2->device_type, "soundchip")
+ )
+ ) break;
+ }
+ if(!dt2) dt2 = dt;
+
+ hd = add_hd_entry(hd_data, __LINE__, 0);
+ hd->bus.id = bus_none;
+ hd->base_class.id = bc_multimedia;
+ hd->sub_class.id = sc_multi_audio;
+ hd->attached_to = hd_parent->idx;
+ hd->rom_id = new_str(dt2->path);
+ irq = dt2->interrupt;
+ if(irq <= 1 && dt2->parent && !dt2->parent->pci) {
+ irq = dt2->parent->interrupt;
+ }
+ if(irq > 1) {
+ res = add_res_entry(&hd->res, new_mem(sizeof *res));
+ res->irq.type = res_irq;
+ res->irq.enabled = 1;
+ res->irq.base = irq;
+ }
+
+ hd->vendor.id = MAKE_ID(TAG_SPECIAL, 0x401); /* Apple */
+ hd->device.id = MAKE_ID(TAG_SPECIAL, 0x0010);
+
+ if(dt2->compatible) {
+ if(!strcmp(dt2->compatible, "screamer")) {
+ hd->device.id = MAKE_ID(TAG_SPECIAL, 0x0011);
+ }
+ else if(!strcmp(dt2->compatible, "burgundy")) {
+ hd->device.id = MAKE_ID(TAG_SPECIAL, 0x0012);
+ }
+ else if(!strcmp(dt2->compatible, "daca")) {
+ hd->device.id = MAKE_ID(TAG_SPECIAL, 0x0013);
+ }
+ else if(!strcmp(dt2->compatible, "CRUS,CS4236B")) {
+ hd->vendor.id = MAKE_ID(TAG_SPECIAL, 0x402); /* IBM */
+ hd->device.id = MAKE_ID(TAG_SPECIAL, 0x0014);
+ }
+ }
+ }
+ }
+ }
+}
+
+
+void add_legacy_prom_devices(hd_data_t *hd_data, devtree_t *dt)
+{
+ if(dt->pci) return;
+
+ if(add_prom_display(hd_data, dt)) return;
+ if(add_prom_vscsi(hd_data, dt)) return;
+ if(add_prom_veth(hd_data, dt)) return;
+}
+
+int add_prom_display(hd_data_t *hd_data, devtree_t *dt)
+{
+ hd_t *hd;
+ hd_res_t *res;
+ unsigned id;
+
+ if(
+ dt->device_type &&
+ !strcmp(dt->device_type, "display")
+ ) {
+ /* display devices */
+
+ id = 0;
+
+ if(dt->name) {
+ if(!strcmp(dt->name, "valkyrie")) {
+ id = MAKE_ID(TAG_SPECIAL, 0x3000);
+ }
+ else if(!strcmp(dt->name, "platinum")) {
+ id = MAKE_ID(TAG_SPECIAL, 0x3001);
+ }
+ }
+
+ if(id) {
+ hd = add_hd_entry(hd_data, __LINE__, 0);
+ hd->bus.id = bus_none;
+ hd->base_class.id = bc_display;
+ hd->sub_class.id = sc_dis_other;
+
+ hd->vendor.id = MAKE_ID(TAG_SPECIAL, 0x0401);
+ hd->device.id = id;
+ hd->rom_id = new_str(dt->path);
+ if(dt->interrupt) {
+ res = add_res_entry(&hd->res, new_mem(sizeof *res));
+ res->irq.type = res_irq;
+ res->irq.enabled = 1;
+ res->irq.base = dt->interrupt;
+ }
+
+ return 1;
+ }
+ }
+
+ return 0;
+}
+
+int add_prom_vscsi(hd_data_t *hd_data, devtree_t *dt)
+{
+ hd_t *hd;
+ char *s, *id;
+
+ if(
+ dt->path &&
+ dt->device_type &&
+ !strcmp(dt->device_type, "vscsi")
+ ) {
+ /* vscsi storage */
+
+ if(
+ (s = strstr(dt->path, "v-scsi@")) &&
+ *(id = s + sizeof "v-scsi@" - 1)
+ ) {
+ hd = add_hd_entry(hd_data, __LINE__, 0);
+ hd->bus.id = bus_none;
+ hd->base_class.id = bc_storage;
+ hd->sub_class.id = sc_sto_scsi;
+ hd->slot = veth_cnt++;
+
+ hd->vendor.id = MAKE_ID(TAG_SPECIAL, 0x6001);
+ hd->device.id = MAKE_ID(TAG_SPECIAL, 0x1001);
+ str_printf(&hd->device.name, 0, "Virtual SCSI %d", hd->slot);
+ hd->rom_id = new_str(dt->path);
+
+ str_printf(&hd->sysfs_id, 0, "/devices/vio/%s", id);
+
+ return 1;
+ }
+ }
+
+ return 0;
+}
+
+int add_prom_veth(hd_data_t *hd_data, devtree_t *dt)
+{
+ hd_t *hd;
+ char *s, *id;
+
+ if(
+ dt->path &&
+ dt->device_type &&
+ dt->compatible &&
+ !strcmp(dt->device_type, "network") &&
+ !strcmp(dt->compatible, "IBM,l-lan")
+ ) {
+ /* veth network */
+
+ if(
+ (s = strstr(dt->path, "l-lan@")) &&
+ *(id = s + sizeof "l-lan@" - 1)
+ ) {
+ hd = add_hd_entry(hd_data, __LINE__, 0);
+ hd->bus.id = bus_none;
+ hd->base_class.id = bc_network;
+ hd->sub_class.id = 0x00;
+ hd->slot = veth_cnt++;
+
+ hd->vendor.id = MAKE_ID(TAG_SPECIAL, 0x6001);
+ hd->device.id = MAKE_ID(TAG_SPECIAL, 0x1002);
+ str_printf(&hd->device.name, 0, "Virtual Ethernet card %d", hd->slot);
+ hd->rom_id = new_str(dt->path);
+
+ str_printf(&hd->sysfs_id, 0, "/devices/vio/%s", id);
+
+ return 1;
+ }
+ }
+
+ return 0;
+}
+
+void add_devices(hd_data_t *hd_data)
+{
+ hd_t *hd;
+ devtree_t *dt;
+#if 0
+ hd_res_t *res;
+ unsigned pci_slot = 0, u;
+#endif
+
+ /* remove old assignments */
+ for(hd = hd_data->hd; hd; hd = hd->next) {
+ if(ID_TAG(hd->device.id) == TAG_PCI && ID_TAG(hd->vendor.id) == TAG_PCI) {
+ hd->rom_id = free_mem(hd->rom_id);
+ hd->detail = free_hd_detail(hd->detail);
+ }
+ }
+
+ for(dt = hd_data->devtree; dt; dt = dt->next) {
+ if(dt->pci) {
+ for(hd = hd_data->hd; hd; hd = hd->next) {
+ if(
+ /* do *not* compare class ids */
+ /* It would be better to check the slot numbers instead but
+ * as they are not stored within /proc/device-tree in a consistent
+ * way, we can't do that.
+ */
+ !hd->rom_id &&
+ ID_TAG(hd->device.id) == TAG_PCI &&
+ ID_TAG(hd->vendor.id) == TAG_PCI &&
+ ID_VALUE(hd->device.id) == dt->device_id &&
+ ID_VALUE(hd->vendor.id) == dt->vendor_id &&
+ (dt->subvendor_id == -1 || ID_VALUE(hd->sub_vendor.id) == dt->subvendor_id) &&
+ (dt->subdevice_id == -1 || ID_VALUE(hd->sub_device.id) == dt->subdevice_id) &&
+ hd->revision.id == dt->revision_id
+ ) break;
+ }
+
+ if(hd) {
+ hd->rom_id = new_str(dt->path);
+ hd->detail = new_mem(sizeof *hd->detail);
+ hd->detail->type = hd_detail_devtree;
+ hd->detail->devtree.data = dt;
+ add_pci_prom_devices(hd_data, hd, dt);
+ }
+ }
+ else {
+ add_legacy_prom_devices(hd_data, dt);
+ }
+ }
+}
+
+void dump_devtree_data(hd_data_t *hd_data)
+{
+ unsigned u;
+ devtree_t *devtree;
+
+ devtree = hd_data->devtree;
+ if(!devtree) return;
+
+ ADD2LOG("----- /proc device tree -----\n");
+
+ for(; devtree; devtree = devtree->next) {
+ u = devtree->parent ? devtree->parent->idx : 0;
+ ADD2LOG(" %02u @%02u %s", devtree->idx, u, devtree->path);
+ if(devtree->pci) ADD2LOG(" [pci]");
+ ADD2LOG("\n");
+
+ ADD2LOG(
+ " name \"%s\", model \"%s\", dtype \"%s\", compat \"%s\"\n",
+ devtree->name ? devtree->name : "",
+ devtree->model ? devtree->model : "",
+ devtree->device_type ? devtree->device_type : "",
+ devtree->compatible ? devtree->compatible : ""
+ );
+
+ if(
+ devtree->class_code != -1 || devtree->vendor_id != -1 ||
+ devtree->device_id != -1 || devtree->revision_id != -1 ||
+ devtree->subdevice_id != -1 || devtree->subvendor_id != -1 ||
+ devtree->interrupt != -1
+ ) {
+ ADD2LOG(" ");
+ if(devtree->class_code != -1) ADD2LOG(" class 0x%06x", devtree->class_code);
+ if(devtree->vendor_id != -1) ADD2LOG(" vend 0x%04x", devtree->vendor_id);
+ if(devtree->device_id != -1) ADD2LOG(" dev 0x%04x", devtree->device_id);
+ if(devtree->subvendor_id != -1) ADD2LOG(" svend 0x%04x", devtree->subvendor_id);
+ if(devtree->subdevice_id != -1) ADD2LOG(" sdev 0x%04x", devtree->subdevice_id);
+ if(devtree->revision_id != -1) ADD2LOG(" rev 0x%02x", devtree->revision_id);
+ if(devtree->interrupt != -1) ADD2LOG(" irq %d", devtree->interrupt);
+ ADD2LOG("\n");
+ }
+
+ if(devtree->edid) {
+ ADD2LOG(" EDID record:\n");
+ for(u = 0; u < 0x80; u += 0x10) {
+ ADD2LOG(" %02x ", u);
+ hexdump(&hd_data->log, 1, 0x10, devtree->edid + u);
+ ADD2LOG("\n");
+ }
+ }
+
+ if(devtree->next) ADD2LOG("\n");
+ }
+
+ ADD2LOG("----- /proc device tree end -----\n");
+}
+
+
+#endif /* defined(__PPC__) */
+
--- /dev/null
+void hd_scan_prom(hd_data_t *hd_data);
--- /dev/null
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "hd.h"
+#include "hd_int.h"
+#include "hddb.h"
+#include "s390.h"
+
+#if defined(__s390__) || defined(__s390x__)
+
+#include <sysfs/libsysfs.h>
+#include <sysfs/dlist.h>
+
+#define BUSNAME "ccw"
+#define BUSNAME_GROUP "ccwgroup"
+#define BUSNAME_IUCV "iucv"
+
+static void hd_scan_s390_ex(hd_data_t *hd_data, int disks_only)
+{
+ hd_t* hd;
+ hd_res_t* res;
+ struct sysfs_bus *bus;
+ struct sysfs_bus *bus_group;
+ struct sysfs_device *curdev = NULL;
+ struct dlist *attributes = NULL;
+ struct sysfs_attribute *curattr = NULL;
+ struct dlist *devlist = NULL;
+ struct dlist *devlist_group = NULL;
+ int virtual_machine=0;
+
+ unsigned int devtype=0,devmod=0,cutype=0,cumod=0;
+
+ /* list of each channel's cutype, used for finding multichannel devices */
+ int cutypes[1<<16]={0};
+ int i;
+
+ hd_data->module=mod_s390;
+
+ remove_hd_entries(hd_data);
+
+ bus=sysfs_open_bus(BUSNAME);
+ bus_group=sysfs_open_bus(BUSNAME_GROUP);
+
+ if (!bus)
+ {
+ ADD2LOG("unable to open" BUSNAME "bus");
+ return;
+ }
+
+ devlist=sysfs_get_bus_devices(bus);
+ if(bus_group) devlist_group=sysfs_get_bus_devices(bus_group);
+
+ if(!devlist)
+ {
+ ADD2LOG("unable to get devices on bus " BUSNAME);
+ return;
+ }
+
+ /* build cutypes list */
+ dlist_for_each_data(devlist, curdev, struct sysfs_device)
+ {
+ int channel=strtol(rindex(curdev->bus_id,'.')+1,NULL,16);
+ attributes = sysfs_get_device_attributes(curdev);
+ dlist_for_each_data(attributes,curattr,struct sysfs_attribute)
+ {
+ if(strcmp("cutype",curattr->name)==0)
+ cutype=strtol(curattr->value,NULL,16);
+ }
+ cutypes[channel]=cutype;
+ }
+ /* check for each channel if it must be skipped and identify virtual reader/punch */
+ for(i=0;i<(1<<16);i++)
+ {
+ if(cutypes[i]==0x3088) /* It seems that QDIO devices only appear once */
+ cutypes[i+1]*=-1; /* negative cutype -> skip */
+
+ if(cutypes[i]==0x2540)
+ {
+ virtual_machine=1; /* we are running in VM */
+ cutypes[i]=-2; /* reader */
+ cutypes[i+1]=-3; /* punch */
+ }
+ }
+
+ /* identify grouped channels */
+ if(devlist_group) dlist_for_each_data(devlist_group, curdev, struct sysfs_device)
+ {
+ struct sysfs_directory* d;
+ struct dlist* dl;
+ struct sysfs_link* cl;
+ //printf("ccwg %s\n",curdev->path);
+ d=sysfs_open_directory(curdev->path);
+ dl=sysfs_get_dir_links(d);
+ dlist_for_each_data(dl,cl,struct sysfs_link) /* iterate over this channel group */
+ {
+ if(!rindex(cl->target,'.')) continue;
+ int channel=strtol(rindex(cl->target,'.')+1,NULL,16);
+ //printf("channel %x name %s target %s\n",channel,cl->name,cl->target);
+ if(strncmp("cdev",cl->name,4)==0)
+ {
+ if(cl->name[4]=='0') /* first channel in group gets an entry */
+ {
+ if(cutypes[channel]<0) cutypes[channel]*=-1; /* make sure its positive */
+ }
+ else /* other channels in group are skipped */
+ if(cutypes[channel]>0) cutypes[channel]*=-1; /* make sure its negative */
+ }
+
+ }
+ }
+
+ dlist_for_each_data(devlist, curdev, struct sysfs_device)
+ {
+ int readonly=0;
+ res=new_mem(sizeof *res);
+
+ attributes = sysfs_get_device_attributes(curdev);
+ dlist_for_each_data(attributes,curattr, struct sysfs_attribute)
+ {
+ if (strcmp("online",curattr->name)==0)
+ res->io.enabled=atoi(curattr->value);
+ else if (strcmp("cutype",curattr->name)==0)
+ {
+ cutype=strtol(curattr->value,NULL,16);
+ cumod=strtol(index(curattr->value,'/')+1,NULL,16);
+ } else if (strcmp("devtype",curattr->name)==0)
+ {
+ devtype=strtol(curattr->value,NULL,16);
+ devmod=strtol(index(curattr->value,'/')+1,NULL,16);
+ } else if (strcmp("readonly",curattr->name)==0)
+ {
+ readonly=atoi(curattr->value);
+ }
+ }
+
+ res->io.type=res_io;
+ res->io.access=readonly?acc_ro:acc_rw;
+ res->io.base=strtol(rindex(curdev->bus_id,'.')+1,NULL,16);
+
+ /* Skip additional channels for multi-channel devices */
+ if(cutypes[res->io.base] < -3)
+ continue;
+
+ if(disks_only && cutype!=0x3990 && cutype!=0x2105 && cutype!=0x3880 && cutype!=0x9343 && cutype!=0x6310 &&
+ (cutype != 0x1731 || devtype != 0x1732 || cumod != 3))
+ continue;
+
+ res->io.range=1;
+ switch (cutype)
+ {
+ /* three channels */
+ case 0x1731: /* QDIO (QETH, HSI, zFCP) */
+ res->io.range++;
+ /* two channels */
+ case 0x3088: /* CU3088 (CTC, LCS) */
+ res->io.range++;
+ }
+
+ hd=add_hd_entry(hd_data,__LINE__,0);
+ add_res_entry(&hd->res,res);
+ hd->vendor.id=MAKE_ID(TAG_SPECIAL,0x6001); /* IBM */
+ hd->device.id=MAKE_ID(TAG_SPECIAL,cutype);
+ hd->sub_device.id=MAKE_ID(TAG_SPECIAL,devtype);
+ hd->bus.id=bus_ccw;
+ hd->sysfs_device_link = new_str(hd_sysfs_id(curdev->path));
+ hd->sysfs_bus_id = new_str(strrchr(curdev->path,'/')+1);
+
+ if(cutypes[res->io.base]==-2) /* virtual reader */
+ {
+ hd->base_class.id=bc_scanner;
+ }
+ if(cutypes[res->io.base]==-3) /* virtual punch */
+ {
+ hd->base_class.id=bc_printer;
+ }
+ /* all other device data (names, classes etc.) comes from the s390 ID file */
+
+ hd->detail=free_hd_detail(hd->detail);
+ hd->detail=new_mem(sizeof *hd->detail);
+ hd->detail->ccw.type=hd_detail_ccw;
+ hd->detail->ccw.data=new_mem(sizeof(ccw_t));
+ hd->detail->ccw.data->cu_model=cumod;
+ hd->detail->ccw.data->dev_model=devmod;
+ hd->detail->ccw.data->lcss=(strtol(curdev->bus_id,0,16) << 8) + strtol(curdev->bus_id+2,0,16);
+ hddb_add_info(hd_data,hd);
+ }
+
+ if(virtual_machine)
+ {
+ /* add an unactivated IUCV device */
+ hd=add_hd_entry(hd_data,__LINE__,0);
+ hd->vendor.id=MAKE_ID(TAG_SPECIAL,0x6001); /* IBM */
+ hd->device.id=MAKE_ID(TAG_SPECIAL,0x0005); /* IUCV */
+ hd->bus.id=bus_iucv;
+ hd->base_class.id=bc_network;
+ hd->status.active=status_no;
+ hd->status.available=status_yes;
+ hddb_add_info(hd_data,hd);
+
+ /* add activated IUCV devices */
+ bus=sysfs_open_bus(BUSNAME_IUCV);
+ if(bus)
+ {
+ devlist=sysfs_get_bus_devices(bus);
+ if(devlist)
+ {
+ dlist_for_each_data(devlist, curdev, struct sysfs_device)
+ {
+ hd=add_hd_entry(hd_data,__LINE__,0);
+ hd->vendor.id=MAKE_ID(TAG_SPECIAL,0x6001); /* IBM */
+ hd->device.id=MAKE_ID(TAG_SPECIAL,0x0005); /* IUCV */
+ hd->bus.id=bus_iucv;
+ hd->base_class.id=bc_network;
+ hd->status.active=status_yes;
+ hd->status.available=status_yes;
+ attributes = sysfs_get_device_attributes(curdev);
+ dlist_for_each_data(attributes,curattr,struct sysfs_attribute)
+ {
+ if(strcmp("user",curattr->name)==0)
+ hd->rom_id=new_str(curattr->value);
+ }
+ hd->sysfs_device_link = new_str(hd_sysfs_id(curdev->path));
+ hd->sysfs_bus_id = new_str(strrchr(curdev->path,'/')+1);
+ hddb_add_info(hd_data,hd);
+ }
+ }
+ }
+
+ }
+}
+
+void hd_scan_s390(hd_data_t *hd_data)
+{
+ if (!hd_probe_feature(hd_data, pr_s390)) return;
+ hd_scan_s390_ex(hd_data, 0);
+}
+
+void hd_scan_s390disks(hd_data_t *hd_data)
+{
+ if (!hd_probe_feature(hd_data, pr_s390disks)) return;
+ hd_scan_s390_ex(hd_data, 1);
+}
+
+#endif
+
--- /dev/null
+/** register all S/390 devices */
+void hd_scan_s390(hd_data_t *hd_data);
+/** register only S/390 disks */
+void hd_scan_s390disks(hd_data_t *hd_data);
+
--- /dev/null
+#include <fcntl.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/ioctl.h>
+
+#include "hd.h"
+#include "hd_int.h"
+#include "sbus.h"
+
+#ifdef __sparc__
+
+#ifdef DIET
+typedef unsigned int u_int;
+#endif
+
+#include <asm/openpromio.h>
+
+#define MAX_VAL (4096-128-4)
+
+static int prom_fd;
+
+static int
+prom_nextnode (int node)
+{
+ char buf[OPROMMAXPARAM];
+ struct openpromio *op = (struct openpromio *)buf;
+
+ op->oprom_size = sizeof (int);
+ if (node == -1)
+ return 0;
+
+ *(int *)op->oprom_array = node;
+ if (ioctl (prom_fd, OPROMNEXT, op) < 0)
+ return 0;
+
+ return *(int *)op->oprom_array;
+}
+
+static int
+prom_getchild (int node)
+{
+ char buf[OPROMMAXPARAM];
+ struct openpromio *op = (struct openpromio *)buf;
+
+ op->oprom_size = sizeof (int);
+
+ if (!node || node == -1)
+ return 0;
+
+ *(int *)op->oprom_array = node;
+ if (ioctl (prom_fd, OPROMCHILD, op) < 0)
+ return 0;
+
+ return *(int *)op->oprom_array;
+}
+
+static char
+*prom_getproperty (char *prop, int *lenp, char *buf)
+{
+ struct openpromio *op = (struct openpromio *)buf;
+
+ op->oprom_size = MAX_VAL;
+
+ strcpy (op->oprom_array, prop);
+
+ if (ioctl (prom_fd, OPROMGETPROP, op) < 0)
+ return 0;
+
+ if (lenp)
+ *lenp = op->oprom_size;
+
+ if (strncmp ("SUNW,", op->oprom_array, 5) == 0)
+ return op->oprom_array + 5;
+ else
+ return op->oprom_array;
+}
+
+static int
+prom_getbool (char *prop)
+{
+ char buf[OPROMMAXPARAM];
+ struct openpromio *op = (struct openpromio *)buf;
+
+ op->oprom_size = 0;
+
+ *(int *)op->oprom_array = 0;
+ for (;;) {
+ op->oprom_size = 128; /* MAX_PROP */
+ if (ioctl (prom_fd, OPROMNXTPROP, op) < 0)
+ return 0;
+ if (!op->oprom_size)
+ return 0;
+ if (!strcmp (op->oprom_array, prop))
+ return 1;
+ }
+}
+
+static void
+prom_parse (int node, int sbus, int ebus, hd_data_t *hd_data)
+{
+ hd_t *hd;
+ char buf1[OPROMMAXPARAM], buf2[OPROMMAXPARAM];
+ int nextnode;
+ int len, nsbus = sbus, nebus = ebus;
+ char *prop1 = prom_getproperty ("device_type", &len, buf1);
+
+ if (strcmp (prop1, "network") == 0)
+ {
+ char *prop2 = prom_getproperty ("name", &len, buf2);
+ if (prop2 && len >= 0)
+ {
+ if (strcmp (prop2, "hme") == 0)
+ {
+ ADD2LOG ("NETWORK: type=Sun Happy Meal Ethernet, module=sunhme\n");
+ hd = add_hd_entry (hd_data, __LINE__, 0);
+ hd->base_class.id = bc_network;
+ hd->sub_class.id = 0x00;
+ hd->bus.id = bus_sbus;
+
+ hd->vendor.id = MAKE_ID(TAG_SPECIAL, 0x4001);
+ hd->device.id = MAKE_ID(TAG_SPECIAL, 0x3001);
+ }
+ else if (strcmp (prop2, "le") == 0)
+ {
+ ADD2LOG ("NETWORK: type=Sun Lance Ethernet, module=ignore\n");
+ hd = add_hd_entry (hd_data, __LINE__, 0);
+ hd->base_class.id = bc_network;
+ hd->sub_class.id = 0x00;
+ hd->bus.id = bus_sbus;
+
+ hd->vendor.id = MAKE_ID(TAG_SPECIAL, 0x4001);
+ hd->device.id = MAKE_ID(TAG_SPECIAL, 0x3002);
+ }
+ else if (strcmp (prop2, "qe") == 0)
+ {
+ prop2 = prom_getproperty("channel#", &len, buf2);
+ if (prop2 && len == 4 && *(int *)prop2 == 0)
+ {
+ ADD2LOG ("NETWORK: type=Sun Quad Ethernet, module=sunqe\n");
+ hd = add_hd_entry (hd_data, __LINE__, 0);
+ hd->base_class.id = bc_network;
+ hd->sub_class.id = 0x00;
+ hd->bus.id = bus_sbus;
+
+ hd->vendor.id = MAKE_ID(TAG_SPECIAL, 0x4001);
+ hd->device.id = MAKE_ID(TAG_SPECIAL, 0x3003);
+ }
+ }
+ else if (strcmp (prop2, "qfe") == 0)
+ {
+ ADD2LOG ("NETWORK: type=Sun Quad Ethernet (qfe), module=sunhme\n");
+ hd = add_hd_entry (hd_data, __LINE__, 0);
+ hd->base_class.id = bc_network;
+ hd->sub_class.id = 0x00;
+ hd->bus.id = bus_sbus;
+
+ hd->vendor.id = MAKE_ID(TAG_SPECIAL, 0x4001);
+ hd->device.id = MAKE_ID(TAG_SPECIAL, 0x3001);
+ }
+ else if (strcmp (prop2, "mlanai") == 0 || strcmp (prop2, "myri") == 0)
+ {
+ ADD2LOG ("NETWORK: type=MyriCOM MyriNET Gigabit Ethernet, module=myri_sbus\n");
+ hd = add_hd_entry (hd_data, __LINE__, 0);
+ hd->base_class.id = bc_network;
+ hd->sub_class.id = 0x00;
+ hd->bus.id = bus_sbus;
+
+ hd->vendor.id = MAKE_ID(TAG_SPECIAL, 0x4001);
+ hd->device.id = MAKE_ID(TAG_SPECIAL, 0x3004);
+ }
+ else
+ ADD2LOG ("NETWORK: Unknown device \"%s\"\n", prop2);
+ }
+ }
+ else if (strcmp (prop1, "scsi") == 0)
+ {
+ char *prop2 = prom_getproperty ("name", &len, buf2);
+ if (prop2 && len >= 0)
+ {
+ if (sbus)
+ {
+ if (strcmp (prop2, "esp") == 0)
+ {
+ ADD2LOG ("SCSI: type=Sun Enhanced SCSI Processor (ESP), module=ignore\n");
+ hd = add_hd_entry (hd_data, __LINE__, 0);
+ hd->base_class.id = bc_storage;
+ hd->sub_class.id = sc_sto_scsi;
+ hd->bus.id = bus_sbus;
+
+ hd->vendor.id = MAKE_ID(TAG_SPECIAL, 0x4001);
+ hd->device.id = MAKE_ID(TAG_SPECIAL, 0x1001);
+ }
+ else if (strcmp (prop2, "soc") == 0)
+ {
+ ADD2LOG ("SCSI: type=Sun SPARCStorage Array, module=fc4:soc:pluto\n");
+ hd = add_hd_entry (hd_data, __LINE__, 0);
+ hd->base_class.id = bc_storage;
+ hd->sub_class.id = sc_sto_scsi;
+ hd->bus.id = bus_sbus;
+
+ hd->vendor.id = MAKE_ID(TAG_SPECIAL, 0x4001);
+ hd->device.id = MAKE_ID(TAG_SPECIAL, 0x1101);
+ }
+ else if (strcmp (prop2, "socal") == 0)
+ {
+ ADD2LOG ("SCSI: type=Sun Enterprise Network Array, module=fc4:socal:fcal\n");
+ hd = add_hd_entry (hd_data, __LINE__, 0);
+ hd->base_class.id = bc_storage;
+ hd->sub_class.id = sc_sto_scsi;
+ hd->bus.id = bus_sbus;
+
+ hd->vendor.id = MAKE_ID(TAG_SPECIAL, 0x4001);
+ hd->device.id = MAKE_ID(TAG_SPECIAL, 0x1102);
+ }
+ else if (strcmp (prop2, "fas") == 0)
+ {
+ ADD2LOG ("SCSI: type=Sun Swift (ESP), module=ignore\n");
+ hd = add_hd_entry (hd_data, __LINE__, 0);
+ hd->base_class.id = bc_storage;
+ hd->sub_class.id = sc_sto_scsi;
+ hd->bus.id = bus_sbus;
+
+ hd->vendor.id = MAKE_ID(TAG_SPECIAL, 0x4001);
+ hd->device.id = MAKE_ID(TAG_SPECIAL, 0x1002);
+ }
+ else if (strcmp (prop2, "ptisp") == 0)
+ {
+ ADD2LOG ("SCSI: type=Performance Technologies ISP, module=qlogicpti\n");
+ hd = add_hd_entry (hd_data, __LINE__, 0);
+ hd->base_class.id = bc_storage;
+ hd->sub_class.id = sc_sto_scsi;
+ hd->bus.id = bus_sbus;
+
+ hd->vendor.id = MAKE_ID(TAG_SPECIAL, 0x4001);
+ hd->device.id = MAKE_ID(TAG_SPECIAL, 0x1003);
+ }
+ else if (strcmp (prop2, "isp") == 0)
+ {
+ ADD2LOG ("SCSI: type=QLogic ISP, module=qlogicpti\n");
+ hd = add_hd_entry (hd_data, __LINE__, 0);
+ hd->base_class.id = bc_storage;
+ hd->sub_class.id = sc_sto_scsi;
+ hd->bus.id = bus_sbus;
+
+ hd->vendor.id = MAKE_ID(TAG_SPECIAL, 0x4001);
+ hd->device.id = MAKE_ID(TAG_SPECIAL, 0x1004);
+ }
+ else
+ ADD2LOG ("SCSI: Unknown SBUS device \"%s\"\n", prop2);
+ }
+ else
+ ADD2LOG ("SCSI: Unknown device \"%s\"\n", prop2);
+ }
+ }
+ else if (strcmp (prop1, "display") == 0)
+ {
+ char *prop2 = prom_getproperty ("name", &len, buf2);
+ if (prop2 && len >= 0)
+ if (sbus || strcmp (prop2, "ffb") == 0 ||
+ strcmp (prop2, "afb") == 0 || strcmp (prop2, "cgfourteen") == 0)
+ {
+ if (strcmp (prop2, "bwtwo") == 0)
+ {
+ ADD2LOG ("DISPLAY: Sun|Monochrome (bwtwo), depth=1\n");
+ hd = add_hd_entry (hd_data, __LINE__, 0);
+ hd->base_class.id = bc_display;
+ hd->sub_class.id = sc_dis_vga;
+ hd->bus.id = bus_sbus;
+
+ hd->vendor.id = MAKE_ID(TAG_SPECIAL, 0x4001);
+ hd->device.id = MAKE_ID(TAG_SPECIAL, 0x0001);
+ }
+ else if (strcmp (prop2, "cgthree") == 0)
+ {
+ ADD2LOG ("DISPLAY: Sun|Color3 (cgthree), depth=8\n");
+ hd = add_hd_entry (hd_data, __LINE__, 0);
+ hd->base_class.id = bc_display;
+ hd->sub_class.id = sc_dis_vga;
+ hd->bus.id = bus_sbus;
+
+ hd->vendor.id = MAKE_ID(TAG_SPECIAL, 0x4001);
+ hd->device.id = MAKE_ID(TAG_SPECIAL, 0x0002);
+ }
+ else if (strcmp (prop2, "cgeight") == 0)
+ {
+ ADD2LOG ("DISPLAY: Sun|CG8/RasterOps, depth=8\n");
+ hd = add_hd_entry (hd_data, __LINE__, 0);
+ hd->base_class.id = bc_display;
+ hd->sub_class.id = sc_dis_vga;
+ hd->bus.id = bus_sbus;
+
+ hd->vendor.id = MAKE_ID(TAG_SPECIAL, 0x4001);
+ hd->device.id = MAKE_ID(TAG_SPECIAL, 0x0003);
+ }
+ else if (strcmp (prop2, "cgtwelve") == 0)
+ {
+ ADD2LOG ("DISPLAY: Sun|GS (cgtwelve), depth=24\n");
+ hd = add_hd_entry (hd_data, __LINE__, 0);
+ hd->base_class.id = bc_display;
+ hd->sub_class.id = sc_dis_vga;
+ hd->bus.id = bus_sbus;
+
+ hd->vendor.id = MAKE_ID(TAG_SPECIAL, 0x4001);
+ hd->device.id = MAKE_ID(TAG_SPECIAL, 0x0004);
+ }
+ else if (strcmp (prop2, "gt") == 0)
+ {
+ ADD2LOG ("DISPLAY: Sun|Graphics Tower (gt), depth=24\n");
+ hd = add_hd_entry (hd_data, __LINE__, 0);
+ hd->base_class.id = bc_display;
+ hd->sub_class.id = sc_dis_vga;
+ hd->bus.id = bus_sbus;
+
+ hd->vendor.id = MAKE_ID(TAG_SPECIAL, 0x4001);
+ hd->device.id = MAKE_ID(TAG_SPECIAL, 0x0005);
+ }
+ else if (strcmp (prop2, "mgx") == 0)
+ {
+ hd = add_hd_entry (hd_data, __LINE__, 0);
+ hd->base_class.id = bc_display;
+ hd->sub_class.id = sc_dis_vga;
+ hd->bus.id = bus_sbus;
+ hd->vendor.id = MAKE_ID(TAG_SPECIAL, 0x4001);
+ prop2 = prom_getproperty ("fb_size", &len, buf2);
+ if (prop2 && len == 4 && *(int *)prop2 == 0x400000)
+ {
+ ADD2LOG ("DISPLAY: Quantum 3D MGXplus with 4M VRAM (mgx), depth=24\n");
+ hd->device.id = MAKE_ID(TAG_SPECIAL, 0x0006);
+ }
+ else
+ {
+ ADD2LOG ("DISPLAY: Quantum 3D MGXplus (mgx), depth=24\n");
+ hd->device.id = MAKE_ID(TAG_SPECIAL, 0x0007);
+ }
+ }
+ else if (strcmp (prop2, "cgsix") == 0)
+ {
+ int chiprev = 0;
+ int vmsize = 0;
+
+ hd = add_hd_entry (hd_data, __LINE__, 0);
+ hd->base_class.id = bc_display;
+ hd->sub_class.id = sc_dis_vga;
+ hd->bus.id = bus_sbus;
+ hd->vendor.id = MAKE_ID(TAG_SPECIAL, 0x4001);
+
+ prop2 = prom_getproperty("chiprev", &len, buf2);
+ if (prop2 && len == 4)
+ chiprev = *(int *)prop2;
+ prop2 = prom_getproperty("vmsize", &len, buf2);
+ if (prop2 && len == 4)
+ vmsize = *(int *)prop2;
+ switch (chiprev)
+ {
+ case 1 ... 4:
+ ADD2LOG ("DISPLAY: Sun|Double width GX (cgsix), depth=8\n");
+ hd->device.id = MAKE_ID(TAG_SPECIAL, 0x0008);
+ break;
+ case 5 ... 9:
+ ADD2LOG ("DISPLAY: Sun|Single width GX (cgsix), depth=8\n");
+ hd->device.id = MAKE_ID(TAG_SPECIAL, 0x0009);
+ break;
+ case 11:
+ switch (vmsize)
+ {
+ case 2:
+ ADD2LOG ("DISPLAY: Sun|Turbo GX with 1M VSIMM (cgsix), depth=8\n");
+ hd->device.id = MAKE_ID(TAG_SPECIAL, 0x000a);
+ break;
+ case 4:
+ ADD2LOG ("DISPLAY: Sun|Turbo GX Plus (cgsix), depth=8\n");
+ hd->device.id = MAKE_ID(TAG_SPECIAL, 0x000b);
+ break;
+ default:
+ ADD2LOG ("DISPLAY: Sun|Turbo GX (cgsix), depth=8\n");
+ hd->device.id = MAKE_ID(TAG_SPECIAL, 0x000c);
+ break;
+ }
+ break;
+ default:
+ ADD2LOG ("DISPLAY: Sun|Unknown GX (cgsix), depth=8\n");
+ hd->device.id = MAKE_ID(TAG_SPECIAL, 0x000d);
+ break;
+ }
+ }
+ else if (strcmp (prop2, "cgfourteen") == 0)
+ {
+ int size = 0;
+
+ hd = add_hd_entry (hd_data, __LINE__, 0);
+ hd->base_class.id = bc_display;
+ hd->sub_class.id = sc_dis_vga;
+ hd->bus.id = bus_sbus;
+ hd->vendor.id = MAKE_ID(TAG_SPECIAL, 0x4001);
+
+ prop2 = prom_getproperty ("reg", &len, buf2);
+ if (prop2 && !(len % 12) && len > 0)
+ size = *(int *)(prop2 + len - 4);
+ switch (size)
+ {
+ case 0x400000:
+ ADD2LOG ("DISPLAY: Sun|SX with 4M VSIMM (cgfourteen), depth=24\n");
+ hd->device.id = MAKE_ID(TAG_SPECIAL, 0x000e);
+ break;
+ case 0x800000:
+ ADD2LOG ("DISPLAY: Sun|SX with 8M VSIMM (cgfourteen), depth=24\n");
+ hd->device.id = MAKE_ID(TAG_SPECIAL, 0x000f);
+ break;
+ default:
+ ADD2LOG ("DISPLAY: Sun|SX (cgfourteen), depth=24\n");
+ hd->device.id = MAKE_ID(TAG_SPECIAL, 0x0010);
+ break;
+ }
+ }
+ else if (strcmp (prop2, "leo") == 0)
+ {
+ hd = add_hd_entry (hd_data, __LINE__, 0);
+ hd->base_class.id = bc_display;
+ hd->sub_class.id = sc_dis_vga;
+ hd->bus.id = bus_sbus;
+ hd->vendor.id = MAKE_ID(TAG_SPECIAL, 0x4001);
+
+ prop2 = prom_getproperty("model", &len, buf2);
+ if (prop2 && len > 0 && !strstr(prop2, "501-2503"))
+ {
+ ADD2LOG ("DISPLAY: Sun|Turbo ZX (leo), depth=24\n");
+ hd->device.id = MAKE_ID(TAG_SPECIAL, 0x0012);
+ }
+ else
+ {
+ ADD2LOG ("DISPLAY: Sun|ZX or Turbo ZX (leo), depth=24\n");
+ hd->device.id = MAKE_ID(TAG_SPECIAL, 0x0011);
+ }
+ }
+ else if (strcmp (prop2, "tcx") == 0)
+ {
+ hd = add_hd_entry (hd_data, __LINE__, 0);
+ hd->base_class.id = bc_display;
+ hd->sub_class.id = sc_dis_vga;
+ hd->bus.id = bus_sbus;
+ hd->vendor.id = MAKE_ID(TAG_SPECIAL, 0x4001);
+
+ if (prom_getbool ("tcx-8-bit"))
+ {
+ ADD2LOG ("DISPLAY: Sun|TCX (8bit), depth=8\n");
+ hd->device.id = MAKE_ID(TAG_SPECIAL, 0x0013);
+ }
+ else
+ {
+ ADD2LOG ("DISPLAY: Sun|TCX (S24), depth=24\n");
+ hd->device.id = MAKE_ID(TAG_SPECIAL, 0x0014);
+ }
+ }
+ else if (strcmp (prop2, "afb") == 0)
+ {
+ int btype = 0;
+
+ prop2 = prom_getproperty("board_type", &len, buf2);
+ if (prop2 && len == 4)
+ btype = *(int *)prop2;
+
+ hd = add_hd_entry (hd_data, __LINE__, 0);
+ hd->base_class.id = bc_display;
+ hd->sub_class.id = sc_dis_vga;
+ hd->bus.id = bus_sbus;
+ hd->vendor.id = MAKE_ID(TAG_SPECIAL, 0x4001);
+
+ if (btype == 3)
+ {
+ ADD2LOG ("DISPLAY: Sun|Elite3D-M6 Horizontal (afb), depth=24\n");
+ hd->device.id = MAKE_ID(TAG_SPECIAL, 0x0015);
+ }
+ else
+ {
+ ADD2LOG ("DISPLAY: Sun|Elite3D (afb), depth=24\n");
+ hd->device.id = MAKE_ID(TAG_SPECIAL, 0x0016);
+ }
+ }
+ else if (strcmp (prop2, "ffb") == 0)
+ {
+ int btype = 0;
+
+ prop2 = prom_getproperty("board_type", &len, buf2);
+ if (prop2 && len == 4)
+ btype = *(int *)prop2;
+
+ hd = add_hd_entry (hd_data, __LINE__, 0);
+ hd->base_class.id = bc_display;
+ hd->sub_class.id = sc_dis_vga;
+ hd->bus.id = bus_sbus;
+ hd->vendor.id = MAKE_ID(TAG_SPECIAL, 0x4001);
+
+ switch (btype)
+ {
+ case 0x08:
+ ADD2LOG ("DISPLAY: Sun|FFB 67MHz Creator (ffb), depth=24\n");
+ hd->device.id = MAKE_ID(TAG_SPECIAL, 0x0017);
+ break;
+ case 0x0b:
+ ADD2LOG ("DISPLAY: Sun|FFB 67MHz Creator 3D (ffb), depth=24\n");
+ hd->device.id = MAKE_ID(TAG_SPECIAL, 0x0018);
+ break;
+ case 0x1b:
+ ADD2LOG ("DISPLAY: Sun|FFB 75MHz Creator 3D (ffb), depth=24\n");
+ hd->device.id = MAKE_ID(TAG_SPECIAL, 0x0019);
+ break;
+ case 0x20:
+ case 0x28:
+ ADD2LOG ("DISPLAY: Sun|FFB2 Vertical Creator (ffb), depth=24\n");
+ hd->device.id = MAKE_ID(TAG_SPECIAL, 0x001a);
+ break;
+ case 0x23:
+ case 0x2b:
+ ADD2LOG ("DISPLAY: Sun|FFB2 Vertical Creator 3D (ffb), depth=24\n");
+ hd->device.id = MAKE_ID(TAG_SPECIAL, 0x001b);
+ break;
+ case 0x30:
+ ADD2LOG ("DISPLAY: Sun|FFB2+ Vertical Creator (ffb), depth=24\n");
+ hd->device.id = MAKE_ID(TAG_SPECIAL, 0x001c);
+ break;
+ case 0x33:
+ ADD2LOG ("DISPLAY: Sun|FFB2+ Vertical Creator 3D (ffb), depth=24\n");
+ hd->device.id = MAKE_ID(TAG_SPECIAL, 0x001d);
+ break;
+ case 0x40:
+ case 0x48:
+ ADD2LOG ("DISPLAY: Sun|FFB2 Horizontal Creator (ffb), depth=24\n");
+ hd->device.id = MAKE_ID(TAG_SPECIAL, 0x001e);
+ break;
+ case 0x43:
+ case 0x4b:
+ ADD2LOG ("DISPLAY: Sun|FFB2 Horizontal Creator 3D (ffb), depth=24\n");
+ hd->device.id = MAKE_ID(TAG_SPECIAL, 0x001f);
+ break;
+ default:
+ ADD2LOG ("DISPLAY: Sun|FFB (ffb), type=%xi, depth=24\n",
+ btype);
+ hd->device.id = MAKE_ID(TAG_SPECIAL, 0x0020);
+ break;
+ }
+ }
+ else
+ ADD2LOG ("DISPLAY: Unknown SBUS device \"%s\"\n", prop2);
+ }
+ else
+ ADD2LOG ("DISPLAY: Unknown device \"%s\"\n", prop2);
+ }
+ else if (strcmp (prop1, "cpu") == 0)
+ {
+ char *prop2 = prom_getproperty ("name", &len, buf2);
+
+ if (prop2 && len >= 0)
+ ADD2LOG ("CPU: %s\n", prop2);
+ }
+ else
+ {
+ char *prop2 = prom_getproperty ("name", &len, buf2);
+
+ if (prop2 && len >= 0)
+ {
+ if (strcmp (prop2, "audio") == 0)
+ {
+ ADD2LOG ("AUDIO: type=AMD7930, module=amd7930\n");
+ hd = add_hd_entry (hd_data, __LINE__, 0);
+ hd->base_class.id = bc_multimedia;
+ hd->sub_class.id = sc_multi_audio;
+ hd->bus.id = bus_sbus;
+ hd->unix_dev_name = new_str ("/dev/audio");
+
+ hd->vendor.id = MAKE_ID(TAG_SPECIAL, 0x4001);
+ hd->device.id = MAKE_ID(TAG_SPECIAL, 0x2001);
+ }
+ else if (strcmp (prop2, "CS4231") == 0)
+ {
+ hd = add_hd_entry (hd_data, __LINE__, 0);
+ hd->base_class.id = bc_multimedia;
+ hd->sub_class.id = sc_multi_audio;
+ hd->bus.id = bus_sbus;
+ hd->unix_dev_name = new_str ("/dev/audio");
+
+ if (ebus)
+ {
+ ADD2LOG ("AUDIO: type=CS4231 EB2 DMA (PCI), module=cs4231\n");
+ hd->device.id = MAKE_ID(TAG_SPECIAL, 0x2002);
+ }
+ else
+ {
+ ADD2LOG ("AUDIO: type=CS4231 APC DMA (SBUS), module=cs4231\n");
+ hd->device.id = MAKE_ID(TAG_SPECIAL, 0x2003);
+ }
+ hd->vendor.id = MAKE_ID(TAG_SPECIAL, 0x4001);
+ }
+ else if (strcmp (prop2, "DBRIe") == 0)
+ {
+ ADD2LOG ("AUDIO: type=SS10/SS20 DBRI, module=dbri\n");
+ hd = add_hd_entry (hd_data, __LINE__, 0);
+ hd->base_class.id = bc_multimedia;
+ hd->sub_class.id = sc_multi_audio;
+ hd->bus.id = bus_sbus;
+ hd->unix_dev_name = new_str ("/dev/audio");
+
+ hd->vendor.id = MAKE_ID(TAG_SPECIAL, 0x4001);
+ hd->device.id = MAKE_ID(TAG_SPECIAL, 0x2004);
+ }
+ else if (strcmp (prop2, "bpp") == 0)
+ {
+ ADD2LOG ("PARPORT: type=bpp, module=unknown\n");
+ }
+ else if (strcmp (prop2, "soc") == 0)
+ {
+ ADD2LOG ("SCSI: type=Sun SPARCStorage Array, module=fc4:soc:pluto\n");
+ hd = add_hd_entry (hd_data, __LINE__, 0);
+ hd->base_class.id = bc_storage;
+ hd->sub_class.id = sc_sto_scsi;
+ hd->bus.id = bus_sbus;
+
+ hd->vendor.id = MAKE_ID(TAG_SPECIAL, 0x4001);
+ hd->device.id = MAKE_ID(TAG_SPECIAL, 0x1101);
+ }
+ else if (strcmp (prop2, "socal") == 0)
+ {
+ ADD2LOG ("SCSI: type=Sun Enterprise Network Array, module=fc4:socal:fcal\n");
+ hd = add_hd_entry (hd_data, __LINE__, 0);
+ hd->base_class.id = bc_storage;
+ hd->sub_class.id = sc_sto_scsi;
+ hd->bus.id = bus_sbus;
+
+ hd->vendor.id = MAKE_ID(TAG_SPECIAL, 0x4001);
+ hd->device.id = MAKE_ID(TAG_SPECIAL, 0x1102);
+ }
+ else if (strcmp(prop2, "sbus") == 0 || strcmp(prop2, "sbi") == 0)
+ nsbus = 1;
+ else if (!strcmp(prop2, "ebus"))
+ nebus = 1;
+ else
+ ADD2LOG ("%s: unknown device \"%s\"\n", prop1, prop2);
+ }
+ }
+
+
+ nextnode = prom_getchild (node);
+ if (nextnode)
+ prom_parse (nextnode, nsbus, nebus, hd_data);
+ nextnode = prom_nextnode (node);
+ if (nextnode)
+ prom_parse (nextnode, sbus, ebus, hd_data);
+
+ return;
+}
+
+void
+hd_scan_sbus (hd_data_t *hd_data)
+{
+ int prom_root_node;
+
+ if(!hd_probe_feature(hd_data, pr_sbus))
+ return;
+
+ hd_data->module = mod_sbus;
+
+ /* some clean-up */
+ remove_hd_entries(hd_data);
+
+ PROGRESS(1, 0, "sun sbus");
+
+ if((prom_fd = open(DEV_OPENPROM, O_RDWR | O_NONBLOCK | O_NOCTTY)) < 0)
+ return;
+
+ prom_root_node = prom_nextnode(0);
+ if (!prom_root_node)
+ goto failed;
+
+ prom_parse (prom_root_node, 0, 0, hd_data);
+
+ failed:
+ close (prom_fd);
+
+ return;
+}
+
+#else
+
+void
+hd_scan_sbus (hd_data_t *hd_data)
+{
+ return;
+}
+
+#endif
--- /dev/null
+void hd_scan_sbus (hd_data_t *hd_data);
--- /dev/null
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+
+#include "hd.h"
+#include "hd_int.h"
+#include "serial.h"
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ * serial interface
+ *
+ * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ */
+
+
+static char *ser_names[] = {
+ "8250", "16450", "16550", "16650", "16750", "16850", "16950"
+};
+
+static void get_serial_info(hd_data_t *hd_data);
+static serial_t *add_serial_entry(serial_t **ser, serial_t *new_ser);
+static void dump_serial_data(hd_data_t *hd_data);
+
+void hd_scan_serial(hd_data_t *hd_data)
+{
+ hd_t *hd;
+ serial_t *ser, *next;
+ hd_res_t *res;
+ int i;
+ char buf[4], *skip_dev[16];
+ str_list_t *sl, *cmd;
+ unsigned skip_devs = 0;
+
+ if(!hd_probe_feature(hd_data, pr_serial)) return;
+
+ hd_data->module = mod_serial;
+
+ /* some clean-up */
+ remove_hd_entries(hd_data);
+ hd_data->serial = NULL;
+
+ PROGRESS(1, 0, "read info");
+
+ get_serial_info(hd_data);
+ if((hd_data->debug & HD_DEB_SERIAL)) dump_serial_data(hd_data);
+
+ for(i = 0; i < 2; i++) {
+ cmd = get_cmdline(hd_data, i == 0 ? "yast2ser" : "console");
+ for(sl = cmd; sl; sl = sl->next) {
+ if(sscanf(sl->str, "tty%3[^,]", buf) == 1) {
+ if(buf[1] == 0) {
+ switch(*buf) {
+ case 'a': strcpy(buf, "S0"); break;
+ case 'b': strcpy(buf, "S1"); break;
+ }
+ }
+ if(skip_devs < sizeof skip_dev / sizeof *skip_dev) {
+ skip_dev[skip_devs] = NULL;
+ str_printf(&skip_dev[skip_devs++], 0, "/dev/tty%s", buf);
+ }
+ }
+ }
+ free_str_list(cmd);
+ }
+
+ PROGRESS(2, 0, "build list");
+
+ for(ser = hd_data->serial; ser; ser = ser->next) {
+ hd = add_hd_entry(hd_data, __LINE__, 0);
+ hd->base_class.id = bc_comm;
+ hd->sub_class.id = sc_com_ser;
+ hd->prog_if.id = 0x80;
+ for(i = 0; (unsigned) i < sizeof ser_names / sizeof *ser_names; i++) {
+ if(strstr(ser->name, ser_names[i])) hd->prog_if.id = i;
+ }
+ hd->device.name = new_str(ser->name);
+ hd->func = ser->line;
+ str_printf(&hd->unix_dev_name, 0, "/dev/ttyS%u", ser->line);
+ for(i = 0; i < (int) skip_devs; i++) {
+ if(!strcmp(skip_dev[i], hd->unix_dev_name)) {
+ hd->tag.ser_skip = 1;
+ break;
+ }
+ }
+ if(ser->device) {
+ if(strstr(ser->device, "modem-printer")) {
+ hd->tag.ser_device = 1;
+ }
+ else if(strstr(ser->device, "infrared")) {
+ hd->tag.ser_device = 2;
+ }
+ else if(strstr(ser->device, "modem")) {
+ hd->tag.ser_device = 3;
+ }
+ }
+ if(ser->baud) {
+ res = add_res_entry(&hd->res, new_mem(sizeof *res));
+ res->baud.type = res_baud;
+ res->baud.speed = ser->baud;
+ }
+ res = add_res_entry(&hd->res, new_mem(sizeof *res));
+ res->io.type = res_io;
+ res->io.enabled = 1;
+ res->io.base = ser->port;
+ res->io.access = acc_rw;
+
+ res = add_res_entry(&hd->res, new_mem(sizeof *res));
+ res->irq.type = res_irq;
+ res->irq.enabled = 1;
+ res->irq.base = ser->irq;
+ }
+
+ for(ser = hd_data->serial; ser; ser = next) {
+ next = ser->next;
+
+ free_mem(ser->name);
+ free_mem(ser->device);
+ free_mem(ser);
+ }
+ hd_data->serial = NULL;
+
+#if 0
+ if(hd_module_is_active(hd_data, "irda")) {
+ hd = add_hd_entry(hd_data, __LINE__, 0);
+ hd->base_class.id = bc_comm;
+ hd->sub_class.id = sc_com_ser;
+ hd->prog_if.id = 0x80;
+ hd->device.name = new_str("IrDA Serial");
+ hd->unix_dev_name = new_str("/dev/ircomm0");
+ }
+#endif
+}
+
+void get_serial_info(hd_data_t *hd_data)
+{
+ char buf[64];
+ unsigned u0, u1, u2;
+#if !defined(__PPC__)
+ unsigned u3;
+#endif
+ int i;
+ str_list_t *sl, *sl0;
+ serial_t *ser;
+
+#if !defined(__PPC__)
+ /*
+ * Max. 44 serial lines at the moment; the serial proc interface is
+ * somewhat buggy at the moment (2.2.13), hence the explicit 44 lines
+ * limit. That may be dropped later.
+ */
+ sl0 = read_file(PROC_DRIVER_SERIAL, 1, 44);
+
+ // ########## FIX !!!!!!!! ########
+ if(sl0) {
+ for(sl = sl0; sl; sl = sl->next) {
+ i = 0;
+ if(
+ sscanf(sl->str, "%u: uart:%31s port:%x irq:%u baud:%u", &u0, buf, &u1, &u2, &u3) == 5 ||
+ (i = 1, sscanf(sl->str, "%u: uart:%31s port:%x irq:%u tx:%u", &u0, buf, &u1, &u2, &u3) == 5)
+ ) {
+ /*
+ * The 'baud' or 'tx' entries are only present for real interfaces.
+ */
+ ser = add_serial_entry(&hd_data->serial, new_mem(sizeof *ser));
+ ser->line = u0;
+ ser->port = u1;
+ ser->irq = u2;
+ if(!i) ser->baud = u3;
+ ser->name = new_str(buf);
+ }
+ }
+
+ if((hd_data->debug & HD_DEB_SERIAL)) {
+ /* log just the first 16 entries */
+ ADD2LOG("----- "PROC_DRIVER_SERIAL" -----\n");
+ for(sl = sl0, i = 16; sl && i--; sl = sl->next) {
+ ADD2LOG(" %s", sl->str);
+ }
+ ADD2LOG("----- "PROC_DRIVER_SERIAL" end -----\n");
+ }
+ }
+#endif /* !defined(__PPC__) */
+
+#if defined(__PPC__)
+ sl0 = read_file(PROC_DRIVER_MACSERIAL, 1, 0);
+
+ if(sl0) {
+ for(sl = sl0; sl; sl = sl->next) {
+ if(
+ (i = sscanf(sl->str, "%u: port:%x irq:%u con:%63[^\n]", &u0, &u1, &u2, buf)) >= 3
+ ) {
+ ser = add_serial_entry(&hd_data->serial, new_mem(sizeof *ser));
+ ser->line = u0;
+ ser->port = u1;
+ ser->irq = u2;
+ ser->name = new_str("SCC");
+ if(i == 4) ser->device = new_str(buf);
+ }
+ }
+
+ if((hd_data->debug & HD_DEB_SERIAL)) {
+ /* log just the first 16 entries */
+ ADD2LOG("----- "PROC_DRIVER_MACSERIAL" -----\n");
+ for(sl = sl0, i = 16; sl && i--; sl = sl->next) {
+ ADD2LOG(" %s", sl->str);
+ }
+ ADD2LOG("----- "PROC_DRIVER_MACSERIAL" end -----\n");
+ }
+ }
+#endif /* defined(__PPC__) */
+
+
+ free_str_list(sl0);
+}
+
+serial_t *add_serial_entry(serial_t **ser, serial_t *new_ser)
+{
+ while(*ser) ser = &(*ser)->next;
+ return *ser = new_ser;
+}
+
+void dump_serial_data(hd_data_t *hd_data)
+{
+ serial_t *ser;
+
+ ADD2LOG("----- serial info -----\n");
+ for(ser = hd_data->serial; ser; ser = ser->next) {
+ ADD2LOG(
+ " uart %s, line %d, port 0x%03x, irq %d, baud %d\n",
+ ser->name, ser->line, ser->port, ser->irq, ser->baud
+ );
+ }
+ ADD2LOG("----- serial info end -----\n");
+}
+
--- /dev/null
+void hd_scan_serial(hd_data_t *hd_data);
--- /dev/null
+#include <stdio.h>
+#include <string.h>
+
+#include "hd.h"
+#include "hd_int.h"
+#include "smbios.h"
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+
+enum sm_map_type { sm_map_str, sm_map_num2str };
+
+typedef struct { unsigned num; char *str; } sm_num2str_t;
+
+typedef struct {
+ enum sm_map_type type;
+ unsigned len;
+ union {
+ char **str;
+ sm_num2str_t *num2str;
+ } list;
+} sm_str_map_t;
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+
+static char *get_string(str_list_t *sl, int index);
+static void smbios_bitmap_print(FILE *f, hd_bitmap_t *hbm, char *label, int style);
+static void smbios_id_print(FILE *f, hd_id_t *hid, char *label);
+static void smbios_str_print(FILE *f, char *str, char *label);
+static void smbios_id2str(hd_id_t *hid, sm_str_map_t *map, unsigned def);
+static void smbios_bitmap2str(hd_bitmap_t *hbm, sm_str_map_t *map);
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+
+#define SMBIOS_PRINT_ID(a, b) smbios_id_print(f, &sm->a, b)
+#define SMBIOS_PRINT_STR(a, b) smbios_str_print(f, sm->a, b)
+#define SMBIOS_PRINT_BITMAP_SHORT(a, b) smbios_bitmap_print(f, &sm->a, b, 0)
+#define SMBIOS_PRINT_BITMAP_LONG(a, b) smbios_bitmap_print(f, &sm->a, b, 1)
+
+#define SMBIOS_DEF_MAP(a) \
+ static sm_str_map_t a = { \
+ sizeof *a ## _ == sizeof (sm_num2str_t) ? sm_map_num2str : sm_map_str, \
+ sizeof a ## _ / sizeof *a ## _, \
+ { (void *) a ## _ } \
+ };
+
+/* ptr is (unsigned char *) */
+#define READ_MEM16(ptr) ((ptr)[0] + ((ptr)[1] << 8))
+#define READ_MEM32(ptr) ((ptr)[0] + ((ptr)[1] << 8) + ((ptr)[2] << 16) + ((ptr)[3] << 24))
+#define READ_MEM64(ptr) (READ_MEM32(ptr) + ((uint64_t) READ_MEM32(ptr + 4) << 32))
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+
+static sm_num2str_t smbios_bios_feature_[] = {
+ { 4, "ISA supported" },
+ { 5, "MCA supported" },
+ { 6, "EISA supported" },
+ { 7, "PCI supported" },
+ { 8, "PCMCIA supported" },
+ { 9, "PnP supported" },
+ { 10, "APM supported" },
+ { 11, "BIOS flashable" },
+ { 12, "BIOS shadowing allowed" },
+ { 13, "VL-VESA supported" },
+ { 14, "ESCD supported" },
+ { 15, "CD boot supported" },
+ { 16, "Selectable boot supported" },
+ { 17, "BIOS ROM socketed" },
+ { 18, "PCMCIA boot supported" },
+ { 19, "EDD spec supported" },
+ { 20, "1.2MB NEC 9800 Japanese Floppy supported" },
+ { 21, "1.2MB Toshiba Japanese Floppy supported" },
+ { 22, "360kB Floppy supported" },
+ { 23, "1.2MB Floppy supported" },
+ { 24, "720kB Floppy supported" },
+ { 25, "2.88MB Floppy supported" },
+ { 26, "Print Screen supported" },
+ { 27, "8042 Keyboard Services supported" },
+ { 28, "Serial Services supported" },
+ { 29, "Printer Services supported" },
+ { 30, "CGA/Mono Video supported" },
+ { 31, "NEC PC-98" },
+ { 64 + 0, "ACPI supported" },
+ { 64 + 1, "USB Legacy supported" },
+ { 64 + 2, "AGP supported" },
+ { 64 + 3, "I2O boot supported" },
+ { 64 + 4, "LS-120 boot supported" },
+ { 64 + 5, "ATAPI ZIP boot supported" },
+ { 64 + 6, "IEEE1394 boot supported" },
+ { 64 + 7, "Smart Battery supported" },
+ { 64 + 8, "BIOS Boot Spec supported" },
+ { 64 + 9, "F12 Network boot supported" }
+};
+SMBIOS_DEF_MAP(smbios_bios_feature);
+
+
+static char *smbios_system_wakeups_[] = {
+ "Reserved", "Other", "Unknown", "APM Timer",
+ "Modem Ring", "LAN Remote", "Power Switch", "PCI PME#",
+ "AC Power Restored"
+};
+SMBIOS_DEF_MAP(smbios_system_wakeups);
+
+
+static char *smbios_board_feature_[] = {
+ "Hosting Board", "Needs One Daughter Board", "Removable", "Replaceable",
+ "Hot Swappable"
+};
+SMBIOS_DEF_MAP(smbios_board_feature);
+
+
+static char *smbios_board_types_[] = {
+ NULL, "Other", "Unknown", "Server Blade",
+ "Connectivity Switch", "System Management Module", "Processor Module", "I/O Module",
+ "Memory Module", "Daughter Board", "Motherboard", "Processor/Memory Module",
+ "Processor/IO Module", "Interconnect Board"
+};
+SMBIOS_DEF_MAP(smbios_board_types);
+
+
+static char *smbios_chassis_types_[] = {
+ NULL, "Other", "Unknown", "Desktop",
+ "Low Profile Desktop", "Pizza Box", "Mini Tower", "Tower",
+ "Portable", "LapTop", "Notebook", "Hand Held",
+ "Docking Station", "All in One", "Sub Notebook", "Space Saving",
+ "Lunch Box", "Main Server Chassis", "Expansion Chassis", "SubChassis",
+ "Bus Expansion Chassis", "Peripheral Chassis", "RAID Chassis", "Rack Mount Chassis",
+ "Sealed-case PC", "Multi-System Chassis"
+};
+SMBIOS_DEF_MAP(smbios_chassis_types);
+
+
+static char *smbios_chassis_states_[] = {
+ NULL, "Other", "Unknown", "Safe",
+ "Warning", "Critical", "Non-recoverable"
+};
+SMBIOS_DEF_MAP(smbios_chassis_states);
+
+
+static char *smbios_chassis_sec_states_[] = {
+ NULL, "Other", "Unknown", "None",
+ "External interface locked out", "External interface enabled"
+};
+SMBIOS_DEF_MAP(smbios_chassis_sec_states);
+
+
+static char *smbios_proc_upgrades_[] = {
+ NULL, "Other", "Unknown", "Daughter Board",
+ "ZIF Socket", "Replaceable Piggy Back", "None", "LIF Socket",
+ "Slot 1", "Slot 2", "370-Pin Socket", "Slot A",
+ "Slot M", "Socket 423", "Socket A (Socket 462)", "Socket 478",
+ "Socket 754", "Socket 940"
+};
+SMBIOS_DEF_MAP(smbios_proc_upgrades);
+
+
+static char *smbios_proc_cpu_status_[8] = {
+ "Unknown", "Enabled", "Disabled by User", "Disabled by BIOS",
+ "Idle", "Reserved", "Reserved", "Other"
+};
+SMBIOS_DEF_MAP(smbios_proc_cpu_status);
+
+
+static char *smbios_proc_types_[] = {
+ NULL, "Other", "Unknown", "CPU",
+ "Math", "DSP", "Video"
+};
+SMBIOS_DEF_MAP(smbios_proc_types);
+
+
+static sm_num2str_t smbios_proc_families_[] = {
+ { 0x00, NULL },
+ { 0x01, "Other" },
+ { 0x02, "Unknown" },
+ { 0x03, "8086" },
+ { 0x04, "80286" },
+ { 0x05, "Intel386" },
+ { 0x06, "Intel486" },
+ { 0x07, "8087" },
+ { 0x08, "80287" },
+ { 0x09, "80387" },
+ { 0x0a, "80487" },
+ { 0x0b, "Pentium" },
+ { 0x0c, "Pentium Pro" },
+ { 0x0d, "Pentium II" },
+ { 0x0e, "Pentium MMX" },
+ { 0x0f, "Celeron" },
+ { 0x10, "Pentium II Xeon" },
+ { 0x11, "Pentium III" },
+ { 0x12, "M1" },
+ { 0x13, "M2" },
+ { 0x18, "Duron" },
+ { 0x19, "K5" },
+ { 0x1a, "K6" },
+ { 0x1b, "K6-2" },
+ { 0x1c, "K6-3" },
+ { 0x1d, "Athlon" },
+ { 0x1e, "AMD2900" },
+ { 0x1f, "K6-2+" },
+ { 0x78, "Crusoe TM5000" },
+ { 0x79, "Crusoe TM3000" },
+ { 0x82, "Itanium" },
+ { 0x83, "Athlon 64" },
+ { 0x84, "Opteron Processor" },
+ { 0xb0, "Pentium III Xeon" },
+ { 0xb1, "Pentium III with SpeedStep" },
+ { 0xb2, "Pentium 4" },
+ { 0xb3, "Xeon" },
+ { 0xb4, "AS400" },
+ { 0xb5, "Xeon MP" },
+ { 0xb6, "Athlon XP" },
+ { 0xb7, "Athlon MP" },
+ { 0xb8, "Itanium 2" }
+};
+SMBIOS_DEF_MAP(smbios_proc_families);
+
+
+static char *smbios_cache_mode_[] = {
+ "Write Through", "Write Back", "Varies with Memory Address", "Unknown"
+};
+SMBIOS_DEF_MAP(smbios_cache_mode);
+
+
+static char *smbios_cache_location_[] = {
+ "Internal", "External", "Reserved", "Unknown"
+};
+SMBIOS_DEF_MAP(smbios_cache_location);
+
+
+static char *smbios_cache_ecc_[] = {
+ NULL, "Other", "Unknown", "None",
+ "Parity", "Single-bit", "Multi-bit", "CRC"
+};
+SMBIOS_DEF_MAP(smbios_cache_ecc);
+#define smbios_memarray_ecc smbios_cache_ecc
+
+
+static char *smbios_cache_type_[] = {
+ NULL, "Other", "Unknown", "Instruction",
+ "Data", "Unified"
+};
+SMBIOS_DEF_MAP(smbios_cache_type);
+
+
+static char *smbios_cache_assoc_[] = {
+ NULL, "Other", "Unknown", "Direct Mapped",
+ "2-way Set-Associative", "4-way Set-Associative", "Fully Associative", "8-way Set-Associative",
+ "16-way Set-Associative"
+};
+SMBIOS_DEF_MAP(smbios_cache_assoc);
+
+
+static char *smbios_cache_sram_[] = {
+ "Other", "Unknown", "Non-Burst", "Burst",
+ "Pipeline Burst", "Synchronous", "Asynchronous"
+};
+SMBIOS_DEF_MAP(smbios_cache_sram);
+
+
+static sm_num2str_t smbios_connect_conn_type_[] = {
+ { 0x00, NULL },
+ { 0x01, "Centronics" },
+ { 0x02, "Mini Centronics" },
+ { 0x03, "Proprietary" },
+ { 0x04, "DB-25 pin male" },
+ { 0x05, "DB-25 pin female" },
+ { 0x06, "DB-15 pin male" },
+ { 0x07, "DB-15 pin female" },
+ { 0x08, "DB-9 pin male" },
+ { 0x09, "DB-9 pin female" },
+ { 0x0a, "RJ-11" },
+ { 0x0b, "RJ-45" },
+ { 0x0c, "50 Pin MiniSCSI" },
+ { 0x0d, "Mini-DIN" },
+ { 0x0e, "Micro-DIN" },
+ { 0x0f, "PS/2" },
+ { 0x10, "Infrared" },
+ { 0x11, "HP-HIL" },
+ { 0x12, "Access Bus [USB]" },
+ { 0x13, "SSA SCSI" },
+ { 0x14, "Circular DIN-8 male" },
+ { 0x15, "Circular DIN-8 female" },
+ { 0x16, "On Board IDE" },
+ { 0x17, "On Board Floppy" },
+ { 0x18, "9 Pin Dual Inline [pin 10 cut]" },
+ { 0x19, "25 Pin Dual Inline [pin 26 cut]" },
+ { 0x1a, "50 Pin Dual Inline" },
+ { 0x1b, "68 Pin Dual Inline" },
+ { 0x1c, "On Board Sound Input from CD-ROM" },
+ { 0x1d, "Mini-Centronics Type-14" },
+ { 0x1e, "Mini-Centronics Type-26" },
+ { 0x1f, "Mini-jack [headphones]" },
+ { 0x20, "BNC" },
+ { 0x21, "1394" },
+ { 0xa0, "PC-98" },
+ { 0xa1, "PC-98Hireso" },
+ { 0xa2, "PC-H98" },
+ { 0xa3, "PC-98Note" },
+ { 0xa4, "PC-98Full" },
+ { 0xff, "Other" }
+};
+SMBIOS_DEF_MAP(smbios_connect_conn_type);
+
+
+static sm_num2str_t smbios_connect_port_type_[] = {
+ { 0x00, NULL },
+ { 0x01, "Parallel Port XT/AT Compatible" },
+ { 0x02, "Parallel Port PS/2" },
+ { 0x03, "Parallel Port ECP" },
+ { 0x04, "Parallel Port EPP" },
+ { 0x05, "Parallel Port ECP/EPP" },
+ { 0x06, "Serial Port XT/AT Compatible" },
+ { 0x07, "Serial Port 16450 Compatible" },
+ { 0x08, "Serial Port 16550 Compatible" },
+ { 0x09, "Serial Port 16550A Compatible" },
+ { 0x0a, "SCSI Port" },
+ { 0x0b, "MIDI Port" },
+ { 0x0c, "Joy Stick Port" },
+ { 0x0d, "Keyboard Port" },
+ { 0x0e, "Mouse Port" },
+ { 0x0f, "SSA SCSI" },
+ { 0x10, "USB" },
+ { 0x11, "FireWire [IEEE P1394]" },
+ { 0x12, "PCMCIA Type I" },
+ { 0x13, "PCMCIA Type II" },
+ { 0x14, "PCMCIA Type III" },
+ { 0x15, "Cardbus" },
+ { 0x16, "Access Bus Port" },
+ { 0x17, "SCSI II" },
+ { 0x18, "SCSI Wide" },
+ { 0x19, "PC-98" },
+ { 0x1a, "PC-98-Hireso" },
+ { 0x1b, "PC-H98" },
+ { 0x1c, "Video Port" },
+ { 0x1d, "Audio Port" },
+ { 0x1e, "Modem Port" },
+ { 0x1f, "Network Port" },
+ { 0xa0, "8251 Compatible" },
+ { 0xa1, "8251 FIFO Compatible" },
+ { 0xff, "Other" }
+};
+SMBIOS_DEF_MAP(smbios_connect_port_type);
+
+
+static sm_num2str_t smbios_slot_type_[] = {
+ { 0x00, NULL },
+ { 0x01, "Other" },
+ { 0x02, "Unknown" },
+ { 0x03, "ISA" },
+ { 0x04, "MCA" },
+ { 0x05, "EISA" },
+ { 0x06, "PCI" },
+ { 0x07, "PC Card [PCMCIA]" },
+ { 0x08, "VL-VESA" },
+ { 0x09, "Proprietary" },
+ { 0x0a, "Processor Card" },
+ { 0x0b, "Proprietary Memory Card" },
+ { 0x0c, "I/O Riser Card" },
+ { 0x0d, "NuBus" },
+ { 0x0e, "PCI - 66MHz Capable" },
+ { 0x0f, "AGP" },
+ { 0x10, "AGP 2X" },
+ { 0x11, "AGP 4X" },
+ { 0x12, "PCI-X" },
+ { 0x13, "AGP 8X" },
+ { 0xa0, "PC-98/C20" },
+ { 0xa1, "PC-98/C24" },
+ { 0xa2, "PC-98/E" },
+ { 0xa3, "PC-98/Local Bus" },
+ { 0xa4, "PC-98/Card" }
+};
+SMBIOS_DEF_MAP(smbios_slot_type);
+
+
+static char *smbios_slot_bus_width_[] = {
+ NULL, "Other", "Unknown", "8 bit",
+ "16 bit", "32 bit", "64 bit", "128 bit"
+};
+SMBIOS_DEF_MAP(smbios_slot_bus_width);
+
+
+static char *smbios_slot_usage_[] = {
+ NULL, "Other", "Unknown", "Available",
+ "In Use"
+};
+SMBIOS_DEF_MAP(smbios_slot_usage);
+
+
+static char *smbios_slot_length_[] = {
+ NULL, "Other", "Unknown", "Short",
+ "Long"
+};
+SMBIOS_DEF_MAP(smbios_slot_length);
+
+
+static char *smbios_slot_feature_[] = {
+ "Unknown", "5.0 V", "3.3 V", "Shared",
+ "PC Card-16", "CardBus", "Zoom Video", "Modem Ring Resume",
+ "PME#", "Hot-Plug"
+};
+SMBIOS_DEF_MAP(smbios_slot_feature);
+
+
+static char *smbios_onboard_type_[] = {
+ "Other", "Other", "Unknown", "Video",
+ "SCSI Controller", "Ethernet", "Token Ring", "Sound"
+};
+SMBIOS_DEF_MAP(smbios_onboard_type);
+
+
+static sm_num2str_t smbios_memarray_location_[] = {
+ { 0x00, NULL },
+ { 0x01, "Other" },
+ { 0x02, "Unknown" },
+ { 0x03, "Motherboard" },
+ { 0x04, "ISA add-on card" },
+ { 0x05, "EISA add-on card" },
+ { 0x06, "PCI add-on card" },
+ { 0x07, "MCA add-on card" },
+ { 0x08, "PCMCIA add-on card" },
+ { 0x09, "Proprietary add-on card" },
+ { 0x0a, "NuBus" },
+ { 0xa0, "PC-98/C20 add-on card" },
+ { 0xa1, "PC-98/C24 add-on card" },
+ { 0xa2, "PC-98/E add-on card" },
+ { 0xa3, "PC-98/Local bus add-on card" }
+};
+SMBIOS_DEF_MAP(smbios_memarray_location);
+
+
+static char *smbios_memarray_use_[] = {
+ NULL, "Other", "Unknown", "System memory",
+ "Video memory", "Flash memory", "Non-volatile RAM", "Cache memory"
+};
+SMBIOS_DEF_MAP(smbios_memarray_use);
+
+
+static char *smbios_mouse_type_[] = {
+ NULL, "Other", "Unknown", "Mouse",
+ "Track Ball", "Track Point", "Glide Point", "Touch Pad",
+ "Touch Screen", "Optical Sensor"
+};
+SMBIOS_DEF_MAP(smbios_mouse_type);
+
+
+static sm_num2str_t smbios_mouse_interface_[] = {
+ { 0x00, NULL },
+ { 0x01, "Other" },
+ { 0x02, "Unknown" },
+ { 0x03, "Serial" },
+ { 0x04, "PS/2" },
+ { 0x05, "Infrared" },
+ { 0x06, "HP-HIL" },
+ { 0x07, "Bus Mouse" },
+ { 0x08, "ADB" },
+ { 0xa0, "Bus mouse DB-9" },
+ { 0xa1, "Bus mouse micro-DIN" },
+ { 0xa2, "USB" }
+};
+SMBIOS_DEF_MAP(smbios_mouse_interface);
+
+
+static char *smbios_memdevice_form_[] = {
+ NULL, "Other", "Unknown", "SIMM",
+ "SIP", "Chip", "DIP", "ZIP",
+ "Proprietary Card", "DIMM", "TSOP", "Row of Chips",
+ "RIMM", "SODIMM", "SRIMM"
+};
+SMBIOS_DEF_MAP(smbios_memdevice_form);
+
+
+static char *smbios_memdevice_type_[] = {
+ NULL, "Other", "Unknown", "DRAM",
+ "EDRAM", "VRAM", "SRAM", "RAM",
+ "ROM", "FLASH", "EEPROM", "FEPROM",
+ "EPROM", "CDRAM", "3DRAM", "SDRAM",
+ "SGRAM", "RDRAM", "DDR"
+};
+SMBIOS_DEF_MAP(smbios_memdevice_type);
+
+
+static char *smbios_memdevice_detail_[] = {
+ NULL, "Other", "Unknown", "Fast-paged",
+ "Static column", "Pseudo-static", "RAMBUS", "Synchronous",
+ "CMOS", "EDO", "Window DRAM", "Cache DRAM",
+ "Non-volatile"
+};
+SMBIOS_DEF_MAP(smbios_memdevice_detail);
+
+
+static char *smbios_memerror_type_[] = {
+ NULL, "Other", "Unknown", "OK",
+ "Bad read", "Parity error", "Single-bit error", "Double-bit error",
+ "Multi-bit error", "Nibble error", "Checksum error", "CRC error",
+ "Corrected single-bit error", "Corrected error", "Uncorrectable error"
+};
+SMBIOS_DEF_MAP(smbios_memerror_type);
+
+
+static char *smbios_memerror_granularity_[] = {
+ NULL, "Other", "Unknown", "Device level",
+ "Memory partition level"
+};
+SMBIOS_DEF_MAP(smbios_memerror_granularity);
+
+
+static char *smbios_memerror_operation_[] = {
+ NULL, "Other", "Unknown", "Read",
+ "Write", "Partial write"
+};
+SMBIOS_DEF_MAP(smbios_memerror_operation);
+
+
+static char *smbios_secure_state_[] = {
+ "Disabled", "Enabled", "Not Implemented", "Unknown"
+};
+SMBIOS_DEF_MAP(smbios_secure_state);
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+
+/*
+ * return the index'th string from sl
+ */
+char *get_string(str_list_t *sl, int index)
+{
+ if(!sl || !index) return NULL;
+
+ for(; sl; sl = sl->next, index--) {
+ if(index == 1) return new_str(sl->str && *sl->str ? sl->str : NULL);
+ }
+
+ return NULL;
+}
+
+
+/*
+ * Print a bitmap.
+ * Style: 0: short, 1: long.
+ */
+void smbios_bitmap_print(FILE *f, hd_bitmap_t *hbm, char *label, int style)
+{
+ unsigned u;
+ str_list_t *sl;
+
+ if(hbm->not_empty) {
+ fprintf(f, " %s: 0x", label);
+ for(u = (hbm->bits + 7) >> 3; u; u--) {
+ fprintf(f, "%02x", hbm->bitmap[u - 1]);
+ }
+ fprintf(f, style ? "\n" : " (");
+ for(sl = hbm->str; sl; sl = sl->next) {
+ if(style) {
+ fprintf(f, " %s\n", sl->str);
+ }
+ else {
+ fprintf(f, "%s%s", sl->str, sl->next ? ", " : "");
+ }
+ }
+ if(!style) fprintf(f, ")\n");
+ }
+}
+
+
+/*
+ * Print id/name pair.
+ */
+void smbios_id_print(FILE *f, hd_id_t *hid, char *label)
+{
+ if(hid->name) fprintf(f, " %s: 0x%02x (%s)\n", label, hid->id, hid->name);
+}
+
+
+/*
+ * Print a string.
+ */
+void smbios_str_print(FILE *f, char *str, char *label)
+{
+ if(str) fprintf(f, " %s: \"%s\"\n", label, str);
+}
+
+
+/*
+ * Look up the name that corresponds to the id (if any).
+ */
+void smbios_id2str(hd_id_t *hid, sm_str_map_t *map, unsigned def)
+{
+ unsigned u;
+ char *str, *def_str;
+
+ if(map->type == sm_map_str) {
+ str = map->list.str[hid->id < map->len ? hid->id : def];
+ if(hid->id && !str) str = map->list.str[def];
+ }
+ else {
+ for(str = def_str = NULL, u = 0; u < map->len; u++) {
+ if(map->list.num2str[u].num == hid->id) str = map->list.num2str[u].str;
+ if(str) break;
+ if(map->list.num2str[u].num == def) def_str = map->list.num2str[u].str;
+ }
+ if(hid->id && !str) str = def_str;
+ }
+ hid->name = new_str(str);
+}
+
+
+/*
+ * Convert a bitmap into a list of strings. (That is, interpret the
+ * bitmap.)
+ */
+void smbios_bitmap2str(hd_bitmap_t *hbm, sm_str_map_t *map)
+{
+ unsigned u, bit;
+ char *str;
+
+ for(u = 0; u < (hbm->bits + 7) >> 3; u++) {
+ if(hbm->bitmap[u]) {
+ hbm->not_empty = 1;
+ break;
+ }
+ }
+
+ if(map->type == sm_map_str) {
+ for(u = 0; u < map->len; u++) {
+ if(u < hbm->bits && hbm->bitmap[u >> 3] & (1 << (u & 7))) {
+ str = map->list.str[u];
+ if(str) add_str_list(&hbm->str, str);
+ }
+ }
+ }
+ else {
+ for(u = 0; u < map->len; u++) {
+ bit = map->list.num2str[u].num;
+ if(bit < hbm->bits && hbm->bitmap[bit >> 3] & (1 << (bit & 7))) {
+ str = map->list.num2str[u].str;
+ if(str) add_str_list(&hbm->str, str);
+ }
+ }
+ }
+}
+
+
+/*
+ * Interpret raw smbios data.
+ */
+void smbios_parse(hd_data_t *hd_data)
+{
+ hd_smbios_t *sm;
+ str_list_t *sl_any, *sl;
+ int cnt, data_len;
+ unsigned char *sm_data;
+ unsigned u, v;
+
+ if(!hd_data->smbios) return;
+
+ for(cnt = 0, sm = hd_data->smbios; sm; sm = sm->next, cnt++) {
+ sm_data = sm->any.data;
+ data_len = sm->any.data_len;
+ sl_any = sm->any.strings;
+ switch(sm->any.type) {
+ case sm_biosinfo:
+ if(data_len >= 0x12) {
+ sm->biosinfo.start = READ_MEM16(sm_data + 6) << 4;
+ sm->biosinfo.rom_size = (sm_data[9] + 1) << 16;
+ sm->biosinfo.vendor = get_string(sl_any, sm_data[4]);
+ sm->biosinfo.version = get_string(sl_any, sm_data[5]);
+ sm->biosinfo.date = get_string(sl_any, sm_data[8]);
+ memcpy(sm->biosinfo.feature.bitmap, sm_data + 0xa, 8);
+ }
+ if(data_len >= 0x13) {
+ sm->biosinfo.feature.bitmap[8] = sm_data[0x12];
+ }
+ if(data_len >= 0x14) {
+ sm->biosinfo.feature.bitmap[9] = sm_data[0x13];
+ }
+ sm->biosinfo.feature.bits = 80;
+ smbios_bitmap2str(&sm->biosinfo.feature, &smbios_bios_feature);
+ break;
+
+ case sm_sysinfo:
+ if(data_len >= 8) {
+ sm->sysinfo.manuf = get_string(sl_any, sm_data[4]);
+ sm->sysinfo.product = get_string(sl_any, sm_data[5]);
+ sm->sysinfo.version = get_string(sl_any, sm_data[6]);
+ sm->sysinfo.serial = get_string(sl_any, sm_data[7]);
+ }
+ if(data_len >= 0x19) {
+ memcpy(sm->sysinfo.uuid, sm_data + 8, 16);
+ sm->sysinfo.wake_up.id = sm_data[0x18];
+ smbios_id2str(&sm->sysinfo.wake_up, &smbios_system_wakeups, 1);
+ }
+ break;
+
+ case sm_boardinfo:
+ if(data_len >= 8) {
+ sm->boardinfo.manuf = get_string(sl_any, sm_data[4]);
+ sm->boardinfo.product = get_string(sl_any, sm_data[5]);
+ sm->boardinfo.version = get_string(sl_any, sm_data[6]);
+ sm->boardinfo.serial = get_string(sl_any, sm_data[7]);
+ }
+ if(data_len >= 9) {
+ sm->boardinfo.asset = get_string(sl_any, sm_data[8]);
+ }
+ if(data_len >= 0x0e) {
+ sm->boardinfo.feature.bitmap[0] = sm_data[9];
+ sm->boardinfo.feature.bits = 8;
+ smbios_bitmap2str(&sm->boardinfo.feature, &smbios_board_feature);
+ sm->boardinfo.location = get_string(sl_any, sm_data[0x0a]);
+ sm->boardinfo.chassis = READ_MEM16(sm_data + 0x0b);
+ sm->boardinfo.board_type.id = sm_data[0x0d];
+ smbios_id2str(&sm->boardinfo.board_type, &smbios_board_types, 1);
+ }
+ if(data_len >= 0x0f) {
+ u = sm_data[0x0e];
+ if(u && data_len >= 0x0f + 2 * u) {
+ sm->boardinfo.objects_len = u;
+ sm->boardinfo.objects = new_mem(u * sizeof *sm->boardinfo.objects);
+ for(u = 0; u < sm->boardinfo.objects_len; u++) {
+ sm->boardinfo.objects[u] = READ_MEM16(sm_data + 0x0f + 2 * u);
+ }
+ }
+ }
+ break;
+
+ case sm_chassis:
+ if(data_len >= 6) {
+ sm->chassis.manuf = get_string(sl_any, sm_data[4]);
+ sm->chassis.lock = sm_data[5] >> 7;
+ sm->chassis.ch_type.id = sm_data[5] & 0x7f;
+ smbios_id2str(&sm->chassis.ch_type, &smbios_chassis_types, 1);
+ }
+ if(data_len >= 9) {
+ sm->chassis.version = get_string(sl_any, sm_data[6]);
+ sm->chassis.serial = get_string(sl_any, sm_data[7]);
+ sm->chassis.asset = get_string(sl_any, sm_data[8]);
+ }
+ if(data_len >= 0x0d) {
+ sm->chassis.bootup.id = sm_data[9];
+ sm->chassis.power.id = sm_data[0x0a];
+ sm->chassis.thermal.id = sm_data[0x0b];
+ sm->chassis.security.id = sm_data[0x0c];
+ smbios_id2str(&sm->chassis.bootup, &smbios_chassis_states, 1);
+ smbios_id2str(&sm->chassis.power, &smbios_chassis_states, 1);
+ smbios_id2str(&sm->chassis.thermal, &smbios_chassis_states, 1);
+ smbios_id2str(&sm->chassis.security, &smbios_chassis_sec_states, 1);
+ }
+ if(data_len >= 0x11) {
+ sm->chassis.oem = READ_MEM32(sm_data + 0x0d);
+ }
+ break;
+
+ case sm_processor:
+ if(data_len >= 0x1a) {
+ sm->processor.socket = get_string(sl_any, sm_data[4]);
+ sm->processor.manuf = get_string(sl_any, sm_data[7]);
+ sm->processor.version = get_string(sl_any, sm_data[0x10]);
+ sm->processor.voltage = sm_data[0x11];
+ if(sm->processor.voltage & 0x80) {
+ sm->processor.voltage &= 0x7f;
+ }
+ else {
+ switch(sm->processor.voltage) {
+ case 0x01:
+ sm->processor.voltage = 50;
+ break;
+ case 0x02:
+ sm->processor.voltage = 33;
+ break;
+ case 0x04:
+ sm->processor.voltage = 29;
+ break;
+ default:
+ sm->processor.voltage = 0;
+ }
+ }
+ sm->processor.pr_type.id = sm_data[5];
+ sm->processor.family.id = sm_data[6];
+ sm->processor.cpu_id = READ_MEM64(sm_data + 8);
+ sm->processor.ext_clock = READ_MEM16(sm_data + 0x12);
+ sm->processor.max_speed = READ_MEM16(sm_data + 0x14);
+ sm->processor.current_speed = READ_MEM16(sm_data + 0x16);
+ sm->processor.sock_status = (sm_data[0x18] >> 6) & 1;
+ sm->processor.cpu_status.id = sm_data[0x18] & 7;
+ sm->processor.upgrade.id = sm_data[0x19];
+ smbios_id2str(&sm->processor.pr_type, &smbios_proc_types, 1);
+ smbios_id2str(&sm->processor.family, &smbios_proc_families, 1);
+ smbios_id2str(&sm->processor.cpu_status, &smbios_proc_cpu_status, 0);
+ smbios_id2str(&sm->processor.upgrade, &smbios_proc_upgrades, 1);
+ }
+ if(data_len >= 0x20) {
+ sm->processor.l1_cache = READ_MEM16(sm_data + 0x1a);
+ sm->processor.l2_cache = READ_MEM16(sm_data + 0x1c);
+ sm->processor.l3_cache = READ_MEM16(sm_data + 0x1e);
+ if(sm->processor.l1_cache == 0xffff) sm->processor.l1_cache = 0;
+ if(sm->processor.l2_cache == 0xffff) sm->processor.l2_cache = 0;
+ if(sm->processor.l3_cache == 0xffff) sm->processor.l3_cache = 0;
+ }
+ if(data_len >= 0x21) {
+ sm->processor.serial = get_string(sl_any, sm_data[0x20]);
+ }
+ if(data_len >= 0x22) {
+ sm->processor.asset = get_string(sl_any, sm_data[0x21]);
+ sm->processor.part = get_string(sl_any, sm_data[0x22]);
+ }
+ break;
+
+ case sm_cache:
+ if(data_len >= 0x0f) {
+ sm->cache.socket = get_string(sl_any, sm_data[4]);
+ u = READ_MEM16(sm_data + 7);
+ if((u & 0x8000)) u = (u & 0x7fff) << 6;
+ sm->cache.max_size = u;
+ u = READ_MEM16(sm_data + 9);
+ if((u & 0x8000)) u = (u & 0x7fff) << 6;
+ sm->cache.current_size = u;
+ u = READ_MEM16(sm_data + 5);
+ sm->cache.mode.id = (u >> 8) & 3;
+ sm->cache.state = (u >> 7) & 1;
+ sm->cache.location.id = (u >> 5) & 3;
+ sm->cache.socketed = (u >> 3) & 1;
+ sm->cache.level = u & 7;
+ smbios_id2str(&sm->cache.mode, &smbios_cache_mode, 0);
+ smbios_id2str(&sm->cache.location, &smbios_cache_location, 0);
+ sm->cache.supp_sram.bitmap[0] = sm_data[0x0b];
+ sm->cache.supp_sram.bitmap[1] = sm_data[0x0c];
+ sm->cache.supp_sram.bits = 16;
+ sm->cache.sram.bitmap[0] = sm_data[0x0d];
+ sm->cache.sram.bitmap[1] = sm_data[0x0e];
+ sm->cache.sram.bits = 16;
+ smbios_bitmap2str(&sm->cache.supp_sram, &smbios_cache_sram);
+ smbios_bitmap2str(&sm->cache.sram, &smbios_cache_sram);
+ }
+ if(data_len >= 0x13) {
+ sm->cache.speed = sm_data[0x0f];
+ sm->cache.ecc.id = sm_data[0x10];
+ sm->cache.cache_type.id = sm_data[0x11];
+ sm->cache.assoc.id = sm_data[0x12];
+ smbios_id2str(&sm->cache.ecc, &smbios_cache_ecc, 1);
+ smbios_id2str(&sm->cache.cache_type, &smbios_cache_type, 1);
+ smbios_id2str(&sm->cache.assoc, &smbios_cache_assoc, 1);
+ }
+ break;
+
+ case sm_connect:
+ if(data_len >= 9) {
+ sm->connect.i_des = get_string(sl_any, sm_data[4]);
+ sm->connect.x_des = get_string(sl_any, sm_data[6]);
+ sm->connect.i_type.id = sm_data[5];
+ sm->connect.x_type.id = sm_data[7];
+ sm->connect.port_type.id = sm_data[8];
+ smbios_id2str(&sm->connect.port_type, &smbios_connect_conn_type, 0xff);
+ smbios_id2str(&sm->connect.x_type, &smbios_connect_conn_type, 0xff);
+ smbios_id2str(&sm->connect.port_type, &smbios_connect_port_type, 0xff);
+ }
+ break;
+
+ case sm_slot:
+ if(data_len >= 0x0c) {
+ sm->slot.desig = get_string(sl_any, sm_data[4]);
+ sm->slot.slot_type.id = sm_data[5];
+ sm->slot.bus_width.id = sm_data[6];
+ sm->slot.usage.id = sm_data[7];
+ sm->slot.length.id = sm_data[8];
+ sm->slot.id = READ_MEM16(sm_data + 9);
+ sm->slot.feature.bitmap[0] = sm_data[0x0b];
+ }
+ if(data_len >= 0x0d) {
+ sm->slot.feature.bitmap[1] = sm_data[0x0c];
+ }
+ sm->slot.feature.bits = 16;
+ smbios_id2str(&sm->slot.slot_type, &smbios_slot_type, 1);
+ smbios_id2str(&sm->slot.bus_width, &smbios_slot_bus_width, 1);
+ smbios_id2str(&sm->slot.usage, &smbios_slot_usage, 1);
+ smbios_id2str(&sm->slot.length, &smbios_slot_length, 1);
+ smbios_bitmap2str(&sm->slot.feature, &smbios_slot_feature);
+ break;
+
+ case sm_onboard:
+ if(data_len >= 4) {
+ u = data_len - 4;
+ if(!(u & 1)) {
+ u >>= 1;
+ if(u) {
+ sm->onboard.dev_len = u;
+ sm->onboard.dev = new_mem(u * sizeof *sm->onboard.dev);
+ }
+ for(u = 0; u < sm->onboard.dev_len; u++) {
+ sm->onboard.dev[u].name = get_string(sl_any, sm_data[4 + (u << 1) + 1]);
+ v = sm_data[4 + (u << 1)];
+ sm->onboard.dev[u].status = v >> 7;
+ sm->onboard.dev[u].type.id = v & 0x7f;
+ smbios_id2str(&sm->onboard.dev[u].type, &smbios_onboard_type, 1);
+ }
+ }
+ }
+ break;
+
+ case sm_oem:
+ for(sl = sl_any; sl; sl = sl->next) {
+ if(sl->str && *sl->str) add_str_list(&sm->oem.oem_strings, sl->str);
+ }
+ break;
+
+ case sm_config:
+ for(sl = sl_any; sl; sl = sl->next) {
+ if(sl->str && *sl->str) add_str_list(&sm->config.options, sl->str);
+ }
+ break;
+
+ case sm_lang:
+ if(data_len >= 0x16) {
+ sm->lang.current = get_string(sl_any, sm_data[0x15]);
+ }
+ break;
+
+ case sm_group:
+ if(data_len >= 5) {
+ sm->group.name = get_string(sl_any, sm_data[4]);
+ u = (data_len - 5) / 3;
+ if(u) {
+ sm->group.items_len = u;
+ sm->group.item_handles = new_mem(u * sizeof *sm->group.item_handles);
+ for(u = 0; u < sm->group.items_len; u++) {
+ sm->group.item_handles[u] = READ_MEM16(sm_data + 6 + 3 * u);
+ }
+ }
+ }
+ break;
+
+ case sm_memarray:
+ if(data_len >= 0x0f) {
+ sm->memarray.location.id = sm_data[4];
+ sm->memarray.use.id = sm_data[5];
+ sm->memarray.ecc.id = sm_data[6];
+ sm->memarray.max_size = READ_MEM32(sm_data + 7);
+ if(sm->memarray.max_size == 0x80000000) sm->memarray.max_size = 0;
+ sm->memarray.error_handle = READ_MEM16(sm_data + 0x0b);
+ sm->memarray.slots = READ_MEM16(sm_data + 0x0d);
+ smbios_id2str(&sm->memarray.location, &smbios_memarray_location, 1);
+ smbios_id2str(&sm->memarray.use, &smbios_memarray_use, 1);
+ smbios_id2str(&sm->memarray.ecc, &smbios_memarray_ecc, 1);
+ }
+ break;
+
+ case sm_memdevice:
+ if(data_len >= 0x15) {
+ sm->memdevice.array_handle = READ_MEM16(sm_data + 0x04);
+ sm->memdevice.error_handle = READ_MEM16(sm_data + 0x06);
+ sm->memdevice.eccbits = READ_MEM16(sm_data + 8);
+ sm->memdevice.width = READ_MEM16(sm_data + 0xa);
+ if(sm->memdevice.width == 0xffff) sm->memdevice.width = 0;
+ if(sm->memdevice.eccbits == 0xffff) sm->memdevice.eccbits = 0;
+ if(sm->memdevice.eccbits >= sm->memdevice.width) {
+ sm->memdevice.eccbits -= sm->memdevice.width;
+ }
+ else {
+ sm->memdevice.eccbits = 0;
+ }
+ sm->memdevice.size = READ_MEM16(sm_data + 0xc);
+ if(sm->memdevice.size == 0xffff) sm->memdevice.size = 0;
+ if((sm->memdevice.size & 0x8000)) {
+ sm->memdevice.size &= 0x7fff;
+ }
+ else {
+ sm->memdevice.size <<= 10;
+ }
+ sm->memdevice.form.id = sm_data[0xe];
+ sm->memdevice.set = sm_data[0xf];
+ sm->memdevice.location = get_string(sl_any, sm_data[0x10]);
+ sm->memdevice.bank = get_string(sl_any, sm_data[0x11]);
+ sm->memdevice.mem_type.id = sm_data[0x12];
+ smbios_id2str(&sm->memdevice.form, &smbios_memdevice_form, 1);
+ smbios_id2str(&sm->memdevice.mem_type, &smbios_memdevice_type, 1);
+ sm->memdevice.type_detail.bitmap[0] = sm_data[0x13];
+ sm->memdevice.type_detail.bitmap[1] = sm_data[0x14];
+ sm->memdevice.type_detail.bits = 16;
+ smbios_bitmap2str(&sm->memdevice.type_detail, &smbios_memdevice_detail);
+ }
+ if(data_len >= 0x17) {
+ sm->memdevice.speed = READ_MEM16(sm_data + 0x15);
+ }
+ if(data_len >= 0x1b) {
+ sm->memdevice.manuf = get_string(sl_any, sm_data[0x17]);
+ sm->memdevice.serial = get_string(sl_any, sm_data[0x18]);
+ sm->memdevice.asset = get_string(sl_any, sm_data[0x19]);
+ sm->memdevice.part = get_string(sl_any, sm_data[0x1a]);
+ }
+ break;
+
+ case sm_memerror:
+ if(data_len >= 0x17) {
+ sm->memerror.err_type.id = sm_data[4];
+ sm->memerror.granularity.id = sm_data[5];
+ sm->memerror.operation.id = sm_data[6];
+ sm->memerror.syndrome = READ_MEM32(sm_data + 7);
+ sm->memerror.array_addr = READ_MEM32(sm_data + 0xb);
+ sm->memerror.device_addr = READ_MEM32(sm_data + 0xf);
+ sm->memerror.range = READ_MEM32(sm_data + 0x13);
+ smbios_id2str(&sm->memerror.err_type, &smbios_memerror_type, 1);
+ smbios_id2str(&sm->memerror.granularity, &smbios_memerror_granularity, 1);
+ smbios_id2str(&sm->memerror.operation, &smbios_memerror_operation, 1);
+ }
+ break;
+
+ case sm_memarraymap:
+ if(data_len >= 0x0f) {
+ sm->memarraymap.start_addr = READ_MEM32(sm_data + 4);
+ sm->memarraymap.start_addr <<= 10;
+ sm->memarraymap.end_addr = 1 + READ_MEM32(sm_data + 8);
+ sm->memarraymap.end_addr <<= 10;
+ sm->memarraymap.array_handle = READ_MEM16(sm_data + 0xc);
+ sm->memarraymap.part_width = sm_data[0x0e];
+ }
+ break;
+
+ case sm_memdevicemap:
+ if(data_len >= 0x13) {
+ sm->memdevicemap.start_addr = READ_MEM32(sm_data + 4);
+ sm->memdevicemap.start_addr <<= 10;
+ sm->memdevicemap.end_addr = 1 + READ_MEM32(sm_data + 8);
+ sm->memdevicemap.end_addr <<= 10;
+ sm->memdevicemap.memdevice_handle = READ_MEM16(sm_data + 0xc);
+ sm->memdevicemap.arraymap_handle = READ_MEM16(sm_data + 0xe);
+ sm->memdevicemap.row_pos = sm_data[0x10];
+ sm->memdevicemap.interleave_pos = sm_data[0x11];
+ sm->memdevicemap.interleave_depth = sm_data[0x12];
+ }
+ break;
+
+ case sm_mouse:
+ if(data_len >= 7) {
+ sm->mouse.mtype.id = sm_data[4];
+ sm->mouse.interface.id = sm_data[5];
+ sm->mouse.buttons = sm_data[6];
+ smbios_id2str(&sm->mouse.mtype, &smbios_mouse_type, 1);
+ smbios_id2str(&sm->mouse.interface, &smbios_mouse_interface, 1);
+ }
+ break;
+
+ case sm_secure:
+ if(data_len >= 5) {
+ u = sm_data[4];
+ sm->secure.power.id = u >> 6;
+ sm->secure.keyboard.id = (u >> 4) & 3;
+ sm->secure.admin.id = (u >> 2) & 3;
+ sm->secure.reset.id = u & 3;
+ smbios_id2str(&sm->secure.power, &smbios_secure_state, 3);
+ smbios_id2str(&sm->secure.keyboard, &smbios_secure_state, 3);
+ smbios_id2str(&sm->secure.admin, &smbios_secure_state, 3);
+ smbios_id2str(&sm->secure.reset, &smbios_secure_state, 3);
+ }
+ break;
+
+ case sm_power:
+ if(data_len >= 9) {
+ sm->power.month = sm_data[4];
+ sm->power.day = sm_data[5];
+ sm->power.hour = sm_data[6];
+ sm->power.minute = sm_data[7];
+ sm->power.second = sm_data[8];
+ }
+ break;
+
+ case sm_mem64error:
+ if(data_len >= 0x1f) {
+ sm->mem64error.err_type.id = sm_data[4];
+ sm->mem64error.granularity.id = sm_data[5];
+ sm->mem64error.operation.id = sm_data[6];
+ sm->mem64error.syndrome = READ_MEM32(sm_data + 7);
+ sm->mem64error.array_addr = READ_MEM64(sm_data + 0xb);
+ sm->mem64error.device_addr = READ_MEM64(sm_data + 0x13);
+ sm->mem64error.range = READ_MEM32(sm_data + 0x1b);
+ smbios_id2str(&sm->mem64error.err_type, &smbios_memerror_type, 1);
+ smbios_id2str(&sm->mem64error.granularity, &smbios_memerror_granularity, 1);
+ smbios_id2str(&sm->mem64error.operation, &smbios_memerror_operation, 1);
+ }
+ break;
+
+ default:
+ break;
+ }
+ }
+}
+
+
+/*
+ * Note: new_sm is directly inserted into the list, so you *must* make sure
+ * that new_sm points to a malloc'ed pice of memory.
+ */
+hd_smbios_t *smbios_add_entry(hd_smbios_t **sm, hd_smbios_t *new_sm)
+{
+ while(*sm) sm = &(*sm)->next;
+
+ return *sm = new_sm;
+}
+
+
+/*
+ * Free the memory allocated by a smbios list.
+ */
+hd_smbios_t *smbios_free(hd_smbios_t *sm)
+{
+ hd_smbios_t *next;
+ unsigned u;
+
+ for(; sm; sm = next) {
+ next = sm->next;
+
+ free_mem(sm->any.data);
+ free_str_list(sm->any.strings);
+
+ switch(sm->any.type) {
+ case sm_biosinfo:
+ free_mem(sm->biosinfo.vendor);
+ free_mem(sm->biosinfo.version);
+ free_mem(sm->biosinfo.date);
+ free_str_list(sm->biosinfo.feature.str);
+ break;
+
+ case sm_sysinfo:
+ free_mem(sm->sysinfo.manuf);
+ free_mem(sm->sysinfo.product);
+ free_mem(sm->sysinfo.version);
+ free_mem(sm->sysinfo.serial);
+ free_mem(sm->sysinfo.wake_up.name);
+ break;
+
+ case sm_boardinfo:
+ free_mem(sm->boardinfo.manuf);
+ free_mem(sm->boardinfo.product);
+ free_mem(sm->boardinfo.version);
+ free_mem(sm->boardinfo.serial);
+ free_mem(sm->boardinfo.asset);
+ free_mem(sm->boardinfo.location);
+ free_mem(sm->boardinfo.board_type.name);
+ free_str_list(sm->boardinfo.feature.str);
+ free_mem(sm->boardinfo.objects);
+ break;
+
+ case sm_chassis:
+ free_mem(sm->chassis.manuf);
+ free_mem(sm->chassis.version);
+ free_mem(sm->chassis.serial);
+ free_mem(sm->chassis.asset);
+ free_mem(sm->chassis.ch_type.name);
+ free_mem(sm->chassis.bootup.name);
+ free_mem(sm->chassis.power.name);
+ free_mem(sm->chassis.thermal.name);
+ free_mem(sm->chassis.security.name);
+ break;
+
+ case sm_processor:
+ free_mem(sm->processor.socket);
+ free_mem(sm->processor.manuf);
+ free_mem(sm->processor.version);
+ free_mem(sm->processor.serial);
+ free_mem(sm->processor.asset);
+ free_mem(sm->processor.part);
+ free_mem(sm->processor.upgrade.name);
+ free_mem(sm->processor.pr_type.name);
+ free_mem(sm->processor.family.name);
+ free_mem(sm->processor.cpu_status.name);
+ break;
+
+ case sm_cache:
+ free_mem(sm->cache.socket);
+ free_mem(sm->cache.mode.name);
+ free_mem(sm->cache.location.name);
+ free_mem(sm->cache.ecc.name);
+ free_mem(sm->cache.cache_type.name);
+ free_mem(sm->cache.assoc.name);
+ free_str_list(sm->cache.supp_sram.str);
+ free_str_list(sm->cache.sram.str);
+ break;
+
+ case sm_connect:
+ free_mem(sm->connect.port_type.name);
+ free_mem(sm->connect.i_des);
+ free_mem(sm->connect.x_des);
+ free_mem(sm->connect.i_type.name);
+ free_mem(sm->connect.x_type.name);
+ break;
+
+ case sm_slot:
+ free_mem(sm->slot.desig);
+ free_mem(sm->slot.slot_type.name);
+ free_mem(sm->slot.bus_width.name);
+ free_mem(sm->slot.usage.name);
+ free_mem(sm->slot.length.name);
+ free_str_list(sm->slot.feature.str);
+ break;
+
+ case sm_onboard:
+ for(u = 0; u < sm->onboard.dev_len; u++) {
+ free_mem(sm->onboard.dev[u].name);
+ free_mem(sm->onboard.dev[u].type.name);
+ }
+ free_mem(sm->onboard.dev);
+ break;
+
+ case sm_oem:
+ free_str_list(sm->oem.oem_strings);
+ break;
+
+ case sm_config:
+ free_str_list(sm->config.options);
+ break;
+
+ case sm_lang:
+ free_mem(sm->lang.current);
+ break;
+
+ case sm_group:
+ free_mem(sm->group.name);
+ free_mem(sm->group.item_handles);
+ break;
+
+ case sm_memarray:
+ free_mem(sm->memarray.location.name);
+ free_mem(sm->memarray.use.name);
+ free_mem(sm->memarray.ecc.name);
+ break;
+
+ case sm_memdevice:
+ free_mem(sm->memdevice.location);
+ free_mem(sm->memdevice.bank);
+ free_mem(sm->memdevice.manuf);
+ free_mem(sm->memdevice.serial);
+ free_mem(sm->memdevice.asset);
+ free_mem(sm->memdevice.part);
+ free_mem(sm->memdevice.form.name);
+ free_mem(sm->memdevice.mem_type.name);
+ free_str_list(sm->memdevice.type_detail.str);
+ break;
+
+ case sm_memerror:
+ free_mem(sm->memerror.err_type.name);
+ free_mem(sm->memerror.granularity.name);
+ free_mem(sm->memerror.operation.name);
+ break;
+
+ case sm_mouse:
+ free_mem(sm->mouse.mtype.name);
+ free_mem(sm->mouse.interface.name);
+ break;
+
+ case sm_secure:
+ free_mem(sm->secure.power.name);
+ free_mem(sm->secure.keyboard.name);
+ free_mem(sm->secure.admin.name);
+ free_mem(sm->secure.reset.name);
+ break;
+
+ case sm_mem64error:
+ free_mem(sm->mem64error.err_type.name);
+ free_mem(sm->mem64error.granularity.name);
+ free_mem(sm->mem64error.operation.name);
+ break;
+
+ default:
+ break;
+ }
+
+ free_mem(sm);
+ }
+
+ return NULL;
+}
+
+
+/*
+ * print SMBIOS entries
+ */
+void smbios_dump(hd_data_t *hd_data, FILE *f)
+{
+ hd_smbios_t *sm;
+ str_list_t *sl;
+ char c, *s;
+ unsigned u;
+ int i;
+
+ if(!hd_data->smbios) return;
+
+ for(sm = hd_data->smbios; sm; sm = sm->next) {
+ switch(sm->any.type) {
+ case sm_biosinfo:
+ fprintf(f, " BIOS Info: #%d\n", sm->any.handle);
+ if(sm->biosinfo.vendor) fprintf(f, " Vendor: \"%s\"\n", sm->biosinfo.vendor);
+ if(sm->biosinfo.version) fprintf(f, " Version: \"%s\"\n", sm->biosinfo.version);
+ if(sm->biosinfo.date) fprintf(f, " Date: \"%s\"\n", sm->biosinfo.date);
+ fprintf(f, " Start Address: 0x%05x\n", sm->biosinfo.start);
+ fprintf(f, " ROM Size: %d kB\n", sm->biosinfo.rom_size >> 10);
+ SMBIOS_PRINT_BITMAP_LONG(biosinfo.feature, "Features");
+ break;
+
+ case sm_sysinfo:
+ fprintf(f, " System Info: #%d\n", sm->any.handle);
+ if(sm->sysinfo.manuf) fprintf(f, " Manufacturer: \"%s\"\n", sm->sysinfo.manuf);
+ if(sm->sysinfo.product) fprintf(f, " Product: \"%s\"\n", sm->sysinfo.product);
+ if(sm->sysinfo.version) fprintf(f, " Version: \"%s\"\n", sm->sysinfo.version);
+ if(sm->sysinfo.serial) fprintf(f, " Serial: \"%s\"\n", sm->sysinfo.serial);
+ for(i = u = 0; (unsigned) i < sizeof sm->sysinfo.uuid / sizeof *sm->sysinfo.uuid; i++) {
+ u |= sm->sysinfo.uuid[i];
+ }
+ fprintf(f, " UUID: ");
+ if(u == 0 || u == 0xff) {
+ fprintf(f, "undefined");
+ if(u == 0xff) fprintf(f, ", but settable");
+ }
+ else {
+ for(i = sizeof sm->sysinfo.uuid / sizeof *sm->sysinfo.uuid - 1; i >= 0; i--) {
+ fprintf(f, "%02x", sm->sysinfo.uuid[i]);
+ }
+ }
+ fprintf(f, "\n");
+ SMBIOS_PRINT_ID(sysinfo.wake_up, "Wake-up");
+ break;
+
+ case sm_boardinfo:
+ fprintf(f, " Board Info: #%d\n", sm->any.handle);
+ if(sm->boardinfo.manuf) fprintf(f, " Manufacturer: \"%s\"\n", sm->boardinfo.manuf);
+ if(sm->boardinfo.product) fprintf(f, " Product: \"%s\"\n", sm->boardinfo.product);
+ if(sm->boardinfo.version) fprintf(f, " Version: \"%s\"\n", sm->boardinfo.version);
+ if(sm->boardinfo.serial) fprintf(f, " Serial: \"%s\"\n", sm->boardinfo.serial);
+ if(sm->boardinfo.asset) fprintf(f, " Asset Tag: \"%s\"\n", sm->boardinfo.asset);
+ SMBIOS_PRINT_ID(boardinfo.board_type, "Type");
+ SMBIOS_PRINT_BITMAP_LONG(boardinfo.feature, "Features");
+ if(sm->boardinfo.location) fprintf(f, " Location: \"%s\"\n", sm->boardinfo.location);
+ if(sm->boardinfo.chassis) fprintf(f, " Chassis: #%d\n", sm->boardinfo.chassis);
+ if(sm->boardinfo.objects_len) {
+ fprintf(f, " Contained Objects: ");
+ for(i = 0; i < sm->boardinfo.objects_len; i++) {
+ fprintf(f, "%s#%d", i ? ", " : "", sm->boardinfo.objects[i]);
+ }
+ fprintf(f, "\n");
+ }
+ break;
+
+ case sm_chassis:
+ fprintf(f, " Chassis Info: #%d\n", sm->any.handle);
+ if(sm->chassis.manuf) fprintf(f, " Manufacturer: \"%s\"\n", sm->chassis.manuf);
+ if(sm->chassis.version) fprintf(f, " Version: \"%s\"\n", sm->chassis.version);
+ if(sm->chassis.serial) fprintf(f, " Serial: \"%s\"\n", sm->chassis.serial);
+ if(sm->chassis.asset) fprintf(f, " Asset Tag: \"%s\"\n", sm->chassis.asset);
+ SMBIOS_PRINT_ID(chassis.ch_type, "Type");
+ if(sm->chassis.lock) fprintf(f, " Lock: present\n");
+ SMBIOS_PRINT_ID(chassis.bootup, "Bootup State");
+ SMBIOS_PRINT_ID(chassis.power, "Power Supply State");
+ SMBIOS_PRINT_ID(chassis.thermal, "Thermal State");
+ SMBIOS_PRINT_ID(chassis.security, "Security Status");
+ if(sm->chassis.oem) fprintf(f, " OEM Info: 0x%08x\n", sm->chassis.oem);
+ break;
+
+ case sm_processor:
+ fprintf(f, " Processor Info: #%d\n", sm->any.handle);
+ SMBIOS_PRINT_STR(processor.socket, "Socket");
+ SMBIOS_PRINT_ID(processor.upgrade, "Socket Type");
+ fprintf(f, " Socket Status: %s\n", sm->processor.sock_status ? "Populated" : "Empty");
+ SMBIOS_PRINT_ID(processor.pr_type, "Type");
+ SMBIOS_PRINT_ID(processor.family, "Family");
+ SMBIOS_PRINT_STR(processor.manuf, "Manufacturer");
+ SMBIOS_PRINT_STR(processor.version, "Version");
+ SMBIOS_PRINT_STR(processor.serial, "Serial");
+ SMBIOS_PRINT_STR(processor.asset, "Asset Tag");
+ SMBIOS_PRINT_STR(processor.part, "Part Number");
+ if(sm->processor.cpu_id) {
+ fprintf(f, " Processor ID: 0x%016"PRIx64"\n", sm->processor.cpu_id);
+ }
+ SMBIOS_PRINT_ID(processor.cpu_status, "Status");
+ if(sm->processor.voltage) {
+ fprintf(f, " Voltage: %u.%u V\n", sm->processor.voltage / 10, sm->processor.voltage % 10);
+ }
+ if(sm->processor.ext_clock) fprintf(f, " External Clock: %u MHz\n", sm->processor.ext_clock);
+ if(sm->processor.max_speed) fprintf(f, " Max. Speed: %u MHz\n", sm->processor.max_speed);
+ if(sm->processor.current_speed) fprintf(f, " Current Speed: %u MHz\n", sm->processor.current_speed);
+
+ if(sm->processor.l1_cache) fprintf(f, " L1 Cache: #%d\n", sm->processor.l1_cache);
+ if(sm->processor.l2_cache) fprintf(f, " L2 Cache: #%d\n", sm->processor.l2_cache);
+ if(sm->processor.l3_cache) fprintf(f, " L3 Cache: #%d\n", sm->processor.l3_cache);
+ break;
+
+ case sm_cache:
+ fprintf(f, " Cache Info: #%d\n", sm->any.handle);
+ SMBIOS_PRINT_STR(cache.socket, "Designation");
+ fprintf(f, " Level: L%u\n", sm->cache.level + 1);
+ fprintf(f, " State: %s\n", sm->cache.state ? "Enabled" : "Disabled");
+ SMBIOS_PRINT_ID(cache.mode, "Mode");
+ if(sm->cache.location.name) {
+ fprintf(f, " Location: 0x%02x (%s, %sSocketed)\n",
+ sm->cache.location.id,
+ sm->cache.location.name,
+ sm->cache.socketed ? "" : "Not "
+ );
+ }
+ SMBIOS_PRINT_ID(cache.ecc, "ECC");
+ SMBIOS_PRINT_ID(cache.cache_type, "Type");
+ SMBIOS_PRINT_ID(cache.assoc, "Associativity");
+ if(sm->cache.max_size) fprintf(f, " Max. Size: %u kB\n", sm->cache.max_size);
+ if(sm->cache.current_size) fprintf(f, " Current Size: %u kB\n", sm->cache.current_size);
+ if(sm->cache.speed) fprintf(f, " Speed: %u ns\n", sm->cache.speed);
+ SMBIOS_PRINT_BITMAP_SHORT(cache.supp_sram, "Supported SRAM Types");
+ SMBIOS_PRINT_BITMAP_SHORT(cache.sram, "Current SRAM Type");
+ break;
+
+ case sm_connect:
+ fprintf(f, " Port Connector: #%d\n", sm->any.handle);
+ SMBIOS_PRINT_ID(connect.port_type, "Type");
+ SMBIOS_PRINT_STR(connect.i_des, "Internal Designator");
+ SMBIOS_PRINT_ID(connect.i_type, "Internal Connector");
+ SMBIOS_PRINT_STR(connect.x_des, "External Designator");
+ SMBIOS_PRINT_ID(connect.x_type, "External Connector");
+ break;
+
+ case sm_slot:
+ fprintf(f, " System Slot: #%d\n", sm->any.handle);
+ SMBIOS_PRINT_STR(slot.desig, "Designation");
+ SMBIOS_PRINT_ID(slot.slot_type, "Type");
+ SMBIOS_PRINT_ID(slot.bus_width, "Bus Width");
+ SMBIOS_PRINT_ID(slot.usage, "Status");
+ SMBIOS_PRINT_ID(slot.length, "Length");
+ fprintf(f, " Slot ID: %u\n", sm->slot.id);
+ SMBIOS_PRINT_BITMAP_SHORT(slot.feature, "Characteristics");
+ break;
+
+ case sm_onboard:
+ fprintf(f, " On Board Devices: #%d\n", sm->any.handle);
+ for(u = 0; u < sm->onboard.dev_len; u++) {
+ fprintf(f, " %s: \"%s\"%s\n",
+ sm->onboard.dev[u].type.name,
+ sm->onboard.dev[u].name,
+ sm->onboard.dev[u].status ? "" : " (disabled)"
+ );
+ }
+ break;
+
+ case sm_oem:
+ fprintf(f, " OEM Strings: #%d\n", sm->any.handle);
+ for(sl = sm->oem.oem_strings; sl; sl = sl->next) {
+ fprintf(f, " %s\n", sl->str);
+ }
+ break;
+
+ case sm_config:
+ fprintf(f, " System Config Options (Jumpers & Switches) #%d:\n", sm->any.handle);
+ for(sl = sm->config.options; sl; sl = sl->next) {
+ fprintf(f, " %s\n", sl->str);
+ }
+ break;
+
+ case sm_lang:
+ fprintf(f, " Language Info: #%d\n", sm->any.handle);
+ if((sl = sm->lang.strings)) {
+ fprintf(f, " Languages: ");
+ for(; sl; sl = sl->next) {
+ fprintf(f, "%s%s", sl->str, sl->next ? ", " : "");
+ }
+ fprintf(f, "\n");
+ }
+ if(sm->lang.current) fprintf(f, " Current: %s\n", sm->lang.current);
+ break;
+
+ case sm_group:
+ fprintf(f, " Group Associations: #%d\n", sm->any.handle);
+ if(sm->group.name) fprintf(f, " Group Name: \"%s\"\n", sm->group.name);
+ if(sm->group.items_len) {
+ fprintf(f, " Items: ");
+ for(i = 0; i < sm->group.items_len; i++) {
+ fprintf(f, "%s#%d", i ? ", " : "", sm->group.item_handles[i]);
+ }
+ fprintf(f, "\n");
+ }
+ break;
+
+ case sm_memarray:
+ fprintf(f, " Physical Memory Array: #%d\n", sm->any.handle);
+ SMBIOS_PRINT_ID(memarray.use, "Use");
+ SMBIOS_PRINT_ID(memarray.location, "Location");
+ fprintf(f, " Slots: %u\n", sm->memarray.slots);
+ if(sm->memarray.max_size) {
+ u = sm->memarray.max_size;
+ c = 'k';
+ if(!(u & 0x3ff)) { u >>= 10; c = 'M'; }
+ if(!(u & 0x3ff)) { u >>= 10; c = 'G'; }
+ fprintf(f, " Max. Size: %u %cB\n", u, c);
+ }
+ SMBIOS_PRINT_ID(memarray.ecc, "ECC");
+ if(sm->memarray.error_handle != 0xfffe) {
+ fprintf(f, " Error Info: ");
+ if(sm->memarray.error_handle != 0xffff) {
+ fprintf(f, "#%d\n", sm->memarray.error_handle);
+ }
+ else {
+ fprintf(f, "No Error\n");
+ }
+ }
+ break;
+
+ case sm_memdevice:
+ fprintf(f, " Memory Device: #%d\n", sm->any.handle);
+ SMBIOS_PRINT_STR(memdevice.location, "Location");
+ SMBIOS_PRINT_STR(memdevice.bank, "Bank");
+ SMBIOS_PRINT_STR(memdevice.manuf, "Manufacturer");
+ SMBIOS_PRINT_STR(memdevice.serial, "Serial");
+ SMBIOS_PRINT_STR(memdevice.asset, "Asset Tag");
+ SMBIOS_PRINT_STR(memdevice.part, "Part Number");
+ fprintf(f, " Memory Array: #%d\n", sm->memdevice.array_handle);
+ if(sm->memdevice.error_handle != 0xfffe) {
+ fprintf(f, " Error Info: ");
+ if(sm->memdevice.error_handle != 0xffff) {
+ fprintf(f, "#%d\n", sm->memdevice.error_handle);
+ }
+ else {
+ fprintf(f, "No Error\n");
+ }
+ }
+ SMBIOS_PRINT_ID(memdevice.form, "Form Factor");
+ SMBIOS_PRINT_ID(memdevice.mem_type, "Type");
+ SMBIOS_PRINT_BITMAP_SHORT(memdevice.type_detail, "Type Detail");
+ fprintf(f, " Data Width: %u bits", sm->memdevice.width);
+ if(sm->memdevice.eccbits) fprintf(f, " (+%u ECC bits)", sm->memdevice.eccbits);
+ fprintf(f, "\n");
+ if(sm->memdevice.size) {
+ u = sm->memdevice.size;
+ c = 'k';
+ if(!(u & 0x3ff)) { u >>= 10; c = 'M'; }
+ if(!(u & 0x3ff)) { u >>= 10; c = 'G'; }
+ fprintf(f, " Size: %u %cB\n", u, c);
+ }
+ else {
+ fprintf(f, " Size: No Memory Installed\n");
+ }
+ if(sm->memdevice.speed) fprintf(f, " Speed: %u MHz\n", sm->memdevice.speed);
+ break;
+
+ case sm_memerror:
+ fprintf(f, " 32bit-Memory Error Info: #%d\n", sm->any.handle);
+ SMBIOS_PRINT_ID(memerror.err_type, "Type");
+ SMBIOS_PRINT_ID(memerror.granularity, "Granularity");
+ SMBIOS_PRINT_ID(memerror.operation, "Operation");
+ if(sm->memerror.syndrome) fprintf(f, " Syndrome: 0x%08x\n", sm->memerror.syndrome);
+ if(sm->memerror.array_addr != (1 << 31)) fprintf(f, " Mem Array Addr: 0x%08x\n", sm->memerror.array_addr);
+ if(sm->memerror.device_addr != (1 << 31)) fprintf(f, " Mem Device Addr: 0x%08x\n", sm->memerror.device_addr);
+ if(sm->memerror.range != (1 << 31)) fprintf(f, " Range: 0x%08x\n", sm->memerror.range);
+ break;
+
+ case sm_memarraymap:
+ fprintf(f, " Memory Array Mapping: #%d\n", sm->any.handle);
+ fprintf(f, " Memory Array: #%d\n", sm->memarraymap.array_handle);
+ fprintf(f, " Partition Width: %u\n", sm->memarraymap.part_width);
+ if((sm->memarraymap.start_addr | sm->memarraymap.end_addr) >> 32) {
+ fprintf(f, " Start Address: 0x%016"PRIx64"\n", sm->memarraymap.start_addr);
+ fprintf(f, " End Address: 0x%016"PRIx64"\n", sm->memarraymap.end_addr);
+ }
+ else {
+ fprintf(f, " Start Address: 0x%08x\n", (unsigned) sm->memarraymap.start_addr);
+ fprintf(f, " End Address: 0x%08x\n", (unsigned) sm->memarraymap.end_addr);
+ }
+ break;
+
+ case sm_memdevicemap:
+ fprintf(f, " Memory Device Mapping: #%d\n", sm->any.handle);
+ fprintf(f, " Memory Device: #%d\n", sm->memdevicemap.memdevice_handle);
+ fprintf(f, " Array Mapping: #%d\n", sm->memdevicemap.arraymap_handle);
+ if(sm->memdevicemap.row_pos != 0xff) fprintf(f, " Row: %u\n", sm->memdevicemap.row_pos);
+ if(
+ !sm->memdevicemap.interleave_pos ||
+ sm->memdevicemap.interleave_pos != 0xff
+ ) {
+ fprintf(f, " Interleave Pos: %u\n", sm->memdevicemap.interleave_pos);
+ }
+ if(
+ !sm->memdevicemap.interleave_depth ||
+ sm->memdevicemap.interleave_depth != 0xff
+ ) {
+ fprintf(f, " Interleaved Depth: %u\n", sm->memdevicemap.interleave_depth);
+ }
+ if((sm->memdevicemap.start_addr | sm->memdevicemap.end_addr) >> 32) {
+ fprintf(f, " Start Address: 0x%016"PRIx64"\n", sm->memdevicemap.start_addr);
+ fprintf(f, " End Address: 0x%016"PRIx64"\n", sm->memdevicemap.end_addr);
+ }
+ else {
+ fprintf(f, " Start Address: 0x%08x\n", (unsigned) sm->memdevicemap.start_addr);
+ fprintf(f, " End Address: 0x%08x\n", (unsigned) sm->memdevicemap.end_addr);
+ }
+ break;
+
+ case sm_mouse:
+ fprintf(f, " Pointing Device: #%d\n", sm->any.handle);
+ SMBIOS_PRINT_ID(mouse.mtype, "Type");
+ SMBIOS_PRINT_ID(mouse.interface, "Interface");
+ if(sm->mouse.buttons) fprintf(f, " Buttons: %u\n", sm->mouse.buttons);
+ break;
+
+ case sm_secure:
+ fprintf(f, " Hardware Security: #%d\n", sm->any.handle);
+ SMBIOS_PRINT_ID(secure.power, "Power-on Password");
+ SMBIOS_PRINT_ID(secure.keyboard, "Keyboard Password");
+ SMBIOS_PRINT_ID(secure.admin, "Admin Password");
+ SMBIOS_PRINT_ID(secure.reset, "Front Panel Reset");
+ break;
+
+ case sm_power:
+ fprintf(f, " System Power Controls: #%d\n", sm->any.handle);
+ fprintf(f,
+ " Next Power-on: %02x:%02x:%02x %02x/%02x\n",
+ sm->power.hour, sm->power.minute, sm->power.second,
+ sm->power.day, sm->power.month
+ );
+ break;
+
+ case sm_mem64error:
+ fprintf(f, " 64bit-Memory Error Info: #%d\n", sm->any.handle);
+ SMBIOS_PRINT_ID(mem64error.err_type, "Type");
+ SMBIOS_PRINT_ID(mem64error.granularity, "Granularity");
+ SMBIOS_PRINT_ID(mem64error.operation, "Operation");
+ if(sm->mem64error.syndrome) fprintf(f, " Syndrome: 0x%08x\n", sm->mem64error.syndrome);
+ if(
+ sm->mem64error.array_addr != (1ll << 63) &&
+ sm->mem64error.array_addr != (1ll << 31)
+ ) {
+ fprintf(f, " Mem Array Addr: 0x%016"PRIx64"\n", sm->mem64error.array_addr);
+ }
+ if(
+ sm->mem64error.device_addr != (1ll << 63) &&
+ sm->mem64error.device_addr != (1ll << 31)
+ ) {
+ fprintf(f, " Mem Device Addr: 0x%016"PRIx64"\n", sm->mem64error.device_addr);
+ }
+ if(sm->mem64error.range != (1 << 31)) fprintf(f, " Range: 0x%08x\n", sm->mem64error.range);
+ break;
+
+ case sm_end:
+ break;
+
+ default:
+ if(sm->any.type == sm_inactive) {
+ fprintf(f, " Inactive Record: #%d\n", sm->any.handle);
+ }
+ else {
+ fprintf(f, " Type %d Record: #%d\n", sm->any.type, sm->any.handle);
+ }
+ if(sm->any.data_len) {
+ for(i = 0; i < sm->any.data_len; i += 0x10) {
+ u = sm->any.data_len - i;
+ if(u > 0x10) u = 0x10;
+ s = NULL;
+ hexdump(&s, 0, u, sm->any.data + i);
+ fprintf(f, " Data %02x: %s\n", i, s);
+ s = free_mem(s);
+ }
+ }
+ for(u = 1, sl = sm->any.strings; sl; sl = sl->next, u++) {
+ if(sl->str && *sl->str) fprintf(f, " String %u: \"%s\"\n", u, sl->str);
+ }
+ break;
+ }
+ }
+}
+
--- /dev/null
+hd_smbios_t *smbios_free(hd_smbios_t *sm);
+hd_smbios_t *smbios_add_entry(hd_smbios_t **sm, hd_smbios_t *new_sm);
+void smbios_dump(hd_data_t *hd_data, FILE *f);
+void smbios_parse(hd_data_t *hd_data);
--- /dev/null
+#define _GNU_SOURCE /* we want memmem() */
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <signal.h>
+#include <ctype.h>
+
+#include <sys/types.h>
+#include <sys/wait.h>
+
+#include "hd.h"
+#include "hd_int.h"
+#include "sys.h"
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ * general system info
+ *
+ * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ */
+
+#if defined(__i386__)
+static void sigsegv_handler(int signum);
+static void chk_vmware(hd_data_t *hd_data, sys_info_t *st);
+#endif
+
+#if defined(__i386__) || defined(__x86_64__)
+static int is_txt(char c);
+static int is_decimal(char c);
+static int txt_len(char *s);
+static int decimal_len(char *s);
+static int chk_vaio(hd_data_t *hd_data, sys_info_t *st);
+#ifdef UCLIBC
+void *memmem(const void *haystack, size_t haystacklen, const void *needle, size_t needlelen);
+#endif
+#endif
+
+void hd_scan_sys(hd_data_t *hd_data)
+{
+ hd_t *hd;
+ sys_info_t *st;
+#if defined(__PPC__) || defined(__sparc__)
+ char buf0[80], *s, *t;
+ str_list_t *sl;
+#endif
+
+ if(!hd_probe_feature(hd_data, pr_sys)) return;
+
+ hd_data->module = mod_sys;
+
+ /* some clean-up */
+ remove_hd_entries(hd_data);
+
+ PROGRESS(1, 0, "cpu");
+
+ hd = add_hd_entry(hd_data, __LINE__, 0);
+ hd->base_class.id = bc_internal;
+ hd->sub_class.id = sc_int_sys;
+ hd->detail = new_mem(sizeof *hd->detail);
+ hd->detail->type = hd_detail_sys;
+ hd->detail->sys.data = st = new_mem(sizeof *st);
+
+ if(!hd_data->cpu) {
+ hd_data->cpu = read_file(PROC_CPUINFO, 0, 0);
+ }
+
+#ifdef __PPC__
+ for(sl = hd_data->cpu; sl; sl = sl->next) {
+ if(sscanf(sl->str, "motherboard : %79[^\n]", buf0) == 1) {
+ if((s = strstr(buf0, "MacRISC"))) {
+ for(t = s + sizeof "MacRISC" - 1; isalnum(*t); t++);
+ *t = 0;
+ st->system_type = new_str(s);
+ hd_data->flags.no_parport = 1;
+ }
+ }
+ if(sscanf(sl->str, "machine : %79[^\n]", buf0) == 1) {
+ if(strstr(buf0, "PReP")) {
+ st->system_type = new_str("PReP");
+ }
+ else if(strstr(buf0, "CHRP")) {
+ st->system_type = new_str(/* is_64 ? "CHRP64" : */ "CHRP");
+ }
+ else if(strstr(buf0, "iSeries")) {
+ st->system_type = new_str("iSeries");
+ hd_data->flags.iseries = 1;
+ }
+ if(strstr(buf0, "PowerBook2,")) {
+ st->model = new_str("iBook");
+ }
+ else if(strstr(buf0, "PowerBook")) {
+ st->model = new_str("PowerBook");
+ }
+ }
+ if(sscanf(sl->str, "pmac-generation : %79[^\n]", buf0) == 1) {
+ st->generation = new_str(buf0);
+ }
+ }
+#endif /* __PPC__ */
+
+#ifdef __sparc__
+ for(sl = hd_data->cpu; sl; sl = sl->next) {
+ if(sscanf(sl->str, "type : %79[^\n]", buf0) == 1) {
+ st->system_type = new_str(buf0);
+ }
+ }
+#endif
+
+#if defined(__i386__) || defined(__x86_64__)
+ chk_vaio(hd_data, st);
+#endif
+
+#if defined(__i386__)
+ chk_vmware(hd_data, st);
+#endif
+
+ if(st->vendor) hd->vendor.name = new_str(st->vendor);
+ if(st->model) hd->device.name = new_str(st->model);
+ if(st->serial) hd->serial = new_str(st->serial);
+}
+
+#if defined(__i386__)
+void sigsegv_handler(int signum) { exit(77); }
+
+void chk_vmware(hd_data_t *hd_data, sys_info_t *st)
+{
+ static int is_vmware = -1;
+ int child, status;
+
+ /* do the check only once */
+ if(is_vmware < 0) {
+
+ child = fork();
+
+ if(child == 0) {
+ signal(SIGSEGV, sigsegv_handler);
+
+ asm(
+ "push %ebx\n"
+ "\tpush %edx\n"
+ "\tpush %eax\n"
+ "\tpush %ecx\n"
+ "\tmov $0x564d5868,%eax\n"
+ "\tmov $0xa,%ecx\n"
+ "\tmov $0x5658,%edx\n"
+ "\tin (%dx),%eax\n"
+ "\tpop %ecx\n"
+ "\tpop %eax\n"
+ "\tpop %edx\n"
+ "\tpop %ebx\n"
+ );
+
+ _exit(66);
+ }
+ else {
+ if(waitpid(child, &status, 0) == child) {
+ status = WEXITSTATUS(status);
+ if(status == 66) is_vmware = 1;
+ if(status == 77) is_vmware = 0;
+ }
+ }
+
+ ADD2LOG(" vmware check: %d\n", is_vmware);
+ }
+
+ if(is_vmware == 1) {
+ st->model = new_str("VMWare");
+ }
+
+ hd_data->in_vmware = is_vmware;
+}
+
+#endif /* __i386__ */
+
+
+#if defined(__i386__) || defined(__x86_64__)
+int is_txt(char c)
+{
+ if(c < ' ' || c == 0x7f) return 0;
+
+ return 1;
+}
+
+int is_decimal(char c)
+{
+ if(c < '0' || c > '9') return 0;
+
+ return 1;
+}
+
+int txt_len(char *s)
+{
+ int i;
+
+ for(i = 0; i < 0x100; i++) {
+ if(!is_txt(s[i])) break;
+ }
+
+ return i;
+}
+
+int decimal_len(char *s)
+{
+ int i;
+
+ for(i = 0; i < 0x100; i++) {
+ if(!is_decimal(s[i])) break;
+ }
+
+ return i;
+}
+
+int chk_vaio(hd_data_t *hd_data, sys_info_t *st)
+{
+ int i;
+ unsigned char *data, *s, *s0, *s1;
+
+ if(!hd_data->bios_rom.data) return 0;
+
+ data = hd_data->bios_rom.data + 0xe8000 - hd_data->bios_rom.start;
+
+ if(!(s = memmem(data, 0x10000, "Sony Corp", sizeof "Sony Corp" - 1))) return 0;
+
+ if((i = txt_len(s))) st->vendor = canon_str(s, i);
+ s += i;
+
+ if(!(s = memmem(s, 0x1000, "PCG-", sizeof "PCG-" - 1))) return 0;
+
+ if((i = txt_len(s))) {
+ st->model = canon_str(s, i);
+ }
+ s += i;
+
+ ADD2LOG(" vaio: %s\n", st->model);
+
+ for(i = 0; i < 0x1000; i++) {
+ if(is_decimal(s[i]) && txt_len(s + i) >= 10 && decimal_len(s + i) >= 5) {
+ st->serial = canon_str(s + i, txt_len(s + i));
+ break;
+ }
+ }
+
+ if(st->model) {
+ s0 = strrchr(st->model, '(');
+ s1 = strrchr(st->model, ')');
+
+ if(s0 && s1 && s1 - s0 >= 3 && s1[1] == 0) {
+ st->lang = canon_str(s0 + 1, s1 - s0 - 1);
+ for(s = st->lang; *s; s++) {
+ if(*s >= 'A' && *s <= 'Z') *s += 'a' - 'A';
+ }
+ if(!strcmp(st->lang, "uc")) strcpy(st->lang, "en");
+ *s0 = 0; /* cut the model entry */
+ }
+ }
+
+ return st->model ? 1 : 0;
+}
+#endif /* __i386__ || __x86_64__ */
+
--- /dev/null
+void hd_scan_sys(hd_data_t *hd_data);
--- /dev/null
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <sys/ioctl.h>
+
+#include "hd.h"
+#include "hd_int.h"
+#include "hddb.h"
+#include "usb.h"
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ * usb
+ *
+ * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ */
+
+#define IOCNR_GET_DEVICE_ID 1
+#define IOCNR_GET_BUS_ADDRESS 5
+#define IOCNR_GET_VID_PID 6
+
+/* Get device_id string: */
+#define LPIOC_GET_DEVICE_ID(len) _IOC(_IOC_READ, 'P', IOCNR_GET_DEVICE_ID, len)
+/* Get two-int array: [0]=bus number, [1]=device address: */
+#define LPIOC_GET_BUS_ADDRESS(len) _IOC(_IOC_READ, 'P', IOCNR_GET_BUS_ADDRESS, len)
+/* Get two-int array: [0]=vendor ID, [1]=product ID: */
+#define LPIOC_GET_VID_PID(len) _IOC(_IOC_READ, 'P', IOCNR_GET_VID_PID, len)
+
+
+static void get_usb_devs(hd_data_t *hd_data);
+static void set_class_entries(hd_data_t *hd_data, hd_t *hd, usb_t *usb);
+static void get_input_devs(hd_data_t *hd_data);
+static void get_printer_devs(hd_data_t *hd_data);
+static void read_usb_lp(hd_data_t *hd_data, hd_t *hd);
+static void get_serial_devs(hd_data_t *hd_data);
+
+void hd_scan_sysfs_usb(hd_data_t *hd_data)
+{
+ if(!hd_probe_feature(hd_data, pr_usb)) return;
+
+ hd_data->module = mod_usb;
+
+ /* some clean-up */
+ remove_hd_entries(hd_data);
+ hd_data->proc_usb = free_str_list(hd_data->proc_usb);
+ hd_data->usb = NULL;
+
+ PROGRESS(1, 0, "sysfs drivers");
+
+ hd_sysfs_driver_list(hd_data);
+
+ PROGRESS(2, 0, "usb");
+
+ get_usb_devs(hd_data);
+
+ PROGRESS(3, 1, "joydev mod");
+ load_module(hd_data, "joydev");
+
+ PROGRESS(3, 2, "evdev mod");
+ load_module(hd_data, "evdev");
+
+ PROGRESS(3, 3, "input");
+ get_input_devs(hd_data);
+
+ PROGRESS(3, 4, "lp");
+ get_printer_devs(hd_data);
+
+ PROGRESS(3, 5, "serial");
+ get_serial_devs(hd_data);
+
+}
+
+
+void get_usb_devs(hd_data_t *hd_data)
+{
+ uint64_t ul0;
+ unsigned u1, u2, u3;
+ hd_t *hd, *hd1;
+ usb_t *usb;
+ str_list_t *sl, *usb_devs = NULL;
+ char *s, *s1, *t;
+ hd_res_t *res;
+ size_t l;
+
+ struct sysfs_bus *sf_bus;
+ struct dlist *sf_dev_list;
+ struct sysfs_device *sf_dev;
+ struct sysfs_device *sf_dev_2;
+
+ sf_bus = sysfs_open_bus("usb");
+
+ if(!sf_bus) {
+ ADD2LOG("sysfs: no such bus: usb\n");
+ return;
+ }
+
+ sf_dev_list = sysfs_get_bus_devices(sf_bus);
+
+ if(sf_dev_list) dlist_for_each_data(sf_dev_list, sf_dev, struct sysfs_device) {
+ if(hd_attr_uint(sysfs_get_device_attr(sf_dev, "bNumInterfaces"), &ul0, 0)) {
+ add_str_list(&usb_devs, sf_dev->path);
+ ADD2LOG(" usb dev: %s\n", hd_sysfs_id(sf_dev->path));
+ }
+ }
+
+ if(sf_dev_list) dlist_for_each_data(sf_dev_list, sf_dev, struct sysfs_device) {
+ ADD2LOG(
+ " usb device: name = %s, bus_id = %s, bus = %s\n path = %s\n",
+ sf_dev->name,
+ sf_dev->bus_id,
+ sf_dev->bus,
+ hd_sysfs_id(sf_dev->path)
+ );
+
+ if(
+ hd_attr_uint(sysfs_get_device_attr(sf_dev, "bInterfaceNumber"), &ul0, 16)
+ ) {
+ hd = add_hd_entry(hd_data, __LINE__, 0);
+
+ hd->detail = new_mem(sizeof *hd->detail);
+ hd->detail->type = hd_detail_usb;
+ hd->detail->usb.data = usb = new_mem(sizeof *usb);
+
+ hd->sysfs_id = new_str(hd_sysfs_id(sf_dev->path));
+ hd->sysfs_bus_id = new_str(sf_dev->bus_id);
+
+ hd->bus.id = bus_usb;
+ hd->func = ul0;
+
+ usb->ifdescr = ul0;
+
+ ADD2LOG(" bInterfaceNumber = %u\n", hd->func);
+
+ if(hd_attr_uint(sysfs_get_device_attr(sf_dev, "bInterfaceClass"), &ul0, 16)) {
+ usb->i_cls = ul0;
+ ADD2LOG(" bInterfaceClass = %u\n", usb->i_cls);
+ }
+
+ if(hd_attr_uint(sysfs_get_device_attr(sf_dev, "bInterfaceSubClass"), &ul0, 16)) {
+ usb->i_sub = ul0;
+ ADD2LOG(" bInterfaceSubClass = %u\n", usb->i_sub);
+ }
+
+ if(hd_attr_uint(sysfs_get_device_attr(sf_dev, "bInterfaceProtocol"), &ul0, 16)) {
+ usb->i_prot = ul0;
+ ADD2LOG(" bInterfaceProtocol = %u\n", usb->i_prot);
+ }
+
+ /* device has longest matching sysfs id */
+ u2 = strlen(sf_dev->path);
+ s = NULL;
+ for(u3 = 0, sl = usb_devs; sl; sl = sl->next) {
+ u1 = strlen(sl->str);
+ if(u1 > u3 && u1 <= u2 && !strncmp(sf_dev->path, sl->str, u1)) {
+ u3 = u1;
+ s = sl->str;
+ }
+ }
+
+ if(s) {
+ ADD2LOG(" if: %s @ %s\n", hd->sysfs_bus_id, hd_sysfs_id(s));
+ sf_dev_2 = sysfs_open_device_path(s);
+ if(sf_dev_2) {
+
+ if(hd_attr_uint(sysfs_get_device_attr(sf_dev_2, "bDeviceClass"), &ul0, 16)) {
+ usb->d_cls = ul0;
+ ADD2LOG(" bDeviceClass = %u\n", usb->d_cls);
+ }
+
+ if(hd_attr_uint(sysfs_get_device_attr(sf_dev_2, "bDeviceSubClass"), &ul0, 16)) {
+ usb->d_sub = ul0;
+ ADD2LOG(" bDeviceSubClass = %u\n", usb->d_sub);
+ }
+
+ if(hd_attr_uint(sysfs_get_device_attr(sf_dev_2, "bDeviceProtocol"), &ul0, 16)) {
+ usb->d_prot = ul0;
+ ADD2LOG(" bDeviceProtocol = %u\n", usb->d_prot);
+ }
+
+ if(hd_attr_uint(sysfs_get_device_attr(sf_dev_2, "idVendor"), &ul0, 16)) {
+ usb->vendor = ul0;
+ ADD2LOG(" idVendor = 0x%04x\n", usb->vendor);
+ }
+
+ if(hd_attr_uint(sysfs_get_device_attr(sf_dev_2, "idProduct"), &ul0, 16)) {
+ usb->device = ul0;
+ ADD2LOG(" idProduct = 0x%04x\n", usb->device);
+ }
+
+ if((s = hd_attr_str(sysfs_get_device_attr(sf_dev_2, "manufacturer")))) {
+ usb->manufact = canon_str(s, strlen(s));
+ ADD2LOG(" manufacturer = \"%s\"\n", usb->manufact);
+ }
+
+ if((s = hd_attr_str(sysfs_get_device_attr(sf_dev_2, "product")))) {
+ usb->product = canon_str(s, strlen(s));
+ ADD2LOG(" product = \"%s\"\n", usb->product);
+ }
+
+ if((s = hd_attr_str(sysfs_get_device_attr(sf_dev_2, "serial")))) {
+ usb->serial = canon_str(s, strlen(s));
+ ADD2LOG(" serial = \"%s\"\n", usb->serial);
+ }
+
+ if(hd_attr_uint(sysfs_get_device_attr(sf_dev_2, "bcdDevice"), &ul0, 16)) {
+ usb->rev = ul0;
+ ADD2LOG(" bcdDevice = %04x\n", usb->rev);
+ }
+
+ if((s = hd_attr_str(sysfs_get_device_attr(sf_dev_2, "speed")))) {
+ s = canon_str(s, strlen(s));
+ if(strcmp(s, "1.5")) usb->speed = 15*100000;
+ else if(strcmp(s, "12")) usb->speed = 12*1000000;
+ else if(strcmp(s, "240")) usb->speed = 240*1000000;
+ ADD2LOG(" speed = \"%s\"\n", s);
+ s = free_mem(s);
+ }
+
+ sysfs_close_device(sf_dev_2);
+ }
+ }
+
+ if(usb->vendor || usb->device) {
+ hd->vendor.id = MAKE_ID(TAG_USB, usb->vendor);
+ hd->device.id = MAKE_ID(TAG_USB, usb->device);
+ }
+
+ if(usb->manufact) hd->vendor.name = new_str(usb->manufact);
+ if(usb->product) hd->device.name = new_str(usb->product);
+ if(usb->serial) hd->serial = new_str(usb->serial);
+
+ if(usb->rev) str_printf(&hd->revision.name, 0, "%x.%02x", usb->rev >> 8, usb->rev & 0xff);
+
+ if(usb->speed) {
+ res = add_res_entry(&hd->res, new_mem(sizeof *res));
+ res->baud.type = res_baud;
+ res->baud.speed = usb->speed;
+ }
+
+ s = hd_sysfs_find_driver(hd_data, hd->sysfs_id, 1);
+ if(s) add_str_list(&hd->drivers, s);
+
+ set_class_entries(hd_data, hd, usb);
+
+ if(!hd_data->scanner_db) {
+ hd_data->scanner_db = hd_module_list(hd_data, 1);
+ }
+
+ if(
+ hd->drivers &&
+ search_str_list(hd_data->scanner_db, hd->drivers->str)
+ ) {
+ hd->base_class.id = bc_scanner;
+ }
+
+ // ###### FIXME
+ if(hd->base_class.id == bc_modem) {
+ hd->unix_dev_name = new_str("/dev/ttyACM0");
+ }
+
+ }
+ }
+
+ sysfs_close_bus(sf_bus);
+
+ /* connect usb devices to each other */
+ for(hd = hd_data->hd; hd; hd = hd->next) {
+ if(hd->module == hd_data->module && hd->sysfs_id) {
+
+ s = new_str(hd->sysfs_id);
+ t = strrchr(s, '/');
+ if(t) *t = 0;
+
+ /* parent has longest matching sysfs id */
+ u2 = strlen(s);
+ for(u3 = 0, hd1 = hd_data->hd; hd1; hd1 = hd1->next) {
+ if(hd1->sysfs_id) {
+ s1 = new_str(hd1->sysfs_id);
+
+ if(hd1->module == hd_data->module) {
+ t = strrchr(s1, ':');
+ if(t) *t = 0;
+ l = strlen(s1);
+ if(l > 2 && s1[l-2] == '-' && s1[l-1] == '0') {
+ /* root hub */
+ s1[l-2] = 0 ;
+ }
+ }
+
+ u1 = strlen(s1);
+ if(u1 > u3 && u1 <= u2 && !strncmp(s, s1, u1)) {
+ u3 = u1;
+ hd->attached_to = hd1->idx;
+ }
+
+ s1 = free_mem(s1);
+ }
+ }
+
+ s = free_mem(s);
+ }
+ }
+
+ /* remove some entries */
+ for(hd = hd_data->hd; hd; hd = hd->next) {
+ if(
+ hd->module == hd_data->module &&
+ hd->sysfs_id &&
+ !hd->tag.remove
+ ) {
+
+ s = new_str(hd->sysfs_id);
+ t = strrchr(s, ':');
+ if(t) *t = 0;
+
+ for(hd1 = hd_data->hd; hd1; hd1 = hd1->next) {
+ if(
+ hd1 != hd &&
+ hd1->module == hd_data->module &&
+ hd1->sysfs_id &&
+ !hd1->tag.remove &&
+ hd1->base_class.id == hd->base_class.id
+ ) {
+
+ s1 = new_str(hd1->sysfs_id);
+ t = strrchr(s1, ':');
+ if(t) *t = 0;
+
+ /* same usb device */
+ if(!strcmp(s, s1)) {
+ hd1->tag.remove = 1;
+ ADD2LOG("removed: %s\n", hd1->sysfs_id);
+ }
+
+ s1 = free_mem(s1);
+ }
+ }
+
+ s = free_mem(s);
+ }
+ }
+
+ remove_tagged_hd_entries(hd_data);
+
+
+}
+
+
+void set_class_entries(hd_data_t *hd_data, hd_t *hd, usb_t *usb)
+{
+ int cls, sub, prot;
+ unsigned u;
+
+ if(usb->d_cls) {
+ cls = usb->d_cls; sub = usb->d_sub; prot = usb->d_prot;
+ }
+ else {
+ cls = usb->i_cls; sub = usb->i_sub; prot = usb->i_prot;
+ }
+
+ switch(cls) {
+ case 2:
+ if(usb->i_sub == 6 && usb->i_prot == 0) {
+ hd->base_class.id = bc_network;
+ hd->sub_class.id = 0x91;
+ }
+ else if(usb->i_sub == 2 && usb->i_prot >= 1 && usb->i_prot <= 6) {
+ hd->base_class.id = bc_modem;
+ }
+ break;
+
+ case 3:
+ if(sub == 1 && prot == 1) {
+ hd->base_class.id = bc_keyboard;
+ hd->sub_class.id = sc_keyboard_kbd;
+ break;
+ }
+ if(sub == 1 && prot == 2) {
+ if(!(
+ (usb->vendor == 0x056a && usb->device == 0x0022) /* Wacom Tablet */
+// || (usb->vendor == 0x08ca && usb->device == 0x0020) /* AIPTEK APT-6000U tablet */
+ )) {
+ hd->base_class.id = bc_mouse;
+ hd->sub_class.id = sc_mou_usb;
+ hd->compat_vendor.id = MAKE_ID(TAG_SPECIAL, 0x0200);
+ hd->compat_device.id = MAKE_ID(TAG_SPECIAL, 0x001);
+ }
+ break;
+ }
+ break;
+
+ case 6:
+ if(sub == 1 && prot == 1) { /* PTP camera */
+ hd->base_class.id = bc_camera;
+ hd->sub_class.id = sc_camera_digital;
+ break;
+ }
+ break;
+
+ case 7:
+ hd->base_class.id = bc_printer;
+ break;
+
+ case 8:
+ hd->base_class.id = bc_storage_device;
+ switch(sub) {
+ case 1: /* flash devices & removable media */
+ case 5:
+ case 6:
+ hd->sub_class.id = sc_sdev_disk;
+ break;
+ case 2:
+ hd->sub_class.id = sc_sdev_cdrom;
+ break;
+ case 3:
+ hd->sub_class.id = sc_sdev_tape;
+ break;
+ case 4:
+ hd->sub_class.id = sc_sdev_floppy;
+ break;
+ default:
+ hd->sub_class.id = sc_sdev_other;
+ }
+ break;
+
+ case 9:
+ hd->base_class.id = bc_hub;
+ break;
+
+ case 0xe0:
+ if(sub == 1 && prot == 1) {
+ hd->base_class.id = bc_bluetooth;
+ hd->sub_class.id = 0;
+ }
+ break;
+
+ case 0xff:
+ /* hp psc 2100, 2200, 2150, officejet 6100 */
+ if(
+ sub == 0xcc &&
+ (
+ usb->vendor == 0x03f0 &&
+ (
+ usb->device == 0x2811 ||
+ usb->device == 0x2911 ||
+ usb->device == 0x2a11 ||
+ usb->device == 0x2d11
+ )
+ )
+ ) {
+ hd->base_class.id = bc_scanner;
+ hd->sub_class.id = 1;
+ }
+ break;
+ }
+
+ if((u = device_class(hd_data, hd->vendor.id, hd->device.id))) {
+ hd->base_class.id = u >> 8;
+ hd->sub_class.id = u & 0xff;
+ }
+
+ /* FIXME: hack for bt isdn box */
+ if(
+ hd->vendor.id == MAKE_ID(TAG_USB, 0x057c) &&
+ hd->device.id == MAKE_ID(TAG_USB, 0x2200)
+ ) {
+ hd_set_hw_class(hd, hw_bluetooth);
+ }
+
+}
+
+
+void get_input_devs(hd_data_t *hd_data)
+{
+ hd_t *hd;
+ char *s, *t;
+ hd_dev_num_t dev_num;
+ unsigned u1, u2;
+
+ struct sysfs_class *sf_class;
+ struct sysfs_class_device *sf_cdev;
+ struct sysfs_device *sf_dev;
+ struct dlist *sf_cdev_list;
+
+ sf_class = sysfs_open_class("input");
+
+ if(!sf_class) {
+ ADD2LOG("sysfs: no such class: input\n");
+ return;
+ }
+
+ sf_cdev_list = sysfs_get_class_devices(sf_class);
+ if(sf_cdev_list) dlist_for_each_data(sf_cdev_list, sf_cdev, struct sysfs_class_device) {
+ ADD2LOG(
+ " input: name = %s, path = %s\n",
+ sf_cdev->name,
+ hd_sysfs_id(sf_cdev->path)
+ );
+
+ if((s = hd_attr_str(sysfs_get_classdev_attr(sf_cdev, "dev")))) {
+ if(sscanf(s, "%u:%u", &u1, &u2) == 2) {
+ dev_num.type = 'c';
+ dev_num.major = u1;
+ dev_num.minor = u2;
+ dev_num.range = 1;
+ }
+ ADD2LOG(" dev = %u:%u\n", u1, u2);
+ }
+
+ sf_dev = sysfs_get_classdev_device(sf_cdev);
+ if(sf_dev) {
+ s = hd_sysfs_id(sf_dev->path);
+
+ ADD2LOG(
+ " input device: bus = %s, bus_id = %s driver = %s\n path = %s\n",
+ sf_dev->bus,
+ sf_dev->bus_id,
+ sf_dev->driver_name,
+ s
+ );
+
+ for(hd = hd_data->hd; hd; hd = hd->next) {
+ if(
+ hd->module == hd_data->module &&
+ hd->sysfs_id &&
+ s &&
+ !strcmp(s, hd->sysfs_id)
+ ) {
+ t = NULL;
+ str_printf(&t, 0, "/dev/input/%s", sf_cdev->name);
+
+ if(strncmp(sf_cdev->name, "mouse", sizeof "mouse" - 1)) {
+ hd->unix_dev_name = t;
+ hd->unix_dev_num = dev_num;
+ }
+ else {
+ hd->unix_dev_name2 = t;
+ hd->unix_dev_num2 = dev_num;
+
+ dev_num.major = 13;
+ dev_num.minor = 63;
+ hd->unix_dev_name = new_str(DEV_MICE);
+ hd->unix_dev_num = dev_num;
+ }
+ }
+ }
+ }
+ }
+
+ sysfs_close_class(sf_class);
+}
+
+
+void get_printer_devs(hd_data_t *hd_data)
+{
+ hd_t *hd;
+ char *s, *t;
+ hd_dev_num_t dev_num;
+ unsigned u1, u2;
+
+ struct sysfs_class *sf_class;
+ struct sysfs_class_device *sf_cdev;
+ struct sysfs_device *sf_dev;
+ struct dlist *sf_cdev_list;
+
+ sf_class = sysfs_open_class("usb");
+
+ if(!sf_class) {
+ ADD2LOG("sysfs: no such class: usb\n");
+ return;
+ }
+
+ sf_cdev_list = sysfs_get_class_devices(sf_class);
+ if(sf_cdev_list) dlist_for_each_data(sf_cdev_list, sf_cdev, struct sysfs_class_device) {
+ if(strncmp(sf_cdev->name, "lp", 2)) continue;
+
+ ADD2LOG(
+ " usb: name = %s, path = %s\n",
+ sf_cdev->name,
+ hd_sysfs_id(sf_cdev->path)
+ );
+
+ if((s = hd_attr_str(sysfs_get_classdev_attr(sf_cdev, "dev")))) {
+ if(sscanf(s, "%u:%u", &u1, &u2) == 2) {
+ dev_num.type = 'c';
+ dev_num.major = u1;
+ dev_num.minor = u2;
+ dev_num.range = 1;
+ }
+ ADD2LOG(" dev = %u:%u\n", u1, u2);
+ }
+
+ sf_dev = sysfs_get_classdev_device(sf_cdev);
+ if(sf_dev) {
+ s = hd_sysfs_id(sf_dev->path);
+
+ ADD2LOG(
+ " usb device: bus = %s, bus_id = %s driver = %s\n path = %s\n",
+ sf_dev->bus,
+ sf_dev->bus_id,
+ sf_dev->driver_name,
+ s
+ );
+
+ for(hd = hd_data->hd; hd; hd = hd->next) {
+ if(
+ hd->module == hd_data->module &&
+ hd->sysfs_id &&
+ s &&
+ !strcmp(s, hd->sysfs_id)
+ ) {
+ t = NULL;
+ str_printf(&t, 0, "/dev/usb/%s", sf_cdev->name);
+
+ hd->unix_dev_name = t;
+ hd->unix_dev_num = dev_num;
+
+ read_usb_lp(hd_data, hd);
+ }
+ }
+ }
+ }
+
+ sysfs_close_class(sf_class);
+}
+
+
+#define MATCH_FIELD(field, var) \
+ if(!strncasecmp(sl->str, field, sizeof field - 1)) var = sl->str + sizeof field - 1
+
+/*
+ * assign /dev/usb/lp* to usb printers.
+ */
+void read_usb_lp(hd_data_t *hd_data, hd_t *hd)
+{
+ char *s;
+ char buf[1024];
+ int fd, two_ints[2];
+ unsigned bus;
+ str_list_t *sl0, *sl;
+ char *vend, *prod, *serial, *descr;
+
+ if((fd = open(hd->unix_dev_name, O_RDWR)) < 0) return;
+
+ if(ioctl(fd, LPIOC_GET_BUS_ADDRESS(sizeof two_ints), two_ints) == -1) {
+ close(fd);
+ return;
+ }
+
+ ADD2LOG(" usb/lp: bus = %d, dev_nr = %d\n", two_ints[0], two_ints[1]);
+ bus = ((two_ints[0] & 0xff) << 8) + (two_ints[1] & 0xff);
+
+ if(ioctl(fd, LPIOC_GET_VID_PID(sizeof two_ints), two_ints) != -1) {
+ /* just for the record */
+ ADD2LOG(" usb/lp: vend = 0x%04x, prod = 0x%04x\n", two_ints[0], two_ints[1]);
+ }
+
+ memset(buf, 0, sizeof buf);
+ if(!ioctl(fd, LPIOC_GET_DEVICE_ID(sizeof buf), buf)) {
+ buf[sizeof buf - 1] = 0;
+ s = canon_str(buf + 2, sizeof buf - 3);
+ ADD2LOG(" usb/lp: \"%s\"\n", s);
+ sl0 = hd_split(';', s);
+ free_mem(s);
+ vend = prod = serial = descr = NULL;
+ for(sl = sl0; sl; sl = sl->next) {
+ MATCH_FIELD("MFG:", vend);
+ MATCH_FIELD("MANUFACTURER:", vend);
+ MATCH_FIELD("MDL:", prod);
+ MATCH_FIELD("MODEL:", prod);
+ MATCH_FIELD("DES:", descr);
+ MATCH_FIELD("DESCRIPTION:", descr);
+ MATCH_FIELD("SERN:", serial);
+ MATCH_FIELD("SERIALNUMBER:", serial);
+ }
+ ADD2LOG(
+ " usb/lp: vend = %s, prod = %s, descr = %s, serial = %s\n",
+ vend ?: "", prod ?: "", descr ?: "", serial ?: ""
+ );
+ if(descr) {
+ str_printf(&hd->model, 0, "%s", descr);
+ }
+ if(vend && prod) {
+ str_printf(&hd->sub_vendor.name, 0, "%s", vend);
+ str_printf(&hd->sub_device.name, 0, "%s", prod);
+ }
+ if(serial && !hd->serial) {
+ hd->serial = new_str(serial);
+ }
+
+ free_str_list(sl0);
+ }
+
+ close(fd);
+}
+#undef MATCH_FIELD
+
+
+void get_serial_devs(hd_data_t *hd_data)
+{
+ hd_t *hd;
+ char *s, *t;
+ hd_dev_num_t dev_num;
+ unsigned u1, u2;
+
+ struct sysfs_class *sf_class;
+ struct sysfs_class_device *sf_cdev;
+ struct sysfs_device *sf_dev;
+ struct dlist *sf_cdev_list;
+
+ sf_class = sysfs_open_class("tty");
+
+ if(!sf_class) {
+ ADD2LOG("sysfs: no such class: tty\n");
+ return;
+ }
+
+ sf_cdev_list = sysfs_get_class_devices(sf_class);
+ if(sf_cdev_list) dlist_for_each_data(sf_cdev_list, sf_cdev, struct sysfs_class_device) {
+ if(strncmp(sf_cdev->name, "ttyUSB", 6)) continue;
+
+ ADD2LOG(
+ " usb: name = %s, path = %s\n",
+ sf_cdev->name,
+ hd_sysfs_id(sf_cdev->path)
+ );
+
+ if((s = hd_attr_str(sysfs_get_classdev_attr(sf_cdev, "dev")))) {
+ if(sscanf(s, "%u:%u", &u1, &u2) == 2) {
+ dev_num.type = 'c';
+ dev_num.major = u1;
+ dev_num.minor = u2;
+ dev_num.range = 1;
+ }
+ ADD2LOG(" dev = %u:%u\n", u1, u2);
+ }
+
+ sf_dev = sysfs_get_classdev_device(sf_cdev);
+ if(sf_dev) {
+ s = hd_sysfs_id(sf_dev->path);
+
+ if((t = strrchr(s, '/')) && !strncmp(t + 1, "ttyUSB", sizeof "ttyUSB" - 1)) *t =0;
+
+ ADD2LOG(
+ " usb device: bus = %s, bus_id = %s driver = %s\n path = %s\n",
+ sf_dev->bus,
+ sf_dev->bus_id,
+ sf_dev->driver_name,
+ s
+ );
+
+ for(hd = hd_data->hd; hd; hd = hd->next) {
+ if(
+ hd->module == hd_data->module &&
+ hd->sysfs_id &&
+ s &&
+ !strcmp(s, hd->sysfs_id)
+ ) {
+ t = NULL;
+ str_printf(&t, 0, "/dev/%s", sf_cdev->name);
+
+ hd->unix_dev_name = t;
+ hd->unix_dev_num = dev_num;
+
+ hd->base_class.id = bc_comm;
+ hd->sub_class.id = sc_com_ser;
+ hd->prog_if.id = 0x80;
+ }
+ }
+ }
+ }
+
+ sysfs_close_class(sf_class);
+}
+
+
--- /dev/null
+void hd_scan_sysfs_usb(hd_data_t *hd_data);
--- /dev/null
+#define HD_VERSION_STRING "10.16"
--- /dev/null
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <dirent.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+
+#include "hd.h"
+#include "hd_int.h"
+#include "veth.h"
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ * iSeries veth devices
+ *
+ * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ */
+
+#if defined(__PPC__)
+
+void hd_scan_veth(hd_data_t *hd_data)
+{
+ unsigned u;
+ hd_t *hd;
+ DIR *dir;
+ struct dirent *de;
+
+ if(!hd_probe_feature(hd_data, pr_veth)) return;
+
+ hd_data->module = mod_veth;
+
+ /* some clean-up */
+ remove_hd_entries(hd_data);
+
+ PROGRESS(1, 0, "read data");
+
+ if((dir = opendir(PROC_ISERIES_VETH))) {
+ while((de = readdir(dir))) {
+ if(sscanf(de->d_name, "veth%u", &u) == 1) {
+ hd = add_hd_entry(hd_data, __LINE__, 0);
+ hd->base_class.id = bc_network;
+ hd->slot = u;
+ hd->vendor.id = MAKE_ID(TAG_SPECIAL, 0x6001); // IBM
+ hd->device.id = MAKE_ID(TAG_SPECIAL, 0x1000);
+ str_printf(&hd->device.name, 0, "Virtual Ethernet card %d", hd->slot);
+ }
+ }
+ closedir(dir);
+ return;
+ }
+ if((dir = opendir(PROC_ISERIES))) {
+ hd = add_hd_entry(hd_data, __LINE__, 0);
+ hd->base_class.id = bc_network;
+ hd->slot = 0;
+ hd->vendor.id = MAKE_ID(TAG_SPECIAL, 0x6001); // IBM
+ hd->device.id = MAKE_ID(TAG_SPECIAL, 0x1000);
+ str_printf(&hd->device.name, 0, "Virtual Ethernet card %d", hd->slot);
+ }
+
+}
+
+#endif /* __PPC__ */
--- /dev/null
+void hd_scan_veth(hd_data_t *hd_data);
--- /dev/null
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/socket.h>
+#include <sys/ioctl.h>
+#include <linux/wireless.h>
+#include <net/ethernet.h>
+
+#include "hd.h"
+#include "hd_int.h"
+#include "wlan.h"
+
+#ifndef LIBHD_TINY
+
+#define AUTH_ALG_OPEN_SYSTEM 0x01
+#define AUTH_ALG_SHARED_KEY 0x02
+#define AUTH_ALG_LEAP 0x04
+
+typedef enum { WPA_ALG_NONE, WPA_ALG_WEP, WPA_ALG_TKIP, WPA_ALG_CCMP } wpa_alg;
+typedef uint8_t u8;
+typedef uint16_t u16;
+typedef uint32_t u32;
+
+struct wpa_driver_ops {
+ int (*set_wpa)(const char *ifnmae, int enabled);
+ int (*set_auth_alg)(const char *ifname, int auth_alg);
+ int (*set_key)(const char *ifname, wpa_alg alg, unsigned char *addr,
+ int key_idx, int set_tx, u8 *seq, size_t seq_len,
+ u8 *key, size_t key_len);
+};
+
+struct wpa_driver_ops wpa_driver_hostap_ops;
+struct wpa_driver_ops wpa_driver_prism54_ops;
+struct wpa_driver_ops wpa_driver_hermes_ops;
+struct wpa_driver_ops wpa_driver_madwifi_ops;
+struct wpa_driver_ops wpa_driver_atmel_ops;
+struct wpa_driver_ops wpa_driver_wext_ops;
+struct wpa_driver_ops wpa_driver_ndiswrapper_ops;
+struct wpa_driver_ops wpa_driver_ipw_ops;
+
+/* the iw_ functions are copied from libiw, so we do not need to
+ link against it */
+
+int iw_sockets_open(void)
+{
+ static const int families[] = {
+ AF_INET, AF_IPX, AF_AX25, AF_APPLETALK
+ };
+ unsigned int i;
+ int sock;
+
+ /*
+ * Now pick any (exisiting) useful socket family for generic queries
+ * Note : don't open all the socket, only returns when one matches,
+ * all protocols might not be valid.
+ * Workaround by Jim Kaba <jkaba@sarnoff.com>
+ * Note : in 99% of the case, we will just open the inet_sock.
+ * The remaining 1% case are not fully correct...
+ */
+
+ /* Try all families we support */
+ for(i = 0; i < sizeof(families)/sizeof(int); ++i)
+ {
+ /* Try to open the socket, if success returns it */
+ sock = socket(families[i], SOCK_DGRAM, 0);
+ if(sock >= 0)
+ return sock;
+ }
+
+ return -1;
+}
+
+static inline int
+iw_get_ext(int skfd, /* Socket to the kernel */
+ const char * ifname, /* Device name */
+ int request, /* WE ID */
+ struct iwreq * pwrq) /* Fixed part of the request */
+{
+ /* Set device name */
+ strncpy(pwrq->ifr_name, ifname, IFNAMSIZ);
+ /* Do the request */
+ return(ioctl(skfd, request, pwrq));
+}
+
+int iw_get_range_info(int skfd,
+ const char * ifname,
+ struct iw_range * range)
+{
+ struct iwreq wrq;
+ char buffer[sizeof(struct iw_range) * 2]; /* Large enough */
+ struct iw_range * range_raw;
+
+ /* Cleanup */
+ bzero(buffer, sizeof(buffer));
+
+ wrq.u.data.pointer = (caddr_t) buffer;
+ wrq.u.data.length = sizeof(buffer);
+ wrq.u.data.flags = 0;
+ if(iw_get_ext(skfd, ifname, SIOCGIWRANGE, &wrq) < 0)
+ return(-1);
+
+ /* Point to the buffer */
+ range_raw = (struct iw_range *) buffer;
+
+ /* For new versions, we can check the version directly, for old versions
+ * we use magic. 300 bytes is a also magic number, don't touch... */
+ if(wrq.u.data.length < 300) {
+ /* That's v10 or earlier. Ouch ! Let's make a guess...*/
+ range_raw->we_version_compiled = 9;
+ }
+
+ /* Check how it needs to be processed */
+ if(range_raw->we_version_compiled > 15) {
+ /* This is our native format, that's easy... */
+ /* Copy stuff at the right place, ignore extra */
+ memcpy((char *) range, buffer, sizeof(struct iw_range));
+ }
+ else {
+ /* not supported */
+ return(-1);
+ }
+
+ return(0);
+}
+
+double iw_freq2float(const struct iw_freq * in)
+{
+ int i;
+ double res = (double) in->m;
+ for(i = 0; i < in->e; i++)
+ res *= 10;
+ return(res);
+}
+
+void hd_scan_wlan(hd_data_t *hd_data)
+{
+ hd_t *hd;
+ hd_res_t *res;
+ struct iw_range range;
+ int k;
+ int skfd;
+ struct wpa_driver_ops *wpa_drv=NULL;
+
+ if(!hd_probe_feature(hd_data, pr_wlan)) return;
+
+ hd_data->module = mod_wlan;
+
+ PROGRESS(1, 0, "detecting wlan features");
+
+ if ((skfd = iw_sockets_open()) < 0) {
+ ADD2LOG( "could not open socket, wlan feature query failed\n" );
+ return;
+ }
+
+ for(hd = hd_data->hd; hd; hd = hd->next) {
+ if(
+ hd->base_class.id == bc_network &&
+ hd->unix_dev_name ) {
+ /* Get list of frequencies / channels */
+ if(iw_get_range_info(skfd, hd->unix_dev_name, &range) < 0) {
+ /* this failed, maybe device does not support wireless extensions */
+ continue;
+ }
+ ADD2LOG("*** device %s is wireless ***\n", hd->unix_dev_name);
+ hd->is.wlan = 1;
+ res = new_mem(sizeof *res);
+ res->any.type = res_wlan;
+
+ if(range.num_frequency > 0) {
+ char buff[20];
+ for(k = 0; k < range.num_frequency; k++) {
+ snprintf(buff, 19, "%i", range.freq[k].i);
+ add_str_list(&res->wlan.channels, buff);
+ snprintf(buff, 19, "%g", (float)iw_freq2float(&(range.freq[k]))/1000000000);
+ add_str_list(&res->wlan.frequencies, buff);
+ }
+ for(k = 0; k < range.num_bitrates; k++) {
+ snprintf(buff, 19, "%g", (float)range.bitrate[k]/1000000);
+ add_str_list(&res->wlan.bitrates, buff);
+ }
+ for(k = 0; k < range.num_encoding_sizes; k++) {
+ snprintf(buff, 19, "WEP%i", range.encoding_size[k]*8);
+ add_str_list(&res->wlan.enc_modes, buff);
+ }
+
+ /* open mode is always supported */
+ add_str_list(&res->wlan.auth_modes, "open");
+ /* if WEP is supported, be assume shared key auth support */
+ if(range.num_encoding_sizes) {
+ add_str_list(&res->wlan.auth_modes, "sharedkey");
+ }
+
+ /* detect WPA capabilities */
+ if (hd->drivers) {
+ if (search_str_list(hd->drivers, "hostap_cs") ||
+ search_str_list(hd->drivers, "hostap_pci") ||
+ search_str_list(hd->drivers, "hostap_plx") )
+ wpa_drv = &wpa_driver_hostap_ops;
+ /* prism54 is not ready yet
+ else if (search_str_list(hd->drivers, "prism54")==0)
+ wpa_drv = &wpa_driver_prism54_ops;
+ */
+ else if (search_str_list(hd->drivers, "ath_pci"))
+ wpa_drv = &wpa_driver_madwifi_ops;
+ else if (strncmp(hd->drivers->str, "at76", 4)==0)
+ wpa_drv = &wpa_driver_atmel_ops;
+ else if (search_str_list(hd->drivers, "ndiswrapper"))
+ wpa_drv = &wpa_driver_ndiswrapper_ops;
+ else if ((search_str_list(hd->drivers, "ipw2100")) ||
+ (search_str_list(hd->drivers, "ipw2200")) )
+ wpa_drv = &wpa_driver_ipw_ops;
+ }
+
+ if (wpa_drv) {
+ if (wpa_drv->set_wpa(hd->unix_dev_name, 1) == 0) {
+ add_str_list(&res->wlan.auth_modes, "wpa-psk");
+ add_str_list(&res->wlan.auth_modes, "wpa-eap");
+ if (wpa_drv->set_auth_alg &&
+ wpa_drv->set_auth_alg(hd->unix_dev_name, AUTH_ALG_LEAP)==0)
+ add_str_list(&res->wlan.auth_modes, "wpa-leap");
+ if (wpa_drv->set_key(hd->unix_dev_name, WPA_ALG_TKIP, "ff:ff:ff:ff:ff:ff",
+ 0, 0, 0, 0,
+ "00000000000000000000000000000000", 32) ==0)
+ add_str_list(&res->wlan.enc_modes, "TKIP");
+ if (wpa_drv->set_key(hd->unix_dev_name, WPA_ALG_CCMP, "ff:ff:ff:ff:ff:ff",
+ 0, 0, 0, 0,
+ "0000000000000000", 16) ==0)
+ add_str_list(&res->wlan.enc_modes, "CCMP");
+ wpa_drv->set_wpa(hd->unix_dev_name, 0);
+ }
+ }
+ }
+ add_res_entry(&hd->res, res);
+ }
+ }
+}
+
+/* following functions are copied from wpa_supplicant
+ they are used to detect WPA capabilities */
+
+/* begin hostap */
+
+#define PRISM2_IOCTL_PRISM2_PARAM (SIOCIWFIRSTPRIV + 0)
+#define PRISM2_IOCTL_HOSTAPD (SIOCDEVPRIVATE + 14)
+#define HOSTAP_CRYPT_ALG_NAME_LEN 16
+#define HOSTAP_CRYPT_FLAG_SET_TX_KEY (1 << (0))
+#define PRISM2_HOSTAPD_GENERIC_ELEMENT_HDR_LEN \
+ ((int) (&((struct prism2_hostapd_param *) 0)->u.generic_elem.data))
+
+enum {
+ PRISM2_SET_ENCRYPTION = 6,
+ PRISM2_HOSTAPD_SET_GENERIC_ELEMENT = 12,
+ PRISM2_PARAM_AP_AUTH_ALGS = 15,
+ PRISM2_PARAM_HOST_ROAMING = 21,
+ PRISM2_PARAM_WPA = 36,
+ PRISM2_PARAM_PRIVACY_INVOKED = 37,
+};
+
+struct prism2_hostapd_param {
+ u32 cmd;
+ u8 sta_addr[ETH_ALEN];
+ union {
+ struct {
+ u16 aid;
+ u16 capability;
+ u8 tx_supp_rates;
+ } add_sta;
+ struct {
+ u32 inactive_sec;
+ } get_info_sta;
+ struct {
+ u8 alg[HOSTAP_CRYPT_ALG_NAME_LEN];
+ u32 flags;
+ u32 err;
+ u8 idx;
+ u8 seq[8]; /* sequence counter (set: RX, get: TX) */
+ u16 key_len;
+ u8 key[0];
+ } crypt;
+ struct {
+ u32 flags_and;
+ u32 flags_or;
+ } set_flags_sta;
+ struct {
+ u16 rid;
+ u16 len;
+ u8 data[0];
+ } rid;
+ struct {
+ u8 len;
+ u8 data[0];
+ } generic_elem;
+ struct {
+ u16 cmd;
+ u16 reason_code;
+ } mlme;
+ struct {
+ u8 ssid_len;
+ u8 ssid[32];
+ } scan_req;
+ } u;
+};
+
+
+int hostapd_ioctl(const char *dev, struct prism2_hostapd_param *param,
+ int len, int show_err)
+{
+ int s;
+ int ret =0;
+ struct iwreq iwr;
+
+ s = socket(PF_INET, SOCK_DGRAM, 0);
+ if (s < 0) {
+ return -1;
+ }
+
+ memset(&iwr, 0, sizeof(iwr));
+ strncpy(iwr.ifr_name, dev, IFNAMSIZ);
+ iwr.u.data.pointer = (caddr_t) param;
+ iwr.u.data.length = len;
+
+ if (ioctl(s, PRISM2_IOCTL_HOSTAPD, &iwr) < 0) {
+ ret=1;
+ }
+ close(s);
+
+ return 0;
+}
+
+int prism2param(const char *ifname, int param, int value)
+{
+ struct iwreq iwr;
+ int *i, s, ret = 0;
+
+ s = socket(PF_INET, SOCK_DGRAM, 0);
+ if (s < 0) {
+ return -1;
+ }
+
+ memset(&iwr, 0, sizeof(iwr));
+ strncpy(iwr.ifr_name, ifname, IFNAMSIZ);
+ i = (int *) iwr.u.name;
+ *i++ = param;
+ *i++ = value;
+
+ if (ioctl(s, PRISM2_IOCTL_PRISM2_PARAM, &iwr) < 0) {
+ ret = -1;
+ }
+ close(s);
+ return ret;
+}
+
+int wpa_driver_hostap_set_auth_alg(const char *ifname, int auth_alg)
+{
+ int algs = 0;
+
+ if (auth_alg & AUTH_ALG_OPEN_SYSTEM)
+ algs |= 1;
+ if (auth_alg & AUTH_ALG_SHARED_KEY)
+ algs |= 2;
+ if (auth_alg & AUTH_ALG_LEAP)
+ algs |= 4;
+ if (algs == 0)
+ algs = 1; /* at least one algorithm should be set */
+
+ return prism2param(ifname, PRISM2_PARAM_AP_AUTH_ALGS, algs);
+}
+
+int wpa_driver_hostap_set_wpa(const char *ifname, int enabled)
+{
+ int ret = 0;
+
+ if (prism2param(ifname, PRISM2_PARAM_HOST_ROAMING,
+ enabled ? 2 : 0) < 0)
+ ret = -1;
+ if (prism2param(ifname, PRISM2_PARAM_PRIVACY_INVOKED, enabled) < 0)
+ ret = -1;
+ if (prism2param(ifname, PRISM2_PARAM_WPA, enabled) < 0)
+ ret = -1;
+
+ return ret;
+}
+
+int wpa_driver_hostap_set_key(const char *ifname, wpa_alg alg,
+ unsigned char *addr, int key_idx,
+ int set_tx, u8 *seq, size_t seq_len,
+ u8 *key, size_t key_len)
+{
+ struct prism2_hostapd_param *param;
+ u8 *buf;
+ size_t blen;
+ int ret = 0;
+ char *alg_name;
+
+ switch (alg) {
+ case WPA_ALG_NONE:
+ alg_name = "none";
+ break;
+ case WPA_ALG_WEP:
+ alg_name = "WEP";
+ break;
+ case WPA_ALG_TKIP:
+ alg_name = "TKIP";
+ break;
+ case WPA_ALG_CCMP:
+ alg_name = "CCMP";
+ break;
+ default:
+ return -1;
+ }
+
+ if (seq_len > 8)
+ return -2;
+
+ blen = sizeof(*param) + key_len;
+ buf = malloc(blen);
+ if (buf == NULL)
+ return -1;
+ memset(buf, 0, blen);
+
+ param = (struct prism2_hostapd_param *) buf;
+ param->cmd = PRISM2_SET_ENCRYPTION;
+ memset(param->sta_addr, 0xff, ETH_ALEN);
+
+ strncpy(param->u.crypt.alg, alg_name, HOSTAP_CRYPT_ALG_NAME_LEN);
+ param->u.crypt.flags = set_tx ? HOSTAP_CRYPT_FLAG_SET_TX_KEY : 0;
+ param->u.crypt.idx = key_idx;
+ memcpy(param->u.crypt.seq, seq, seq_len);
+ param->u.crypt.key_len = key_len;
+ memcpy((u8 *) (param + 1), key, key_len);
+
+ if (hostapd_ioctl(ifname, param, blen, 1)) {
+ ret = -1;
+ }
+ free(buf);
+
+ return ret;
+}
+
+struct wpa_driver_ops wpa_driver_hostap_ops = {
+ .set_wpa = wpa_driver_hostap_set_wpa,
+ .set_key = wpa_driver_hostap_set_key,
+ .set_auth_alg = wpa_driver_hostap_set_auth_alg,
+};
+
+/* end hostap */
+
+/* begin madwifi */
+
+#define IEEE80211_IOCTL_SETPARAM (SIOCIWFIRSTPRIV+0)
+#define IEEE80211_IOCTL_SETKEY (SIOCIWFIRSTPRIV+2)
+#define IEEE80211_CIPHER_WEP 0
+#define IEEE80211_CIPHER_TKIP 1
+#define IEEE80211_CIPHER_AES_CCM 3
+#define IEEE80211_ADDR_LEN 6
+#define IEEE80211_KEY_XMIT 0x01
+#define IEEE80211_KEY_RECV 0x02
+#define IEEE80211_KEYBUF_SIZE 16
+#define IEEE80211_MICBUF_SIZE 16
+
+enum {
+ IEEE80211_PARAM_WPA = 10, /* WPA mode (0,1,2) */
+ IEEE80211_PARAM_ROAMING = 12, /* roaming mode */
+ IEEE80211_PARAM_PRIVACY = 13, /* privacy invoked */
+};
+
+struct ieee80211req_key {
+ u_int8_t ik_type; /* key/cipher type */
+ u_int8_t ik_pad;
+ u_int16_t ik_keyix; /* key index */
+ u_int8_t ik_keylen; /* key length in bytes */
+ u_int8_t ik_flags;
+#define IEEE80211_KEY_DEFAULT 0x80 /* default xmit key */
+ u_int8_t ik_macaddr[IEEE80211_ADDR_LEN];
+ u_int64_t ik_keyrsc; /* key receive sequence counter */
+ u_int64_t ik_keytsc; /* key transmit sequence counter */
+ u_int8_t ik_keydata[IEEE80211_KEYBUF_SIZE+IEEE80211_MICBUF_SIZE];
+};
+
+int
+set80211param(const char *dev, int op, int arg)
+{
+ struct iwreq iwr;
+ int s=-1;
+
+ if (s < 0 ? (s = socket(AF_INET, SOCK_DGRAM, 0)) == -1 : 0) {
+ return -1;
+ }
+
+ memset(&iwr, 0, sizeof(iwr));
+ strncpy(iwr.ifr_name, dev, IFNAMSIZ);
+ iwr.u.mode = op;
+ memcpy(iwr.u.name+sizeof(__u32), &arg, sizeof(arg));
+
+ if (ioctl(s, IEEE80211_IOCTL_SETPARAM, &iwr) < 0) {
+ return -1;
+ }
+ return 0;
+}
+
+static int
+wpa_driver_madwifi_set_wpa(const char *ifname, int enabled)
+{
+ int ret = 0;
+
+ if (set80211param(ifname, IEEE80211_PARAM_ROAMING, enabled ? 2 : 0) < 0)
+ ret = -1;
+ if (set80211param(ifname, IEEE80211_PARAM_PRIVACY, enabled) < 0)
+ ret = -1;
+ if (set80211param(ifname, IEEE80211_PARAM_WPA, enabled ? 3 : 0) < 0)
+ ret = -1;
+
+ return ret;
+}
+
+static int
+set80211priv(const char *dev, int op, void *data, int len)
+{
+ struct iwreq iwr;
+ int s=-1;
+
+ if (s < 0 ? (s = socket(AF_INET, SOCK_DGRAM, 0)) == -1 : 0) {
+ return -1;
+ }
+
+ memset(&iwr, 0, sizeof(iwr));
+ strncpy(iwr.ifr_name, dev, IFNAMSIZ);
+ if (len < IFNAMSIZ) {
+ /*
+ * Argument data fits inline; put it there.
+ */
+ memcpy(iwr.u.name, data, len);
+ } else {
+ /*
+ * Argument data too big for inline transfer; setup a
+ * parameter block instead; the kernel will transfer
+ * the data for the driver.
+ */
+ iwr.u.data.pointer = data;
+ iwr.u.data.length = len;
+ }
+
+ if (ioctl(s, op, &iwr) < 0) {
+ return -1;
+ }
+ return 0;
+}
+
+static int
+wpa_driver_madwifi_set_key(const char *ifname, wpa_alg alg,
+ unsigned char *addr, int key_idx,
+ int set_tx, u8 *seq, size_t seq_len,
+ u8 *key, size_t key_len)
+{
+ struct ieee80211req_key wk;
+ char *alg_name;
+ u_int8_t cipher;
+
+ if (alg == WPA_ALG_NONE)
+ return 0;
+
+ switch (alg) {
+ case WPA_ALG_WEP:
+ alg_name = "WEP";
+ cipher = IEEE80211_CIPHER_WEP;
+ break;
+ case WPA_ALG_TKIP:
+ alg_name = "TKIP";
+ cipher = IEEE80211_CIPHER_TKIP;
+ break;
+ case WPA_ALG_CCMP:
+ alg_name = "CCMP";
+ cipher = IEEE80211_CIPHER_AES_CCM;
+ break;
+ default:
+ return -1;
+ }
+
+ if (seq_len > sizeof(u_int64_t)) {
+ return -2;
+ }
+ if (key_len > sizeof(wk.ik_keydata)) {
+ return -3;
+ }
+
+ memset(&wk, 0, sizeof(wk));
+ wk.ik_type = cipher;
+ wk.ik_flags = IEEE80211_KEY_RECV;
+ if (set_tx) {
+ wk.ik_flags |= IEEE80211_KEY_XMIT | IEEE80211_KEY_DEFAULT;
+ memcpy(wk.ik_macaddr, addr, IEEE80211_ADDR_LEN);
+ } else
+ memset(wk.ik_macaddr, 0, IEEE80211_ADDR_LEN);
+ wk.ik_keyix = key_idx;
+ wk.ik_keylen = key_len;
+ memcpy(&wk.ik_keyrsc, seq, seq_len);
+ memcpy(wk.ik_keydata, key, key_len);
+
+ return set80211priv(ifname, IEEE80211_IOCTL_SETKEY, &wk, sizeof(wk));
+}
+
+struct wpa_driver_ops wpa_driver_madwifi_ops = {
+ .set_wpa = wpa_driver_madwifi_set_wpa,
+ .set_key = wpa_driver_madwifi_set_key,
+};
+
+/* end madwifi */
+
+/* begin ipw */
+
+#define IPW_IOCTL_WPA_SUPPLICANT SIOCIWFIRSTPRIV+30
+#define IPW_CMD_SET_WPA_PARAM 1
+#define IPW_CMD_SET_ENCRYPTION 3
+#define IPW_PARAM_WPA_ENABLED 1
+#define IPW_PARAM_AUTH_ALGS 5
+#define IPW_CRYPT_ALG_NAME_LEN 16
+
+struct ipw_param {
+ u32 cmd;
+ u8 sta_addr[ETH_ALEN];
+ union {
+ struct {
+ u8 name;
+ u32 value;
+ } wpa_param;
+ struct {
+ u32 len;
+ u8 *data;
+ } wpa_ie;
+ struct{
+ int command;
+ int reason_code;
+ } mlme;
+ struct {
+ u8 alg[IPW_CRYPT_ALG_NAME_LEN];
+ u8 set_tx;
+ u32 err;
+ u8 idx;
+ u8 seq[8];
+ u16 key_len;
+ u8 key[0];
+ } crypt;
+
+ } u;
+};
+
+int ipw_ioctl(const char *dev, struct ipw_param *param, int len)
+{
+ struct iwreq iwr;
+ int s;
+ int ret = 0;
+
+ s = socket(PF_INET, SOCK_DGRAM, 0);
+ if (s < 0) {
+ return -1;
+ }
+
+ memset(&iwr, 0, sizeof(iwr));
+ strncpy(iwr.ifr_name, dev, IFNAMSIZ);
+ iwr.u.data.pointer = (caddr_t) param;
+ iwr.u.data.length = len;
+
+ if (ioctl(s, IPW_IOCTL_WPA_SUPPLICANT, &iwr) < 0) {
+ ret = -1;
+ }
+
+ close(s);
+ return ret;
+}
+
+int wpa_driver_ipw_set_wpa(const char *ifname, int enabled)
+{
+ int ret = 0;
+ struct ipw_param param;
+
+ memset(¶m, 0, sizeof(param));
+ param.cmd = IPW_CMD_SET_WPA_PARAM;
+ param.u.wpa_param.name = IPW_PARAM_WPA_ENABLED;
+ param.u.wpa_param.value = enabled;
+
+ if (ipw_ioctl(ifname, ¶m, sizeof(param)) < 0)
+ ret = -1;
+
+ return ret;
+}
+
+int wpa_driver_ipw_set_key(const char *ifname, wpa_alg alg,
+ unsigned char *addr, int key_idx, int set_tx,
+ u8 *seq, size_t seq_len,
+ u8 *key, size_t key_len)
+{
+ struct ipw_param *param;
+ u8 *buf;
+ size_t blen;
+ int ret = 0;
+ char *alg_name;
+
+ switch (alg) {
+ case WPA_ALG_NONE:
+ alg_name = "none";
+ break;
+ case WPA_ALG_WEP:
+ alg_name = "WEP";
+ break;
+ case WPA_ALG_TKIP:
+ alg_name = "TKIP";
+ break;
+ case WPA_ALG_CCMP:
+ alg_name = "CCMP";
+ break;
+ default:
+ return -1;
+ }
+
+ if (seq_len > 8)
+ return -2;
+
+ blen = sizeof(*param) + key_len;
+ buf = malloc(blen);
+ if (buf == NULL)
+ return -1;
+ memset(buf, 0, blen);
+
+ param = (struct ipw_param *) buf;
+ param->cmd = IPW_CMD_SET_ENCRYPTION;
+ memset(param->sta_addr, 0xff, ETH_ALEN);
+ strncpy(param->u.crypt.alg, alg_name, IPW_CRYPT_ALG_NAME_LEN);
+ param->u.crypt.set_tx = set_tx ? 1 : 0;
+ param->u.crypt.idx = key_idx;
+ memcpy(param->u.crypt.seq, seq, seq_len);
+ param->u.crypt.key_len = key_len;
+ memcpy((u8 *) (param + 1), key, key_len);
+
+ if (ipw_ioctl(ifname, param, blen)) {
+ ret = -1;
+ }
+ free(buf);
+
+ return ret;
+}
+
+int wpa_driver_ipw_set_auth_alg(const char *ifname, int auth_alg)
+{
+ int algs = 0;
+ struct ipw_param param;
+
+ if (auth_alg & AUTH_ALG_OPEN_SYSTEM)
+ algs |= 1;
+ if (auth_alg & AUTH_ALG_SHARED_KEY)
+ algs |= 2;
+ if (auth_alg & AUTH_ALG_LEAP)
+ algs |= 4;
+ if (algs == 0)
+ algs = 1; /* at least one algorithm should be set */
+
+ memset(¶m, 0, sizeof(param));
+ param.cmd = IPW_CMD_SET_WPA_PARAM;
+ param.u.wpa_param.name = IPW_PARAM_AUTH_ALGS;
+ param.u.wpa_param.value = algs;
+
+ return ipw_ioctl(ifname, ¶m, sizeof(param));
+}
+
+struct wpa_driver_ops wpa_driver_ipw_ops = {
+ .set_wpa = wpa_driver_ipw_set_wpa,
+ .set_key = wpa_driver_ipw_set_key,
+ .set_auth_alg = wpa_driver_ipw_set_auth_alg
+};
+
+/* end ipw */
+
+/* begin atmel */
+
+#define ATMEL_WPA_IOCTL (SIOCIWFIRSTPRIV + 2)
+#define ATMEL_WPA_IOCTL_PARAM (SIOCIWFIRSTPRIV + 3)
+#define ATMEL_WPA_IOCTL_GET_PARAM (SIOCIWFIRSTPRIV + 4)
+
+#define MAX_KEY_LENGTH 40
+
+/* ATMEL_WPA_IOCTL ioctl() cmd: */
+enum {
+ SET_WPA_ENCRYPTION = 1,
+ SET_CIPHER_SUITES = 2,
+};
+
+/* ATMEL_WPA_IOCTL_PARAM ioctl() cmd: */
+enum {
+ ATMEL_PARAM_WPA = 1,
+ ATMEL_PARAM_PRIVACY_INVOKED = 2,
+ ATMEL_PARAM_WPA_TYPE = 3,
+};
+
+struct atmel_param{
+ unsigned char sta_addr[6];
+ int cmd;
+ u8 alg;
+ u8 key_idx;
+ u8 set_tx;
+ u8 seq[8];
+ u8 seq_len;
+ u16 key_len;
+ u8 key[MAX_KEY_LENGTH];
+ struct{
+ int reason_code;
+ u8 state;
+ }mlme;
+ u8 pairwise_suite;
+ u8 group_suite;
+ u8 key_mgmt_suite;
+};
+
+int atmel_ioctl(const char *dev, struct atmel_param *param, int len)
+{
+ int s;
+ int ret=0;
+ struct iwreq iwr;
+
+ s = socket(PF_INET, SOCK_DGRAM, 0);
+ if (s < 0) {
+ return -1;
+ }
+
+ memset(&iwr, 0, sizeof(iwr));
+ strncpy(iwr.ifr_name, dev, IFNAMSIZ);
+ iwr.u.data.pointer = (caddr_t) param;
+ iwr.u.data.length = len;
+
+ if (ioctl(s, ATMEL_WPA_IOCTL, &iwr) < 0) {
+ ret = -1;
+ }
+ close(s);
+
+ return 0;
+}
+
+int atmel2param(const char *ifname, int param, int value)
+{
+ struct iwreq iwr;
+ int *i, s, ret = 0;
+
+ s = socket(PF_INET, SOCK_DGRAM, 0);
+ if (s < 0) {
+ return -1;
+ }
+
+ memset(&iwr, 0, sizeof(iwr));
+ strncpy(iwr.ifr_name, ifname, IFNAMSIZ);
+ i = (int *) iwr.u.name;
+ *i++ = param;
+ *i++ = value;
+
+ if (ioctl(s, ATMEL_WPA_IOCTL_PARAM, &iwr) < 0) {
+ ret = -1;
+ }
+ close(s);
+ return ret;
+}
+
+int wpa_driver_atmel_set_wpa(const char *ifname, int enabled)
+{
+ int ret = 0;
+
+ if (atmel2param(ifname, ATMEL_PARAM_PRIVACY_INVOKED, enabled) < 0)
+ ret = -1;
+ if (atmel2param(ifname, ATMEL_PARAM_WPA, enabled) < 0)
+ ret = -1;
+
+ return ret;
+}
+
+int wpa_driver_atmel_set_key(const char *ifname, wpa_alg alg,
+ unsigned char *addr, int key_idx,
+ int set_tx, u8 *seq, size_t seq_len,
+ u8 *key, size_t key_len)
+{
+ int ret = 0;
+ struct atmel_param *param;
+ u8 *buf;
+ u8 alg_type;
+
+ size_t blen;
+ char *alg_name;
+
+ switch (alg) {
+ case WPA_ALG_NONE:
+ alg_name = "none";
+ alg_type = 0;
+ break;
+ case WPA_ALG_WEP:
+ alg_name = "WEP";
+ alg_type = 1;
+ break;
+ case WPA_ALG_TKIP:
+ alg_name = "TKIP";
+ alg_type = 2;
+ break;
+ case WPA_ALG_CCMP:
+ alg_name = "CCMP";
+ alg_type = 3;
+ break;
+ default:
+ return -1;
+ }
+
+ if (seq_len > 8)
+ return -2;
+
+ blen = sizeof(*param) + key_len;
+ buf = malloc(blen);
+ if (buf == NULL)
+ return -1;
+ memset(buf, 0, blen);
+
+ param = (struct atmel_param *) buf;
+
+ param->cmd = SET_WPA_ENCRYPTION;
+
+ if (addr == NULL)
+ memset(param->sta_addr, 0xff, ETH_ALEN);
+ else
+ memcpy(param->sta_addr, addr, ETH_ALEN);
+
+ param->alg = alg_type;
+ param->key_idx = key_idx;
+ param->set_tx = set_tx;
+ memcpy(param->seq, seq, seq_len);
+ param->seq_len = seq_len;
+ param->key_len = key_len;
+ memcpy((u8 *)param->key, key, key_len);
+
+ if (atmel_ioctl(ifname, param, blen)) {
+ ret = -1;
+ }
+ free(buf);
+
+ return ret;
+}
+
+struct wpa_driver_ops wpa_driver_atmel_ops = {
+ .set_wpa = wpa_driver_atmel_set_wpa,
+ .set_key = wpa_driver_atmel_set_key,
+};
+
+/* end atmel */
+
+/* begin ndiswrapper */
+
+#define WPA_SET_WPA SIOCIWFIRSTPRIV+1
+#define WPA_SET_KEY SIOCIWFIRSTPRIV+2
+#define WPA_SET_AUTH_ALG SIOCIWFIRSTPRIV+8
+
+struct wpa_key
+{
+ wpa_alg alg;
+ u8 *addr;
+ int key_index;
+ int set_tx;
+ u8 *seq;
+ size_t seq_len;
+ u8 *key;
+ size_t key_len;
+};
+
+int wpa_ndiswrapper_set_ext(const char *ifname, int request, struct iwreq *pwrq)
+{
+ int s;
+ int ret;
+
+ s = socket( AF_INET, SOCK_DGRAM, 0);
+ if (s < 0)
+ return -1;
+
+ strncpy(pwrq->ifr_name, ifname, IFNAMSIZ);
+ ret = ioctl(s, request, pwrq);
+ close(s);
+ return ret;
+}
+
+int wpa_ndiswrapper_set_wpa(const char *ifname, int enabled)
+{
+ struct iwreq priv_req;
+ int ret = 0;
+
+ memset(&priv_req, 0, sizeof(priv_req));
+
+ priv_req.u.data.flags = enabled;
+ if (wpa_ndiswrapper_set_ext(ifname, WPA_SET_WPA, &priv_req) < 0)
+ ret = -1;
+ return ret;
+}
+
+int wpa_ndiswrapper_set_key(const char *ifname, wpa_alg alg, u8 *addr,
+ int key_idx, int set_tx, u8 *seq,
+ size_t seq_len, u8 *key, size_t key_len)
+{
+ struct wpa_key wpa_key;
+ int ret = 0;
+ struct iwreq priv_req;
+
+ memset(&priv_req, 0, sizeof(priv_req));
+
+ wpa_key.alg = alg;
+ wpa_key.addr = addr;
+ wpa_key.key_index = key_idx;
+ wpa_key.set_tx = set_tx;
+ wpa_key.seq = seq;
+ wpa_key.seq_len = seq_len;
+ wpa_key.key = key;
+ wpa_key.key_len = key_len;
+
+ priv_req.u.data.pointer = (void *)&wpa_key;
+
+ if (wpa_ndiswrapper_set_ext(ifname, WPA_SET_KEY, &priv_req) < 0)
+ ret = -1;
+ return ret;
+}
+
+static int wpa_ndiswrapper_set_auth_alg(const char *ifname, int auth_alg)
+{
+ int ret = 0;
+ struct iwreq priv_req;
+
+ memset(&priv_req, 0, sizeof(priv_req));
+
+ priv_req.u.param.value = auth_alg;
+ if (wpa_ndiswrapper_set_ext(ifname, WPA_SET_AUTH_ALG, &priv_req) < 0)
+ ret = -1;
+ return ret;
+}
+
+struct wpa_driver_ops wpa_driver_ndiswrapper_ops = {
+ .set_wpa = wpa_ndiswrapper_set_wpa,
+ .set_key = wpa_ndiswrapper_set_key,
+ .set_auth_alg = wpa_ndiswrapper_set_auth_alg,
+};
+
+/* end ndiswrapper */
+
+#endif /* !defined(LIBHD_TINY) */
+
--- /dev/null
+void hd_scan_wlan(hd_data_t *hd_data);
--- /dev/null
+TOPDIR = ../..
+TARGETS = $(LIBHD_D)
+CLEANFILES = *.log src/*~
+DISTCLEANFILES = *.h *.xml *.ids check_hd
+
+include $(TOPDIR)/Makefile.common
+
+ifeq "$(ARCH)" "ppc"
+IDFILES += src/ppc
+endif
+
+ifeq "$(ARCH)" "ppc64"
+IDFILES += src/ppc
+endif
+
+IDFILES += src/bus src/class src/extra src/special src/scanner src/network \
+ src/usb src/usb2 src/isapnp src/monitor src/camera src/tv src/dvb \
+ src/chipcard src/modem src/pcmcia src/s390
+
+ifeq "$(ARCH)" "i386"
+IDFILES += src/x11.i386 src/modem.i386
+endif
+
+ifeq "$(ARCH)" "ppc"
+IDFILES += src/x11.ppc src/x11.ppc.special
+endif
+
+ifeq "$(ARCH)" "alpha"
+IDFILES += src/x11.axp
+endif
+
+ifeq "$(ARCH)" "sparc"
+IDFILES += src/x11.sparc
+endif
+
+ifeq "$(ARCH)" "sparc64"
+IDFILES += src/x11.sparc
+endif
+
+ifeq "$(ARCH)" "ia64"
+IDFILES += src/x11.ia64
+endif
+
+ifeq "$(ARCH)" "x86_64"
+IDFILES += src/x11.amd64
+endif
+
+IDFILES += src/pci src/storage src/sound src/mouse src/braille
+
+$(LIBHD_D): hd_ids.o
+ ar r $(LIBHD) $?
+
+check_hd: check_hd.c
+ $(CC) $(CFLAGS) $< -o $@
+
+hd_ids.c: hd_ids.h hd_ids_tiny.h
+
+hd_ids.h hd.ids: check_hd $(IDFILES)
+ ./check_hd --check --sort --cfile hd_ids.h $(IDFILES)
+
+hd_ids_tiny.h: check_hd hd.ids
+ ./check_hd --mini --cfile hd_ids_tiny.h --log=hd_tiny.log --out=hd_tiny.ids hd.ids
+
--- /dev/null
+#!/usr/bin/perl -w
+# Copyright (c) 1996 SuSE GmbH Nuernberg, Germany. All rights reserved.
+#
+# Author: Dirk Hessing <dhess@suse.de>, 08/2001
+#
+# Exporting hw-data for x11 from developer-CDB
+
+
+use DBI;
+use strict;
+use IO::Handle;
+use Getopt::Long;
+
+# MySQL-Host / MySQL-User
+my $hostname = "cdbintern.suse.de";
+my $mysql_user = "cdbclient";
+my $mysql_passwd = "cdb";
+my $target = "cdb";
+
+my $driver = DBI->install_driver('mysql');
+my $dbh = DBI->connect('DBI:mysql:'.$target.':'.$hostname,$mysql_user,$mysql_passwd)
+ or die "Can't connect to the MySQL Database, table $target";
+
+### Log-Handle und STDOUT-Handle auf ungepufferte Ausgabe setzten (schlechtere Performance ;-)
+STDOUT->autoflush();
+
+
+my $dist_name = "Stable";
+my $date = localtime();
+
+my (@query,$x,$result,$arch_name,@arch_names,$filename,$count);
+my ($product_id,$product_name,$vendor_name,$bus_name,$subclass_name);
+my ($vId,$dId,$sdId,$svId);
+my (%tooltopics,$tooltopic_name,$vario_name,$charvalue);
+
+my $opt_dir = "tmp";
+
+
+# convert to new id format
+sub new_id
+{
+ my ($old_id, $id_class, $tag, $id);
+
+ ($old_id, $id_class) = @_;
+
+ if($old_id =~ /^([us]?)(\S{4})$/) {
+ $tag = $1;
+ $id = $2;
+ }
+ else {
+ die "invalid id format: \"$old_id\"\n";
+ }
+
+ if($tag eq "" && $id_class && $id_class =~ /^([us]?)(\S{4})$/) {
+ $tag = $1;
+ }
+
+ if($tag eq "s") {
+ $tag = "special ";
+ }
+ elsif($tag eq "u") {
+ $tag = "usb ";
+ }
+ elsif($tag eq "") {
+ $tag = "pci ";
+ }
+ else {
+ die "invalid id format: \"$old_id\"\n";
+ }
+
+ return "${tag}0x$id";
+}
+
+
+# write data to FH
+sub write_info
+{
+ my ($arch, $xfree, $has3d, $vId, $dId, $svId, $sdId, $vName, $dName, $tt, $raw, @raw);
+
+ ($arch, $xfree, $has3d, $vId, $dId, $svId, $sdId, $vName, $dName, $tt) = @_;
+
+ return unless $vId ne "" && $dId ne "";
+
+ # print FH "\n# vId = $vId, dId = $dId, svId = $svId, sdId = $sdId, vName = \"$vName\", dName = \"$dName\"\n";
+
+ if($svId ne "" && $sdId ne "") {
+ print FH "\n vendor.id\t\t${\new_id $vId}\n";
+ print FH "+vendor.name\t\t$vName\n";
+
+ print FH "\n vendor.id\t\t${\new_id $vId}\n";
+ print FH "&device.id\t\t${\new_id $dId, $vId}\n";
+ print FH "&subvendor.id\t\t${\new_id $svId, $vId}\n";
+ print FH "&subdevice.id\t\t${\new_id $sdId, $vId}\n";
+ print FH "+subdevice.name\t\t$dName\n";
+ }
+ else {
+ print FH "\n vendor.id\t\t${\new_id $vId}\n";
+ print FH "+vendor.name\t\t$vName\n";
+
+ print FH "\n vendor.id\t\t${\new_id $vId}\n";
+ print FH "&device.id\t\t${\new_id $dId, $vId}\n";
+ print FH "+device.name\t\t$dName\n";
+ }
+
+ if($$tt{resol} ne "") {
+ $$tt{resol} =~ s/bpp//g;
+ }
+
+ # Teste ob mehr als ein driver- oder installscript-topic vorhanden ist:
+ if(($$tt{driver} =~ /,/) || ($$tt{installscript} =~ /,/)) {
+ warn
+ "\nMore than one driver- or installscript-topic.\n" .
+ " Product-id = $product_id, Vario = $vario_name, Arch = $arch\n" .
+ " Id = (${\new_id $vId}, ${\new_id $dId, $vId}), Name = $dName\n" .
+ " Driver = \"$$tt{driver}\", script = \"$$tt{installscript}\"\n";
+ }
+
+ print FH
+ "+driver.xfree\t\t$xfree|$$tt{driver}|" .
+ ($has3d ? "3d" : "") .
+ "|$$tt{package}|$$tt{extension}|$$tt{option}|$$tt{resol}||$$tt{installscript}|\n";
+
+ if ($$tt{raw} ne "") {
+ @raw = (split(',',$$tt{raw}));
+ foreach $raw (@raw) {
+ print FH "+driver.xfree.config\t$raw\n";
+ }
+ }
+}
+
+
+# get product info and write everything to FH
+sub get_info
+{
+ my ($arch_name, $xfree, $has3d);
+
+ ($arch_name, $vario_name) = @_;
+
+ $xfree = $vario_name =~ /XFree3/ ? 3 : 4;
+ $has3d = $vario_name =~ /3D/ ? 1 : 0;
+
+ $tooltopics{driver} = "";
+ $tooltopics{package} = "";
+ $tooltopics{extension} = "";
+ $tooltopics{option} = "";
+ $tooltopics{resol} = "";
+ $tooltopics{installscript} = "";
+ $tooltopics{raw} = "";
+
+ # Product supported=full?
+ $query[2] = $dbh->prepare("SELECT toolproperty.charvalue FROM toolproperty
+ LEFT JOIN tooltopic ON toolproperty.tooltopic_id=tooltopic.id
+ LEFT JOIN arch_dist_l_vario ON toolproperty.arch_dist_l_vario_id=arch_dist_l_vario.id
+ LEFT JOIN arch ON arch_dist_l_vario.arch_id=arch.id
+ LEFT JOIN distribution ON arch_dist_l_vario.distribution_id=distribution.id
+ LEFT JOIN vario ON arch_dist_l_vario.vario_id=vario.id
+ WHERE toolproperty.product_id=$product_id
+ AND tooltopic.name='supported'
+ AND arch.name='$arch_name'
+ AND distribution.name='$dist_name'
+ AND vario.name='$vario_name'
+ AND toolproperty.valid=1
+ AND tooltopic.valid=1
+ AND arch_dist_l_vario.valid=1")
+ or die "Can\'t select table toolproperty";
+ $query[2]->execute or die "Can\'t select table toolproperty";
+
+ undef $result;
+ $count = 0;
+ while ($x = $query[2]->fetchrow_array) {
+ $result = $x if defined $x;
+ multiple_supportedtopics($dbh,$product_id,$product_name,$arch_name,$dist_name,$vario_name) if $count > 0;
+ $count++;
+ }
+ $result = "" if not defined $result;
+
+ if ($result eq "full") {
+ $query[2] = $dbh->prepare("SELECT tooltopic.name,toolproperty.charvalue FROM toolproperty
+ LEFT JOIN tooltopic ON toolproperty.tooltopic_id=tooltopic.id
+ LEFT JOIN arch_dist_l_vario ON toolproperty.arch_dist_l_vario_id=arch_dist_l_vario.id
+ LEFT JOIN arch ON arch_dist_l_vario.arch_id=arch.id
+ LEFT JOIN distribution ON arch_dist_l_vario.distribution_id=distribution.id
+ LEFT JOIN language ON arch_dist_l_vario.lang_id=language.id
+ LEFT JOIN vario ON arch_dist_l_vario.vario_id=vario.id
+ WHERE arch.name='$arch_name'
+ AND distribution.name='$dist_name'
+ AND vario.name='$vario_name'
+ AND toolproperty.product_id=$product_id
+ AND tooltopic.name != 'supported'
+ AND toolproperty.valid=1
+ AND tooltopic.valid=1
+ AND arch_dist_l_vario.valid=1")
+ or die "Can\'t select table toolproperty";
+ $query[2]->execute or die "Can\'t select table toolproperty";
+
+ while ( ($tooltopic_name,$charvalue) = ($query[2]->fetchrow_array) ) {
+ if (($charvalue eq "none") || ($charvalue eq "None")) {
+ $charvalue = "";
+ }
+ next if $charvalue eq "";
+ if (!$tooltopics{"$tooltopic_name"}) {
+ $tooltopics{"$tooltopic_name"} = $charvalue;
+ } else {
+ $tooltopics{"$tooltopic_name"} .= ",".$charvalue;
+ }
+ }
+
+ write_info $arch_name, $xfree, $has3d, $vId, $dId, $svId, $sdId, $vendor_name, $product_name, \%tooltopics;
+ }
+}
+
+
+GetOptions(
+ 'dir=s' => \$opt_dir
+) ;
+
+
+print "\n\nGenerating x11.hwinfo-files, one for each architecture.\n";
+mkdir($opt_dir, 0755) || die "\nmkdir: $opt_dir: $!\n" unless -d $opt_dir;
+
+print "\nStoring files in \"$opt_dir\"\n\n";
+
+$query[0] = $dbh->prepare("SELECT name FROM arch WHERE valid=1")
+ or die "Can\'t select table arch";
+$query[0]->execute or die "Can\'t select table arch";
+while ($result = $query[0]->fetchrow_array) {
+ push(@arch_names,$result);
+}
+
+# Für jede Architektur wird eine eigene Datei geschrieben
+foreach $arch_name (@arch_names) {
+ $filename = "$opt_dir/x11.hwinfo.$arch_name";
+ open(FH,"> $filename") or die "Can\'t open $filename";
+ print FH "#\n";
+ print FH "# x11.hwinfo-file for architecture $arch_name\n";
+ print FH "#\n";
+ print FH "# generated at: $date\n";
+ print FH "# data source: CDB\n";
+ print FH "# distribution: $dist_name\n";
+ print FH "#\n\n\n";
+
+ $query[0] = $dbh->prepare("SELECT product.id,product.name,
+ product.vId,product.dId,product.svId,product.sdId,
+ vendor.longname,product.vId,
+ bus.name,subclass.name FROM product
+ LEFT JOIN product_area ON product.id=product_area.product_id
+ LEFT JOIN groups ON product_area.group_id=groups.id
+ LEFT JOIN vendor ON product.vendor_id=vendor.id
+ LEFT JOIN bus ON product.bus_id=bus.id
+ LEFT JOIN subclass ON product.subclass_id=subclass.id
+ WHERE groups.name='graphic-developer'
+ AND product_area.valid=1
+ AND product.valid=1")
+ or die "Can\'t select table product";
+ $query[0]->execute or die "Can\'t select table product";
+ while ( ($product_id,$product_name,$vId,$dId,$svId,$sdId,$vendor_name,$vId,$bus_name,$subclass_name) = ($query[0]->fetchrow_array) ) {
+ # Postinitialisierung, falls undefinierte Werte
+ $vId = "----" if !defined($vId);
+ $dId = "----" if !defined($dId);
+ $svId = "----" if !defined($svId);
+ $sdId = "----" if !defined($sdId);
+
+ $vId = "" if $vId eq "----";
+ $dId = "" if $dId eq "----";
+ $svId = "" if $svId eq "----";
+ $sdId = "" if $sdId eq "----";
+
+ # Step 1: Erzeuge Zeilen für XFree 3 ohne 3D
+ get_info $arch_name, "XFree3";
+
+ # Step 2: Erzeuge Zeilen für XFree 3 mit 3D
+ get_info $arch_name, "XFree3 with 3D";
+
+ # Step 2: Erzeuge Zeilen für XFree 4 ohne 3D
+ get_info $arch_name, "XFree4";
+
+ # Step 2: Erzeuge Zeilen für XFree 4 mit 3D
+ get_info $arch_name, "XFree4 with 3D";
+
+ } # Ende der Produktschleife
+ close(FH);
+} # Ende der Arch-Schleife
+
+
+
+
+sub multiple_supportedtopics {
+ my $handle = shift;
+ my $product_id = shift;
+ my $product_name = shift;
+ my $arch_name = shift;
+ my $dist_name = shift;
+ my $vario_name = shift;
+ my ($query,$id,$value,$name,$time,$htime,%topic,$key,$answer,%key);
+
+ my $min_key = "0";
+ undef %key;
+
+ print "\n *********** Unconsistency registered *******************";
+ print "\nMultiple supported-topics:";
+ print "\nProduct_name: $product_name ID=$product_id";
+ print "\nArch=$arch_name Dist=$dist_name Vario=$vario_name";
+ print "\n";
+
+ $query = $handle->prepare("SELECT toolproperty.id,tooltopic.name,
+ toolproperty.charvalue,toolproperty.createtime
+ FROM toolproperty
+ LEFT JOIN tooltopic ON toolproperty.tooltopic_id=tooltopic.id
+ LEFT JOIN arch_dist_l_vario ON toolproperty.arch_dist_l_vario_id=arch_dist_l_vario.id
+ LEFT JOIN arch ON arch_dist_l_vario.arch_id=arch.id
+ LEFT JOIN distribution ON arch_dist_l_vario.distribution_id=distribution.id
+ LEFT JOIN vario ON arch_dist_l_vario.vario_id=vario.id
+ WHERE toolproperty.product_id=$product_id
+ AND tooltopic.name='supported'
+ AND toolproperty.valid=1
+ AND arch.name='$arch_name'
+ AND distribution.name='$dist_name'
+ AND vario.name='$vario_name'")
+ or die "Can\'t select table toolproperty";
+ $query->execute or die "Can\'t select table toolproperty";
+ while (($id,$name,$value,$time) = ($query->fetchrow_array)) {
+ $htime = localtime($time);
+ $topic{$id} = $htime." ".$value;
+ $min_key = $id;
+ }
+ foreach $key (sort keys %topic) {
+ $min_key = $key if $key<$min_key;
+ }
+ foreach $key (sort keys %topic) {
+ print "\nD toolproperty-ID $key: $topic{$key}" if $key != $min_key;
+ }
+ print "\n* toolproperty-ID $min_key:$topic{$min_key}";
+ print "\n\nDeleting doublettes marked with D (* will be left the valid one) [N|y] ?";
+ $answer = <STDIN>;
+ chop($answer);
+ if ( ($answer eq "y") || ($answer eq "Y") ) {
+ print "\n\nDeleting supported-doublettes.... done\n";
+ foreach $key (keys %topic) {
+ if ($key != $min_key) {
+ $query = $handle->prepare("DELETE FROM toolproperty
+ WHERE id=$key")
+ or die "Can\'t delete from toolproperty";
+ $query->execute or die "Can\'t delete from toolproperty";
+ }
+ }
+ }
+ return;
+}
+
--- /dev/null
+#define _GNU_SOURCE /* memmem */
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <inttypes.h>
+#include <unistd.h>
+#include <time.h>
+#include <getopt.h>
+
+#include "../hd/hddb_int.h"
+
+#define TAG_PCI 1 /* pci ids */
+#define TAG_EISA 2 /* eisa ids */
+#define TAG_USB 3 /* usb ids */
+#define TAG_SPECIAL 4 /* internally used ids */
+#define TAG_PCMCIA 5 /* pcmcia ids */
+
+#define ID_VALUE(id) ((id) & 0xffff)
+#define ID_TAG(id) (((id) >> 16) & 0xf)
+#define MAKE_ID(tag, id_val) ((tag << 16) | (id_val))
+
+typedef uint32_t hddb_entry_mask_t;
+
+typedef enum {
+ match_any, match_all
+} match_t;
+
+typedef enum {
+ pref_empty, pref_new, pref_and, pref_or, pref_add
+} prefix_t;
+
+typedef struct line_s {
+ prefix_t prefix;
+ hddb_entry_t key;
+ char *value;
+} line_t;
+
+typedef struct str_s {
+ struct str_s *next;
+ char *str;
+} str_t;
+
+typedef struct list_any_s {
+ struct list_any_s *next;
+} list_any_t;
+
+typedef struct {
+ void *first;
+ void *last;
+} list_t;
+
+typedef struct {
+ unsigned flag;
+ unsigned remove;
+} hid_any_t;
+
+typedef struct {
+ unsigned flag;
+ unsigned remove;
+ unsigned tag;
+ unsigned id;
+ unsigned range;
+ unsigned mask;
+ struct {
+ unsigned range:1;
+ unsigned mask:1;
+ } has;
+} hid_num_t;
+
+typedef struct {
+ unsigned flag;
+ unsigned remove;
+ list_t list;
+} hid_str_t;
+
+typedef union {
+ hid_any_t any;
+ hid_num_t num;
+ hid_str_t str;
+} hid_t;
+
+typedef struct skey_s {
+ struct skey_s *next;
+ hid_t *hid[he_nomask];
+} skey_t;
+
+typedef struct item_s {
+ struct item_s *next;
+ unsigned remove:1;
+ char *pos;
+ list_t key; /* skey_t */
+ skey_t *value;
+} item_t;
+
+
+typedef struct hddb_list_s {
+ hddb_entry_mask_t key_mask;
+ hddb_entry_mask_t value_mask;
+ unsigned key;
+ unsigned value;
+} hddb_list_t;
+
+typedef struct {
+ unsigned list_len, list_max;
+ hddb_list_t *list;
+ unsigned ids_len, ids_max;
+ unsigned *ids;
+ unsigned strings_len, strings_max;
+ char *strings;
+} hddb_data_t;
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+#ifdef UCLIBC
+void *memmem(const void *haystack, size_t haystacklen, const void *needle, size_t needlelen);
+#endif
+void *new_mem(size_t size);
+void *free_mem(void *ptr);
+char *new_str(char *str);
+void *add_list(list_t *list, void *entry);
+void sort_list(list_t *list, int (*cmp_func)(const void *, const void *));
+unsigned eisa_id(char *s);
+char *eisa_str(unsigned id);
+void write_stats(FILE *f);
+
+void read_items(char *file);
+line_t *parse_line(char *str);
+hddb_entry_mask_t add_entry(skey_t *skey, hddb_entry_t idx, char *val);
+
+void write_items(char *file, list_t *hd);
+void write_item(FILE *f, item_t *item);
+void write_skey(FILE *f, prefix_t pre, skey_t *skey);
+void write_ent_name(FILE *f, hid_t *hid, char pre, hddb_entry_t ent);
+void write_id(FILE *f, hddb_entry_t ent, hid_t *hid);
+void write_drv(FILE *f, char pre, hid_t *hid);
+void write_drv1(FILE *f, hid_t *hid, char pre, char *val);
+void log_items(FILE *f, item_t *item0, item_t *item1);
+
+int count_common_hids(skey_t *skey0, skey_t *skey1);
+int strip_skey(skey_t *skey0, skey_t *skey1, int do_it);
+void remove_deleted_hids(skey_t *skey);
+void undelete_hids(skey_t *skey);
+str_t *split(char del, char *s);
+char *join(char del, str_t *str);
+
+int cmp_driver_info(char *str0, char *str1);
+int cmp_str_s(const void *p0, const void *p1);
+int cmp_hid(hid_t *hid0, hid_t *hid1);
+int cmp_skey(skey_t *skey0, skey_t *skey1);
+int cmp_skey_s(const void *p0, const void *p1);
+int cmp_item(item_t *item0, item_t *item1);
+int cmp_item_s(const void *p0, const void *p1);
+
+int match_hid(hid_t *hid0, hid_t *hid1, match_t match);
+int match_skey(skey_t *skey0, skey_t *skey1, match_t match);
+int match_item(item_t *item0, item_t *item1, match_t match);
+
+int combine_keys(skey_t *skey0, skey_t *skey1);
+
+str_t *clone_str(str_t *str);
+hid_t *clone_hid(hid_t *hid);
+skey_t *clone_skey(skey_t *skey);
+item_t *clone_item(item_t *item);
+
+str_t *free_str(str_t *str, int follow_next);
+hid_t *free_hid(hid_t *hid);
+skey_t *free_skey(skey_t *skey, int follow_next);
+item_t *free_item(item_t *item, int follow_next);
+
+unsigned driver_entry_types(hid_t *hid);
+
+void remove_items(list_t *hd);
+void remove_nops(list_t *hd);
+void check_items(list_t *hd);
+void split_items(list_t *hd);
+void combine_driver(list_t *hd);
+void combine_requires(list_t *hd);
+void join_items_by_value(list_t *hd);
+void join_items_by_key(list_t *hd);
+void remove_unimportant_items(list_t *hd);
+
+void write_cfile(FILE *f, list_t *hd);
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+struct option options[] = {
+ { "help", 0, NULL, 1 },
+// { "debug", 1, NULL, 2 },
+ { "log", 1, NULL, 3 },
+ { "mini", 0, NULL, 4 },
+ { "sort", 0, NULL, 5 },
+ { "reverse", 0, NULL, 6 }, /* for debugging */
+ { "random", 0, NULL, 7 }, /* dto */
+ { "check", 0, NULL, 8 },
+ { "with-source", 0, NULL, 9 },
+ { "out", 1, NULL, 10},
+ { "split", 0, NULL, 11},
+ { "cfile", 1, NULL, 12},
+ { "no-compact", 0, NULL, 13},
+ { "join-keys-first", 0, NULL, 14},
+ { "combine", 0, NULL, 15},
+ { }
+};
+
+list_t hd;
+
+char *item_ind = NULL;
+FILE *logfh = NULL;
+
+struct {
+ int debug;
+ unsigned sort:1;
+ unsigned reverse:1;
+ unsigned random:1;
+ unsigned check:1;
+ unsigned with_source:1;
+ unsigned mini:1;
+ unsigned split:1;
+ unsigned no_compact:1;
+ unsigned join_keys_first:1;
+ unsigned combine:1; /* always combine driver info */
+ char *logfile;
+ char *outfile;
+ char *cfile;
+} opt = {
+ logfile: "hd.log",
+ outfile: "hd.ids"
+};
+
+struct {
+ unsigned items_in, items_out;
+ unsigned diffs, errors, errors_res;
+} stats;
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+int main(int argc, char **argv)
+{
+ int i, close_log = 0, close_cfile = 0;
+ item_t *item;
+ FILE *cfile;
+
+ for(opterr = 0; (i = getopt_long(argc, argv, "", options, NULL)) != -1; ) {
+ switch(i) {
+#if 0
+ case 2:
+ opt.debug = strtol(optarg, NULL, 0);
+ break;
+#endif
+
+ case 3:
+ opt.logfile = optarg;
+ if(!*opt.logfile) opt.logfile = NULL;
+ break;
+
+ case 4:
+ opt.mini = 1;
+ break;
+
+ case 5:
+ opt.sort = 1;
+ break;
+
+ case 6:
+ opt.reverse = 1;
+ break;
+
+ case 7:
+ opt.random = 1;
+ srand(time(NULL));
+ break;
+
+ case 8:
+ opt.check = 1;
+ break;
+
+ case 9:
+ opt.with_source = 1;
+ break;
+
+ case 10:
+ opt.outfile = optarg;
+ if(!*opt.outfile) opt.outfile = NULL;
+ break;
+
+ case 11:
+ opt.split = 1;
+ break;
+
+ case 12:
+ opt.cfile = optarg;
+ if(!*opt.cfile) opt.cfile = NULL;
+ break;
+
+ case 13:
+ opt.no_compact = 1;
+ break;
+
+ case 14:
+ opt.join_keys_first = 1;
+ break;
+
+ case 15:
+ opt.combine = 1;
+ break;
+
+ default:
+ fprintf(stderr,
+ "Usage: check_hd [options] files\n"
+ "Try to put hardware data into a consistent form.\n"
+ " --check\t\tdo a lot of checks and remove unnecessary data\n"
+ " --sort\t\tsort data\n"
+ " --reverse\t\treverse sorting order\n"
+ " --split\t\twrite separate entries for each key\n"
+ " --with-source\t\tadd comment to each item indicating info source\n"
+ " --mini\t\tminimal data base (basically driver info only)\n"
+ " --join-keys-first\twhen combining similar items, join entries with\n"
+ " \t\t\tcommon keys first (default is common values first)\n"
+ " --cfile file\t\tcreate C file to be included in libhd\n"
+ " --no-compact\t\tdon't try to make C version as small as possible\n"
+ " --out file\t\twrite results to file, default is \"hd.ids\"\n"
+ " --log file\t\twrite log info to file, default is \"hd.log\"\n\n"
+ " Note: check_hd works with libhd/hwinfo internal format only;\n"
+ " to convert to other formats, use convert_hd\n"
+ );
+ return 1;
+ }
+ }
+
+ if(opt.logfile && strcmp(opt.logfile, "-")) {
+ logfh = fopen(opt.logfile, "w");
+ if(!logfh) {
+ perror(opt.logfile);
+ return 3;
+ }
+ close_log = 1;
+ }
+ else {
+ logfh = stdout;
+ }
+
+ for(argv += optind; *argv; argv++) {
+ read_items(*argv);
+ }
+
+ for(item = hd.first; item; item = item->next) stats.items_in++;
+
+ fprintf(logfh, "- removing useless entries\n");
+ fflush(logfh);
+ remove_nops(&hd);
+
+ if(opt.mini) {
+ fprintf(logfh, "- building mini version\n");
+ fflush(logfh);
+ remove_unimportant_items(&hd);
+ }
+
+ if(opt.check || opt.split) {
+ fprintf(logfh, "- splitting entries\n");
+ fflush(logfh);
+ split_items(&hd);
+ }
+
+ if(opt.check) {
+ fprintf(logfh, "- combining driver info\n");
+ fflush(logfh);
+ combine_driver(&hd);
+
+ fprintf(logfh, "- combining requires info\n");
+ fflush(logfh);
+ combine_requires(&hd);
+
+ fprintf(logfh, "- checking for consistency\n");
+ fflush(logfh);
+ check_items(&hd);
+
+ fprintf(logfh, "- join items\n");
+ fflush(logfh);
+ if(opt.join_keys_first) {
+ join_items_by_key(&hd);
+ join_items_by_value(&hd);
+ }
+ else {
+ join_items_by_value(&hd);
+ join_items_by_key(&hd);
+ }
+
+ if(opt.split) split_items(&hd);
+ }
+
+ if(opt.sort) {
+ fprintf(logfh, "- sorting\n");
+ fflush(logfh);
+ sort_list(&hd, cmp_item_s);
+ }
+
+ for(item = hd.first; item; item = item->next) stats.items_out++;
+
+ write_items(opt.outfile, &hd);
+
+ if(opt.cfile) {
+ if(opt.cfile && strcmp(opt.cfile, "-")) {
+ cfile = fopen(opt.cfile, "w");
+ if(!cfile) {
+ perror(opt.cfile);
+ return 3;
+ }
+ close_cfile = 1;
+ }
+ else {
+ cfile = stdout;
+ }
+
+ split_items(&hd);
+
+ write_cfile(cfile, &hd);
+
+ if(close_cfile) fclose(cfile);
+ }
+
+ fprintf(logfh, "- statistics\n");
+ write_stats(logfh);
+ if(logfh != stdout) {
+ if(opt.outfile && strcmp(opt.outfile, "-")) {
+ fprintf(stderr, "data written to \"%s\"\n", opt.outfile);
+ }
+ if(opt.logfile && strcmp(opt.logfile, "-")) {
+ fprintf(stderr, "log written to \"%s\"\n", opt.logfile);
+ }
+ fprintf(stderr, "statistics:\n");
+ write_stats(stderr);
+ }
+
+ free_item(hd.first, 1);
+
+ if(close_log) fclose(logfh);
+
+ return 0;
+}
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+void *new_mem(size_t size)
+{
+ if(size == 0) return NULL;
+
+ return calloc(size, 1);
+}
+
+
+void *free_mem(void *ptr)
+{
+ if(ptr) free(ptr);
+
+ return NULL;
+}
+
+
+char *new_str(char *str)
+{
+ if(!str) return NULL;
+
+ return strdup(str);
+}
+
+
+void *add_list(list_t *list, void *entry)
+{
+ if(list->last) {
+ ((list_any_t *) list->last)->next = entry;
+ }
+ list->last = entry;
+
+ if(!list->first) {
+ list->first = entry;
+ }
+
+ return entry;
+}
+
+
+void sort_list(list_t *list, int (*cmp_func)(const void *, const void *))
+{
+ int i, list_len = 0;
+ list_any_t *list_entry;
+ list_t new_list = {};
+ list_any_t **list_array;
+
+ for(list_entry = list->first; list_entry; list_entry = list_entry->next) list_len++;
+ if(list_len < 2) return;
+
+ list_array = new_mem(list_len * sizeof *list_array);
+ for(i = 0, list_entry = list->first; list_entry; list_entry = list_entry->next) {
+ list_array[i++] = list_entry;
+ }
+
+ qsort(list_array, list_len, sizeof *list_array, cmp_func);
+
+ for(i = 0; i < list_len; i++) {
+ add_list(&new_list, list_array[i]);
+ }
+
+ if(new_list.last) {
+ ((list_any_t *) new_list.last)->next = NULL;
+ }
+
+ *list = new_list;
+
+ free_mem(list_array);
+}
+
+
+unsigned eisa_id(char *s)
+{
+ int i;
+ unsigned u = 0;
+
+ for(i = 0; i < 3; i++) {
+ u <<= 5;
+ if(s[i] < 'A' - 1 || s[i] > 'A' - 1 + 0x1f) return 0;
+ u += s[i] - 'A' + 1;
+ }
+
+ return MAKE_ID(TAG_EISA, u);
+}
+
+
+char *eisa_str(unsigned id)
+{
+ static char s[4];
+
+ s[0] = ((id >> 10) & 0x1f) + 'A' - 1;
+ s[1] = ((id >> 5) & 0x1f) + 'A' - 1;
+ s[2] = ( id & 0x1f) + 'A' - 1;
+ s[3] = 0;
+
+ return s;
+}
+
+
+void write_stats(FILE *f)
+{
+ fprintf(f, " %u inconsistencies%s\n", stats.diffs, stats.diffs ? " fixed" : "");
+ fprintf(f, " %u errors", stats.errors + stats.errors_res);
+ if(stats.errors_res) fprintf(f, ", %u resolved", stats.errors_res);
+ fprintf(f, "\n");
+ fprintf(f, " %u items in\n", stats.items_in);
+ fprintf(f, " %u items out\n", stats.items_out);
+}
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+void read_items(char *file)
+{
+ FILE *f;
+ char buf[1024], fpos[256];
+ unsigned u, state, l_nr;
+ hddb_entry_mask_t entry_mask = 0;
+ line_t *l;
+ item_t *item;
+ skey_t *skey;
+
+ if(!(f = fopen(file, "r"))) {
+ perror(file);
+ return;
+ }
+
+ item = new_mem(sizeof *item);
+ skey = new_mem(sizeof *skey);
+
+ sprintf(fpos, "%s(1)", file);
+ item->pos = new_str(fpos);
+
+ for(l_nr = 1, state = 0; fgets(buf, sizeof buf, f); l_nr++) {
+ l = parse_line(buf);
+ if(!l) {
+ fprintf(stderr, "%s: invalid line\n", fpos);
+ state = 4;
+ break;
+ };
+ if(l->prefix == pref_empty) continue;
+ switch(l->prefix) {
+ case pref_new:
+ if(state == 1) {
+ add_list(&item->key, skey);
+ skey = new_mem(sizeof *skey);
+ }
+ else if(state == 2) {
+ item->value = skey;
+ skey = new_mem(sizeof *skey);
+ }
+ if(state == 2 || state == 1) {
+ add_list(&hd, item);
+ item = new_mem(sizeof *item);
+ if(!item->pos) {
+ sprintf(fpos, "%s(%d)", file, l_nr);
+ item->pos = new_str(fpos);
+ }
+ }
+ entry_mask = 0;
+ state = 1;
+ break;
+
+ case pref_and:
+ if(state != 1) {
+ fprintf(stderr, "%s: must start item first\n", fpos);
+ state = 4;
+ break;
+ }
+ break;
+
+ case pref_or:
+ if(state != 1 || !entry_mask) {
+ fprintf(stderr, "%s: must start item first\n", fpos);
+ state = 4;
+ break;
+ }
+ add_list(&item->key, skey);
+ skey = new_mem(sizeof *skey);
+ entry_mask = 0;
+ break;
+
+ case pref_add:
+ if(state == 1 && !entry_mask) {
+ fprintf(stderr, "%s: driver info not allowed\n", fpos);
+ state = 4;
+ break;
+ }
+ if(state == 1) {
+ add_list(&item->key, skey);
+ skey = new_mem(sizeof *skey);
+ entry_mask = 0;
+ state = 2;
+ }
+ if(state != 2) {
+ fprintf(stderr, "%s: driver info not allowed\n", fpos);
+ state = 4;
+ break;
+ }
+ break;
+
+ default:
+ state = 4;
+ }
+
+ if(state != 4) {
+ u = add_entry(skey, l->key, l->value);
+ if(u) {
+ entry_mask |= u;
+ }
+ else {
+ fprintf(stderr, "%s: invalid info\n", fpos);
+ state = 4;
+ }
+ }
+
+ if(state == 4) break; /* error */
+
+ }
+
+ /* finalize last item */
+ if(entry_mask && (state == 1 || state == 2)) {
+ if(state == 1) {
+ add_list(&item->key, skey);
+ skey = NULL;
+ }
+ else if(state == 2) {
+ item->value = skey;
+ skey = NULL;
+ }
+ add_list(&hd, item);
+ item = NULL;
+ }
+
+ free_mem(skey);
+ free_mem(item);
+
+ fclose(f);
+}
+
+
+line_t *parse_line(char *str)
+{
+ static line_t l;
+ char *s;
+ int i;
+
+ /* drop leading spaces */
+ while(isspace(*str)) str++;
+
+ /* skip emtpy lines and comments */
+ if(!*str || *str == ';' || *str == '#') {
+ l.prefix = pref_empty;
+ return &l;
+ }
+
+ l.prefix = pref_new;
+
+ switch(*str) {
+ case '&':
+ l.prefix = pref_and;
+ str++;
+ break;
+
+ case '|':
+ l.prefix = pref_or;
+ str++;
+ break;
+
+ case '+':
+ l.prefix = pref_add;
+ str++;
+ break;
+ }
+
+ /* skip spaces */
+ while(isspace(*str)) str++;
+
+ s = str;
+ while(*str && !isspace(*str)) str++;
+ if(*str) *str++ = 0;
+ while(isspace(*str)) str++;
+
+ for(i = 0; (unsigned) i < sizeof hddb_entry_strings / sizeof *hddb_entry_strings; i++) {
+ if(!strcmp(s, hddb_entry_strings[i])) {
+ l.key = i;
+ break;
+ }
+ }
+
+ if((unsigned) i >= sizeof hddb_entry_strings / sizeof *hddb_entry_strings) return NULL;
+
+ l.value = str;
+
+ /* drop trailing white space */
+ i = strlen(str);
+ while(i > 0) {
+ if(isspace(str[i - 1]))
+ str[--i] = 0;
+ else
+ break;
+ }
+
+ /* special case: drop leading and final double quotes, if any */
+ i = strlen(l.value);
+ if(i >= 2 && l.value[0] == '"' && l.value[i - 1] == '"') {
+ l.value[i - 1] = 0;
+ l.value++;
+ }
+
+ // fprintf(stderr, "pre = %d, key = %d, val = \"%s\"\n", l.prefix, l.key, l.value);
+
+ return &l;
+}
+
+
+int parse_id(char *str, unsigned *id, unsigned *tag, unsigned *range, unsigned *mask)
+{
+ static unsigned id0, val;
+ char c = 0, *s, *t = NULL;
+
+ *id = *tag = *range = *mask = 0;
+
+ if(!str || !*str) return 0;
+
+ for(s = str; *str && !isspace(*str); str++);
+ if(*str) {
+ c = *(t = str); /* remember for later */
+ *str++ = 0;
+ }
+ while(isspace(*str)) str++;
+
+ if(*s) {
+ if(!strcmp(s, "pci")) *tag = TAG_PCI;
+ else if(!strcmp(s, "usb")) *tag = TAG_USB;
+ else if(!strcmp(s, "special")) *tag = TAG_SPECIAL;
+ else if(!strcmp(s, "eisa")) *tag = TAG_EISA;
+ else if(!strcmp(s, "isapnp")) *tag = TAG_EISA;
+ else if(!strcmp(s, "pcmcia")) *tag = TAG_PCMCIA;
+ else {
+ str = s;
+ if(t) *t = c; /* restore */
+ }
+ }
+
+ id0 = strtoul(str, &s, 0);
+
+ if(s == str) {
+ id0 = eisa_id(str);
+ if(!id0) return 0;
+ s = str + 3;
+ id0 = ID_VALUE(id0);
+ if(!*tag) *tag = TAG_EISA;
+ }
+
+ while(isspace(*s)) s++;
+ if(*s && *s != '&' && *s != '+') return 0;
+
+ *id = id0;
+
+ if(!*s) return 1;
+
+ c = *s++;
+
+ while(isspace(*s)) s++;
+
+ val = strtoul(s, &str, 0);
+
+ if(s == str) return 0;
+
+ while(isspace(*str)) str++;
+
+ if(*str) return 0;
+
+ if(c == '+') *range = val; else *mask = val;
+
+ return c == '+' ? 2 : 3;
+}
+
+
+hddb_entry_mask_t add_entry(skey_t *skey, hddb_entry_t idx, char *val)
+{
+ hddb_entry_mask_t e_mask = 0;
+ int i;
+ unsigned id, tag, range, mask;
+ char *s, *s1, *s2, c;
+ hid_t *hid;
+ str_t *str;
+
+ for(i = 0; (unsigned) i < sizeof hddb_is_numeric / sizeof *hddb_is_numeric; i++) {
+ if(idx == hddb_is_numeric[i]) break;
+ }
+
+ // printf("i = %d, idx = %d, val = >%s<\n", i, idx, val);
+
+ if((unsigned) i < sizeof hddb_is_numeric / sizeof *hddb_is_numeric) {
+ /* numeric id */
+ e_mask |= 1 << idx;
+
+ i = parse_id(val, &id, &tag, &range, &mask);
+
+ // printf("parse_id = %d\n", i);
+
+ if(i) {
+ skey->hid[idx] = hid = new_mem(sizeof *hid);
+ hid->num.flag = FLAG_ID;
+ hid->num.tag = tag;
+ hid->num.id = id;
+ }
+ else {
+ return 0;
+ }
+
+ switch(i) {
+ case 1:
+ break;
+
+ case 2:
+ hid->num.range = range;
+ hid->num.has.range = 1;
+ break;
+
+ case 3:
+ hid->num.mask = mask;
+ hid->num.has.mask = 1;
+ break;
+
+ default:
+ return 0;
+ }
+ }
+ else {
+ if(idx < he_nomask) {
+ /* strings */
+
+ e_mask |= 1 << idx;
+ skey->hid[idx] = hid = new_mem(sizeof *hid);
+ hid->str.flag = FLAG_STRING;
+ str = add_list(&hid->str.list, new_mem(sizeof *str));
+ str->str = new_str(val);
+ }
+ else {
+ /* special */
+
+ if(idx == he_class_id) {
+ i = parse_id(val, &id, &tag, &range, &mask);
+ if(i != 1) return 0;
+
+ skey->hid[he_baseclass_id] = hid = new_mem(sizeof *hid);
+ hid->num.flag = FLAG_ID;
+ hid->num.tag = tag;
+ hid->num.id = id >> 8;
+
+ skey->hid[he_subclass_id] = hid = new_mem(sizeof *hid);
+ hid->num.flag = FLAG_ID;
+ hid->num.tag = tag;
+ hid->num.id = id & 0xff;
+
+ e_mask |= (1 << he_baseclass_id) + (1 << he_subclass_id) /* + (1 << he_progif_id) */;
+ }
+ else {
+ switch(idx) {
+ case he_driver_module_insmod:
+ c = 'i';
+ break;
+
+ case he_driver_module_modprobe:
+ c = 'm';
+ break;
+
+ case he_driver_module_config:
+ c = 'M';
+ break;
+
+ case he_driver_xfree:
+ c = 'x';
+ break;
+
+ case he_driver_xfree_config:
+ c = 'X';
+ break;
+
+ case he_driver_mouse:
+ c = 'p';
+ break;
+
+ case he_driver_display:
+ c = 'd';
+ break;
+
+ case he_driver_any:
+ c = 'a';
+ break;
+
+ default:
+ c = 0;
+ break;
+ }
+ if(c) {
+ s = new_mem(strlen(val) + 3);
+ s[0] = c;
+ s[1] = '\t';
+ strcpy(s + 2, val);
+ hid = skey->hid[he_driver];
+ if(!hid) {
+ skey->hid[he_driver] = hid = new_mem(sizeof *hid);
+ hid->str.flag = FLAG_STRING;
+ }
+ if(
+ (c == 'X' || c == 'M') &&
+ hid->str.list.last &&
+ (s1 = ((str_t *) hid->str.list.last)->str)
+ ) {
+ s2 = new_mem(strlen(s1) + strlen(s) + 2);
+ sprintf(s2, "%s\001%s", s1, s);
+ free_mem(s1);
+ ((str_t *) hid->str.list.last)->str = s2;
+ }
+ else {
+ str = add_list(&hid->str.list, new_mem(sizeof *str));
+ str->str = new_str(s);
+ }
+ e_mask |= (1 << he_driver);
+ s = free_mem(s);
+ }
+ }
+ }
+ }
+
+ return e_mask;
+}
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+void write_items(char *file, list_t *hd)
+{
+ FILE *f;
+ item_t *item;
+ int close_it = 0;
+
+ if(file && strcmp(file, "-")) {
+ f = fopen(file, "w");
+ if(!f) {
+ perror(file);
+ return;
+ }
+ close_it = 1;
+ }
+ else {
+ f = stdout;
+ }
+
+ for(item = hd->first; item; item = item->next) {
+ if(opt.with_source) fprintf(f, "# %s\n", item->pos);
+ write_item(f, item);
+ fputc('\n', f);
+ }
+
+ if(close_it) fclose(f);
+}
+
+
+void write_item(FILE *f, item_t *item)
+{
+ skey_t *skey;
+ prefix_t pre;
+
+ pre = pref_new;
+ for(skey = item->key.first; skey; skey = skey->next) {
+ write_skey(f, pre, skey);
+ pre = pref_or;
+ }
+ write_skey(f, pref_add, item->value);
+}
+
+
+void write_skey(FILE *f, prefix_t pre, skey_t *skey)
+{
+ static char pref_char[5] = { ' ', ' ', '&', '|', '+' };
+ int i;
+
+ if(pre >= sizeof pref_char) {
+ fprintf(stderr, "internal oops\n");
+ exit(2);
+ }
+
+ if(!skey) return;
+
+ for(i = 0; (unsigned) i < sizeof skey->hid / sizeof *skey->hid; i++) {
+ if(skey->hid[i]) {
+ if(i != he_driver) {
+ write_ent_name(f, skey->hid[i], pref_char[pre], i);
+ write_id(f, i, skey->hid[i]);
+ fputc('\n', f);
+ }
+ else {
+ write_drv(f, pref_char[pre], skey->hid[i]);
+ }
+ if(pre != pref_add) pre = pref_and;
+ }
+ }
+}
+
+
+void write_ent_name(FILE *f, hid_t *hid, char pre, hddb_entry_t ent)
+{
+ int len, tab_ind = 24;
+ char c;
+
+ if(ent >= sizeof hddb_entry_strings / sizeof *hddb_entry_strings) {
+ fprintf(stderr, "internal oops\n");
+ exit(2);
+ }
+
+ len = item_ind ? strlen(item_ind) : 0;
+
+ if(!len) {
+ fprintf(f, "%c%s\t", pre, hddb_entry_strings[ent]);
+ }
+ else {
+ c = hid->any.remove ? '*' : ':';
+ fprintf(f, "%s%c %c%s\t", item_ind, c, pre, hddb_entry_strings[ent]);
+ len += 2;
+ tab_ind += 8;
+ }
+
+ len += strlen(hddb_entry_strings[ent]) + 1;
+
+ for(len = (len & ~7) + 8; len < tab_ind; len += 8) {
+ fputc('\t', f);
+ }
+}
+
+
+void write_id(FILE *f, hddb_entry_t ent, hid_t *hid)
+{
+ static char *tag_name[6] = { "", "pci ", "eisa ", "usb ", "special ", "pcmcia " };
+ int tag;
+ unsigned u;
+ char c;
+
+ switch(hid->any.flag) {
+ case FLAG_ID:
+ tag = hid->num.tag;
+ if((unsigned) tag >= sizeof tag_name / sizeof *tag_name) {
+ fprintf(stderr, "internal oops\n");
+ exit(2);
+ }
+ if(tag == TAG_EISA && (ent == he_vendor_id || ent == he_subvendor_id)) {
+ fprintf(f, "%s", eisa_str(hid->num.id));
+ }
+ else {
+ u = 4;
+ if(ent == he_bus_id || ent == he_subclass_id || ent == he_progif_id) {
+ u = 2;
+ }
+ else if(ent == he_baseclass_id) {
+ u = 3;
+ }
+ fprintf(f, "%s0x%0*x", tag_name[tag], u, hid->num.id);
+ }
+ if(hid->num.has.range || hid->num.has.mask) {
+ if(hid->num.has.range) {
+ u = hid->num.range;
+ c = '+';
+ }
+ else {
+ u = hid->num.mask;
+ c = '&';
+ }
+ fprintf(f, "%c0x%04x", c, u);
+ }
+ break;
+
+ case FLAG_STRING:
+ if( /* not exactly 1 string */
+ !hid->str.list.first ||
+ ((str_t *) hid->str.list.first)->next
+ ) {
+ fprintf(stderr, "internal oops\n");
+ exit(2);
+ }
+ fprintf(f, "%s", ((str_t *) hid->str.list.first)->str);
+ break;
+
+ default:
+ fprintf(stderr, "internal oops\n");
+ exit(2);
+ break;
+ }
+}
+
+
+void write_drv(FILE *f, char pre, hid_t *hid)
+{
+ str_t *str;
+ char *s, *t;
+
+ if(hid->any.flag != FLAG_STRING) {
+ fprintf(stderr, "internal oops\n");
+ exit(2);
+ }
+
+ for(str = hid->str.list.first; str; str = str->next) {
+ for(s = str->str; (t = strchr(s, '\001')); s = t + 1) {
+ *t = 0;
+ write_drv1(f, hid, pre, s);
+ *t = '\001';
+ }
+ write_drv1(f, hid, pre, s);
+ }
+}
+
+
+void write_drv1(FILE *f, hid_t *hid, char pre, char *val)
+{
+ char type;
+ int ent;
+
+ type = val[0];
+ if(!type || val[1] != '\t') {
+ fprintf(stderr, "internal oops\n");
+ exit(2);
+ }
+
+ switch(type) {
+ case 'x':
+ ent = he_driver_xfree;
+ break;
+
+ case 'X':
+ ent = he_driver_xfree_config;
+ break;
+
+ case 'i':
+ ent = he_driver_module_insmod;
+ break;
+
+ case 'm':
+ ent = he_driver_module_modprobe;
+ break;
+
+ case 'M':
+ ent = he_driver_module_config;
+ break;
+
+ case 'p':
+ ent = he_driver_mouse;
+ break;
+
+ case 'd':
+ ent = he_driver_display;
+ break;
+
+ case 'a':
+ ent = he_driver_any;
+ break;
+
+ default:
+ fprintf(stderr, "internal oops\n");
+ exit(2);
+ break;
+ }
+
+ write_ent_name(f, hid, pre, ent);
+ fprintf(f, "%s\n", val + 2);
+
+}
+
+
+void log_items(FILE *f, item_t *item0, item_t *item1)
+{
+ char *save_ind = item_ind;
+
+ if(item0) {
+ item_ind = " 0";
+ write_item(f, item0);
+ }
+
+ if(item1) {
+ item_ind = " 1";
+ write_item(f, item1);
+ }
+
+ item_ind = save_ind;
+}
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+/* count common defined hid entries */
+int count_common_hids(skey_t *skey0, skey_t *skey1)
+{
+ int i, cnt = 0;
+
+ if(!skey0 || !skey1) return 0;
+
+ for(i = 0; (unsigned) i < sizeof skey0->hid / sizeof *skey0->hid; i++) {
+ if(skey0->hid[i] && skey1->hid[i]) cnt++;
+ }
+
+ return cnt;
+}
+
+
+/*
+ * remove hid entries from skey0 that are defined in skey1
+ *
+ * do_it:
+ * 0: don't remove anything, just count
+ * 1: remove identical entries
+ * 2: remove differing entries
+ * 3: both of the above
+ *
+ * return
+ * bits 0- 7: identical entries
+ * 8-15: different entries
+ * 16-23: critical conflicts
+ */
+int strip_skey(skey_t *skey0, skey_t *skey1, int do_it)
+{
+ int i, cnt;
+
+ for(i = cnt = 0; (unsigned) i < sizeof skey0->hid / sizeof *skey0->hid; i++) {
+ if(!skey0->hid[i] || !skey1->hid[i]) continue;
+ if(cmp_hid(skey0->hid[i], skey1->hid[i])) {
+ cnt += 1 << 8;
+ if(i == he_driver || i == he_requires) {
+ cnt += 1 << 16;
+ }
+ if((do_it & 2)) skey0->hid[i]->any.remove = 1;
+ }
+ else {
+ cnt++;
+ if((do_it & 1)) skey0->hid[i]->any.remove = 1;
+ }
+ }
+
+ return cnt;
+}
+
+
+/*
+ * remove deleted hid entries from skey
+ */
+void remove_deleted_hids(skey_t *skey)
+{
+ int i;
+
+ for(i = 0; (unsigned) i < sizeof skey->hid / sizeof *skey->hid; i++) {
+ if(skey->hid[i] && skey->hid[i]->any.remove) {
+ skey->hid[i] = free_hid(skey->hid[i]);
+ }
+ }
+}
+
+
+/*
+ * undeleted hid entries from skey
+ */
+void undelete_hids(skey_t *skey)
+{
+ int i;
+
+ for(i = 0; (unsigned) i < sizeof skey->hid / sizeof *skey->hid; i++) {
+ if(skey->hid[i]) skey->hid[i]->any.remove = 0;
+ }
+}
+
+
+str_t *split(char del, char *s)
+{
+ char *t, *s0;
+ list_t list = {};
+ str_t *str;
+
+ if(!s) return NULL;
+
+ for(s0 = s = new_str(s); (t = strchr(s, del)); s = t + 1) {
+ *t = 0;
+ str = add_list(&list, new_mem(sizeof *str));
+ str->str = new_str(s);
+ }
+ str = add_list(&list, new_mem(sizeof *str));
+ str->str = new_str(s);
+
+ free_mem(s0);
+
+ return list.first;
+}
+
+
+char *join(char del, str_t *str)
+{
+ char *s, t[2];
+ str_t *str0;
+ int len = 0;
+
+ for(str0 = str; str0; str0 = str0->next) {
+ len += strlen(str0->str) + 1;
+ }
+
+ if(!len) return NULL;
+
+ s = new_mem(len);
+
+ t[0] = del; t[1] = 0;
+
+ for(; str; str = str->next) {
+ strcat(s, str->str);
+ if(str->next) strcat(s, t);
+ }
+
+ return s;
+}
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+
+/*
+ * str0 & str1 _must_ hold valid driver info
+ */
+int cmp_driver_info(char *str0, char *str1)
+{
+ char type0, type1;
+ str_t *sl0, *sl1;
+ int _3d0, _3d1, res;
+
+ type0 = *str0;
+ type1 = *str1;
+
+ if(type0 == 'a' || type1 == 'a') {
+ if(type0 == 'a' && type1 == 'a') return 0;
+ if(type0 == 'a') return 1;
+ return -1;
+ }
+
+ if(type0 != 'x' || type1 != 'x') return 0;
+
+ str0 += 2;
+ str1 += 2;
+
+ sl0 = split('|', str0);
+ sl1 = split('|', str1);
+
+ res = 0;
+
+ if(sl0 && sl1) {
+
+ /* xfree v4 first, then xfree v3 */
+ if(*sl0->str != *sl1->str) res = *sl0->str < *sl1->str ? 1 : -1;
+
+ if(!res) {
+ _3d0 = _3d1 = 0;
+
+ if(sl0->next && sl0->next->next && *sl0->next->next->str) _3d0 = 1;
+ if(sl1->next && sl1->next->next && *sl1->next->next->str) _3d1 = 1;
+
+ /* entries without 3d support first */
+ res = _3d0 - _3d1;
+ }
+ }
+
+ free_str(sl0, 1);
+ free_str(sl1, 1);
+
+ return res;
+}
+
+
+/* wrapper for qsort */
+int cmp_str_s(const void *p0, const void *p1)
+{
+ str_t **str0, **str1;
+
+ str0 = (str_t **) p0;
+ str1 = (str_t **) p1;
+
+ return strcmp((*str0)->str, (*str1)->str);
+}
+
+
+int cmp_hid(hid_t *hid0, hid_t *hid1)
+{
+ int i = 0;
+ str_t *str0, *str1;
+
+ if(!hid0 && !hid1) return 0;
+ if(!hid0) return -1;
+ if(!hid1) return 1;
+
+ if(hid0->any.flag != hid1->any.flag) {
+ return hid0->any.flag < hid1->any.flag ? -1 : 1;
+ }
+
+ if(hid0->any.flag == FLAG_STRING) {
+ str0 = hid0->str.list.first;
+ str1 = hid1->str.list.first;
+ for(; str0 && str1; str0 = str0->next, str1 = str1->next) {
+ i = strcmp(str0->str, str1->str);
+ if(i) {
+ i = i > 0 ? 1 : -1;
+ break;
+ }
+ }
+ if(!i) {
+ if(str0) i = 1; else if(str1) i = -1;
+ }
+ }
+ else if(hid0->any.flag == FLAG_ID) {
+ if(hid0->num.tag != hid1->num.tag) {
+ i = hid0->num.tag < hid1->num.tag ? -1 : 1;
+ }
+ else if(hid0->num.id != hid1->num.id) {
+ i = hid0->num.id < hid1->num.id ? -1 : 1;
+ }
+ else if(hid0->num.has.range || hid1->num.has.range) {
+ if(!hid0->num.has.range) {
+ i = -1;
+ }
+ else if(!hid1->num.has.range) {
+ i = 1;
+ }
+ else if(hid0->num.range != hid1->num.range) {
+ i = hid0->num.range < hid1->num.range ? -1 : 1;
+ }
+ }
+ else if(hid0->num.has.mask || hid1->num.has.mask) {
+ if(!hid0->num.has.mask) {
+ i = -1;
+ }
+ else if(!hid1->num.has.mask) {
+ i = 1;
+ }
+ else if(hid0->num.mask != hid1->num.mask) {
+ i = hid0->num.mask < hid1->num.mask ? -1 : 1;
+ }
+ }
+ }
+
+ return i;
+}
+
+
+int cmp_skey(skey_t *skey0, skey_t *skey1)
+{
+ int i, j, len0, len1, len;
+
+ if(!skey0 && !skey1) return 0;
+ if(!skey0) return -1;
+ if(!skey1) return 1;
+
+ for(i = len0 = len1 = 0; (unsigned) i < sizeof skey0->hid / sizeof *skey0->hid; i++) {
+ if(skey0->hid[i]) len0 = i;
+ if(skey1->hid[i]) len1 = i;
+ }
+ len0++;
+ len1++;
+
+ // printf("len0 = %d, len1 = %d\n", len0, len1);
+
+ len = len0 < len1 ? len0 : len1;
+
+ for(i = j = 0; j < len; j++) {
+ // printf("0: j = %d\n", j);
+
+ if(!skey0->hid[j] && !skey1->hid[j]) continue;
+
+ /* note: this looks reversed, but is intentional! */
+ if(!skey0->hid[j]) { i = 1; break; }
+ if(!skey1->hid[j]) { i = -1; break; }
+
+ i = cmp_hid(skey0->hid[j], skey1->hid[j]);
+ // printf("1: j = %d, i = %d\n", j, i);
+
+ if(i) break;
+ }
+
+ if(!i && len0 != len1) {
+ i = len0 > len1 ? 1 : -1;
+ }
+
+ return i;
+}
+
+
+/* wrapper for qsort */
+int cmp_skey_s(const void *p0, const void *p1)
+{
+ skey_t **skey0, **skey1;
+
+ skey0 = (skey_t **) p0;
+ skey1 = (skey_t **) p1;
+
+ return cmp_skey(*skey0, *skey1);
+}
+
+
+int cmp_item(item_t *item0, item_t *item1)
+{
+ int i;
+ skey_t *skey0, *skey1;
+
+ skey0 = item0->key.first;
+ skey1 = item1->key.first;
+ for(i = 0; skey0 && skey1; skey0 = skey0->next, skey1 = skey1->next) {
+ if((i = cmp_skey(skey0, skey1))) break;
+ }
+ if(!i) i = cmp_skey(skey0, skey1);
+
+ if(!i) i = 2 * cmp_skey(item0->value, item1->value);
+
+ // printf("%s -- %s : %d\n", item0->pos, item1->pos, i);
+
+ return i;
+}
+
+
+/* wrapper for qsort */
+int cmp_item_s(const void *p0, const void *p1)
+{
+ int i;
+ item_t **item0, **item1;
+
+ item0 = (item_t **) p0;
+ item1 = (item_t **) p1;
+
+ if(opt.random) {
+ i = ((rand() / 317) % 3) - 1;
+ }
+ else if(opt.reverse) {
+ i = cmp_item(*item1, *item0);
+ }
+ else {
+ i = cmp_item(*item0, *item1);
+ }
+
+ return i;
+}
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+/*
+ * Does hid1 match if hid0 does?
+ * > 0: yes, 0: no, < 0: maybe
+ *
+ * match:
+ * match_any: at least one common id in hid1 & hid0
+ * match_all: hid1 matches whenever hid0 does (hid0 is special case of hid1))
+ */
+int match_hid(hid_t *hid0, hid_t *hid1, match_t match)
+{
+ int i, m = -1;
+ str_t *str0, *str1;
+
+ if(!hid1) return 1;
+ if(!hid0) return 0;
+
+ if(hid0->any.flag != hid1->any.flag) return 0;
+
+ if(hid0->any.flag == FLAG_STRING) {
+ str0 = hid0->str.list.first;
+ str1 = hid1->str.list.first;
+ for(; str0 && str1; str0 = str0->next, str1 = str1->next) {
+ i = strcmp(str0->str, str1->str);
+ if(i) return 0;
+ }
+ m = str0 || str1 ? 0 : 1;
+ }
+ else if(hid0->any.flag == FLAG_ID) {
+ if(hid0->num.tag != hid1->num.tag) return 0;
+
+ if(match == match_any) {
+
+ if(hid0->num.has.range) {
+ if(hid1->num.has.range) {
+ m =
+ (
+ hid1->num.id >= hid0->num.id &&
+ hid1->num.id < hid0->num.id + hid0->num.range
+ ) ||
+ (
+ hid0->num.id >= hid1->num.id &&
+ hid0->num.id < hid1->num.id + hid1->num.range
+ ) ? 1 : 0;
+
+ }
+ else if(hid1->num.has.mask) {
+
+ }
+ else {
+ m =
+ (
+ hid1->num.id >= hid0->num.id &&
+ hid1->num.id < hid0->num.id + hid0->num.range
+ ) ? 1 : 0;
+ }
+ }
+ else if(hid0->num.has.mask) {
+ if(hid1->num.has.range) {
+
+ }
+ else if(hid1->num.has.mask) {
+
+ }
+ else {
+ m = (hid1->num.id & ~hid0->num.mask) == hid0->num.id ? 1 : 0;
+ }
+ }
+ else {
+ if(hid1->num.has.range) {
+ m =
+ (
+ hid0->num.id >= hid1->num.id &&
+ hid0->num.id < hid1->num.id + hid1->num.range
+ ) ? 1 : 0;
+ }
+ else if(hid1->num.has.mask) {
+ m = (hid0->num.id & ~hid1->num.mask) == hid1->num.id ? 1 : 0;
+ }
+ else {
+ m = hid0->num.id == hid1->num.id ? 1 : 0;
+ }
+ }
+
+ }
+ else { /* match_all */
+
+ if(hid0->num.has.range) {
+ if(hid1->num.has.range) {
+ m =
+ (
+ hid0->num.id >= hid1->num.id &&
+ hid0->num.id + hid0->num.range <= hid1->num.id + hid1->num.range
+ ) ? 1 : 0;
+// fprintf(logfh, "id0 = 0x%x, id1 = 0x%x, m = %d\n", hid0->num.id, hid1->num.id, m);
+ }
+ else if(hid1->num.has.mask) {
+
+ }
+ else {
+ m = hid1->num.id == hid0->num.id && hid0->num.range == 1 ? 1 : 0;
+ }
+ }
+ else if(hid0->num.has.mask) {
+ if(hid1->num.has.range) {
+
+ }
+ else if(hid1->num.has.mask) {
+
+ }
+ else {
+ m = (hid1->num.id & ~hid0->num.mask) == hid0->num.id && hid0->num.mask == 0 ? 1 : 0;
+ }
+ }
+ else {
+ if(hid1->num.has.range) {
+ m =
+ (
+ hid0->num.id >= hid1->num.id &&
+ hid0->num.id < hid1->num.id + hid1->num.range
+ ) ? 1 : 0;
+ }
+ else if(hid1->num.has.mask) {
+ m = (hid0->num.id & ~hid1->num.mask) == hid1->num.id ? 1 : 0;
+ }
+ else {
+ m = hid0->num.id == hid1->num.id ? 1 : 0;
+ }
+ }
+
+ }
+ }
+
+ return m;
+}
+
+
+/*
+ * Does skey1 match if skey0 does?
+ * > 0: yes, 0: no, < 0: maybe
+ */
+int match_skey(skey_t *skey0, skey_t *skey1, match_t match)
+{
+ int i, k, m = 1;
+
+ for(i = k = 0; (unsigned) i < sizeof skey0->hid / sizeof *skey0->hid; i++) {
+ k = match_hid(skey0->hid[i], skey1->hid[i], match);
+ if(k > 0) continue;
+ if(!k) return 0;
+ m = k;
+ }
+
+ return m;
+}
+
+
+/*
+ * Does item1 match if item0 does?
+ * > 0: yes, 0: no, < 0: maybe
+ */
+int match_item(item_t *item0, item_t *item1, match_t match)
+{
+ int i, k = 0;
+ skey_t *skey0, *skey1;
+
+ skey0 = item0->key.first;
+ skey1 = item1->key.first;
+
+ for(skey0 = item0->key.first; skey0; skey0 = skey0->next) {
+ for(skey1 = item1->key.first; skey1; skey1 = skey1->next) {
+ i = match_skey(skey0, skey1, match);
+ if(i > 0) return i;
+ if(i) k = i;
+ }
+ }
+
+ return k;
+}
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+int combine_keys(skey_t *skey0, skey_t *skey1)
+{
+ int i, ind;
+ unsigned r0, r1;
+ hid_t *hid0, *hid1;
+
+ for(ind = -1, i = 0; (unsigned) i < sizeof skey0->hid / sizeof *skey0->hid; i++) {
+ if(!skey0->hid[i] && !skey1->hid[i]) continue;
+ if(!skey0->hid[i] || !skey1->hid[i]) return 0;
+ if(!cmp_hid(skey0->hid[i], skey1->hid[i])) continue;
+ if(ind >= 0) return 0;
+ ind = i;
+ }
+
+ if(ind < 0) return 0;
+
+ /* ok, exactly one hid differs */
+ hid0 = skey0->hid[ind];
+ hid1 = skey1->hid[ind];
+
+ /* must be numerical */
+ if(hid0->any.flag != FLAG_ID || hid1->any.flag != FLAG_ID) return 0;
+
+ /* no mask value */
+ if(hid0->num.has.mask || hid1->num.has.mask) return 0;
+
+ /* must be adjacent ranges, can overlap */
+ r0 = hid0->num.has.range ? hid0->num.range : 1;
+ r1 = hid1->num.has.range ? hid1->num.range : 1;
+
+ if(hid1->num.id >= hid0->num.id && hid1->num.id <= hid0->num.id + r0) {
+ i = hid1->num.id + r1 - hid0->num.id;
+ if((unsigned) i < r0) i = r0;
+ if(i != 1) {
+ hid0->num.range = i;
+ hid0->num.has.range = 1;
+ }
+ else {
+ hid0->num.range = 0;
+ hid0->num.has.range = 0;
+ }
+ }
+ else {
+ return 0;
+ }
+
+ return 1;
+}
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+str_t *clone_str(str_t *str)
+{
+ str_t *n_str;
+
+ if(!str) return NULL;
+
+ n_str = new_mem(sizeof *n_str);
+ n_str->str = new_str(str->str);
+
+ return n_str;
+}
+
+
+hid_t *clone_hid(hid_t *hid)
+{
+ hid_t *new_hid;
+ str_t *str;
+
+ if(!hid) return NULL;
+
+ new_hid = new_mem(sizeof *new_hid);
+
+ *new_hid = *hid;
+
+ if(hid->any.flag == FLAG_STRING) {
+ memset(&new_hid->str.list, 0, sizeof new_hid->str.list);
+ for(str = hid->str.list.first; str; str = str->next) {
+ add_list(&new_hid->str.list, clone_str(str));
+ }
+ }
+
+ return new_hid;
+}
+
+
+skey_t *clone_skey(skey_t *skey)
+{
+ int i;
+ skey_t *new_skey;
+
+ if(!skey) return NULL;
+
+ new_skey = new_mem(sizeof *new_skey);
+
+ for(i = 0; (unsigned) i < sizeof skey->hid / sizeof *skey->hid; i++) {
+ new_skey->hid[i] = clone_hid(skey->hid[i]);
+ }
+
+ return new_skey;
+}
+
+
+item_t *clone_item(item_t *item)
+{
+ item_t *new_item;
+ skey_t *skey;
+
+ if(!item) return NULL;
+
+ new_item = new_mem(sizeof *new_item);
+
+ new_item->pos = new_str(item->pos);
+
+ for(skey = item->key.first; skey; skey = skey->next) {
+ add_list(&new_item->key, clone_skey(skey));
+ }
+
+ new_item->value = clone_skey(item->value);
+
+ return new_item;
+}
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+str_t *free_str(str_t *str, int follow_next)
+{
+ str_t *next;
+
+ for(; str; str = next) {
+ next = str->next;
+
+ free_mem(str->str);
+ free_mem(str);
+
+ if(!follow_next) break;
+ }
+
+ return NULL;
+}
+
+
+hid_t *free_hid(hid_t *hid)
+{
+ if(!hid) return NULL;
+
+ if(hid->any.flag == FLAG_STRING) {
+ free_str(hid->str.list.first, 1);
+ }
+ free_mem(hid);
+
+ return NULL;
+}
+
+
+skey_t *free_skey(skey_t *skey, int follow_next)
+{
+ skey_t *next;
+ int i;
+
+ for(; skey; skey = next) {
+ next = skey->next;
+
+ for(i = 0; (unsigned) i < sizeof skey->hid / sizeof *skey->hid; i++) {
+ free_hid(skey->hid[i]);
+ }
+
+ free_mem(skey);
+
+ if(!follow_next) break;
+ }
+
+ return NULL;
+}
+
+
+item_t *free_item(item_t *item, int follow_next)
+{
+ item_t *next;
+
+ for(; item; item = next) {
+ next = item->next;
+
+ free_mem(item->pos);
+
+ free_skey(item->key.first, 1);
+ free_skey(item->value, 0);
+
+ free_mem(item);
+
+ if(!follow_next) break;
+ }
+
+ return NULL;
+}
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+unsigned driver_entry_types(hid_t *hid)
+{
+ str_t *str;
+ unsigned ent = 0;
+
+ for(str = hid->str.list.first; str; str = str->next) {
+ if(!str->str[0] || str->str[1] != '\t') break;
+ switch(str->str[0]) {
+ case 'a':
+ ent |= 1;
+ break;
+
+ case 'x':
+ case 'X':
+ ent |= 2;
+ break;
+
+ default:
+ ent |= 4;
+ }
+ }
+
+ return ent;
+}
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+void remove_items(list_t *hd)
+{
+ item_t *item, *next;
+ list_t hd_new = {};
+
+ for(item = hd->first; item; item = next) {
+ next = item->next;
+ if(item->remove) {
+ free_item(item, 0);
+ }
+ else {
+ add_list(&hd_new, item);
+ }
+ }
+
+ if(hd_new.last) {
+ ((list_any_t *) hd_new.last)->next = NULL;
+ }
+
+ *hd = hd_new;
+}
+
+
+void remove_nops(list_t *hd)
+{
+ item_t *item;
+ int cnt = 0;
+
+ for(item = hd->first; item; item = item->next) {
+ if(!item->value || !item->key.first) {
+ item->remove = 1;
+ cnt++;
+ }
+ }
+
+ if(cnt) remove_items(hd);
+}
+
+
+void split_items(list_t *hd)
+{
+ item_t *item, *new_item, *next_item;
+ skey_t *skey, *next;
+ list_t hd_new = {};
+ int cnt, l;
+ char buf[16];
+
+ for(item = hd->first; item; item = next_item) {
+ next_item = item->next;
+ skey = item->key.first;
+ if(skey && skey->next) {
+ for(cnt = 0, skey = item->key.first; skey; skey = next) {
+ next = skey->next;
+ new_item = add_list(&hd_new, new_mem(sizeof *new_item));
+ if(item->pos && (l = strlen(item->pos))) {
+ sprintf(buf, ",%d)", cnt++);
+ new_item->pos = new_mem(l - 1 + strlen(buf) + 1);
+ strcpy(new_item->pos, item->pos);
+ strcpy(new_item->pos + l - 1, buf);
+ }
+ new_item->value = clone_skey(item->value);
+ add_list(&new_item->key, clone_skey(skey));
+ }
+ free_item(item, 0);
+ }
+ else {
+ add_list(&hd_new, item);
+ }
+ }
+
+ if(hd_new.last) {
+ ((list_any_t *) hd_new.last)->next = NULL;
+ }
+
+ *hd = hd_new;
+}
+
+
+void check_items(list_t *hd)
+{
+ int i, j, k, m, mr, m_all, mr_all, c_ident, c_diff, c_crit;
+ char *s;
+ item_t *item0, *item1, *item_a, *item_b;
+ unsigned *stat_cnt;
+
+ for(item0 = hd->first; item0; item0 = item0->next) {
+ if(item0->remove) continue;
+ for(item1 = item0->next; item1 && !item0->remove; item1 = item1->next) {
+ if(item1->remove) continue;
+
+ item_a = item0; item_b = item1;
+
+ m = match_item(item0, item1, match_any);
+ mr = match_item(item1, item0, match_any);
+
+ m_all = mr_all = 0;
+
+ if(m && mr) {
+ m_all = match_item(item0, item1, match_all);
+ mr_all = match_item(item1, item0, match_all);
+ if(mr_all) {
+ item_a = item1; item_b = item0;
+ i = m_all; m_all = mr_all; mr_all = i;
+ i = m; m = mr; mr = i;
+ }
+ }
+ else if(mr && !m) {
+ item_a = item1; item_b = item0;
+ m = mr; mr = 0;
+ }
+
+ if(m && !mr) {
+ m_all = match_item(item_a, item_b, match_all);
+ mr_all = match_item(item_b, item_a, match_all);
+ }
+
+ if(m) {
+#if 0
+ fprintf(
+ logfh, "a = %s, b = %s, m = %d, mr = %d, m_all = %d, mr_all = %d\n",
+ item_a->pos, item_b->pos,
+ m, mr, m_all, mr_all
+ );
+#endif
+
+ if(m_all) {
+ /*
+ * item_b matches (at least) everything that item_a does
+ * (item_a is a special case of item_b)
+ */
+
+ i = cmp_item(item_a, item_b); /* just informational */
+ if(!i) {
+ /* identical keys and values */
+ fprintf(logfh,
+ "%s: duplicate of %s, item removed\n",
+ item_a->pos, item_b->pos
+ );
+ item_a->remove = 1;
+ }
+ else {
+ /* matching keys, differing values */
+
+ j = count_common_hids(item_a->key.first, item_b->key.first);
+ k = (
+ j == count_common_hids(item_b->key.first, item_b->key.first) &&
+ j < count_common_hids(item_a->key.first, item_a->key.first)
+ ) ? 1 : 0;
+
+ if(k) {
+ /*
+ * item_a is a special case of item_b _and_ item_a has more hid fields
+ * --> libhd can handle differing info in this case
+ */
+ j = strip_skey(item_a->value, item_b->value, 1);
+ if(j) {
+ c_ident = j & 0xff;
+ c_diff = (j >> 8) & 0xff;
+ if(c_diff && c_ident) {
+ fprintf(logfh,
+ "%s: some info identical to %s, identical info removed\n",
+ item_a->pos, item_b->pos
+ );
+ log_items(logfh, item_a, item_b);
+ }
+ else if(!c_diff) {
+ fprintf(logfh,
+ "%s: info is identical to %s, info removed\n",
+ item_a->pos, item_b->pos
+ );
+ log_items(logfh, item_a, item_b);
+ }
+ remove_deleted_hids(item_a->value);
+ }
+ }
+ else {
+ j = strip_skey(item_a->value, item_b->value, 3);
+ if(j) {
+ c_ident = j & 0xff;
+ c_diff = (j >> 8) & 0xff;
+ c_crit = (j >> 16) & 0xff;
+ if(c_crit || cmp_skey(item_a->key.first, item_b->key.first)) {
+ s = "conflicts with";
+ stat_cnt = &stats.errors_res;
+ }
+ else {
+ s = "differs from";
+ stat_cnt = &stats.diffs;
+ }
+ /*
+ * if the keys are identical, make it a warning,
+ * else make it an error
+ */
+ if(c_diff && !c_ident) {
+ (*stat_cnt)++;
+ fprintf(logfh,
+ "%s: info %s %s, info removed\n",
+ item_a->pos, s, item_b->pos
+ );
+ }
+ else if(c_diff && c_ident) {
+ (*stat_cnt)++;
+ fprintf(logfh,
+ "%s: info %s/is identical to %s, info removed\n",
+ item_a->pos, s, item_b->pos
+ );
+ }
+ else {
+ fprintf(logfh,
+ "%s: info is identical to %s, info removed\n",
+ item_a->pos, item_b->pos
+ );
+ }
+ log_items(logfh, item_a, item_b);
+ remove_deleted_hids(item_a->value);
+ }
+ }
+
+ if(!count_common_hids(item_a->value, item_a->value)) {
+ /* remove if no values left */
+ item_a->remove = 1;
+ fprintf(logfh, "%s: no info left, item removed\n", item_a->pos);
+ }
+
+ }
+ }
+ else if(count_common_hids(item_a->value, item_b->value)) {
+ /* different keys, potentially conflicting values */
+ k = cmp_skey(item_a->value, item_b->value);
+ if(k) {
+ /* differing keys, differing values */
+ j = strip_skey(item_b->value, item_a->value, 2);
+ c_diff = (j >> 8) & 0xff;
+ if(c_diff) {
+ /* different keys, conflicting values --> error */
+ stats.errors++;
+ fprintf(logfh,
+ "%s: info conflicts with %s\n",
+ item_b->pos, item_a->pos
+ );
+ log_items(logfh, item_b, item_a);
+ }
+ undelete_hids(item_b->value);
+ }
+ }
+ }
+ }
+ }
+
+ remove_items(hd);
+}
+
+
+void combine_driver(list_t *hd)
+{
+ int i;
+ item_t *item0, *item1, *item_a, *item_b;
+ hid_t *hid0, *hid1, *new_hid, *hid_a, *hid_b;
+ str_t *str0, *str1, *tmp_str, *last_str;
+ unsigned type0, type1;
+
+ for(item0 = hd->first; item0; item0 = item0->next) {
+ if(
+ item0->remove ||
+ !item0->value ||
+ !(hid0 = item0->value->hid[he_driver]) ||
+ hid0->any.flag != FLAG_STRING
+ ) continue;
+ for(item1 = item0->next; item1 && !item0->remove; item1 = item1->next) {
+ hid0 = item0->value->hid[he_driver];
+ if(
+ item1->remove ||
+ !item1->value ||
+ !(hid1 = item1->value->hid[he_driver]) ||
+ hid1->any.flag != FLAG_STRING
+ ) continue;
+
+ i = cmp_item(item0, item1);
+
+ /* remove duplicate entries */
+ if(!i) {
+ item1->remove = 1;
+ continue;
+ }
+
+ /* work only on entries with identical keys */
+ if(i == -1 || i == 1) continue;
+
+ /* ensure these are proper driver entries */
+ if(!(type0 = driver_entry_types(hid0))) continue;
+ if(!(type1 = driver_entry_types(hid1))) continue;
+
+ /*
+ * Allow only (x11 + x11) & (!any + any)
+ * unless --combine option was used.
+ */
+ if(!opt.combine && (((type0 & type1) & 5) || ((type0 | type1) & 6) == 6)) {
+ fprintf(logfh,
+ "%s: can't combine driver info with %s %d %d\n",
+ item0->pos, item1->pos, type0, type1
+ );
+ log_items(logfh, item0, item1);
+ continue;
+ }
+
+ item_a = item0;
+ item_b = item1;
+ hid_a = hid0;
+ hid_b = hid1;
+
+ if(type0 == 1) {
+ item_a = item1;
+ item_b = item0;
+ hid_a = hid1;
+ hid_b = hid0;
+ }
+
+ fprintf(logfh, "%s: combine with %s\n", item_a->pos, item_b->pos);
+ log_items(logfh, item_a, item_b);
+
+ new_hid = clone_hid(hid_a);
+
+ for(str1 = hid_b->str.list.first; str1; str1 = str1->next) {
+ last_str = NULL;
+ for(str0 = new_hid->str.list.first; str0; last_str = str0, str0 = str0->next) {
+ i = cmp_driver_info(str1->str, str0->str);
+ if(i < 0) break;
+ }
+ if(last_str) {
+ tmp_str = last_str->next;
+ last_str->next = clone_str(str1);
+ last_str->next->next = tmp_str;
+ if(!tmp_str) {
+ new_hid->str.list.last = last_str->next;
+ }
+ }
+ else {
+ /* smaller than first entry */
+ tmp_str = clone_str(str1);
+ tmp_str->next = new_hid->str.list.first;
+ new_hid->str.list.first = tmp_str;
+ }
+ }
+
+ free_hid(item_a->value->hid[he_driver]);
+ item_a->value->hid[he_driver] = new_hid;
+ item_b->value->hid[he_driver] = free_hid(item_b->value->hid[he_driver]);
+
+ fprintf(logfh, " --\n");
+ log_items(logfh, item_a, item_b);
+
+ if(!count_common_hids(item_b->value, item_b->value)) {
+ /* remove if no values left */
+ item_b->remove = 1;
+ fprintf(logfh, "%s: no info left, item removed\n", item_b->pos);
+ }
+
+ }
+ }
+
+ remove_items(hd);
+}
+
+
+void combine_requires(list_t *hd)
+{
+ int i;
+ item_t *item0, *item1;
+ hid_t *hid0, *hid1;
+ list_t slist = {};
+ str_t *str, *str0, *str1;
+
+ for(item0 = hd->first; item0; item0 = item0->next) {
+ if(
+ item0->remove ||
+ !item0->value ||
+ !(hid0 = item0->value->hid[he_requires]) ||
+ hid0->any.flag != FLAG_STRING
+ ) continue;
+ for(item1 = item0->next; item1; item1 = item1->next) {
+ if(
+ item1->remove ||
+ !item1->value ||
+ !(hid1 = item1->value->hid[he_requires]) ||
+ hid1->any.flag != FLAG_STRING
+ ) continue;
+
+ i = cmp_item(item0, item1);
+
+ /* remove duplicate entries */
+ if(!i) {
+ item1->remove = 1;
+ continue;
+ }
+
+ /* work only on entries with identical keys */
+ if(i == -1 || i == 1) continue;
+
+ if(!cmp_hid(hid0, hid1)) {
+ hid1->any.remove = 1;
+ fprintf(logfh,
+ "%s: info is identical to %s, info removed\n",
+ item1->pos, item0->pos
+ );
+ log_items(logfh, item1, item0);
+ item1->value->hid[he_requires] = free_hid(item1->value->hid[he_requires]);
+ }
+ else {
+ slist.first = split('|', ((str_t *) hid0->str.list.first)->str);
+
+ /* add pointer to last element */
+ for(str = slist.first; str; str = str->next) {
+ if(!str->next) slist.last = str;
+ }
+
+ str1 = split('|', ((str_t *) hid1->str.list.first)->str);
+ for(str = str1; str; str = str->next) {
+ for(str0 = slist.first; str0; str0 = str0->next) {
+ if(!strcmp(str->str, str0->str)) break;
+ }
+ if(!str0) add_list(&slist, clone_str(str));
+ }
+ free_str(str1, 1);
+
+ sort_list(&slist, cmp_str_s);
+
+ free_str(hid0->str.list.first, 1);
+ hid0->str.list.last = NULL;
+ hid0->str.list.first = add_list(&hid0->str.list, new_mem(sizeof (str_t)));
+ ((str_t *) hid0->str.list.first)->str = join('|', slist.first);
+
+ free_str(slist.first, 1);
+
+ hid1->any.remove = 1;
+
+ fprintf(logfh,
+ "%s: combine with %s, info removed\n",
+ item1->pos, item0->pos
+ );
+ log_items(logfh, item1, item0);
+ item1->value->hid[he_requires] = free_hid(item1->value->hid[he_requires]);
+ }
+
+ if(!count_common_hids(item1->value, item1->value)) {
+ /* remove if no values left */
+ item1->remove = 1;
+ fprintf(logfh, "%s: no info left, item removed\n", item1->pos);
+ }
+ }
+ }
+
+ remove_items(hd);
+}
+
+
+void join_items_by_value(list_t *hd)
+{
+ item_t *item0, *item1;
+ skey_t *skey, *next;
+ int i;
+
+ for(item0 = hd->first; item0; item0 = item0->next) {
+ if(item0->remove) continue;
+ for(item1 = item0->next; item1; item1 = item1->next) {
+ if(item1->remove) continue;
+
+ if(!cmp_skey(item0->value, item1->value)) {
+ for(skey = item1->key.first; skey; skey = next) {
+ next = skey->next;
+ add_list(&item0->key, skey);
+ }
+ memset(&item1->key, 0, sizeof item1->key);
+ item1->remove = 1;
+ fprintf(logfh, "%s: info added to %s, item removed\n", item1->pos, item0->pos);
+ }
+ }
+ }
+
+ remove_items(hd);
+
+ for(item0 = hd->first; item0; item0 = item0->next) {
+
+ /* sort key entries */
+ sort_list(&item0->key, cmp_skey_s);
+
+ /* try to join adjacent keys */
+ for(skey = item0->key.first; skey && (next = skey->next); ) {
+ i = combine_keys(skey, next);
+ if(!i) {
+ skey = next;
+ continue;
+ }
+ if(!(skey->next = next->next)) {
+ /* last element has changed */
+ item0->key.last = skey;
+ }
+ free_skey(next, 0);
+ }
+ }
+}
+
+
+void join_items_by_key(list_t *hd)
+{
+ item_t *item0, *item1;
+ skey_t *val0, *val1;
+ int i;
+
+ for(item0 = hd->first; item0; item0 = item0->next) {
+ if(item0->remove) continue;
+ val0 = item0->value;
+ for(item1 = item0->next; item1; item1 = item1->next) {
+ if(item1->remove) continue;
+
+ i = cmp_item(item0, item1);
+
+ if(i == 2 || i == -2) {
+ /* identical keys, values differ */
+ val1 = item1->value;
+ if(!count_common_hids(val0, val1)) {
+ /* move everything from item1 to item0 */
+
+ for(i = 0; (unsigned) i < sizeof val1->hid / sizeof *val1->hid; i++) {
+ if(val1->hid[i]) {
+ val0->hid[i] = val1->hid[i];
+ val1->hid[i] = NULL;
+ }
+ }
+ item1->remove = 1;
+ fprintf(logfh, "%s: info added to %s, item removed\n", item1->pos, item0->pos);
+ }
+ }
+ }
+ }
+
+ remove_items(hd);
+}
+
+
+void remove_unimportant_items(list_t *hd)
+{
+ item_t *item;
+ skey_t *val;
+ str_t *str;
+ int i, cnt;
+
+ for(item = hd->first; item; item = item->next) {
+ val = item->value;
+ cnt = 0;
+ if(val) {
+ for(i = 0; (unsigned) i < sizeof val->hid / sizeof *val->hid; i++) {
+ if(i == he_driver && val->hid[i]) {
+ if(!(
+ val->hid[i]->any.flag == FLAG_STRING &&
+ (str = val->hid[i]->str.list.first) &&
+ str->str &&
+ (*str->str == 'i' || *str->str == 'm')
+ )) {
+ val->hid[i] = free_hid(val->hid[i]);
+ }
+ }
+ else if(val->hid[i]) {
+ if(val->hid[i]->any.flag != FLAG_ID) val->hid[i] = free_hid(val->hid[i]);
+ }
+ if(val->hid[i]) cnt++;
+ }
+ }
+ /* no values left */
+ if(!cnt) item->remove = 1;
+ }
+
+ remove_items(hd);
+}
+
+
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
+
+#if 0
+/* returns index in hddb2->ids */
+unsigned store_entry(hddb2_data_t *x, tmp_entry_t *te)
+{
+ int i, j;
+ unsigned ent = -1, u, v;
+
+ for(i = 0; i < he_nomask; i++) {
+ if(te[i].len) {
+ for(j = 0; j < te[i].len; j++) {
+ v = te[i].val[j] | (1 << 31);
+ if(j == te[i].len - 1) v &= ~(1 << 31);
+ u = store_value(x, v);
+ if(ent == -1) ent = u;
+ }
+ }
+ }
+
+ return ent;
+}
+
+void add_value(tmp_entry_t *te, hddb_entry_t idx, unsigned val)
+{
+ if(idx >= he_nomask) return;
+ te += idx;
+
+ if(te->len >= sizeof te->val / sizeof *te->val) return;
+
+ te->val[te->len++] = val;
+}
+
+#endif
+
+
+
+unsigned hddb_store_string(hddb_data_t *hddb, char *str)
+{
+ unsigned l = strlen(str), u;
+ char *s;
+
+ if(!opt.no_compact) {
+ /* maybe we already have it... */
+ if(l && l < hddb->strings_len) {
+ s = memmem(hddb->strings, hddb->strings_len, str, l + 1);
+ if(s) return s - hddb->strings;
+ }
+ }
+
+ if(hddb->strings_len + l >= hddb->strings_max) {
+ hddb->strings_max += l + 0x1000; /* >4k steps */
+ hddb->strings = realloc(hddb->strings, hddb->strings_max * sizeof *hddb->strings);
+ }
+
+ /* make sure the 1st byte is 0 */
+ if(hddb->strings_len == 0) {
+ *hddb->strings = 0; /* realloc does _not_ clear memory */
+ hddb->strings_len = 1;
+ }
+
+ if(l == 0) return 0; /* 1st byte is always 0 */
+
+ strcpy(hddb->strings + (u = hddb->strings_len), str);
+ hddb->strings_len += l + 1;
+
+ return u;
+}
+
+
+unsigned hddb_store_value(hddb_data_t *hddb, unsigned val)
+{
+ if(hddb->ids_len == hddb->ids_max) {
+ hddb->ids_max += 0x400; /* 4k steps */
+ hddb->ids = realloc(hddb->ids, hddb->ids_max * sizeof *hddb->ids);
+ }
+
+ hddb->ids[hddb->ids_len++] = val;
+
+ return hddb->ids_len - 1;
+}
+
+
+unsigned hddb_store_hid(hddb_data_t *hddb, hid_t *hid, hddb_entry_t entry)
+{
+ unsigned u, idx = -1;
+ str_t *str, *str0, *str1;
+
+ if(!hid) return idx;
+
+ if(hid->any.flag == FLAG_ID) {
+ if(hid->num.has.range) {
+ idx = hddb_store_value(hddb, MAKE_DATA(FLAG_RANGE, hid->num.range) | (1 << 31));
+ }
+ else if(hid->num.has.mask) {
+ idx = hddb_store_value(hddb, MAKE_DATA(FLAG_MASK, hid->num.mask) | (1 << 31));
+ }
+ u = hddb_store_value(hddb, MAKE_DATA(FLAG_ID, hid->num.id + (hid->num.tag << 16)));
+ if(idx == -1u) idx = u;
+ }
+ else if(hid->any.flag == FLAG_STRING) {
+ if(entry == he_driver ) {
+ for(str = hid->str.list.first; str; str = str->next) {
+ str0 = split('\001', str->str);
+ for(str1 = str0; str1; str1 = str1->next) {
+ u = hddb_store_string(hddb, str1->str);
+ if(str->next || str1->next) u |= 1 << 31;
+ u = hddb_store_value(hddb, MAKE_DATA(FLAG_STRING, u));
+ if(idx == -1u) idx = u;
+ }
+ free_str(str0, 1);
+ }
+ }
+ else {
+ u = hddb_store_string(hddb, ((str_t *) hid->str.list.first)->str);
+ idx = hddb_store_value(hddb, MAKE_DATA(FLAG_STRING, u));
+ }
+ }
+
+ return idx;
+}
+
+
+void hddb_store_skey(hddb_data_t *hddb, skey_t *skey, unsigned *mask, unsigned *idx)
+{
+ int i, j, end;
+ unsigned ent;
+ hddb_data_t save_db = *hddb;
+
+ *mask = 0;
+ *idx = 0;
+
+ if(!skey) return;
+
+ for(i = 0; (unsigned) i < sizeof skey->hid / sizeof *skey->hid; i++) {
+ if(skey->hid[i]) {
+ ent = hddb_store_hid(hddb, skey->hid[i], i);
+ if(!*mask) *idx = ent;
+ *mask |= (1 << i);
+ }
+ }
+
+ if(!opt.no_compact) {
+ /* maybe there was an identical skey before... */
+ if(save_db.ids_len && hddb->ids_len > save_db.ids_len) {
+ j = hddb->ids_len - save_db.ids_len;
+ end = save_db.ids_len - j;
+ /* this is pretty slow, but avoids memmem() alignment problems */
+ for(i = 0; i < end; i++) {
+ if(!memcmp(hddb->ids + i, hddb->ids + save_db.ids_len, j * sizeof *hddb->ids)) {
+ /* remove new id entries and return existing entry */
+ hddb->ids_len = save_db.ids_len;
+ *idx = i;
+ break;
+ }
+ }
+ }
+ }
+}
+
+
+void hddb_store_list(hddb_data_t *hddb, hddb_list_t *list)
+{
+ if(!list || !list->key_mask || !list->value_mask) return;
+
+ if(hddb->list_len == hddb->list_max) {
+ hddb->list_max += 0x100; /* 4k steps */
+ hddb->list = realloc(hddb->list, hddb->list_max * sizeof *hddb->list);
+ }
+
+ hddb->list[hddb->list_len++] = *list;
+}
+
+
+void hddb_init(hddb_data_t *hddb, list_t *hd)
+{
+ item_t *item;
+ hddb_list_t db_list = {};
+ unsigned item_cnt;
+
+ for(item_cnt = 0, item = hd->first; item; item = item->next, item_cnt++) {
+
+ hddb_store_skey(hddb, item->key.first, &db_list.key_mask, &db_list.key);
+ hddb_store_skey(hddb, item->value, &db_list.value_mask, &db_list.value);
+
+ hddb_store_list(hddb, &db_list);
+ }
+}
+
+
+unsigned char *quote_string(unsigned char *str, int len)
+{
+ unsigned char *qstr;
+ int i, j;
+
+ if(!str || !len) return NULL;
+
+ qstr = new_mem(4 * len + 1); /* enough */
+
+ for(i = j = 0; i < len; i++) {
+ if(str[i] == '\\' || str[i] == '"' || str[i] == '?') {
+ qstr[j++] = '\\';
+ qstr[j++] = str[i];
+ }
+ else if(str[i] == '\n') {
+ qstr[j++] = '\\';
+ qstr[j++] = 'n';
+ }
+ else if(str[i] == '\t') {
+ qstr[j++] = '\\';
+ qstr[j++] = 't';
+ }
+ else if(str[i] < ' ') {
+ qstr[j++] = '\\';
+ qstr[j++] = (str[i] >> 6) + '0';
+ qstr[j++] = ((str[i] >> 3) & 7) + '0';
+ qstr[j++] = (str[i] & 7) + '0';
+ }
+ else {
+ qstr[j++] = str[i];
+ }
+ }
+
+ return qstr;
+}
+
+
+void write_cfile(FILE *f, list_t *hd)
+{
+ hddb_data_t hddb = {};
+ char *qstr;
+ unsigned u, qstr_len, len;
+
+ fprintf(logfh, "- building C version\n");
+ fflush(logfh);
+
+ hddb_init(&hddb, hd);
+
+ fprintf(logfh, " db size: %u bytes\n",
+ (unsigned) (sizeof hddb +
+ hddb.strings_len +
+ hddb.ids_len * sizeof *hddb.ids +
+ hddb.list_len * sizeof *hddb.list)
+ );
+
+ fprintf(f,
+ "static hddb_list_t hddb_internal_list[];\n"
+ "static unsigned hddb_internal_ids[];\n"
+ "static char hddb_internal_strings[];\n\n"
+ "hddb2_data_t hddb_internal = {\n"
+ " %u, %u, hddb_internal_list,\n"
+ " %u, %u, hddb_internal_ids,\n"
+ " %u, %u, hddb_internal_strings\n"
+ "};\n\n",
+ hddb.list_len, hddb.list_len,
+ hddb.ids_len, hddb.ids_len,
+ hddb.strings_len, hddb.strings_len
+ );
+
+ fprintf(f, "static hddb_list_t hddb_internal_list[%u] = {\n", hddb.list_len);
+ for(u = 0; u < hddb.list_len; u++) {
+ fprintf(f,
+ " { 0x%08x, 0x%08x, 0x%08x, 0x%08x }%s\n",
+ hddb.list[u].key_mask, hddb.list[u].value_mask,
+ hddb.list[u].key, hddb.list[u].value,
+ u + 1 == hddb.list_len ? "" : ","
+ );
+ }
+ fprintf(f, "};\n\n");
+
+ fprintf(f, "static unsigned hddb_internal_ids[%u] = {\n", hddb.ids_len);
+ for(u = 0; u < hddb.ids_len; u++) {
+ if((u % 6) == 0) fputc(' ', f);
+ fprintf(f, " 0x%08x", hddb.ids[u]);
+ if(u + 1 != hddb.ids_len) fputc(',', f);
+ if(u % 6 == 6 - 1 || u + 1 == hddb.ids_len) fputc('\n', f);
+ }
+ fprintf(f, "};\n\n");
+
+ qstr = quote_string(hddb.strings, hddb.strings_len);
+ qstr_len = qstr ? strlen(qstr) : 0;
+ fprintf(f, "static char hddb_internal_strings[%u] = \"\\\n", hddb.strings_len);
+ for(u = 0; u < qstr_len; ) {
+ len = qstr_len - u;
+ if(len > 72) len = 72;
+ while(len--) fputc(qstr[u++], f);
+ fprintf(f, "\\\n");
+ }
+ fprintf(f, "\";\n\n");
+
+ free_mem(qstr);
+
+ free_mem(hddb.list);
+ free_mem(hddb.ids);
+ free_mem(hddb.strings);
+}
+
+
--- /dev/null
+#! /usr/bin/perl
+
+use Getopt::Long;
+use XML::Writer;
+use XML::Parser;
+use IO;
+use Dumpvalue;
+
+sub help;
+
+sub read_name_file;
+sub read_driver_file;
+sub read_id_file;
+sub read_pcimap_file;
+sub read_usbmap_file;
+sub read_alias_file;
+sub read_modinfo_file;
+sub eisa_id;
+sub eisa_str;
+
+sub remove_nops;
+sub remove_duplicates;
+sub fix_driver_info;
+
+sub cmp_id;
+sub cmp_skey;
+sub cmp_item;
+
+sub match_id;
+sub match_skey;
+sub match_item;
+
+sub join_skey;
+
+sub split_item;
+
+sub get_xml_data;
+sub parse_xml_item;
+sub parse_xml_key;
+sub parse_xml_id;
+sub parse_xml_id_id;
+sub parse_xml_id_range;
+sub parse_xml_id_mask;
+sub parse_xml_driver;
+sub parse_xml_driver_display;
+sub parse_xml_driver_module;
+sub parse_xml_driver_mouse;
+sub parse_xml_driver_xfree;
+sub parse_xml_pair;
+sub parse_xml_cdata;
+sub idstr2value;
+
+sub dump2ids;
+sub dump2xml;
+sub dump_xml_item;
+sub dump_xml_names;
+sub dump_xml_drivers;
+sub id2xml;
+
+sub hd_dtd;
+sub hd_dtd_internal;
+
+$dump = new Dumpvalue();
+
+(
+ $he_other, $he_bus_id, $he_baseclass_id, $he_subclass_id, $he_progif_id,
+ $he_vendor_id, $he_device_id, $he_subvendor_id, $he_subdevice_id, $he_rev_id,
+ $he_bus_name, $he_baseclass_name, $he_subclass_name, $he_progif_name,
+ $he_vendor_name, $he_device_name, $he_subvendor_name, $he_subdevice_name,
+ $he_rev_name, $he_serial, $he_driver, $he_requires,
+ $he_nomask,
+ $he_driver_module_insmod, $he_driver_module_modprobe,
+ $he_driver_module_config, $he_driver_xfree, $he_driver_xfree_config,
+ $he_driver_mouse, $he_driver_display, $he_driver_any
+) = ( 0 .. 100 );
+$he_class_id = $he_nomask;
+
+@ent_names = (
+ "other", "bus.id", "baseclass.id", "subclass.id", "progif.id",
+ "vendor.id", "device.id", "subvendor.id", "subdevice.id", "rev.id",
+ "bus.name", "baseclass.name", "subclass.name", "progif.name",
+ "vendor.name", "device.name", "subvendor.name", "subdevice.name",
+ "rev.name", "serial", "driver", "requires",
+ "class.id", "driver.module.insmod", "driver.module.modprobe",
+ "driver.module.config", "driver.xfree", "driver.xfree.config",
+ "driver.mouse", "driver.display", "driver.any"
+);
+@ent_values{@ent_names} = ( 0 .. 100 );
+
+@xml_names = (
+ "other", "bus", "baseclass", "subclass", "progif",
+ "vendor", "device", "subvendor", "subdevice", "revision",
+ "bus", "baseclass", "subclass", "progif",
+ "vendor", "device", "subvendor", "subdevice",
+ "revision", "serial", "driver", "requires"
+);
+@xml_values{@xml_names} = ( 0 .. 100 );
+
+( $tag_none, $tag_pci, $tag_eisa, $tag_usb, $tag_special, $tag_pcmcia ) = ( 0 .. 5 );
+
+@tag_name = ( "", "pci", "eisa", "usb", "special", "pcmcia" );
+@tag_values{@tag_name} = ( 0 .. 5 );
+$tag_values{none} = 0;
+
+( $flag_id, $flag_range, $flag_mask, $flag_string, $flag_regexp ) = ( 0 .. 4 );
+$flag_cont = 8;
+
+# map usb modules to device classes
+%usbmod2class = (
+ 'ov511' => [ 0x10f, 0 ],
+ 'pwc' => [ 0x10f, 0 ],
+ 'hpusbscsi' => [ 0x10c, 0 ],
+ 'microtek' => [ 0x10c, 0 ],
+ 'scanner' => [ 0x10c, 0 ]
+);
+
+
+# options
+$opt_write_ids = 1;
+$opt_write_xml = 0;
+$opt_sort_ids = 0;
+$opt_sort_reverse = 0;
+$opt_sort_random = 0; # for testing
+$opt_split = 0;
+$opt_with_source = 0;
+$opt_fix_driver = 1;
+$opt_help = 0;
+$opt_internal_dtd = 0;
+
+$opt_ok = GetOptions(
+ 'ids' => \$opt_write_ids,
+ 'no-ids' => sub { $opt_write_ids = 0 },
+ 'xml' => \$opt_write_xml,
+ 'no-xml' => sub { $opt_write_xml = 0 },
+ 'sort' => \$opt_sort,
+ 'reverse' => \$opt_sort_reverse,
+ 'random' => \$opt_sort_random,
+ 'split' => \$opt_split,
+ 'with-source' => \$opt_with_source,
+ 'fix-driver' => \$opt_fix_driver,
+ 'no-fix-driver' => sub { $opt_fix_driver = 0 },
+ 'internal-dtd' => \$opt_internal_dtd,
+ 'help' => \&help
+) ;
+
+for $f (@ARGV) {
+ if(open F, $f) {
+ @f = (<F>);
+ close F;
+
+ # file format check
+
+ undef $format;
+
+ for (@f) {
+ if(/^\s*\<\?xml\s/) {
+ $format = 'xml';
+ last;
+ }
+
+ if(/^#\s+pci\s+module\s+vendor\s+device\s+subvendor\s+subdevice\s+class\s+class_mask\s+driver_data\s*$/) {
+ $format = 'pcimap';
+ last;
+ }
+
+ if(/^#\s+usb\s+module\s+match_flags\s+idVendor\s+idProduct\s+/) {
+ $format = 'usbmap';
+ last;
+ }
+
+ if(/^\s*alias\s+(pci|pnp|usb):\S+\s+\S+$/) {
+ $format = 'alias';
+ last;
+ }
+
+ if(/^\s*alias:\s+(pci|pnp|usb):\S+\s*$/) {
+ $format = 'modinfo';
+ last;
+ }
+
+ }
+
+ if(!$format) {
+ $i = join "|", map "\Q$_", @ent_names;
+ for (@f) {
+ if(/^\s*[+&|]?($i)\s/) {
+ $format = 'ids';
+ last;
+ }
+ }
+ }
+
+ if(!$format) {
+ for (@f) {
+ if(/^\t[a-z]\s/) {
+ $format = 'drivers';
+ last;
+ }
+ }
+ }
+
+ $format = 'names' if !$format;
+
+ if($format eq 'names') {
+
+ print STDERR "====== \"$f\": name info ======\n";
+ read_name_file $f, \@f;
+
+ }
+ elsif($format eq 'drivers') {
+
+ print STDERR "====== \"$f\": driver info ======\n";
+ read_driver_file $f, \@f;
+
+ }
+ elsif($format eq 'xml') {
+
+ print STDERR "====== \"$f\": xml info ======\n";
+ $xmlp = new XML::Parser(Style => 'Tree', ParseParamEnt => 1);
+ get_xml_data $xmlp->parsefile($f);
+
+ }
+ elsif($format eq 'ids') {
+
+ print STDERR "====== \"$f\": id info ======\n";
+ read_id_file $f, \@f;
+
+ }
+ elsif($format eq 'pcimap') {
+
+ print STDERR "====== \"$f\": pcimap info ======\n";
+ read_pcimap_file $f, \@f;
+
+ }
+ elsif($format eq 'usbmap') {
+
+ print STDERR "====== \"$f\": usbmap info ======\n";
+ read_usbmap_file $f, \@f;
+
+ }
+ elsif($format eq 'alias') {
+
+ print STDERR "====== \"$f\": alias info ======\n";
+ read_alias_file $f, \@f;
+
+ }
+ elsif($format eq 'modinfo') {
+
+ print STDERR "====== \"$f\": module info ======\n";
+ read_modinfo_file $f, \@f;
+
+ }
+ }
+ else {
+ die "$f: $!\n"
+ }
+}
+
+print STDERR "removing unnecessary items\n";
+remove_nops;
+
+print STDERR "got ${\scalar @hd} items\n";
+
+if($opt_fix_driver) {
+ fix_driver_info;
+}
+
+if($opt_split) {
+ print STDERR "splitting items\n";
+ for (@hd) {
+ push @hd_new, split_item($_);
+ }
+ @hd = @hd_new;
+ undef @hd_new;
+}
+
+if($opt_sort_ids) {
+ print STDERR "sorting\n";
+ if($opt_sort_random) {
+ @hd = sort { $cmp_item_cnt++, rand() <=> rand() } @hd;
+ }
+ elsif($opt_sort_reverse) {
+ @hd = sort { cmp_item $b, $a } @hd;
+ }
+ else {
+ @hd = sort { cmp_item $a, $b } @hd;
+ }
+}
+
+if($opt_write_ids) {
+ print STDERR "writing \"hd.ids\"\n";
+ dump2ids;
+}
+
+if($opt_write_xml) {
+ print STDERR "writing \"hd.xml\"\n";
+ dump2xml;
+}
+
+print STDERR "cmps: $cmp_item_cnt\n" if $cmp_item_cnt;
+
+# $dump->dumpValue( \@hd );
+
+
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+sub help
+{
+ print STDERR
+ "Usage: convert_hd [options] files\n" .
+ "Convert various hardware info to libhd/hwinfo internal format or to XML.\n" .
+ " --ids write internal format (default) to \"hd.ids\"\n" .
+ " --no-ids do not write internal format\n" .
+ " --xml write XML to \"hd.xml\", DTD to \"hd.dtd\"\n" .
+ " --no-xml do not write XML (default)\n" .
+ " --with-source add comment to each item indicating info source\n" .
+ " --internal-dtd generate internal dtd\n\n" .
+ " Note: for more sophisticated operations on hardware data use check_hd.\n";
+
+ exit 0;
+}
+
+
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+sub num
+{
+ return $_[0] =~ /^0/ ? oct $_[0] : return $_[0] + 0;
+}
+
+
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+#
+# read file with name/class info
+#
+# (either pciutils or SaX/SaX2 format)
+#
+
+sub read_name_file
+{
+ my ( $file_name, $file, $line, $sax_version, $tag, $id, $val, $ent );
+ my ( @id0, @id1, @id2, @id3, @id4, $raw, $opt, $ext, $srv, $str );
+ local $_;
+
+ my $rnf_add_id0 = sub
+ {
+ my ( $id0, $name0, $ent_id0, $ent_name0, $id, $val );
+
+ # note: $tag belongs to read_name_file()
+ ( $ent_id0, $ent_name0, $tag, $id0, $name0 ) = @_;
+
+ $ent = $ent_id0;
+
+ @id0 = ( $flag_id, $tag, $id0 );
+ undef @id1; undef @id2; undef @id3;
+
+ $id->[$ent_id0] = [ @id0 ];
+ $val->[$ent_name0] = [ $flag_string, $name0 ];
+
+ push @hd, [ "$file_name($line)", [ $id ], $val ];
+ };
+
+ my $rnf_add_bus = sub
+ {
+ $rnf_add_id0->($he_bus_id, $he_bus_name, 0, @_);
+ };
+
+ my $rnf_add_baseclass = sub
+ {
+ $rnf_add_id0->($he_baseclass_id, $he_baseclass_name, 0, @_);
+ };
+
+ my $rnf_add_vendor = sub
+ {
+ $rnf_add_id0->($he_vendor_id, $he_vendor_name, @_);
+ };
+
+ my $rnf_add_subdevice = sub
+ {
+ my ( $id2, $id3, $range, $name, $class, $id, $val );
+
+ ( $id2, $id3, $range, $name, $class ) = @_;
+
+ @id2 = ( $flag_id, $tag, $id2 );
+ @id3 = ( $flag_id, $tag, $id3 );
+ $id3[3] = $range if defined $range;
+
+ if($ent == $he_device_id || $ent == $he_subdevice_id) {
+ $ent = $he_subdevice_id;
+
+ $id->[$he_vendor_id] = [ @id0 ];
+ $id->[$he_device_id] = [ @id1 ];
+ $id->[$he_subvendor_id] = [ @id2 ];
+ $id->[$he_subdevice_id] = [ @id3 ];
+ $val->[$he_subdevice_name] = [ $flag_string, $name ];
+ if(defined $class) {
+ $val->[$he_baseclass_id] = [ $flag_id, $tag_none, $class >> 8 ];
+ $val->[$he_subclass_id] = [ $flag_id, $tag_none, $class & 0xff ];
+ }
+ }
+ else {
+ die "oops $file_name($line): subdevice id expected\n";
+ }
+
+ push @hd, [ "$file_name($line)", [ $id ], $val ];
+ };
+
+ ( $file_name, $file ) = @_;
+
+ $line = 0;
+ undef $sax_version;
+
+ for (@$file) {
+ $line++;
+ chomp;
+ s/\s*$//;
+ next if /^\s*[#;]/;
+ next if /^$/;
+
+ # SaX Identity file
+ if(/^NAME=(.+?)§DEVICE=(.+?)§VID=0x([0-9a-fA-F]+?)§DID=0x([0-9a-fA-F]+?)§SERVER=([^§]+)(§EXT=([^§]*))?(§OPT=([^§]*))?(§RAW=([^§]*))?$/) {
+ # 1 2 3 4 5 6 7 8 9 10 11
+
+ $rnf_add_vendor->($tag_pci, hex($3), $1);
+
+ @id0 = ( $flag_id, $tag, hex($3) );
+ @id1 = ( $flag_id, $tag, hex($4) );
+ @id3 = ( $flag_string, $2 );
+
+ $id = [];
+ $val = [];
+
+ $id->[$he_vendor_id] = [ @id0 ];
+ $id->[$he_device_id] = [ @id1 ];
+ $val->[$he_device_name] = [ @id3 ];
+
+ push @hd, [ "$file_name($line)", [ $id ], $val ];
+
+ ( $srv, $ext, $opt, $raw ) = ( $5, $7, $9, $11 );
+ $sax_tmp = $srv =~ /^3DLABS|MACH64|P9000|RUSH|S3|SVGA|TGA$/ ? 1 : 2;
+ $sax_version = $sax_tmp unless defined $sax_version;
+ die "line has SaX$sax_tmp format (expected SaX$sax_version): $file_name($line)\n" if $sax_tmp != $sax_version;
+
+ $id = [];
+ $val = [];
+
+ $id->[$he_vendor_id] = [ @id0 ];
+ $id->[$he_device_id] = [ @id1 ];
+
+ if($opt) {
+ $str = join "|", ( $sax_version == 1 ? 3 : 4, $srv, undef, undef, $ext, $opt );
+ }
+ elsif($ext) {
+ $str = join "|", ( $sax_version == 1 ? 3 : 4, $srv, undef, undef, $ext );
+ }
+ else {
+ $str = join "|", ( $sax_version == 1 ? 3 : 4, $srv );
+ }
+
+ @id4 = ( "x\t$str" );
+ if($raw) {
+ for $str (split /,/, $raw) { $id4[0] .= "\x00X\t$str" }
+ }
+
+ $val->[$he_driver] = [ $flag_string, @id4 ];
+
+ push @hd, [ "$file_name($line)", [ $id ], $val ];
+ }
+
+ elsif(/^B\s+([0-9a-fA-F]+)\s+(.*?)\s*$/) {
+
+ $rnf_add_bus->(hex($1), $2);
+
+ }
+
+ elsif(/^C\s+([0-9a-fA-F]+)\s+(.*?)\s*$/) {
+
+ $rnf_add_baseclass->(hex($1), $2);
+
+ }
+
+ elsif(/^([0-9a-fA-F]{4})(\s+(.*?))?\s*$/) {
+
+ $rnf_add_vendor->($tag_pci, hex($1), $3);
+
+ }
+
+ elsif(/^u([0-9a-fA-F]{4})(\s+(.*?))?\s*$/) {
+
+ $rnf_add_vendor->($tag_usb, hex($1), $3);
+
+ }
+
+ elsif(/^s([0-9a-fA-F]{4})(\s+(.*?))?\s*$/) {
+
+ $rnf_add_vendor->($tag_special, hex($1), $3);
+
+ }
+
+ elsif(/^([A-Z_@]{3})(\s+(.*?))?\s*$/) {
+
+ $rnf_add_vendor->($tag_eisa, eisa_id($1), $3);
+
+ }
+
+ elsif(/^\t([0-9a-fA-F]{1,4})(\+([0-9a-fA-F]+))?(\.([0-9a-fA-F]+))?(\s+(.*?))?\s*$/) {
+
+ $range = $3 ? hex($3) : undef;
+ $class = $5 ? hex($5) : undef;
+
+ @id1 = ( $flag_id, $tag, hex($1) );
+ $id1[3] = $range if defined $range;
+ undef @id2; undef @id3;
+
+ $id = [];
+ $val = [];
+
+ if($ent == $he_baseclass_id || $ent == $he_subclass_id) {
+ $ent = $he_subclass_id;
+
+ $id->[$he_baseclass_id] = [ @id0 ];
+ $id->[$he_subclass_id] = [ @id1 ];
+ $val->[$he_subclass_name] = [ $flag_string, $7 ];
+ }
+ elsif($ent == $he_vendor_id || $ent == $he_device_id || $ent == $he_subdevice_id) {
+ $ent = $he_device_id;
+
+ $id->[$he_vendor_id] = [ @id0 ];
+ $id->[$he_device_id] = [ @id1 ];
+ $val->[$he_device_name] = [ $flag_string, $7 ];
+ if(defined $class) {
+ $val->[$he_baseclass_id] = [ $flag_id, $tag_none, $class >> 8 ];
+ $val->[$he_subclass_id] = [ $flag_id, $tag_none, $class & 0xff ];
+ }
+ }
+ else {
+ die "oops $file_name($line): device id expected\n";
+ }
+
+ push @hd, [ "$file_name($line)", [ $id ], $val ];
+
+ }
+
+ elsif($ent == $he_subclass_id && /^\t\t([0-9a-fA-F]+)\s+(.*?)\s*$/) {
+
+ @id2 = ( $flag_id, $tag, hex($1) );
+ undef @id3;
+
+ $id = [];
+ $val = [];
+
+ $id->[$he_baseclass_id] = [ @id0 ];
+ $id->[$he_subclass_id] = [ @id1 ];
+ $id->[$he_progif_id] = [ @id2 ];
+ $val->[$he_progif_name] = [ $flag_string, $2 ];
+
+ push @hd, [ "$file_name($line)", [ $id ], $val ];
+
+ }
+
+ elsif(/^\t\t([0-9a-fA-F]{4})\s+([0-9a-fA-F]{4})(\+([0-9a-fA-F]+))?(\.([0-9a-fA-F]+))?(\s+(.*?))?\s*$/) {
+
+ $rnf_add_subdevice->(hex($1), hex($2), $4 ? hex($4) : undef, $8, $6 ? hex($6) : undef);
+
+ }
+
+ elsif(/^\t\t([A-Z_@]{3})\s+([0-9a-fA-F]{4})(\+([0-9a-fA-F]+))?(\.([0-9a-fA-F]+))?(\s+(.*?))?\s*$/) {
+
+ $rnf_add_subdevice->(eisa_id($1), hex($2), $4 ? hex($4) : undef, $8, $6 ? hex($6) : undef);
+
+ }
+
+ elsif(/^\t\t([0-9a-fA-F]{4})([0-9a-fA-F]{4})\s+(.*?)\s*$/) {
+
+ # NOTE: subvendor & subdevice ids are reversed!
+ $rnf_add_subdevice->(hex($2), hex($1), undef, $3);
+
+ }
+
+ else {
+ die "invalid line: $file_name($line)\n";
+ }
+ }
+}
+
+
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+#
+# read file with driver info
+#
+
+sub read_driver_file
+{
+ my ( $line, @drv, $file, $file_name, $drv_type, $tag );
+ local $_;
+
+ my $rdf_save_drv = sub
+ {
+ if($drv_type) {
+ push @hd, [ @drv ] if defined @drv;
+ @drv = ( "$file_name($line)" );
+ $drv[2][$he_driver] = [ $flag_string ];
+ $drv_type = undef;
+ }
+ };
+
+ my $rdf_add_id = sub
+ {
+ my ( $tag, $id0, $id1, $range1, $id2, $id3, $range3, $id );
+
+ ( $tag, $id0, $id1, $range1, $id2, $id3, $range3 ) = @_;
+
+ $rdf_save_drv->();
+
+ $id = [];
+
+ @id0 = ( $flag_id, $tag, $id0 );
+ @id1 = ( $flag_id, $tag, $id1 );
+ $id1[3] = $range1 if defined $range1;
+
+ $id->[$he_vendor_id] = [ @id0 ];
+ $id->[$he_device_id] = [ @id1 ];
+
+ if(defined $id2) {
+ @id2 = ( $flag_id, $tag, $id2 );
+ @id3 = ( $flag_id, $tag, $id3 );
+ $id3[3] = $range3 if defined $range3;
+
+ $id->[$he_subvendor_id] = [ @id2 ];
+ $id->[$he_subdevice_id] = [ @id3 ];
+ }
+ push @{$drv[1]}, $id;
+ };
+
+ ( $file_name, $file ) = @_;
+
+ $drv_type = 1;
+
+ for (@$file) {
+ $line++;
+ chomp;
+ s/\s*$//;
+ next if /^[#;]/;
+ next if /^$/;
+
+ if(/^([us]?)([0-9a-fA-F]{4})\s+([0-9a-fA-F]{4})(\+([0-9a-fA-F]+))?\s*$/) {
+
+ $tag = $tag_pci;
+ $tag = $tag_usb if $1 eq 'u';
+ $tag = $tag_special if $1 eq 's';
+
+ $rdf_add_id->($tag, hex($2), hex($3), $5 ? hex($5) : undef);
+
+ }
+
+ elsif(/^([A-Z_@]{3})\s+([0-9a-fA-F]{4})(\+([0-9a-fA-F]+))?\s*$/) {
+
+ $rdf_add_id->($tag_eisa, eisa_id($1), hex($2), $4 ? hex($4) : undef);
+
+ }
+
+ elsif(/^([us]?)([0-9a-fA-F]{4})\s+([0-9a-fA-F]{4})(\+([0-9a-fA-F]+))?\s+([us]?)([0-9a-fA-F]{4})\s+([0-9a-fA-F]{4})(\+([0-9a-fA-F]+))?\s*$/) {
+
+ $tag = $tag_pci;
+ $tag = $tag_usb if $1 eq 'u';
+ $tag = $tag_special if $1 eq 's';
+
+ $rdf_add_id->($tag, hex($2), hex($3), $5 ? hex($5) : undef, hex($7), hex($8), $10 ? hex($10) : undef);
+
+ }
+
+ elsif(/^([A-Z_@]{3})\s+([0-9a-fA-F]{4})(\+([0-9a-fA-F]+))?\s+([A-Z_@]{3})\s+([0-9a-fA-F]{4})(\+([0-9a-fA-F]+))?\s*$/) {
+
+ $rdf_add_id->($tag_eisa, eisa_id($1), hex($2), $4 ? hex($4) : undef, eisa_id($5), hex($6), $8 ? hex($8) : undef);
+
+ }
+
+ elsif(/^\t([a-z])\s+(.*?)\s*$/) {
+
+ push @{$drv[2][$he_driver]}, "$1\t$2";
+ $drv_type = $1;
+
+ }
+
+ elsif($drv_type && /^\t\t\s*(.*)$/) {
+
+ $drv_type = "X" if $drv_type eq "x";
+ $drv_type = "M" if $drv_type eq "m";
+ $drv[2][$he_driver][-1] .= "\x00$drv_type\t$1";
+
+ }
+
+ else {
+ die "invalid line: $file_name($line)\n";
+ }
+ }
+
+ $rdf_save_drv->();
+}
+
+
+sub num
+{
+ return $_[0] =~ /^0/ ? oct $_[0] : return $_[0] + 0;
+}
+
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+#
+# read file with id info
+#
+
+sub read_id_file
+{
+ my ( $line, $file, $file_name, $tag, $pre, $fields, @item, @id, $state, $keyid );
+ my ( $is_id, $i );
+ local $_;
+
+ my $rif_save_item = sub
+ {
+ if(@item > 1) {
+ push @hd, [ @item ];
+ }
+ @item = ( "$file_name($line)" );
+ };
+
+ # parse id field
+ my $str2id = sub
+ {
+ my ($val, $id, $tag, $mask, $range, @id);
+
+ $val = shift;
+
+ if($val =~ s/^(${\join '|', @tag_name})\s+//o) {
+ die "internal oops: $file_name($line)\n" unless exists $tag_values{$1};
+ $tag = $tag_values{$1};
+ }
+ else {
+ $tag = 0;
+ }
+
+ if($val =~ /^\s*(\S+)\s*([&+])\s*(\S+)\s*$/) {
+ $id = $1;
+ if($2 eq "+") {
+ $range = $3;
+ }
+ else {
+ $mask = $3;
+ }
+ }
+ else {
+ $id = $val;
+ }
+
+ if(defined $range) {
+ if($range =~ /^(0x[0-9a-zA-Z]+|\d+)$/) {
+ $range = num $range;
+ }
+ else {
+ die "$file_name($line): invalid range\n"
+ }
+ }
+
+ if(defined $mask) {
+ if($mask =~ /^(0x[0-9a-zA-Z]+|\d+)$/) {
+ $mask = num $mask;
+ }
+ else {
+ die "$file_name($line): invalid mask\n"
+ }
+ }
+
+ if($id =~ /^(0x[0-9a-zA-Z]+|\d+)$/) {
+ $id = num $id;
+ }
+ elsif(($tag == $tag_none || $tag == $tag_eisa) && $id =~ /^[A-Z_@]{3}$/) {
+ $id = eisa_id $id;
+ $tag = $tag_eisa;
+ }
+ else {
+ die "$file_name($line): invalid id\n"
+ }
+
+ @id = ( $flag_id, $tag, $id );
+ $id[3] = $range if defined $range;
+ $id[4] = $mask if defined $mask;
+
+ return \@id;
+ };
+
+ ( $file_name, $file ) = @_;
+
+ $fields = join "|", map "\Q$_", @ent_names;
+
+ $state = 0;
+
+ $rif_save_item->();
+
+ for (@$file) {
+ $line++;
+ chomp;
+ s/\s*$//;
+ next if /^\s*[#;]/;
+ next if /^$/;
+
+ if(/^\s*([+&|]?)($fields)\s+(.+)/) {
+ ($pre, $key, $val) = ($1, $2, $3);
+ # print ">$pre< $is_id>$key< >$val<\n";
+ die "internal oops: $file_name($line)\n" unless exists $ent_values{$key};
+ $keyid = $ent_values{$key};
+ $is_id = $keyid < $he_nomask && $key =~ /\.id$/ ? 1 : 0;
+ }
+ else {
+ die "invalid line: $file_name($line)\n";
+ }
+
+ if($pre eq "") {
+ die "invalid line: $file_name($line)\n" unless $state == 0 || $state == 2;
+ if($state == 2) {
+ $item[2] = [ @id ];
+ undef @id;
+ }
+ $rif_save_item->();
+ $state = 1;
+ }
+ elsif($pre eq "|") {
+ die "invalid line: $file_name($line)\n" unless $state == 1;
+ push @{$item[1]}, [ @id ];
+ undef @id;
+ }
+ elsif($pre eq "&") {
+ die "invalid line: $file_name($line)\n" unless $state == 1;
+ }
+ elsif($pre eq "+") {
+ die "invalid line: $file_name($line)\n" unless $state == 1 || $state == 2;
+ if($state == 1) {
+ push @{$item[1]}, [ @id ];
+ undef @id;
+ }
+ $state = 2;
+ }
+ else {
+ die "internal oops: $file_name($line)\n";
+ }
+
+ if($is_id) {
+ $id[$keyid] = $str2id->($val);
+ }
+ elsif($keyid < $he_nomask) {
+ $id[$keyid] = [ $flag_string, $val ];
+ }
+ elsif($keyid == $he_class_id) {
+ $i = ${$str2id->($val)}[2];
+ $id[$he_baseclass_id] = [ $flag_id, $tag_none, $i >> 8 ];
+ $id[$he_subclass_id] = [ $flag_id, $tag_none, $i & 0xff ];
+ }
+ else {
+ undef $i;
+ if($keyid == $he_driver_module_insmod) {
+ $i = "i";
+ }
+ elsif($keyid == $he_driver_module_modprobe) {
+ $i = "m";
+ }
+ elsif($keyid == $he_driver_module_config) {
+ $i = "M";
+ }
+ elsif($keyid == $he_driver_xfree) {
+ $i = "x";
+ }
+ elsif($keyid == $he_driver_xfree_config) {
+ $i = "X";
+ }
+ elsif($keyid == $he_driver_mouse) {
+ $i = "p";
+ }
+ elsif($keyid == $he_driver_display) {
+ $i = "d";
+ }
+ elsif($keyid == $he_driver_any) {
+ $i = "a";
+ }
+ else {
+ die "unhandled entry: $file_name($line)\n"
+ }
+ $val = "$i\t$val";
+ if(!defined $id[$he_driver]) {
+ $id[$he_driver] = [ $flag_string ];
+ }
+ if($i eq "X" || $i eq "M") {
+ $id[$he_driver]->[-1] .= "\x00$val"
+ }
+ else {
+ push @{$id[$he_driver]}, $val;
+ }
+ }
+ }
+
+ if($state == 2) {
+ $item[2] = [ @id ];
+ undef @id;
+ }
+
+ $rif_save_item->();
+}
+
+
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+#
+# read pcimap file
+#
+
+sub read_pcimap_file
+{
+ my (@l, $id, $n, $key, $val, $mask);
+ local $_;
+
+ ( $file_name, $file ) = @_;
+
+ for (@$file) {
+ $line++;
+ chomp;
+ s/\s*$//;
+ next if /^\s*#/;
+ next if /^$/;
+
+ @l = split;
+
+ die "invalid line: $file_name($line)\n" unless @l == 8;
+
+ $val = [];
+
+ $val->[$he_driver] = [ $flag_string, "m\t$l[0]" ];
+
+ $key = [];
+
+ $key->[$he_vendor_id] = [ $flag_id, $tag_pci, $n ] if ($n = num $l[1]) != 0xffffffff;
+ $key->[$he_device_id] = [ $flag_id, $tag_pci, $n ] if ($n = num $l[2]) != 0xffffffff;
+ $key->[$he_subvendor_id] = [ $flag_id, $tag_pci, $n ] if ($n = num $l[3]) != 0xffffffff;
+ $key->[$he_subdevice_id] = [ $flag_id, $tag_pci, $n ] if ($n = num $l[4]) != 0xffffffff;
+
+ $n = num $l[6];
+
+ if($mask = ($n >> 16) & 0xff) {
+ $key->[$he_baseclass_id] = [ $flag_id, $tag_none, (num($l[5]) >> 16) & 0xff ];
+ if($mask != 0xff) {
+ $key->[$he_baseclass_id][4] = (~$mask & 0xff);
+ }
+ }
+
+ if($mask = ($n >> 8) & 0xff) {
+ $key->[$he_subclass_id] = [ $flag_id, $tag_none, (num($l[5]) >> 8) & 0xff ];
+ if($mask != 0xff) {
+ $key->[$he_subclass_id][4] = (~$mask & 0xff);
+ }
+ }
+
+ if($mask = $n & 0xff) {
+ $key->[$he_progif_id] = [ $flag_id, $tag_none, num($l[5]) & 0xff ];
+ if($mask != 0xff) {
+ $key->[$he_progif_id][4] = (~$mask & 0xff);
+ }
+ }
+
+ push @hd, [ "$file_name($line)", [ $key ], $val ];
+ }
+}
+
+
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+#
+# read usbmap file
+#
+
+sub read_usbmap_file
+{
+ my (@l, $id, $n, $key, $val, $mask);
+ local $_;
+
+ ( $file_name, $file ) = @_;
+
+ for (@$file) {
+ $line++;
+ chomp;
+ s/\s*$//;
+ next if /^\s*#/;
+ next if /^$/;
+
+ @l = split;
+
+ die "invalid line: $file_name($line)\n" unless @l == 13;
+
+ next if num($l[1]) != 3; # match_flags != 3
+
+ $val = [];
+
+ $key = [];
+
+ $key->[$he_vendor_id] = [ $flag_id, $tag_usb, num($l[2]) ];
+ $key->[$he_device_id] = [ $flag_id, $tag_usb, num($l[3]) ];
+
+ $val->[$he_driver] = [ $flag_string, "m\t$l[0]" ];
+
+ if($usbmod2class{$l[0]}) {
+ $val->[$he_baseclass_id] = [ $flag_id, $tag_none, $usbmod2class{$l[0]}[0] ] if defined $usbmod2class{$l[0]}[0];
+ $val->[$he_subclass_id] = [ $flag_id, $tag_none, $usbmod2class{$l[0]}[1] ] if defined $usbmod2class{$l[0]}[1];
+ }
+
+ push @hd, [ "$file_name($line)", [ $key ], $val ];
+ }
+}
+
+
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+#
+# read alias file
+#
+
+sub read_alias_file
+{
+ my ($f, $id, $n, $key, $val, $mask, $tag, $module, $spec, $t1, $t2);
+ local $_;
+
+ $f = '[0-9A-F*]+';
+
+ ( $file_name, $file ) = @_;
+
+ for (@$file) {
+ $line++;
+ chomp;
+ s/\s*$//;
+ next if /^\s*#/;
+ next if /^$/;
+
+ next unless /^\s*alias\s+(pci|pnp|usb):(\S+)\s+(\S+)/;
+
+ $tag = $tag_pci if $1 eq 'pci';
+ $tag = $tag_eisa if $1 eq 'pnp';
+ $tag = $tag_usb if $1 eq 'usb';
+
+ $spec = $2;
+ $module = $3;
+
+ $val = [];
+
+ $val->[$he_driver] = [ $flag_string, "m\t$module" ];
+
+ $key = [];
+
+ if($spec =~ /^v($f)d($f)sv($f)sd($f)bc($f)sc($f)i($f)$/ ) {
+ $key->[$he_vendor_id] = [ $flag_id, $tag, hex $1 ] if $1 ne '*';
+ $key->[$he_device_id] = [ $flag_id, $tag, hex $2 ] if $2 ne '*';
+ $key->[$he_subvendor_id] = [ $flag_id, $tag, hex $3 ] if $3 ne '*';
+ $key->[$he_subdevice_id] = [ $flag_id, $tag, hex $4 ] if $4 ne '*';
+ $key->[$he_baseclass_id] = [ $flag_id, $tag_none, hex $5 ] if $5 ne '*';
+ $key->[$he_subclass_id] = [ $flag_id, $tag_none, hex $6 ] if $6 ne '*';
+ $key->[$he_progif_id] = [ $flag_id, $tag_none, hex $7 ] if $7 ne '*';
+
+ push @hd, [ "$file_name($line)", [ $key ], $val ];
+ }
+ elsif($spec =~ /^v($f)p($f)dl($f)dh($f)dc($f)dsc($f)dp($f)ic($f)isc($f)ip($f)$/ ) {
+
+ if(
+ $3 == '*' && $4 == '*' && $5 == '*' &&
+ $6 == '*' && $7 == '*' && $8 == '*' &&
+ $9 == '*' && $10 == '*'
+ ) {
+ $key->[$he_vendor_id] = [ $flag_id, $tag, hex $1 ] if $1 ne '*';
+ $key->[$he_device_id] = [ $flag_id, $tag, hex $2 ] if $2 ne '*';
+
+ push @hd, [ "$file_name($line)", [ $key ], $val ];
+ }
+ }
+ elsif($spec =~ /^[c|d](\S{3})([0-9a-fA-FX]{4})/ ) {
+ $t1 = $1;
+ $t2 = $2;
+
+ if($t1 =~ /[\@A-Z\[\\\]\^_]{3}/ && $t2 ne 'XXXX') {
+ $key->[$he_vendor_id] = [ $flag_id, $tag, eisa_id $t1 ];
+ $key->[$he_device_id] = [ $flag_id, $tag, hex $t2 ];
+
+ push @hd, [ "$file_name($line)", [ $key ], $val ];
+ }
+ }
+ else {
+ die "invalid line: $file_name($line)\n"
+ }
+ }
+}
+
+
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+#
+# read modinfo data
+#
+
+sub read_modinfo_file
+{
+ my ($f, $id, $n, $key, $val, $mask, $tag, $module, $spec, $t1, $t2);
+ local $_;
+
+ $f = '[0-9A-F*]+';
+
+ ( $file_name, $file ) = @_;
+
+ for (@$file) {
+ $line++;
+ chomp;
+ s/\s*$//;
+ next if /^\s*#/;
+ next if /^$/;
+
+ if(m#([^/]+)\.ko:$#) {
+ $module = $1;
+ next;
+ }
+
+ next unless /^\s*alias:\s+(pci|pnp|usb):(\S+)\s*$/;
+
+ $tag = $tag_pci if $1 eq 'pci';
+ $tag = $tag_eisa if $1 eq 'pnp';
+ $tag = $tag_usb if $1 eq 'usb';
+
+ $spec = $2;
+
+ $val = [];
+
+ $val->[$he_driver] = [ $flag_string, "m\t$module" ];
+
+ $key = [];
+
+ if($spec =~ /^v($f)d($f)sv($f)sd($f)bc($f)sc($f)i($f)$/ ) {
+ $key->[$he_vendor_id] = [ $flag_id, $tag, hex $1 ] if $1 ne '*';
+ $key->[$he_device_id] = [ $flag_id, $tag, hex $2 ] if $2 ne '*';
+ $key->[$he_subvendor_id] = [ $flag_id, $tag, hex $3 ] if $3 ne '*';
+ $key->[$he_subdevice_id] = [ $flag_id, $tag, hex $4 ] if $4 ne '*';
+ $key->[$he_baseclass_id] = [ $flag_id, $tag_none, hex $5 ] if $5 ne '*';
+ $key->[$he_subclass_id] = [ $flag_id, $tag_none, hex $6 ] if $6 ne '*';
+ $key->[$he_progif_id] = [ $flag_id, $tag_none, hex $7 ] if $7 ne '*';
+
+ push @hd, [ "$file_name($line)", [ $key ], $val ];
+ }
+ elsif($spec =~ /^v($f)p($f)dl($f)dh($f)dc($f)dsc($f)dp($f)ic($f)isc($f)ip($f)$/ ) {
+
+ if(
+ $3 == '*' && $4 == '*' && $5 == '*' &&
+ $6 == '*' && $7 == '*' && $8 == '*' &&
+ $9 == '*' && $10 == '*'
+ ) {
+ $key->[$he_vendor_id] = [ $flag_id, $tag, hex $1 ] if $1 ne '*';
+ $key->[$he_device_id] = [ $flag_id, $tag, hex $2 ] if $2 ne '*';
+
+ push @hd, [ "$file_name($line)", [ $key ], $val ];
+ }
+ }
+ elsif($spec =~ /^[c|d](\S{3})([0-9a-fA-FX]{4})/ ) {
+ $t1 = $1;
+ $t2 = $2;
+
+ if($t1 =~ /[\@A-Z\[\\\]\^_]{3}/ && $t2 ne 'XXXX') {
+ $key->[$he_vendor_id] = [ $flag_id, $tag, eisa_id $t1 ];
+ $key->[$he_device_id] = [ $flag_id, $tag, hex $t2 ];
+
+ push @hd, [ "$file_name($line)", [ $key ], $val ];
+ }
+ }
+ else {
+ die "invalid line: $file_name($line)\n"
+ }
+ }
+}
+
+
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+#
+# convert 3-letter eisa id to number
+#
+
+sub eisa_id
+{
+ my ( $str, $id, $i, $j );
+
+ $str = shift;
+ $id = 0;
+
+ die "internal oops" unless length($str) == 3;
+ for($i = 0; $i < 3; $i++) {
+ $id <<= 5;
+ $j = ord substr $str, $i, 1;
+ $j -= ord('A') - 1;
+ die "internal oops" unless $j >= 0 && $j <= 0x1f;
+ $id += $j;
+ }
+
+ return $id;
+}
+
+
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+#
+# convert numerical eisa id to 3-letter string
+#
+
+sub eisa_str
+{
+ my ( $id, $str );
+
+ $id = shift;
+
+ die "internal oops: eisa id \"$id\"" unless $id >= 0 && $id <= 0x7fff;
+
+ $str = chr((($id >> 10) & 0x1f) + ord('A') - 1);
+ $str .= chr((($id >> 5) & 0x1f) + ord('A') - 1);
+ $str .= chr(( $id & 0x1f) + ord('A') - 1);
+
+ return $str;
+}
+
+
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+#
+# remove entries that have no effect
+#
+
+sub remove_nops
+{
+ my ($hd, $id, $f, $i, $cf);
+ local $_;
+
+ for $hd (@hd) {
+ if(!defined($hd->[1]) || !@{$hd->[1]} || !defined($hd->[2]) || !@{$hd->[2]}) {
+ undef $hd;
+ next;
+ }
+ for $id (@{$hd->[1]}, $hd->[2]) {
+ if(defined($id)) {
+ $cf = 0;
+ for $f (@$id) {
+ if(defined $f) {
+ $cf++;
+ if(@$f == 2 && $f->[0] == $flag_string && $f->[1] eq "") {
+ undef $f;
+ $cf--;
+ }
+ }
+ }
+ undef $id if !$cf;
+ }
+ }
+ if(!defined($hd->[1]) || !@{$hd->[1]} || !defined($hd->[2]) || !@{$hd->[2]}) {
+ print STDERR "$hd->[0] has no info, dropped\n";
+ undef $hd;
+ next;
+ }
+ }
+
+ @hd = grep { defined } @hd;
+}
+
+
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+#
+# remove duplicate entries
+#
+
+sub remove_duplicates
+{
+ my ($hd, $hd0, $hd1, $len, $i, $j, $m, $v, $buf, $errors, $drop);
+ local $_;
+
+ $len = @hd;
+
+ for($j = 0; $j < $len; $j++) {
+ print STDERR ">> $j\r";
+ $hd0 = \$hd[$j];
+ for($i = $j + 1; $i < $len; $i++) {
+ $hd1 = \$hd[$i];
+ $m = match_item $$hd0, $$hd1;
+ # print "$$hd0->[0] -- $$hd1->[0]: $m\n";
+ if($m) {
+ $drop = cmp_item $$hd0, $$hd1;
+ $drop = !$drop || abs($drop) == 2 ? ", dropped" : undef;
+ undef $buf;
+ # print STDERR "j: $$hd0->[0], $$hd1->[0]\n";
+ $v = join_skey $$hd0->[2], $$hd1->[2], \$buf, \$errors;
+ if($errors) {
+ print STDERR "$$hd1->[0] conflicts with $$hd0->[0]$drop:\n$buf\n";
+ $$hd1 = undef if $drop;
+ }
+ else {
+ if($drop) {
+ print STDERR "$$hd1->[0] added to $$hd0->[0] and dropped\n";
+ $$hd0->[2] = $v;
+# $$hd1 = undef;
+ }
+ else {
+ print STDERR "$$hd1->[0] shadowed by $$hd0->[0]\n";
+ $$hd0->[2] = $v;
+ }
+ }
+ }
+ }
+ }
+
+ @hd = grep { defined } @hd;
+
+ for $hd (@hd) {
+ if(
+ !defined($hd->[2]) ||
+ !defined($hd->[2][$he_driver]) ||
+ !(defined($hd->[2][$he_device_name]) || defined($hd->[2][$he_subdevice_name]))
+ ) {
+ undef $hd;
+ next;
+ }
+ }
+
+ @hd = grep { defined } @hd;
+
+}
+
+
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+#
+# remove duplicate entries
+#
+
+sub remove_duplicatesx
+{
+ my ($hd0, $hd1, $len, $i, $j, $m, $v, $buf, $errors, $drop);
+ local $_;
+
+ $len = @hd;
+
+ for($j = 0; $j < $len; $j++) {
+ print STDERR ">> $j\r";
+ $hd0 = \$hd[$j];
+ for($i = $j + 1; $i < $len; $i++) {
+ $hd1 = \$hd[$i];
+ $m = match_item $$hd0, $$hd1;
+ # print "$$hd0->[0] -- $$hd1->[0]: $m\n";
+ if($m) {
+ $drop = cmp_item $$hd0, $$hd1;
+ $drop = !$drop || abs($drop) == 2 ? ", dropped" : undef;
+ undef $buf;
+ $v = join_skey $$hd0->[2], $$hd1->[2], \$buf, \$errors;
+ if($errors) {
+ print STDERR "$$hd1->[0] conflicts with $$hd0->[0]$drop:\n$buf\n";
+ $$hd1 = undef if $drop;
+ }
+ else {
+ if($drop) {
+ print STDERR "$$hd1->[0] added to $$hd0->[0] and dropped\n";
+ $$hd0->[2] = $v;
+ $$hd1 = undef;
+ }
+ else {
+ print STDERR "$$hd1->[0] shadowed by $$hd0->[0]\n";
+ }
+ }
+ }
+ }
+ }
+
+ @hd = grep { defined } @hd;
+}
+
+
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+#
+# fix drive info
+#
+
+sub fix_driver_info
+{
+ my ($hd, $hid, $drv, $i, @i, @info, @req, %req);
+
+ for $hd (@hd) {
+ if(
+ !defined($hd->[2]) ||
+ !defined($hd->[2][$he_driver])
+ ) {
+ next;
+ }
+ $hid = $hd->[2][$he_driver];
+ next unless $hid->[0] == $flag_string;
+
+ undef @req;
+
+ for $drv (@$hid[1 .. @$hid - 1]) {
+ @i = split /\x00/, $drv;
+ for $i (@i) {
+ next if $i =~ /^[MX]\t/;
+ $i =~ s/\|+$//;
+ next unless $i =~ /^x\t/;
+ @info = split /\|/, $i;
+ # remove leasding 'XF86_' from server name
+ $info[1] =~ s/^XF86_// if $info[1];
+ # sort package, extension and option lists
+ push @req, split /,/, $info[3] if $info[3];
+ # $info[3] = join ',', sort split /,/, $info[3] if $info[3];
+ $info[3] = undef if $info[3];
+ $info[4] = join ',', sort split /,/, $info[4] if $info[4];
+ $info[5] = join ',', sort split /,/, $info[5] if $info[5];
+ $info[6] = join ',', sort { $a <=> $b } split /,/, $info[6] if $info[6];
+ $i = join '|', @info;
+ }
+ $drv = join "\x00", @i;
+ # print ">$drv<\n"
+ }
+
+ if(@req) {
+ $hid = $hd->[2][$he_requires];
+ if($hid) {
+ if($hid->[0] != $flag_string) {
+ die "oops, invalid data"
+ }
+ push @req, split /\|/, $hid->[1];
+ $hid->[1] = join '|', @req;
+ }
+ else {
+ $hd->[2][$he_requires] = [ $flag_string, join('|', @req) ];
+ }
+ }
+ }
+
+ for $hd (@hd) {
+ if(
+ !defined($hd->[2]) ||
+ !defined($hd->[2][$he_requires])
+ ) {
+ next;
+ }
+ $hid = $hd->[2][$he_requires];
+ next unless $hid->[0] == $flag_string;
+
+ undef @req;
+ undef %req;
+
+ @req = split /\|/, $hid->[1];
+ @req{@req} = @req;
+
+ $hid->[1] = join '|', sort keys %req;
+ }
+}
+
+
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+#
+# hd: [ "source", [ skey, skey, ... ], [ val ] ]
+# skey/val: [ ... , id, ..., id, ... ]
+# id: [ $flag_id, $tag, $value, $range, $mask ]
+# id: [ $flag_string, "str", "str", ... ]
+
+sub cmp_id
+{
+ my ($id0, $id1, $len0, $len1, $len, $i, $k);
+
+ ($id0, $id1) = @_;
+
+ return 0 if !defined($id0) && !defined($id1);
+ return -1 if !defined($id0);
+ return 1 if !defined($id1);
+
+ if($id0->[0] != $id1->[0]) {
+ return $id0->[0] <=> $id1->[0];
+ }
+
+ $len0 = @$id0;
+ $len1 = @$id1;
+ $len = $len0 < $len1 ? $len0 : $len1;
+
+ if($id0->[0] == $flag_string) {
+ for($i = 1; $i < $len; $i++) {
+ $k = $id0->[$i] cmp $id1->[$i];
+ return $k if $k;
+ }
+ return $len0 <=> $len1;
+ }
+
+ if($id0->[0] == $flag_id) {
+ $k = $id0->[1] <=> $id1->[1];
+ return $k if $k;
+ $k = $id0->[2] <=> $id1->[2];
+ return $k if $k;
+ $k = $len0 <=> $len1;
+ return $k if $k || $len <= 3;
+ # print "-\n";
+ # $dump->dumpValue( $id0 );
+ # $dump->dumpValue( $id1 );
+ # die "internal oops: strange id" if $len < 4;
+ $i = $len - 1;
+ return -1 if !defined($id0->[$i]);
+ return 1 if !defined($id1->[$i]);
+ return $id0->[$i] <=> $id1->[$i];
+ }
+
+ die "internal oops: can't compare that!";
+}
+
+
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+#
+sub cmp_skey
+{
+ my ($skey0, $skey1, $len0, $len1, $len, $i, $k);
+
+ ($skey0, $skey1) = @_;
+
+ return 0 if !defined($skey0) && !defined($skey1);
+ return -1 if !defined($skey0);
+ return 1 if !defined($skey1);
+
+ $len0 = @$skey0;
+ $len1 = @$skey1;
+ $len = $len0 < $len1 ? $len0 : $len1;
+
+ # $dump->dumpValue( $skey0 );
+ # $dump->dumpValue( $skey1 );
+
+ for($i = 0; $i < $len; $i++) {
+ next unless defined($skey0->[$i]) || defined($skey1->[$i]);
+
+ # note: this looks reversed, but is intentional!
+ return 1 if !defined($skey0->[$i]);
+ return -1 if !defined($skey1->[$i]);
+
+ $k = cmp_id $skey0->[$i], $skey1->[$i];
+
+ return $k if $k;
+ }
+
+ return $len0 <=> $len1;
+}
+
+
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+#
+# 0: equal
+# +-1: differing keys
+# +-2: differing values
+#
+sub cmp_item
+{
+ my ($item0, $item1, $len0, $len1, $len, $i, $k);
+
+ ($item0, $item1) = @_;
+
+ $cmp_item_cnt++;
+
+ return 0 if !defined($item0) && !defined($item1);
+ return -1 if !defined($item0);
+ return 1 if !defined($item1);
+
+ $len0 = @{$item0->[1]};
+ $len1 = @{$item1->[1]};
+ $len = $len0 < $len1 ? $len0 : $len1;
+
+# $dump->dumpValue( $item0 );
+
+ for($i = 0; $i < $len; $i++) {
+ return -1 if !defined($item0->[1][$i]);
+ return 1 if !defined($item1->[1][$i]);
+ $k = cmp_skey $item0->[1][$i], $item1->[1][$i];
+ # print " skey: $k\n";
+ return $k if $k;
+ }
+ $k = $len0 <=> $len1;
+ return $k if $k;
+
+ return 0 if !defined($item0->[2]) && !defined($item1->[2]);
+ return -2 if !defined($item0->[2]);
+ return 2 if !defined($item1->[2]);
+
+ $k = cmp_skey $item0->[2], $item1->[2];
+ # print " val: $k\n";
+ return 2 * $k;
+}
+
+
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+#
+# check if id1 is part of id0
+#
+# return:
+# 1: yes
+# 0: no
+# undef: don't know
+#
+# hd: [ "source", [ skey, skey, ... ], [ val ] ]
+# skey/val: [ ... , id, ..., id, ... ]
+# id: [ $flag_id, $tag, $value, $range, $mask ]
+# id: [ $flag_string, "str", "str", ... ]
+
+sub match_id
+{
+ my ($id0, $id1, $len0, $len1, $len, $i, $k);
+
+ ($id0, $id1) = @_;
+
+ return 0 if !defined($id0) || !defined($id1);
+
+ return 0 if $id0->[0] != $id1->[0];
+
+ $len0 = @$id0;
+ $len1 = @$id1;
+ $len = $len0 < $len1 ? $len0 : $len1;
+
+ if($id0->[0] == $flag_string) {
+ for($i = 1; $i < $len; $i++) {
+ return 0 if $id0->[$i] cmp $id1->[$i];
+ }
+ return $len0 != $len1 ? 0 : 1;
+ }
+
+ if($id0->[0] == $flag_id) {
+ return 0 if $id0->[1] != $id1->[1];
+ if($len1 == 3) {
+ if($len0 == 3) {
+ return $id0->[2] != $id1->[2] ? 0 : 1;
+ }
+ elsif($len0 == 4) {
+ return $id1->[2] >= $id0->[2] && $id1->[2] < $id0->[2] + $id0->[3] ? 1 : 0;
+ }
+ elsif($len0 == 5) {
+ return ($id1->[2] & ~$id0->[4]) == $id0->[2] ? 1 : 0;
+ }
+ else {
+ die "invalid id";
+ }
+ }
+ elsif($len1 == 4) {
+ return undef;
+ }
+ elsif($len1 == 5) {
+ return undef;
+ }
+ else {
+ die "invalid id";
+ }
+ }
+
+ die "internal oops: can't match that!";
+}
+
+
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+#
+# skey1 part of skey0?
+#
+sub match_skey
+{
+ my ($skey0, $skey1, $len0, $len1, $len, $i, $k);
+
+ ($skey0, $skey1) = @_;
+
+ return 0 if !defined($skey0) || !defined($skey1);
+
+ $len0 = @$skey0;
+ $len1 = @$skey1;
+
+ $len = $len0 > $len1 ? $len0 : $len1;
+
+ # $dump->dumpValue( $skey0 );
+ # $dump->dumpValue( $skey1 );
+
+ for($i = 0; $i < $len; $i++) {
+ next unless defined($skey1->[$i]);
+
+ return 0 if !defined($skey0->[$i]) && defined($skey1->[$i]);
+
+ $k = match_id $skey0->[$i], $skey1->[$i];
+
+ return $k if !$k;
+ }
+
+ return 1;
+}
+
+
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+#
+# item1 part of item0?
+#
+sub match_item
+{
+ my ($item0, $item1, $len0, $len1, $i, $j, $k, $m);
+
+ ($item0, $item1) = @_;
+
+ $match_item_cnt++;
+
+ return 0 if !defined($item0) || !defined($item1);
+
+ $len0 = @{$item0->[1]};
+ $len1 = @{$item1->[1]};
+
+ for($j = 0; $j < $len1; $j++) {
+ for($i = 0; $i < $len0; $i++) {
+ $k = match_skey $item0->[1][$i], $item1->[1][$j];
+ $m = $k if defined $k;
+ return $k if $k;
+ }
+ }
+
+ return $m
+}
+
+
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+#
+# add skey1 to skey0
+#
+sub join_skey
+{
+ my ($skey0, $skey1, $len, $i, $k, $n, $buf, $err);
+
+ ($skey0, $skey1, $buf, $errors) = @_;
+
+ $$errors = 0;
+
+ return undef if !defined($skey0) && !defined($skey1);
+ return [ @$skey0 ] if !defined($skey1);
+ return [ @$skey1 ] if !defined($skey0);
+
+ $n = [ @$skey0 ];
+
+ $len = @$skey1;
+
+ for($i = 0; $i < $len; $i++) {
+ next unless defined $skey1->[$i];
+
+ $n->[$i] = $skey1->[$i];
+
+ next unless defined $skey0->[$i];
+
+ $k = cmp_id $skey0->[$i], $skey1->[$i];
+
+ if($k) {
+ if(defined $buf) {
+ if($i != $he_driver) {
+ $$buf .= ent_name_pr(" 0:", $ent_names[$i]);
+ $$buf .= id_dump($i, $skey0->[$i]) . "\n";
+ $$buf .= ent_name_pr(" 1:", $ent_names[$i]);
+ $$buf .= id_dump($i, $skey1->[$i]) . "\n";
+ }
+ else {
+ $$buf .= drv_dump(" 0:", $skey0->[$i]);
+ $$buf =~ s/\n&/\n 0:/;
+ $$buf .= drv_dump(" 1:", $skey1->[$i]);
+ $$buf =~ s/\n&/\n 1:/;
+ }
+ }
+ $$errors++ if defined $errors;
+ }
+ }
+
+ return $n;
+}
+
+
+
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+#
+# split key fields
+#
+sub split_item
+{
+ my ($item, @items, $tmp);
+ local $_;
+
+ $item = shift;
+
+ return $item if !defined($item) || !defined($item->[1]);
+
+ for (@{$item->[1]}) {
+ $tmp = [ @$item ];
+ $tmp->[1] = [ $_ ];
+ push @items, $tmp;
+ }
+
+ return @items;
+}
+
+
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+sub get_xml_data
+{
+ my ($xml, $i, $j);
+
+ $xml = shift;
+
+ if($xml->[0] ne 'hwdata') {
+ die "invalid XML root element (expected 'hwdata')\n"
+ }
+
+ for($i = 1; $i < @{$xml->[1]}; $i += 2) {
+ if($xml->[1][$i] eq 'item') {
+ push @hd, parse_xml_item($xml->[1][$i + 1]);
+ }
+ }
+}
+
+
+sub parse_xml_item
+{
+ my (@xml, %attr, $i, $item);
+
+ @xml = @{$_[0]};
+ %attr = %{shift @xml};
+
+ for($i = 0; $i < @xml; $i += 2) {
+ if($xml[$i] eq 'key') {
+ push @{$item->[1]}, parse_xml_key($xml[$i + 1]);
+ }
+ else {
+ $item->[2] = parse_xml_key($_[0]);
+ }
+ }
+
+ return $item;
+}
+
+
+sub parse_xml_key
+{
+ my (@xml, %attr, $i, @key, $val, $id, $is_id, $keyid, $keyid2, $tmp);
+
+ @xml = @{$_[0]};
+ %attr = %{shift @xml};
+
+ for($i = 0; $i < @xml; $i += 2) {
+ next if $xml[$i] eq '0' || $xml[$i] eq 'key';
+
+ $keyid = $xml_values{$xml[$i]};
+ $is_id = $keyid < $he_nomask && $ent_names[$keyid] =~ /\.(id|name)$/ ? 1 : 0;
+
+ if(!defined($keyid)) {
+ die "invalid key element \"$xml[$i]\"\n";
+ }
+
+ if($keyid == $he_driver) {
+ $id = parse_xml_driver($xml[$i + 1]);
+ if(!defined($key[$keyid])) {
+ $key[$keyid] = $id;
+ }
+ else {
+ push @{$key[$keyid]}, $id->[1];
+ }
+ }
+ elsif($is_id) {
+ $id = parse_xml_id($xml[$i + 1]);
+ if($id->[0] == $flag_id) {
+ $tmp = $ent_names[$keyid];
+ $tmp =~ s/\.name$/.id/;
+ $keyid2 = $ent_values{$tmp};
+ if(!defined($keyid2)) {
+ die "oops, no .id for $xml[$i]?";
+ }
+ }
+ else {
+ $tmp = $ent_names[$keyid];
+ $tmp =~ s/\.id$/.name/;
+ $keyid2 = $ent_values{$tmp};
+ if(!defined($keyid2)) {
+ die "oops, no .name for $xml[$i]?";
+ }
+ }
+ $key[$keyid2] = $id;
+ }
+ else {
+ $val = parse_xml_cdata($xml[$i + 1]);
+ if(defined($key[$keyid]) && $keyid == $he_requires) {
+ $key[$keyid][1] .= "|$val";
+ }
+ else {
+ $key[$keyid] = [ $flag_string, $val ];
+ }
+ }
+ }
+
+ return [ @key ];
+}
+
+
+sub parse_xml_id
+{
+ my (@xml, %attr, $i, $id, $val);
+
+ @xml = @{$_[0]};
+ %attr = %{shift @xml};
+
+ for($i = 0; $i < @xml; $i += 2) {
+ next if $xml[$i] eq '0';
+
+ if($xml[$i] eq 'id') {
+ $id = parse_xml_id_id($xml[$i + 1]);
+ }
+ elsif($xml[$i] eq 'idrange') {
+ $id = parse_xml_id_range($xml[$i + 1]);
+ }
+ elsif($xml[$i] eq 'idmask') {
+ $id = parse_xml_id_mask($xml[$i + 1]);
+ }
+ elsif($xml[$i] eq 'name') {
+ $val = parse_xml_cdata($xml[$i + 1]);
+ $id = [ $flag_string, $val ];
+ }
+ else {
+ die "invalid id element \"$xml[$i]\"\n";
+ }
+ }
+
+ return $id;
+}
+
+
+sub parse_xml_id_id
+{
+ my (@xml, %attr, $i, $tag, $value);
+
+ @xml = @{$_[0]};
+ %attr = %{shift @xml};
+
+ $tag = $tag_values{$attr{type}};
+
+ if(!defined($tag)) {
+ die "missing/unsupported id attribute \"$attr{type}\"\n";
+ }
+
+ for($i = 0; $i < @xml; $i += 2) {
+ if($xml[$i] eq '0') {
+ $value = idstr2value $tag, $xml[$i + 1];
+ }
+ else {
+ die "cdata expected, got \"$xml[$i]\"\n";
+ }
+ }
+
+ return [ $flag_id, $tag, $value ];
+}
+
+
+sub parse_xml_id_range
+{
+ my (@xml, %attr, $i, $tag, $value, $range);
+
+ @xml = @{$_[0]};
+ %attr = %{shift @xml};
+
+ $tag = $tag_values{$attr{type}};
+
+ if(!defined($tag)) {
+ die "missing/unsupported id attribute \"$attr{type}\"\n";
+ }
+
+ for($i = 0; $i < @xml; $i += 2) {
+ next if $xml[$i] eq '0';
+ if($xml[$i] eq 'first') {
+ $value = idstr2value $tag, parse_xml_cdata($xml[$i + 1]);
+ }
+ elsif($xml[$i] eq 'last') {
+ $range = idstr2value $tag, parse_xml_cdata($xml[$i + 1]);
+ }
+ else {
+ die "invalid idrange element \"$xml[$i]\"\n";
+ }
+ }
+
+ if(!defined($value) || !defined($range)) {
+ die "invalid idrange\n";
+ }
+
+ return [ $flag_id, $tag, $value, $range - $value + 1 ];
+}
+
+
+sub parse_xml_id_mask
+{
+ my (@xml, %attr, $i, $tag, $value, $mask);
+
+ @xml = @{$_[0]};
+ %attr = %{shift @xml};
+
+ $tag = $tag_values{$attr{type}};
+
+ if(!defined($tag)) {
+ die "missing/unsupported id attribute \"$attr{type}\"\n";
+ }
+
+ for($i = 0; $i < @xml; $i += 2) {
+ next if $xml[$i] eq '0';
+ if($xml[$i] eq 'value') {
+ $value = idstr2value $tag, parse_xml_cdata($xml[$i + 1]);
+ }
+ elsif($xml[$i] eq 'mask') {
+ $mask = idstr2value $tag, parse_xml_cdata($xml[$i + 1]);
+ }
+ else {
+ die "invalid idmask element \"$xml[$i]\"\n";
+ }
+ }
+
+ if(!defined($value) || !defined($mask)) {
+ die "invalid idmask\n";
+ }
+
+ return [ $flag_id, $tag, $value, undef, $mask ];
+}
+
+
+sub parse_xml_driver
+{
+ my (@xml, %attr, $i, $val);
+
+ @xml = @{$_[0]};
+ %attr = %{shift @xml};
+
+ for($i = 0; $i < @xml; $i += 2) {
+ next if $xml[$i] eq '0';
+
+ if($xml[$i] eq 'any') {
+ $val = "a\t" . parse_xml_cdata($xml[$i + 1]);
+ }
+ elsif($xml[$i] eq 'display') {
+ $val = parse_xml_driver_display($xml[$i + 1]);
+ }
+ elsif($xml[$i] eq 'module') {
+ $val = parse_xml_driver_module($xml[$i + 1]);
+ }
+ elsif($xml[$i] eq 'mouse') {
+ $val = parse_xml_driver_mouse($xml[$i + 1]);
+ }
+ elsif($xml[$i] eq 'xfree') {
+ $val = parse_xml_driver_xfree($xml[$i + 1]);
+ }
+ else {
+ die "invalid driver element \"$xml[$i]\"\n";
+ }
+ }
+
+ return [ $flag_string, $val ];
+}
+
+
+sub parse_xml_driver_display
+{
+ my (@xml, %attr, $i, @val);
+
+ @xml = @{$_[0]};
+ %attr = %{shift @xml};
+
+ for($i = 0; $i < @xml; $i += 2) {
+ next if $xml[$i] eq '0';
+
+ if($xml[$i] eq 'resolution') {
+ $val[0] = join('x', parse_xml_pair($xml[$i + 1], 'width', 'height'));
+ }
+ elsif($xml[$i] eq 'vsync') {
+ $val[1] = join('-', parse_xml_pair($xml[$i + 1], 'min', 'max'));
+ }
+ elsif($xml[$i] eq 'hsync') {
+ $val[2] = join('-', parse_xml_pair($xml[$i + 1], 'min', 'max'));
+ }
+ elsif($xml[$i] eq 'bandwidth') {
+ $val[3] = parse_xml_cdata($xml[$i + 1]);
+ }
+ else {
+ die "invalid display element \"$xml[$i]\"\n";
+ }
+ }
+
+ if(!@val) {
+ die "invalid display info\n";
+ }
+
+ return "d\t" . join('|', @val);
+}
+
+
+sub parse_xml_driver_module
+{
+ my (@xml, %attr, $i, $val, $type, @conf, @mods);
+
+ @xml = @{$_[0]};
+ %attr = %{shift @xml};
+
+ for($i = 0; $i < @xml; $i += 2) {
+ next if $xml[$i] eq '0';
+
+ $val = parse_xml_cdata($xml[$i + 1]);
+
+ if($xml[$i] eq 'modprobe') {
+ if($type && $type ne 'm') {
+ die "invalid module info: \"$xml[$i]\"\n";
+ }
+ $type = 'm';
+ push @mods, $val;
+ }
+ elsif($xml[$i] eq 'insmod') {
+ if($type && $type ne 'i') {
+ die "invalid module info: \"$xml[$i]\"\n";
+ }
+ $type = 'i';
+ push @mods, $val;
+ }
+ elsif($xml[$i] eq 'modconf') {
+ if($type && $type ne 'm') {
+ die "invalid module info: \"$xml[$i]\"\n";
+ }
+ push @conf, "\x00M\t$val";
+ }
+ else {
+ die "invalid module element \"$xml[$i]\"\n";
+ }
+ }
+
+ if(!$type && !@mods) {
+ die "invalid module info\n";
+ }
+
+ $val = "$type\t" . join('|', @mods);
+
+ if(@conf) {
+ $val .= join('', @conf);
+ }
+
+ return $val;
+}
+
+
+sub parse_xml_driver_mouse
+{
+ my (@xml, %attr, $i, $val, @val);
+
+ @xml = @{$_[0]};
+ %attr = %{shift @xml};
+
+ for($i = 0; $i < @xml; $i += 2) {
+ next if $xml[$i] eq '0';
+
+ $val = parse_xml_cdata($xml[$i + 1]);
+
+ if($xml[$i] eq 'xf86') {
+ $val[0] = $val;
+ }
+ elsif($xml[$i] eq 'gpm') {
+ $val[1] = $val;
+ }
+ elsif($xml[$i] eq 'buttons') {
+ $val[2] = $val;
+ }
+ elsif($xml[$i] eq 'wheels') {
+ $val[3] = $val;
+ }
+ else {
+ die "invalid mouse element \"$xml[$i]\"\n";
+ }
+ }
+
+ if(!@val) {
+ die "invalid mouse info\n";
+ }
+
+ return "p\t" . join('|', @val);
+}
+
+
+sub parse_xml_driver_xfree
+{
+ my (@xml, %attr, $i, $val, @val, @conf);
+
+ @xml = @{$_[0]};
+ %attr = %{shift @xml};
+
+ for($i = 0; $i < @xml; $i += 2) {
+ next if $xml[$i] eq '0';
+
+ if($xml[$i] eq 'has3d') {
+ $val[2] = '3d';
+ }
+ else {
+ $val = parse_xml_cdata($xml[$i + 1]);
+
+ if($xml[$i] eq 'version') {
+ $val[0] = $val;
+ }
+ elsif($xml[$i] eq 'server') {
+ $val[1] = $val;
+ }
+ elsif($xml[$i] eq 'extension') {
+ $val[4] .= "," if defined $val[4];
+ $val[4] .= $val;
+ }
+ elsif($xml[$i] eq 'option') {
+ $val[5] .= "," if defined $val[5];
+ $val[5] .= $val;
+ }
+ elsif($xml[$i] eq 'bpp') {
+ $val[6] .= "," if defined $val[6];
+ $val[6] .= $val;
+ }
+ elsif($xml[$i] eq 'dacspeed') {
+ $val[7] = $val;
+ }
+ elsif($xml[$i] eq 'script') {
+ $val[8] = $val;
+ }
+ elsif($xml[$i] eq 'xf86conf') {
+ push @conf, "\x00X\t$val";
+ }
+ else {
+ die "invalid xfree element \"$xml[$i]\"\n";
+ }
+ }
+ }
+
+ if(!@val) {
+ die "invalid xfree info\n";
+ }
+
+ $val = "x\t" . join('|', @val);
+
+ if(@conf) {
+ $val .= join('', @conf);
+ }
+
+ return $val;
+}
+
+
+sub parse_xml_pair
+{
+ my (@xml, %attr, $i, $val0, $val1, $elem0, $elem1);
+
+ $elem0 = $_[1];
+ $elem1 = $_[2];
+
+ @xml = @{$_[0]};
+ %attr = %{shift @xml};
+
+ for($i = 0; $i < @xml; $i += 2) {
+ next if $xml[$i] eq '0';
+ if($xml[$i] eq $elem0) {
+ $val0 = parse_xml_cdata($xml[$i + 1]);
+ }
+ elsif($xml[$i] eq $elem1) {
+ $val1 = parse_xml_cdata($xml[$i + 1]);
+ }
+ else {
+ die "invalid element \"$xml[$i]\"\n";
+ }
+ }
+
+ if(!defined($val0) || !defined($val1)) {
+ die "invalid element\n";
+ }
+
+ return ($val0, $val1);
+}
+
+
+sub parse_xml_cdata
+{
+ my (@xml, %attr, $i);
+
+ @xml = @{$_[0]};
+ %attr = %{shift @xml};
+
+ for($i = 0; $i < @xml; $i += 2) {
+ if($xml[$i] eq '0') {
+ return $xml[$i + 1]
+ }
+ }
+}
+
+
+sub idstr2value
+{
+ my ($tag, $value);
+
+ ($tag, $value) = @_;
+
+ if($tag == $tag_eisa && length($value) == 3 && $value !~ /^[0-9]/) {
+ $value = eisa_id $value;
+ }
+ else {
+ $value = num $value;
+ }
+
+ return $value;
+}
+
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+sub ent_name_pr
+{
+ my ($str, $len);
+
+ $str = $_[0] . $_[1];
+
+ $len = length $str;
+
+ $str .= "\t";
+ $len = ($len & ~7) + 8;
+ $str .= "\t" x ((24 - $len)/8) if $len < 24;
+
+ return $str;
+}
+
+
+sub id_dump
+{
+ my ($id, $ent, $str, $tag, $format);
+
+ ($ent, $id) = @_;
+
+ if($id->[0] == $flag_id) {
+ $tag = $id->[1];
+ if($tag == $tag_eisa && ($ent == $he_vendor_id || $ent == $he_subvendor_id)) {
+ $str = eisa_str $id->[2];
+ }
+ else {
+ $str .= $tag_name[$tag];
+ $str .= " " if $tag;
+ $format = "0x%04x";
+ $format = "0x%02x" if $ent == $he_bus_id || $ent == $he_subclass_id || $ent == $he_progif_id;
+ $format = "0x%03x" if $ent == $he_baseclass_id;
+ $str .= sprintf $format, $id->[2];
+ }
+ if(defined $id->[3]) {
+ $str .= sprintf "+0x%04x", $id->[3];
+ }
+ elsif(defined $id->[4]) {
+ $str .= sprintf "&0x%04x", $id->[4];
+ }
+ }
+ elsif($id->[0] == $flag_string) {
+ if(defined($id->[2])) {
+ die "oops: strage string data\n";
+ }
+ $str = $id->[1];
+ }
+ else {
+ die "oops: unknown id flag\n"
+ }
+
+ return $str;
+}
+
+
+sub drv_dump
+{
+ my ($id, $str, $i, $pre, $type, $drv, $buf);
+
+ ($pre, $id) = @_;
+
+ die "oops: invalid driver data\n" if $id->[0] != $flag_string;
+
+ for($i = 1; $i < @{$id}; $i++) {
+ for $drv (split /\x00/, $id->[$i]) {
+ $type = substr $drv, 0, 2;
+
+ if($type eq "x\t") {
+ $buf .= ent_name_pr($pre, $ent_names[$he_driver_xfree]);
+ $buf .= substr($drv, 2) . "\n";
+ }
+ elsif($type eq "X\t") {
+ $buf .= ent_name_pr($pre, $ent_names[$he_driver_xfree_config]);
+ $buf .= substr($drv, 2) . "\n";
+ }
+ elsif($type eq "i\t") {
+ $buf .= ent_name_pr($pre, $ent_names[$he_driver_module_insmod]);
+ $buf .= substr($drv, 2) . "\n";
+ }
+ elsif($type eq "m\t") {
+ $buf .= ent_name_pr($pre, $ent_names[$he_driver_module_modprobe]);
+ $buf .= substr($drv, 2) . "\n";
+ }
+ elsif($type eq "M\t") {
+ $buf .= ent_name_pr($pre, $ent_names[$he_driver_module_config]);
+ $buf .= substr($drv, 2) . "\n";
+ }
+ elsif($type eq "p\t") {
+ $buf .= ent_name_pr($pre, $ent_names[$he_driver_mouse]);
+ $buf .= substr($drv, 2) . "\n";
+ }
+ elsif($type eq "d\t") {
+ $buf .= ent_name_pr($pre, $ent_names[$he_driver_display]);
+ $buf .= substr($drv, 2) . "\n";
+ }
+ elsif($type eq "a\t") {
+ $buf .= ent_name_pr($pre, $ent_names[$he_driver_any]);
+ $buf .= substr($drv, 2) . "\n";
+ }
+ else {
+ die "oops: unhandled driver info type: $drv\n";
+ }
+
+ $pre = "&" if $pre ne "+";
+ }
+ }
+
+ return $buf;
+}
+
+
+sub ent_dump
+{
+ my ($pre, $id, $ent, $buf);
+
+ ($buf, $pre, $id) = @_;
+
+ $pre = defined($pre) ? "|" : " " if $pre ne "+";
+ for($ent = 0; $ent < @{$id}; $ent++) {
+ if(defined $id->[$ent]) {
+ if($ent != $he_driver) {
+ $$buf .= ent_name_pr($pre, $ent_names[$ent]);
+ $$buf .= id_dump($ent, $id->[$ent]);
+ $$buf .= "\n";
+ }
+ else {
+ $$buf .= drv_dump($pre, $id->[$ent]);
+ }
+ $pre = "&" if $pre ne "+";
+ }
+ }
+
+ return $pre;
+}
+
+
+sub dump2ids
+{
+ my ($item, $id, $ent, $pre, $buf);
+
+ # $dump->dumpValue( \@hd );
+
+ open F, ">hd.ids";
+
+ for $item (@hd) {
+ undef $buf;
+ undef $pre;
+ print F "# $item->[0]\n" if $opt_with_source;
+ for $id (@{$item->[1]}) {
+ $pre = ent_dump \$buf, $pre, $id;
+ }
+ $pre = "+";
+ ent_dump \$buf, $pre, $item->[2];
+ $buf .= "\n";
+
+ print F $buf;
+ }
+
+ close F;
+}
+
+
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+sub dump2xml
+{
+ my ($item, $dtd);
+
+ if($opt_internal_dtd) {
+ $dtd = hd_dtd_internal;
+ }
+ else {
+ $dtd = "<!DOCTYPE hwdata SYSTEM \"hd.dtd\">\n";
+ }
+
+ $xml_file = new IO::File(">hd.xml");
+ $xml = new XML::Writer(OUTPUT => $xml_file, DATA_MODE => 1, DATA_INDENT => 2);
+
+ $xml->xmlDecl("utf-8");
+
+ print $xml_file "\n$dtd";
+
+ $xml->startTag("hwdata");
+
+ print $xml_file "\n";
+
+ for $item (@hd) {
+ dump_xml_item $item;
+ }
+
+ $xml->endTag("hwdata");
+ $xml->end();
+
+ if(!$opt_internal_dtd) {
+ print STDERR "writing \"hd.dtd\"\n";
+ open DTD, ">hd.dtd";
+ print DTD hd_dtd;
+ close DTD;
+ }
+}
+
+
+sub dump_xml_id
+{
+ my ($ent, $id, $i, $tag, $str, $format, $range, $mask);
+
+ ($ent, $id) = @_;
+
+ $i = $xml_names[$ent];
+
+ die "oops: entry $ent not allowed here\n" unless $i;
+
+ if($ent == $he_requires) {
+ if($id->[0] == $flag_string) {
+ die "oops: strange string data\n" if defined $id->[2];
+ for $str (split /\|/, $id->[1]) {
+ $xml->dataElement("requires", $str);
+ }
+ }
+ else {
+ die "oops: requires _id_???\n"
+ }
+ }
+ else {
+ $xml->startTag($i);
+
+ if($ent == $he_serial) {
+ if($id->[0] == $flag_string) {
+ die "oops: strange string data\n" if defined $id->[2];
+ $xml->characters($id->[1]);
+ }
+ else {
+ die "oops: serial _id_???\n"
+ }
+ }
+ else {
+ if($id->[0] == $flag_id) {
+ $tag = $id->[1];
+ if($tag == $tag_eisa && ($ent == $he_vendor_id || $ent == $he_subvendor_id)) {
+ $str = eisa_str $id->[2];
+ }
+ else {
+ $format = "0x%04x";
+ $format = "0x%02x" if $ent == $he_bus_id || $ent == $he_subclass_id || $ent == $he_progif_id;
+ $format = "0x%03x" if $ent == $he_baseclass_id;
+ $str = sprintf $format, $id->[2];
+ }
+ if(defined $id->[3]) {
+ if($tag == $tag_eisa && ($ent == $he_vendor_id || $ent == $he_subvendor_id)) {
+ $range = eisa_str $id->[2] + $id->[3] - 1;
+ }
+ else {
+ $range = sprintf "0x%04x", $id->[2] + $id->[3] - 1;
+ }
+ }
+ elsif(defined $id->[4]) {
+ $mask = sprintf "0x%04x", $id->[4];
+ }
+ $tag = $tag_name[$tag];
+
+ if(defined $range) {
+ if($tag) {
+ $xml->startTag("idrange", "type" => $tag);
+ }
+ else {
+ $xml->startTag("idrange");
+ }
+ $xml->dataElement("first", $str);
+ $xml->dataElement("last", $range);
+ $xml->endTag();
+ }
+ elsif(defined $mask) {
+ if($tag) {
+ $xml->startTag("idmask", "type" => $tag);
+ }
+ else {
+ $xml->startTag("idmask");
+ }
+ $xml->dataElement("value", $str);
+ $xml->dataElement("mask", $mask);
+ $xml->endTag();
+ }
+ else {
+ if($tag) {
+ $xml->dataElement("id", $str, "type" => $tag);
+ }
+ else {
+ $xml->dataElement("id", $str);
+ }
+ }
+ }
+ elsif($id->[0] == $flag_string) {
+ die "oops: strage string data\n" if defined $id->[2];
+ $xml->dataElement("name", $id->[1]);
+ }
+ else {
+ die "oops: unknown id flag\n"
+ }
+ }
+
+ $xml->endTag();
+ }
+}
+
+
+sub dump_xml_drv
+{
+ my ($id, $str, $i, $j, $k, $type, $drv, $info, @info, $current);
+
+ $id = shift;
+
+ die "oops: invalid driver data\n" if $id->[0] != $flag_string;
+
+ for($i = 1; $i < @{$id}; $i++) {
+
+ $xml->startTag('driver');
+
+ undef $current;
+
+ for $drv (split /\x00/, $id->[$i]) {
+ $type = substr $drv, 0, 2;
+ $info = substr $drv, 2;
+ @info = split /\|/, $info;
+
+ if($type eq "i\t") {
+ $xml->endTag() if $current; $current = $type;
+ $xml->startTag('module');
+ for $j (@info) {
+ $xml->dataElement('insmod', $j);
+ }
+ }
+ elsif($type eq "m\t") {
+ $xml->endTag() if $current; $current = $type;
+ $xml->startTag('module');
+ for $j (@info) {
+ $xml->dataElement('modprobe', $j);
+ }
+ }
+ elsif($type eq "M\t") {
+ die "oops: incorrect driver info: $drv\n" unless $current eq "m\t";
+ $xml->dataElement('modconf', $info);
+ }
+ elsif($type eq "a\t") {
+ $xml->endTag() if $current; $current = undef;;
+ $xml->dataElement('any', $info);
+ }
+ elsif($type eq "d\t") {
+ $xml->endTag() if $current; $current = undef;
+ $xml->startTag('display');
+ if($info[0] =~ /^(\d+)x(\d+)$/) {
+ ($j, $k) = ($1, $2);
+ $xml->startTag('resolution');
+ $xml->dataElement('width', $j);
+ $xml->dataElement('height', $k);
+ $xml->endTag('resolution');
+ }
+ if($info[1] =~ /^(\d+)-(\d+)$/) {
+ ($j, $k) = ($1, $2);
+ $xml->startTag('vsync');
+ $xml->dataElement('min', $j);
+ $xml->dataElement('max', $k);
+ $xml->endTag('vsync');
+ }
+ if($info[2] =~ /^(\d+)-(\d+)$/) {
+ ($j, $k) = ($1, $2);
+ $xml->startTag('hsync');
+ $xml->dataElement('min', $j);
+ $xml->dataElement('max', $k);
+ $xml->endTag('hsync');
+ }
+ if($info[3] =~ /^\d+$/) {
+ $xml->dataElement('bandwidth', $info[3]);
+ }
+ $xml->endTag('display');
+ }
+ elsif($type eq "x\t") {
+ $xml->endTag() if $current; $current = $type;
+ $xml->startTag('xfree');
+ if(defined $info[0]) {
+ $xml->dataElement('version', $info[0]);
+ }
+ if($info[1]) {
+ $xml->dataElement('server', $info[1]);
+ }
+ if($info[2]) {
+ $xml->emptyTag('has3d');
+ }
+# if($info[3]) {
+# for $j (split /,/, $info[3]) {
+# $xml->dataElement('package', $j);
+# }
+# }
+ if($info[4]) {
+ for $j (split /,/, $info[4]) {
+ $xml->dataElement('extension', $j);
+ }
+ }
+ if($info[5]) {
+ for $j (split /,/, $info[5]) {
+ $xml->dataElement('option', $j);
+ }
+ }
+ if($info[6]) {
+ for $j (split /,/, $info[6]) {
+ $xml->dataElement('bpp', $j);
+ }
+ }
+ if($info[7] =~ /^\d+$/) {
+ $xml->dataElement('dacspeed', $info[7]);
+ }
+ if($info[8]) {
+ $xml->dataElement('script', $info[8]);
+ }
+ }
+ elsif($type eq "X\t") {
+ die "oops: incorrect driver info: $drv\n" unless $current eq "x\t";
+ $xml->dataElement('xf86conf', $info);
+ }
+ elsif($type eq "p\t") {
+ $xml->endTag() if $current; $current = undef;
+ $xml->startTag('mouse');
+ if($info[0]) {
+ $xml->dataElement('xf86', $info[0]);
+ }
+ if($info[1]) {
+ $xml->dataElement('gpm', $info[1]);
+ }
+ if($info[2] ne "") {
+ $xml->dataElement('buttons', $info[2]);
+ }
+ if($info[3] ne "") {
+ $xml->dataElement('wheels', $info[3]);
+ }
+ $xml->endTag('mouse');
+ }
+ else {
+ $xml->endTag() if $current; $current = undef;
+ # die "oops: unhandled driver info type: $drv\n";
+ }
+ }
+
+ $xml->endTag() if $current;
+
+ $xml->endTag('driver');
+
+ }
+}
+
+
+sub dump_xml_ent
+{
+ my ($id, $ent);
+
+ $id = shift;
+
+ for($ent = 0; $ent < @{$id}; $ent++) {
+ if(defined $id->[$ent]) {
+ if($ent != $he_driver) {
+ dump_xml_id $ent, $id->[$ent];
+ }
+ else {
+ dump_xml_drv $id->[$ent];
+ }
+ }
+ }
+
+}
+
+
+sub dump_xml_item
+{
+ my ($item, $id);
+
+ $item = shift;
+
+ $xml->startTag('item');
+
+ for $id (@{$item->[1]}) {
+ $xml->startTag('key');
+ dump_xml_ent $id;
+ $xml->endTag('key');
+ }
+
+ dump_xml_ent $item->[2];
+
+ $xml->endTag('item');
+ print $xml_file "\n";
+}
+
+
+sub hd_dtd
+{
+ my $dtd = <<'EOF'
+<!-- libhd DTD V0.2 -->
+
+<!ENTITY % keyfields "bus|baseclass|subclass|progif|vendor|device|subvendor|subdevice|revision|serial|driver|requires">
+<!ENTITY % idelements "id|idrange|idmask|name">
+<!ENTITY % idtypes "none|pci|eisa|usb|pcmcia|special">
+
+<!ELEMENT hwdata (item*)>
+
+<!ELEMENT item (key+,(%keyfields;)*)>
+
+<!ELEMENT key (%keyfields;)+>
+
+ <!ELEMENT bus (%idelements;)>
+ <!ELEMENT baseclass (%idelements;)>
+ <!ELEMENT subclass (%idelements;)>
+ <!ELEMENT progif (%idelements;)>
+ <!ELEMENT vendor (%idelements;)>
+ <!ELEMENT device (%idelements;)>
+ <!ELEMENT subvendor (%idelements;)>
+ <!ELEMENT subdevice (%idelements;)>
+ <!ELEMENT revision (%idelements;)>
+ <!ELEMENT serial (#PCDATA)>
+ <!ELEMENT requires (#PCDATA)>
+ <!ELEMENT id (#PCDATA)>
+ <!ELEMENT idrange (first,last)>
+ <!ELEMENT first (#PCDATA)>
+ <!ELEMENT last (#PCDATA)>
+ <!ELEMENT idmask (value,mask)>
+ <!ELEMENT value (#PCDATA)>
+ <!ELEMENT mask (#PCDATA)>
+ <!ATTLIST id type (%idtypes;) "none">
+ <!ATTLIST idrange type (%idtypes;) "none">
+ <!ATTLIST idmask type (%idtypes;) "none">
+ <!ELEMENT name (#PCDATA)>
+
+<!ELEMENT driver (any|display|module|mouse|xfree)?>
+
+ <!ELEMENT any (#PCDATA)>
+
+ <!ELEMENT display (resolution?,vsync?,hsync?,bandwidth?)>
+ <!ELEMENT resolution (width,height)>
+ <!ELEMENT width (#PCDATA)>
+ <!ELEMENT height (#PCDATA)>
+ <!ELEMENT vsync (min,max)>
+ <!ELEMENT hsync (min,max)>
+ <!ELEMENT min (#PCDATA)>
+ <!ELEMENT max (#PCDATA)>
+ <!ELEMENT bandwidth (#PCDATA)>
+
+ <!ELEMENT module (insmod+|(modprobe+,modconf*))>
+ <!ELEMENT insmod (#PCDATA)>
+ <!ELEMENT modprobe (#PCDATA)>
+ <!ELEMENT modconf (#PCDATA)>
+
+ <!ELEMENT mouse (xf86?,gpm?,buttons?,wheels?)>
+ <!ELEMENT xf86 (#PCDATA)>
+ <!ELEMENT gpm (#PCDATA)>
+ <!ELEMENT buttons (#PCDATA)>
+ <!ELEMENT wheels (#PCDATA)>
+
+ <!ELEMENT xfree (version,server?,has3d?,extension*,option*,bpp*,dacspeed?,script?,xf86conf*)>
+ <!ELEMENT version (#PCDATA)>
+ <!ELEMENT server (#PCDATA)>
+ <!ELEMENT has3d EMPTY>
+ <!ELEMENT extension (#PCDATA)>
+ <!ELEMENT option (#PCDATA)>
+ <!ELEMENT bpp (#PCDATA)>
+ <!ELEMENT dacspeed (#PCDATA)>
+ <!ELEMENT script (#PCDATA)>
+ <!ELEMENT xf86conf (#PCDATA)>
+EOF
+;
+
+ return $dtd;
+}
+
+
+sub hd_dtd_internal
+{
+ my $dtd = <<'EOF'
+<!DOCTYPE hwdata [
+ <!ELEMENT hwdata (item*)>
+ <!ELEMENT item (key+,(bus|baseclass|subclass|progif|vendor|device|subvendor|subdevice|revision|serial|driver|requires)*)>
+ <!ELEMENT key (bus|baseclass|subclass|progif|vendor|device|subvendor|subdevice|revision|serial|driver|requires)+>
+ <!ELEMENT bus (id|idrange|idmask|name)>
+ <!ELEMENT baseclass (id|idrange|idmask|name)>
+ <!ELEMENT subclass (id|idrange|idmask|name)>
+ <!ELEMENT progif (id|idrange|idmask|name)>
+ <!ELEMENT vendor (id|idrange|idmask|name)>
+ <!ELEMENT device (id|idrange|idmask|name)>
+ <!ELEMENT subvendor (id|idrange|idmask|name)>
+ <!ELEMENT subdevice (id|idrange|idmask|name)>
+ <!ELEMENT revision (id|idrange|idmask|name)>
+ <!ELEMENT serial (#PCDATA)>
+ <!ELEMENT requires (#PCDATA)>
+ <!ELEMENT id (#PCDATA)>
+ <!ELEMENT idrange (first,last)>
+ <!ELEMENT first (#PCDATA)>
+ <!ELEMENT last (#PCDATA)>
+ <!ELEMENT idmask (value,mask)>
+ <!ELEMENT value (#PCDATA)>
+ <!ELEMENT mask (#PCDATA)>
+ <!ATTLIST id type (none|pci|eisa|usb|pcmcia|special) "none">
+ <!ATTLIST idrange type (none|pci|eisa|usb|special) "none">
+ <!ATTLIST idmask type (none|pci|eisa|usb|special) "none">
+ <!ELEMENT name (#PCDATA)>
+ <!ELEMENT driver (any|display|module|mouse|xfree)?>
+ <!ELEMENT any (#PCDATA)>
+ <!ELEMENT display (resolution?,vsync?,hsync?,bandwidth?)>
+ <!ELEMENT resolution (width,height)>
+ <!ELEMENT width (#PCDATA)>
+ <!ELEMENT height (#PCDATA)>
+ <!ELEMENT vsync (min,max)>
+ <!ELEMENT hsync (min,max)>
+ <!ELEMENT min (#PCDATA)>
+ <!ELEMENT max (#PCDATA)>
+ <!ELEMENT bandwidth (#PCDATA)>
+ <!ELEMENT module (insmod+|(modprobe+,modconf*))>
+ <!ELEMENT insmod (#PCDATA)>
+ <!ELEMENT modprobe (#PCDATA)>
+ <!ELEMENT modconf (#PCDATA)>
+ <!ELEMENT mouse (xf86?,gpm?,buttons?,wheels?)>
+ <!ELEMENT xf86 (#PCDATA)>
+ <!ELEMENT gpm (#PCDATA)>
+ <!ELEMENT buttons (#PCDATA)>
+ <!ELEMENT wheels (#PCDATA)>
+ <!ELEMENT xfree (version,server?,has3d?,extension*,option*,bpp*,dacspeed?,script?,xf86conf*)>
+ <!ELEMENT version (#PCDATA)>
+ <!ELEMENT server (#PCDATA)>
+ <!ELEMENT has3d EMPTY>
+ <!ELEMENT extension (#PCDATA)>
+ <!ELEMENT option (#PCDATA)>
+ <!ELEMENT bpp (#PCDATA)>
+ <!ELEMENT dacspeed (#PCDATA)>
+ <!ELEMENT script (#PCDATA)>
+ <!ELEMENT xf86conf (#PCDATA)>
+]>
+EOF
+;
+
+ return $dtd;
+}
+
--- /dev/null
+#! /usr/bin/perl
+
+#
+# read gcc -E {aic79xx_pci.c,aic7xxx_pci.c} and extract module info
+#
+
+sub add_range;
+sub add_entry;
+
+while(<>) {
+ if(/^struct.*ah[cd]_pci_ident_table\s*\[\s*\]\s*=\s*$/ .. /^\}/) {
+ if(/^struct.*ah([cd])_pci_ident_table\s*\[\s*\]\s*=\s*$/) {
+ $mod = $1 eq "c" ? "aic7xxx" : "aic79xx";
+ }
+
+ if(/^\s+\{/ .. /^\s+\}/) {
+ if(/^\s+\}/) {
+ if($field && $field != 4) {
+ die "oops, unexpected line $.: $_";
+ }
+ if($field) {
+ # print "id = $id, id_mask = $id_mask, mask = $mask, name = $name, func = $func\n";
+ add_entry;
+ }
+
+ undef $field;
+ undef $id;
+ undef $id_mask;
+ undef $mask;
+ undef $name;
+ undef $func;
+ }
+
+ if($field == 0 && /^\s+0x([0-9A-Fa-f]{16})ull\s*,\s*$/) {
+ $id = $1;
+ $field++;
+ }
+ elsif($field == 0 && /^\s+0x([0-9A-Fa-f]{16})ull\s*\&\s*0x([0-9A-Fa-f]{16})ull\s*,\s*$/) {
+ $id = $1;
+ $id_mask = $2;
+ $field++;
+ }
+ elsif($field == 1 && /^\s+0x([0-9A-Fa-f]{16})ull\s*,\s*$/) {
+ $mask = $1;
+ $field++;
+ }
+ elsif($field == 2 && /^\s+((NULL|\(\(void\s*\*\)\s*0\))|(\".+\"))\s*,\s*$/) {
+ $name = $1;
+ $field++;
+ }
+ elsif($field == 3 && /^\s+((NULL|\(\(void\s*\*\)\s*0\))|([a-z].+))\s*,?\s*$/) {
+ $func = $1;
+ $field++;
+ }
+ }
+
+ }
+}
+
+sub add_range
+{
+ my ($r);
+
+ $r = 0xffff - $_[0];
+
+ return unless $r;
+
+ if($r != 15) {
+ printf " & 0x%04x", $r;
+ }
+ else {
+ printf " + 0x0010";
+ }
+}
+
+
+sub add_entry
+{
+ local $_;
+ my ($v, $d, $sv, $sd);
+ my ($vm, $dm, $svm, $sdm);
+ my ($tag);
+
+ $id_mask = "F" x 16 unless defined $id_mask;
+
+ $d = hex(substr $id, 0, 4) & hex(substr $id_mask, 0, 4);
+ $v = hex(substr $id, 4, 4) & hex(substr $id_mask, 4, 4);
+ $sd = hex(substr $id, 8, 4) & hex(substr $id_mask, 8, 4);
+ $sv = hex(substr $id, 12, 4) & hex(substr $id_mask, 12, 4);
+
+ $dm = hex(substr $mask, 0, 4);
+ $vm = hex(substr $mask, 4, 4);
+ $sdm = hex(substr $mask, 8, 4);
+ $svm = hex(substr $mask, 12, 4);
+
+ $name =~ s/^"|"$//g;
+
+ if($func !~ /^[a-z]/) {
+ print STDERR "entry \"$name\" dropped\n";
+ return;
+ }
+
+ print "\n# $name\n";
+
+ $tag = " ";
+
+ if($vm) {
+ printf "${tag}vendor.id\t\tpci 0x%04x", $v;
+ add_range $vm;
+ print "\n";
+
+ $tag = "&";
+ }
+
+ if($dm) {
+ printf "${tag}device.id\t\tpci 0x%04x", $d;
+ add_range $dm;
+ print "\n";
+
+ $tag = "&";
+ }
+
+ if($svm) {
+ printf "${tag}subvendor.id\t\tpci 0x%04x", $sv;
+ add_range $svm;
+ print "\n";
+
+ $tag = "&";
+ }
+
+ if($sdm) {
+ printf "${tag}subdevice.id\t\tpci 0x%04x", $sd;
+ add_range $sdm;
+ print "\n";
+
+ $tag = "&";
+ }
+
+ printf "+driver.module.modprobe\t%s\n", $mod;
+
+}
+
--- /dev/null
+#! /usr/bin/perl
+
+#
+# read /etc/pcmcia/config file
+#
+
+while(<>) {
+ if(/^\s*card\s+"(.*)"\s*$/) {
+ push @cards, $card;
+ undef $card;
+ $card->{name} = $1;
+ next;
+ }
+
+ if(/^\s*bind\s+"(\S+)"\s*$/) {
+ push @{$card->{modules}}, $1;
+ next;
+ }
+
+ if(/^\s*bind\s+"(\S+)"\s*to\s*\d,\s*"(\S+)"\s*to\s*\d\s*$/) {
+ push @{$card->{modules}}, $1;
+ push @{$card->{modules}}, $2;
+ next;
+ }
+
+ if(/^\s*manfid\s+(0x\S+),\s*(0x\S+)\s*$/) {
+ $card->{vendor} = sprintf("0x%04x", hex $1);
+ $card->{device} = sprintf("0x%04x", hex $2);
+ next;
+ }
+
+}
+
+for (@cards) {
+ next unless $_->{modules};
+ next unless $_->{name} =~ /ethernet/i;
+ for $mods (@{$_->{modules}}) {
+ $eth{$mods} = 1;
+ }
+}
+
+
+for (@cards) {
+ next unless $_->{vendor};
+ next unless $_->{modules};
+ print "# $_->{name}\n";
+ print " vendor.id\t\tpcmcia $_->{vendor}\n";
+ print "&device.id\t\tpcmcia $_->{device}\n";
+ if($_->{modules}) {
+ $eth = 1;
+ for $mods (@{$_->{modules}}) {
+ $eth = 0 unless $eth{$mods};
+ print "+driver.module.modprobe\t$mods\n";
+ }
+ if($eth) {
+ print "+baseclass.id\t\t0x002\n";
+ print "+subclass.id\t\t0x00\n";
+ }
+ }
+ print "\n";
+}
+
--- /dev/null
+#include <stdio.h>
+#include "hd.h"
+
+#ifndef LIBHD_TINY
+#include "hd_ids.h"
+#else
+#include "hd_ids_tiny.h"
+#endif
--- /dev/null
+# braille displays
+
+ vendor.id special 0x5001
++vendor.name Alva
+
+ vendor.id special 0x5001
+&device.id special 0x0000
++device.name abt320
++driver.any abt320
+
+ vendor.id special 0x5001
+&device.id special 0x0001
++device.name abt340
++driver.any abt340
+
+ vendor.id special 0x5001
+&device.id special 0x0002
++device.name abt34d
++driver.any abt34d
+
+ vendor.id special 0x5001
+&device.id special 0x0003
++device.name abt380
++driver.any abt380
+
+ vendor.id special 0x5001
+&device.id special 0x0004
++device.name abt38d
++driver.any abt38d
+
+ vendor.id special 0x5001
+&device.id special 0x000b
++device.name del440
++driver.any del440
+
+ vendor.id special 0x5001
+&device.id special 0x000d
++device.name del480
++driver.any del480
+
+ vendor.id special 0x5001
+&device.id special 0x000e
++device.name sat540
++driver.any sat540
+
+ vendor.id special 0x5002
++vendor.name Papenmeier
+
+ vendor.id special 0x5002
+&device.id special 0x0001
++device.name 2dlite
++driver.any 2dlite
+
+ vendor.id special 0x5002
+&device.id special 0x0002
++device.name tiny
++driver.any tiny
+
+ vendor.id special 0x5002
+&device.id special 0x0003
++device.name 2d
++driver.any 2d
+
+ vendor.id special 0x5002
+&device.id special 0x0040
++device.name el40
++driver.any el40
+
+ vendor.id special 0x5002
+&device.id special 0x0041
++device.name el66
++driver.any el66
+
+ vendor.id special 0x5002
+&device.id special 0x0042
++device.name el80
++driver.any el80
+
+ vendor.id special 0x5002
+&device.id special 0x0043
++device.name el2d
++driver.any el2d
+
+ vendor.id special 0x5002
+&device.id special 0x0044
++device.name el40p
++driver.any el40p
+
+ vendor.id special 0x5003
++vendor.name Handy Tech
+
+ vendor.id special 0x5003
+&device.id special 0x0005
+|vendor.id special 0x5003
+&device.id special 0x0009
++device.name brlwave
++driver.any brlwave
+
+ vendor.id special 0x5003
+&device.id special 0x0044
++device.name vario40-ht
++driver.any vario40-ht
+
+ vendor.id special 0x5003
+&device.id special 0x0074
++device.name brlstar40
++driver.any brlstar40
+
+ vendor.id special 0x5003
+&device.id special 0x0080
++device.name ht20
++driver.any ht20
+
+ vendor.id special 0x5003
+&device.id special 0x0084
++device.name vario80-ht
++driver.any vario80-ht
+
+ vendor.id special 0x5003
+&device.id special 0x0088
++device.name ht80
++driver.any ht80
+
+ vendor.id special 0x5003
+&device.id special 0x0089
++device.name ht40
++driver.any ht40
+
+ vendor.id special 0x5004
++vendor.name Baum
+
+ vendor.id special 0x5004
+&device.id special 0x0001
++device.name Vario40
++driver.any vario40
+
+ vendor.id special 0x5004
+&device.id special 0x0002
++device.name Vario80
++driver.any vario80
+
--- /dev/null
+# bus types
+
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+# 0x00 - 0x7f are PCI types
+
+ bus.id 0x00
++bus.name None
+
+ bus.id 0x01
++bus.name ISA
+
+ bus.id 0x02
++bus.name EISA
+
+ bus.id 0x03
++bus.name MC
+
+ bus.id 0x04
++bus.name PCI
+
+ bus.id 0x05
++bus.name PCMCIA
+
+ bus.id 0x06
++bus.name NuBUS
+
+ bus.id 0x07
++bus.name CardBus
+
+ bus.id 0x08
++bus.name Unknown
+
+
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+# >0x80 are our own bus/interface types
+
+ bus.id 0x80
++bus.name PS/2
+
+ bus.id 0x81
++bus.name Serial
+
+ bus.id 0x82
++bus.name Parallel
+
+ bus.id 0x83
++bus.name Floppy
+
+ bus.id 0x84
++bus.name SCSI
+
+ bus.id 0x85
++bus.name IDE
+
+ bus.id 0x86
++bus.name USB
+
+ bus.id 0x87
++bus.name ADB
+
+ bus.id 0x88
++bus.name RAID
+
+ bus.id 0x89
++bus.name SBUS
+
+ bus.id 0x8a
++bus.name I2O
+
+ bus.id 0x8b
++bus.name Virtual IO
+
+ bus.id 0x8c
++bus.name CCW
+
+ bus.id 0x8d
++bus.name IUCV
--- /dev/null
+# digital cameras
+
+
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+# digital (usb) still cams
+
+ vendor.id usb 0x03f0
++vendor.name HP
+
+ vendor.id usb 0x03f0
+&device.id usb 0x4102
++baseclass.id 0x10f
++subclass.id 0x01
++device.name PhotoSmart 618
+
+ vendor.id usb 0x03f0
+&device.id usb 0x4202
++baseclass.id 0x10f
++subclass.id 0x01
++device.name PhotoSmart 812
+
+ vendor.id usb 0x03f0
+&device.id usb 0x4302
++baseclass.id 0x10f
++subclass.id 0x01
++device.name PhotoSmart 850
+
+ vendor.id usb 0x03f0
+&device.id usb 0x4402
++baseclass.id 0x10f
++subclass.id 0x01
++device.name PhotoSmart 935
+
+ vendor.id usb 0x03f0
+&device.id usb 0x6302
++baseclass.id 0x10f
++subclass.id 0x01
++device.name PhotoSmart 318
+
+ vendor.id usb 0x03f0
+&device.id usb 0x6402
++baseclass.id 0x10f
++subclass.id 0x01
++device.name PhotoSmart 715
+
+ vendor.id usb 0x03f0
+&device.id usb 0x6502
++baseclass.id 0x10f
++subclass.id 0x01
++device.name PhotoSmart 120
+
+ vendor.id usb 0x03f0
+&device.id usb 0x6602
++baseclass.id 0x10f
++subclass.id 0x01
++device.name PhotoSmart 320
+
+ vendor.id usb 0x03f0
+&device.id usb 0x6702
++baseclass.id 0x10f
++subclass.id 0x01
++device.name PhotoSmart 720
+
+ vendor.id usb 0x03f0
+&device.id usb 0x6802
++baseclass.id 0x10f
++subclass.id 0x01
++device.name PhotoSmart 620
+
+ vendor.id usb 0x03f0
+&device.id usb 0x6a02
++baseclass.id 0x10f
++subclass.id 0x01
++device.name PhotoSmart 735
+
+ vendor.id usb 0x040a
++vendor.name Kodak
+
+ vendor.id usb 0x040a
+&device.id usb 0x0100
++baseclass.id 0x10f
++subclass.id 0x01
++device.name DC220
+
+ vendor.id usb 0x040a
+&device.id usb 0x0110
++baseclass.id 0x10f
++subclass.id 0x01
++device.name DC260
+
+ vendor.id usb 0x040a
+&device.id usb 0x0111
++baseclass.id 0x10f
++subclass.id 0x01
++device.name DC265
+
+ vendor.id usb 0x040a
+&device.id usb 0x0112
++baseclass.id 0x10f
++subclass.id 0x01
++device.name DC290
+
+ vendor.id usb 0x041e
++vendor.name Creative
+
+ vendor.id usb 0x041e
+&device.id usb 0x400a
++baseclass.id 0x10f
++subclass.id 0x01
++device.name PC-CAM 300
+
+ vendor.id usb 0x041e
+&device.id usb 0x400b
++baseclass.id 0x10f
++subclass.id 0x01
++device.name PC-CAM 600
+
+ vendor.id usb 0x04a5
++vendor.name Benq
+
+ vendor.id usb 0x04a5
+&device.id usb 0x3003
++baseclass.id 0x10f
++subclass.id 0x01
++device.name DC1300
+
+ vendor.id usb 0x04a9
++vendor.name Canon
+
+ vendor.id usb 0x04a9
+&device.id usb 0x3041
++baseclass.id 0x10f
++subclass.id 0x01
++device.name PowerShot S10
+
+ vendor.id usb 0x04a9
+&device.id usb 0x3043
++baseclass.id 0x10f
++subclass.id 0x01
++device.name PowerShot S20
+
+ vendor.id usb 0x04a9
+&device.id usb 0x3044
++baseclass.id 0x10f
++subclass.id 0x01
++device.name EOS D30
+
+ vendor.id usb 0x04a9
+&device.id usb 0x3045
++baseclass.id 0x10f
++subclass.id 0x01
++device.name PowerShot S100
+
+ vendor.id usb 0x04a9
+&device.id usb 0x3046
++baseclass.id 0x10f
++subclass.id 0x01
++device.name IXY DIGITAL
+
+ vendor.id usb 0x04a9
+&device.id usb 0x3047
++baseclass.id 0x10f
++subclass.id 0x01
++device.name Digital IXUS
+
+ vendor.id usb 0x04a9
+&device.id usb 0x3048
++baseclass.id 0x10f
++subclass.id 0x01
++device.name PowerShot G1
+
+ vendor.id usb 0x04a9
+&device.id usb 0x3049
++baseclass.id 0x10f
++subclass.id 0x01
++device.name PowerShot Pro90 IS
+
+ vendor.id usb 0x04a9
+&device.id usb 0x304b
++baseclass.id 0x10f
++subclass.id 0x01
++device.name IXY DIGITAL 300
+
+ vendor.id usb 0x04a9
+&device.id usb 0x304c
++baseclass.id 0x10f
++subclass.id 0x01
++device.name PowerShot S300
+
+ vendor.id usb 0x04a9
+&device.id usb 0x304d
++baseclass.id 0x10f
++subclass.id 0x01
++device.name Digital IXUS 300
+
+ vendor.id usb 0x04a9
+&device.id usb 0x304e
++baseclass.id 0x10f
++subclass.id 0x01
++device.name PowerShot A20
+
+ vendor.id usb 0x04a9
+&device.id usb 0x304f
++baseclass.id 0x10f
++subclass.id 0x01
++device.name PowerShot A10
+
+ vendor.id usb 0x04a9
+&device.id usb 0x3051
++baseclass.id 0x10f
++subclass.id 0x01
++device.name PowerShot S110
+
+ vendor.id usb 0x04a9
+&device.id usb 0x3052
++baseclass.id 0x10f
++subclass.id 0x01
++device.name DIGITAL IXUS V
+
+ vendor.id usb 0x04a9
+&device.id usb 0x3055
++baseclass.id 0x10f
++subclass.id 0x01
++device.name PowerShot G2
+
+ vendor.id usb 0x04a9
+&device.id usb 0x3056
++baseclass.id 0x10f
++subclass.id 0x01
++device.name PowerShot S40
+
+ vendor.id usb 0x04a9
+&device.id usb 0x3057
++baseclass.id 0x10f
++subclass.id 0x01
++device.name PowerShot S30
+
+ vendor.id usb 0x04a9
+&device.id usb 0x3058
++baseclass.id 0x10f
++subclass.id 0x01
++device.name PowerShot A40
+
+ vendor.id usb 0x04a9
+&device.id usb 0x3059
++baseclass.id 0x10f
++subclass.id 0x01
++device.name PowerShot A30
+
+ vendor.id usb 0x04a9
+&device.id usb 0x3060
++baseclass.id 0x10f
++subclass.id 0x01
++device.name EOS D60
+
+ vendor.id usb 0x04a9
+&device.id usb 0x3061
++baseclass.id 0x10f
++subclass.id 0x01
++device.name PowerShot A100
+
+ vendor.id usb 0x04a9
+&device.id usb 0x3062
++baseclass.id 0x10f
++subclass.id 0x01
++device.name PowerShot A200
+
+ vendor.id usb 0x04a9
+&device.id usb 0x3065
++baseclass.id 0x10f
++subclass.id 0x01
++device.name IXUS v2
+
+ vendor.id usb 0x04a9
+&device.id usb 0x3066
++baseclass.id 0x10f
++subclass.id 0x01
++device.name IXUS 330
+
+ vendor.id usb 0x04a9
+&device.id usb 0x306a
++baseclass.id 0x10f
++subclass.id 0x01
++device.name PowerShot S45
+
+ vendor.id usb 0x04a9
+&device.id usb 0x306b
++baseclass.id 0x10f
++subclass.id 0x01
++device.name Optura 200 MC
+
+ vendor.id usb 0x04a9
+&device.id usb 0x306c
++baseclass.id 0x10f
++subclass.id 0x01
++device.name PowerShot S45
+
+ vendor.id usb 0x04a9
+&device.id usb 0x306d
++baseclass.id 0x10f
++subclass.id 0x01
++device.name PowerShot S45
+
+ vendor.id usb 0x04a9
+&device.id usb 0x306e
++baseclass.id 0x10f
++subclass.id 0x01
++device.name PowerShot G3
+
+ vendor.id usb 0x04a9
+&device.id usb 0x306f
++baseclass.id 0x10f
++subclass.id 0x01
++device.name PowerShot G3
+
+ vendor.id usb 0x04a9
+&device.id usb 0x3070
++baseclass.id 0x10f
++subclass.id 0x01
++device.name IXUS v3
+
+ vendor.id usb 0x04a9
+&device.id usb 0x3071
++baseclass.id 0x10f
++subclass.id 0x01
++device.name IXUS v3
+
+ vendor.id usb 0x04a9
+&device.id usb 0x3072
++baseclass.id 0x10f
++subclass.id 0x01
++device.name IXUS II
+
+ vendor.id usb 0x04a9
+&device.id usb 0x3073
++baseclass.id 0x10f
++subclass.id 0x01
++device.name PowerShot A70
+
+ vendor.id usb 0x04a9
+&device.id usb 0x3074
++baseclass.id 0x10f
++subclass.id 0x01
++device.name PowerShot A60
+
+ vendor.id usb 0x04a9
+&device.id usb 0x3075
++baseclass.id 0x10f
++subclass.id 0x01
++device.name IXUS 400
+
+ vendor.id usb 0x04a9
+&device.id usb 0x3076
++baseclass.id 0x10f
++subclass.id 0x01
++device.name PowerShot A300
+
+ vendor.id usb 0x04a9
+&device.id usb 0x3077
++baseclass.id 0x10f
++subclass.id 0x01
++device.name PowerShot S50
+
+ vendor.id usb 0x04a9
+&device.id usb 0x3078
++baseclass.id 0x10f
++subclass.id 0x01
++device.name ZR70MC
+
+ vendor.id usb 0x04a9
+&device.id usb 0x307b
++baseclass.id 0x10f
++subclass.id 0x01
++device.name MV630i
+
+ vendor.id usb 0x04a9
+&device.id usb 0x307f
++baseclass.id 0x10f
++subclass.id 0x01
++device.name Optura 20
+
+ vendor.id usb 0x04a9
+&device.id usb 0x3081
++baseclass.id 0x10f
++subclass.id 0x01
++device.name Optura 10
+
+ vendor.id usb 0x04a9
+&device.id usb 0x3083
++baseclass.id 0x10f
++subclass.id 0x01
++device.name EOS 10D
+
+ vendor.id usb 0x04a9
+&device.id usb 0x3084
++baseclass.id 0x10f
++subclass.id 0x01
++device.name EOS 300D
+
+ vendor.id usb 0x04a9
+&device.id usb 0x3085
++baseclass.id 0x10f
++subclass.id 0x01
++device.name PowerShot G5
+
+ vendor.id usb 0x04a9
+&device.id usb 0x3099
++baseclass.id 0x10f
++subclass.id 0x01
++device.name EOS 300D
+
+ vendor.id usb 0x04a9
+&device.id usb 0x309a
++baseclass.id 0x10f
++subclass.id 0x01
++device.name PowerShot A80
+
+ vendor.id usb 0x04a9
+&device.id usb 0x309b
++baseclass.id 0x10f
++subclass.id 0x01
++device.name IXUS i
+
+ vendor.id usb 0x04b0
++vendor.name Nikon
+
+ vendor.id usb 0x04b0
+&device.id usb 0x0102
++baseclass.id 0x10f
++subclass.id 0x01
++device.name Coolpix 990
+
+ vendor.id usb 0x04b0
+&device.id usb 0x0103
++baseclass.id 0x10f
++subclass.id 0x01
++device.name Coolpix 880
+
+ vendor.id usb 0x04b0
+&device.id usb 0x0104
++baseclass.id 0x10f
++subclass.id 0x01
++device.name Coolpix 995
+
+ vendor.id usb 0x04b0
+&device.id usb 0x0109
++baseclass.id 0x10f
++subclass.id 0x01
++device.name Coolpix 2500
+
+ vendor.id usb 0x04b0
+&device.id usb 0x010b
++baseclass.id 0x10f
++subclass.id 0x01
++device.name Coolpix 4500
+
+ vendor.id usb 0x04b0
+&device.id usb 0x010d
++baseclass.id 0x10f
++subclass.id 0x01
++device.name Coolpix 5700
+
+ vendor.id usb 0x04b0
+&device.id usb 0x010f
++baseclass.id 0x10f
++subclass.id 0x01
++device.name Coolpix 4300
+
+ vendor.id usb 0x04b0
+&device.id usb 0x0111
++baseclass.id 0x10f
++subclass.id 0x01
++device.name Coolpix 3500
+
+ vendor.id usb 0x04b0
+&device.id usb 0x0112
++baseclass.id 0x10f
++subclass.id 0x01
++device.name Coolpix 885
+
+ vendor.id usb 0x04b0
+&device.id usb 0x0113
++baseclass.id 0x10f
++subclass.id 0x01
++device.name Coolpix 5000
+
+ vendor.id usb 0x04b0
+&device.id usb 0x0115
++baseclass.id 0x10f
++subclass.id 0x01
++device.name Coolpix 3100
+
+ vendor.id usb 0x04b0
+&device.id usb 0x0117
++baseclass.id 0x10f
++subclass.id 0x01
++device.name Coolpix 2100
+
+ vendor.id usb 0x04b0
+&device.id usb 0x0119
++baseclass.id 0x10f
++subclass.id 0x01
++device.name Coolpix 5400
+
+ vendor.id usb 0x04b0
+&device.id usb 0x0202
++baseclass.id 0x10f
++subclass.id 0x01
++device.name Coolpix SQ
+
+ vendor.id usb 0x04b0
+&device.id usb 0x0302
++baseclass.id 0x10f
++subclass.id 0x01
++device.name Coolpix 2000
+
+ vendor.id usb 0x04b0
+&device.id usb 0x0402
++baseclass.id 0x10f
++subclass.id 0x01
++device.name DSC D100
+
+
+ vendor.id usb 0x04b8
++vendor.name Epson
+
+ vendor.id usb 0x04fc
++vendor.name Sunplus
+
+ vendor.id usb 0x04fc
+&device.id usb 0x504a
++baseclass.id 0x10f
++subclass.id 0x01
++device.name SPCA 504a camera
+
+ vendor.id usb 0x04fc
+&device.id usb 0x504b
++baseclass.id 0x10f
++subclass.id 0x01
++device.name SPCA 504b camera
+
+
+ vendor.id usb 0x04b8
+&device.id usb 0x0403
++baseclass.id 0x10f
++subclass.id 0x01
++device.name PhotoPC 3000z
+
+ vendor.id usb 0x0553
++vendor.name STM
+
+ vendor.id usb 0x0553
+&device.id usb 0x0202
++baseclass.id 0x10f
++subclass.id 0x01
++device.name STV680 based camera
+
+ vendor.id usb 0x054c
++vendor.name Sony
+
+ vendor.id usb 0x054c
+&device.id usb 0x004e
++baseclass.id 0x10f
++subclass.id 0x01
++device.name Digital Camera
+
+ vendor.id usb 0x055f
++vendor.name Mustek
+
+ vendor.id usb 0x055f
+&device.id usb 0xa350
++baseclass.id 0x10f
++subclass.id 0x01
++device.name gSmart 350
+
+ vendor.id usb 0x055f
+&device.id usb 0xc200
++baseclass.id 0x10f
++subclass.id 0x01
++device.name gSmart 300
+
+ vendor.id usb 0x055f
+&device.id usb 0xc220
++baseclass.id 0x10f
++subclass.id 0x01
++device.name gSmart mini
+
+ vendor.id usb 0x055f
+&device.id usb 0xc420
++baseclass.id 0x10f
++subclass.id 0x01
++device.name gSmart mini 2
+
+ vendor.id usb 0x055f
+&device.id usb 0xc520
++baseclass.id 0x10f
++subclass.id 0x01
++device.name gSmart mini 3
+
+ vendor.id usb 0x06bd
++vendor.name Agfa
+
+ vendor.id usb 0x06bd
+&device.id usb 0x0403
++baseclass.id 0x10f
++subclass.id 0x01
++device.name CL18
+
+ vendor.id usb 0x06bd
+&device.id usb 0x0404
++baseclass.id 0x10f
++subclass.id 0x01
++device.name CL20
+
+ vendor.id usb 0x0797
++vendor.name Grandtech
+
+ vendor.id usb 0x0797
+&device.id usb 0x801a
++baseclass.id 0x10f
++subclass.id 0x01
++device.name 891a
+
+ vendor.id usb 0x0797
+&device.id usb 0x801c
++baseclass.id 0x10f
++subclass.id 0x01
++device.name 891c
+
+ vendor.id usb 0x0797
+&device.id usb 0x8901
++baseclass.id 0x10f
++subclass.id 0x01
++device.name SX-35
+
+ vendor.id usb 0x0797
+&device.id usb 0x8909
++baseclass.id 0x10f
++subclass.id 0x01
++device.name SX-35
+
+ vendor.id usb 0x0797
+&device.id usb 0x8911
++baseclass.id 0x10f
++subclass.id 0x01
++device.name SX-35
+
+
+ vendor.id usb 0x0784
++vendor.name Polaroid
+
+ vendor.id usb 0x0784
+&device.id usb 0x0784
++baseclass.id 0x10f
++subclass.id 0x01
++device.name DC700
+
+ vendor.id usb 0x07b4
++vendor.name Olympus
+
+ vendor.id usb 0x07b4
+&device.id usb 0x0100
++baseclass.id 0x10f
++subclass.id 0x01
++device.name C-2100UZ
+
+ vendor.id usb 0x07b4
+&device.id usb 0x0105
++baseclass.id 0x10f
++subclass.id 0x01
++device.name C-2040Z
+
+ vendor.id usb 0x07b4
+&device.id usb 0x0114
++baseclass.id 0x10f
++subclass.id 0x01
++device.name PTP Camera
+
+# vendor.id usb 0x07cf
+#+vendor.name Casio
+
+# vendor.id usb 0x07cf
+#&device.id usb 0x1001
+#+baseclass.id 0x10f
+#+subclass.id 0x02
+
+ vendor.id usb 0x084d
++vendor.name Minton
+
+ vendor.id usb 0x084d
+&device.id usb 0x0003
++baseclass.id 0x10f
++subclass.id 0x01
++device.name S-Cam F5
+
+
+ vendor.id usb 0x084e
++vendor.name KBGear
+
+ vendor.id usb 0x084e
+&device.id usb 0x0001
++baseclass.id 0x10f
++subclass.id 0x01
++device.name JamCam v3
+
+ vendor.id usb 0x0919
++vendor.name Tiger
+
+ vendor.id usb 0x0919
+&device.id usb 0x0100
++baseclass.id 0x10f
++subclass.id 0x01
++device.name Fast Flicks
+
+ vendor.id usb 0x0d64
++vendor.name DXG
+
+ vendor.id usb 0x0d94
+&device.id usb 0x1021
++baseclass.id 0x10f
++subclass.id 0x01
++device.name D-Link DSC 350F
+
+ vendor.id usb 0x0d94
+&device.id usb 0x1001
++baseclass.id 0x10f
++subclass.id 0x01
++device.name SiPix Stylecam
+
+ vendor.id usb 0x0d96
++vendor.name Traveller
+
+ vendor.id usb 0x0d96
+&device.id usb 0x3300
++baseclass.id 0x10f
++subclass.id 0x01
++device.name SX 330z
+
+ vendor.id usb 0x0d96
+&device.id usb 0x4100
++baseclass.id 0x10f
++subclass.id 0x01
++device.name SX 410z
+
+ vendor.id usb 0x0d96
+&device.id usb 0x4102
++baseclass.id 0x10f
++subclass.id 0x01
++vendor.name Medion
++device.name MD 9700
+
+ vendor.id usb 0x0d96
+&device.id usb 0x0000
++baseclass.id 0x10f
++subclass.id 0x01
++vendor.name Jenoptik
++device.name JD350v
+
+ vendor.id usb 0x2770
++vendor.name NHJ
+
+ vendor.id usb 0x2770
+&device.id usb 0x9120
++baseclass.id 0x10f
++subclass.id 0x01
++device.name 9120 based camera
+
+
+
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+# webcams
+
+ vendor.id usb 0x05a9
++vendor.name OmniVision
+
+ vendor.id usb 0x05a9
+&device.id usb 0x0511
++baseclass.id 0x10f
++subclass.id 0x00
++device.name OV511 WebCam
+
+ vendor.id usb 0x05a9
+&device.id usb 0xa511
++baseclass.id 0x10f
++subclass.id 0x00
++device.name OV511+ WebCam
+
+ vendor.id usb 0x0813
++vendor.name Mattel
+
+ vendor.id usb 0x0813
+&device.id usb 0x0002
++baseclass.id 0x10f
++subclass.id 0x00
++device.name OV511 based WebCam
+
+ vendor.id usb 0x06a5
+&device.id usb 0x0000
++baseclass.id 0x10f
++subclass.id 0x00
++device.name Typhoon Webcam 100k
+
+
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+# usbmap: ov511.o
+ vendor.id usb 0x05a9
+&device.id usb 0x0511
+|vendor.id usb 0x05a9
+&device.id usb 0x0518
+|vendor.id usb 0x05a9
+&device.id usb 0xa511
+|vendor.id usb 0x05a9
+&device.id usb 0xa518
+|vendor.id usb 0x0813
+&device.id usb 0x0002
++baseclass.id 0x10f
++subclass.id 0x00
+
+# usbmap: pwc.o
+ vendor.id usb 0x041e
+&device.id usb 0x400c
+|vendor.id usb 0x041e
+&device.id usb 0x4011
+|vendor.id usb 0x046d
+&device.id usb 0x08b0+0x0009
+|vendor.id usb 0x0471
+&device.id usb 0x0302+0x0003
+|vendor.id usb 0x0471
+&device.id usb 0x0307+0x0002
+|vendor.id usb 0x0471
+&device.id usb 0x030c
+|vendor.id usb 0x0471
+&device.id usb 0x0310+0x0004
+|vendor.id usb 0x04cc
+&device.id usb 0x8116
+|vendor.id usb 0x055d
+&device.id usb 0x9000+0x0002
+|vendor.id usb 0x069a
+&device.id usb 0x0001
+|vendor.id usb 0x0d81
+&device.id usb 0x1900
+|vendor.id usb 0x0d81
+&device.id usb 0x1910
++baseclass.id 0x10f
++subclass.id 0x00
+
--- /dev/null
+# chipcard reader
+
+
+ vendor.id TWK
++vendor.name Towitoko
+
+ vendor.id TWK
+&device.id eisa 0x5542
++baseclass.id 0x10e
++subclass.id 0x00
++device.name Smartcard reader
++requires pcsc-towitoko
+
+ vendor.id usb 0x0c4b
+&device.id usb 0x0100
++baseclass.id 0x10e
++subclass.id 0x00
++device.name Cyberjack USB
++driver.module.modprobe cyberjack
++requires ctapi-cyberjack
+
--- /dev/null
+# device classes
+
+
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+# PCI device classes and subclasses
+
+ baseclass.id 0x000
++baseclass.name Unclassified device
+
+ baseclass.id 0x000
+&subclass.id 0x00
++subclass.name Unclassified device
+
+ baseclass.id 0x000
+&subclass.id 0x01
++subclass.name VGA compatible unclassified device
+
+ baseclass.id 0x001
++baseclass.name Mass storage controller
+
+ baseclass.id 0x001
+&subclass.id 0x00
++subclass.name SCSI storage controller
+
+ baseclass.id 0x001
+&subclass.id 0x01
++subclass.name IDE interface
+
+ baseclass.id 0x001
+&subclass.id 0x02
++subclass.name Floppy disk controller
+
+ baseclass.id 0x001
+&subclass.id 0x03
++subclass.name IPI bus controller
+
+ baseclass.id 0x001
+&subclass.id 0x04
++subclass.name RAID bus controller
+
+ baseclass.id 0x001
+&subclass.id 0x80
++subclass.name Unknown mass storage controller
+
+ baseclass.id 0x002
++baseclass.name Network controller
+
+ baseclass.id 0x002
+&subclass.id 0x00
++subclass.name Ethernet controller
+
+ baseclass.id 0x002
+&subclass.id 0x01
++subclass.name Token ring network controller
+
+ baseclass.id 0x002
+&subclass.id 0x02
++subclass.name FDDI network controller
+
+ baseclass.id 0x002
+&subclass.id 0x03
++subclass.name ATM network controller
+
+ baseclass.id 0x002
+&subclass.id 0x04
++subclass.name ISDN controller
+
+ baseclass.id 0x002
+&subclass.id 0x80
++subclass.name Network controller
+
+ baseclass.id 0x002
+&subclass.id 0x81
++subclass.name Myrinet controller
+
+ baseclass.id 0x002
+&subclass.id 0x82
++subclass.name WLAN controller
+
+ baseclass.id 0x002
+&subclass.id 0x83
++subclass.name XPNET controller
+
+ baseclass.id 0x002
+&subclass.id 0x86
++subclass.name OSA-Express controller
+
+ baseclass.id 0x002
+&subclass.id 0x87
++subclass.name HiperSocket controller
+
+ baseclass.id 0x002
+&subclass.id 0x88
++subclass.name CTC controller
+
+ baseclass.id 0x002
+&subclass.id 0x89
++subclass.name OSA-2 controller
+
+ baseclass.id 0x002
+&subclass.id 0x8e
++subclass.name FICON controller
+
+ baseclass.id 0x002
+&subclass.id 0x8f
++subclass.name ESCON controller
+
+ baseclass.id 0x002
+&subclass.id 0x90
++subclass.name IUCV connection
+
+ baseclass.id 0x002
+&subclass.id 0x91
++subclass.name USB Host-to-Host link
+
+ baseclass.id 0x003
++baseclass.name Display controller
+
+ baseclass.id 0x003
+&subclass.id 0x00
++subclass.name VGA compatible controller
+
+ baseclass.id 0x003
+&subclass.id 0x00
+&progif.id 0x00
++progif.name VGA
+
+ baseclass.id 0x003
+&subclass.id 0x00
+&progif.id 0x01
++progif.name 8514
+
+ baseclass.id 0x003
+&subclass.id 0x01
++subclass.name XGA compatible controller
+
+ baseclass.id 0x003
+&subclass.id 0x02
++subclass.name 3D controller
+
+ baseclass.id 0x003
+&subclass.id 0x80
++subclass.name Display controller
+
+ baseclass.id 0x004
++baseclass.name Multimedia controller
+
+ baseclass.id 0x004
+&subclass.id 0x00
++subclass.name Multimedia video controller
+
+ baseclass.id 0x004
+&subclass.id 0x01
++subclass.name Multimedia audio controller
+
+ baseclass.id 0x004
+&subclass.id 0x02
++subclass.name Computer telephony device
+
+ baseclass.id 0x004
+&subclass.id 0x80
++subclass.name Multimedia controller
+
+ baseclass.id 0x005
++baseclass.name Memory controller
+
+ baseclass.id 0x005
+&subclass.id 0x00
++subclass.name RAM memory
+
+ baseclass.id 0x005
+&subclass.id 0x01
++subclass.name FLASH memory
+
+ baseclass.id 0x005
+&subclass.id 0x80
++subclass.name Memory controller
+
+ baseclass.id 0x006
++baseclass.name Bridge
+
+ baseclass.id 0x006
+&subclass.id 0x00
++subclass.name Host bridge
+
+ baseclass.id 0x006
+&subclass.id 0x01
++subclass.name ISA bridge
+
+ baseclass.id 0x006
+&subclass.id 0x02
++subclass.name EISA bridge
+
+ baseclass.id 0x006
+&subclass.id 0x03
++subclass.name MicroChannel bridge
+
+ baseclass.id 0x006
+&subclass.id 0x04
++subclass.name PCI bridge
+
+ baseclass.id 0x006
+&subclass.id 0x04
+&progif.id 0x00
++progif.name Normal decode
+
+ baseclass.id 0x006
+&subclass.id 0x04
+&progif.id 0x01
++progif.name Subtractive decode
+
+ baseclass.id 0x006
+&subclass.id 0x05
++subclass.name PCMCIA bridge
+
+ baseclass.id 0x006
+&subclass.id 0x06
++subclass.name NuBus bridge
+
+ baseclass.id 0x006
+&subclass.id 0x07
++subclass.name CardBus bridge
+
+ baseclass.id 0x006
+&subclass.id 0x08
++subclass.name RACEway bridge
+
+ baseclass.id 0x006
+&subclass.id 0x08
+&progif.id 0x00
++progif.name Transparent mode
+
+ baseclass.id 0x006
+&subclass.id 0x08
+&progif.id 0x01
++progif.name Endpoint mode
+
+ baseclass.id 0x006
+&subclass.id 0x09
++subclass.name Semi-transparent PCI-to-PCI bridge
+
+ baseclass.id 0x006
+&subclass.id 0x09
+&progif.id 0x40
++progif.name Primary bus towards host CPU
+
+ baseclass.id 0x006
+&subclass.id 0x09
+&progif.id 0x80
++progif.name Secondary bus towards host CPU
+
+ baseclass.id 0x006
+&subclass.id 0x0a
++subclass.name InfiniBand to PCI host bridge
+
+ baseclass.id 0x006
+&subclass.id 0x80
++subclass.name Bridge
+
+ baseclass.id 0x007
++baseclass.name Communication controller
+
+ baseclass.id 0x007
+&subclass.id 0x00
++subclass.name Serial controller
+
+ baseclass.id 0x007
+&subclass.id 0x00
+&progif.id 0x00
++progif.name 8250
+
+ baseclass.id 0x007
+&subclass.id 0x00
+&progif.id 0x01
++progif.name 16450
+
+ baseclass.id 0x007
+&subclass.id 0x00
+&progif.id 0x02
++progif.name 16550
+
+ baseclass.id 0x007
+&subclass.id 0x00
+&progif.id 0x03
++progif.name 16650
+
+ baseclass.id 0x007
+&subclass.id 0x00
+&progif.id 0x04
++progif.name 16750
+
+ baseclass.id 0x007
+&subclass.id 0x00
+&progif.id 0x05
++progif.name 16850
+
+ baseclass.id 0x007
+&subclass.id 0x00
+&progif.id 0x06
++progif.name 16950
+
+ baseclass.id 0x007
+&subclass.id 0x01
++subclass.name Parallel controller
+
+ baseclass.id 0x007
+&subclass.id 0x01
+&progif.id 0x00
++progif.name SPP
+
+ baseclass.id 0x007
+&subclass.id 0x01
+&progif.id 0x01
++progif.name BiDir
+
+ baseclass.id 0x007
+&subclass.id 0x01
+&progif.id 0x02
++progif.name ECP
+
+ baseclass.id 0x007
+&subclass.id 0x01
+&progif.id 0x03
++progif.name IEEE1284
+
+ baseclass.id 0x007
+&subclass.id 0x01
+&progif.id 0xfe
++progif.name IEEE1284 Target
+
+ baseclass.id 0x007
+&subclass.id 0x02
++subclass.name Multiport serial controller
+
+ baseclass.id 0x007
+&subclass.id 0x03
++subclass.name Modem
+
+ baseclass.id 0x007
+&subclass.id 0x03
+&progif.id 0x01
++progif.name Hayes/16450
+
+ baseclass.id 0x007
+&subclass.id 0x03
+&progif.id 0x02
++progif.name Hayes/16550
+
+ baseclass.id 0x007
+&subclass.id 0x03
+&progif.id 0x03
++progif.name Hayes/16650
+
+ baseclass.id 0x007
+&subclass.id 0x03
+&progif.id 0x04
++progif.name Hayes/16750
+
+ baseclass.id 0x007
+&subclass.id 0x80
++subclass.name Communication controller
+
+ baseclass.id 0x007+0x0002
+&subclass.id 0x03
+&progif.id 0x00
++progif.name Generic
+
+ baseclass.id 0x008
++baseclass.name Generic system peripheral
+
+ baseclass.id 0x008
+&subclass.id 0x00
++subclass.name PIC
+
+ baseclass.id 0x008
+&subclass.id 0x00
+&progif.id 0x00
++progif.name 8259
+
+ baseclass.id 0x008
+&subclass.id 0x00
+&progif.id 0x01
++progif.name ISA PIC
+
+ baseclass.id 0x008
+&subclass.id 0x00
+&progif.id 0x02
++progif.name EISA PIC
+
+ baseclass.id 0x008
+&subclass.id 0x00
+&progif.id 0x10
++progif.name IO-APIC
+
+ baseclass.id 0x008
+&subclass.id 0x00
+&progif.id 0x20
++progif.name IO(X)-APIC
+
+ baseclass.id 0x008
+&subclass.id 0x01
++subclass.name DMA controller
+
+ baseclass.id 0x008
+&subclass.id 0x01
+&progif.id 0x00
++progif.name 8237
+
+ baseclass.id 0x008
+&subclass.id 0x01
+&progif.id 0x01
++progif.name ISA DMA
+
+ baseclass.id 0x008
+&subclass.id 0x01
+&progif.id 0x02
++progif.name EISA DMA
+
+ baseclass.id 0x008
+&subclass.id 0x02
++subclass.name Timer
+
+ baseclass.id 0x008
+&subclass.id 0x02
+&progif.id 0x00
++progif.name 8254
+
+ baseclass.id 0x008
+&subclass.id 0x02
+&progif.id 0x01
++progif.name ISA Timer
+
+ baseclass.id 0x008
+&subclass.id 0x02
+&progif.id 0x02
++progif.name EISA Timers
+
+ baseclass.id 0x008
+&subclass.id 0x03
++subclass.name RTC
+
+ baseclass.id 0x008
+&subclass.id 0x03
+&progif.id 0x01
++progif.name ISA RTC
+
+ baseclass.id 0x008
+&subclass.id 0x04
++subclass.name PCI Hot-plug controller
+
+ baseclass.id 0x008
+&subclass.id 0x80
++subclass.name System peripheral
+
+ baseclass.id 0x009
++baseclass.name Input device controller
+
+ baseclass.id 0x009
+&subclass.id 0x00
++subclass.name Keyboard controller
+
+ baseclass.id 0x009
+&subclass.id 0x01
++subclass.name Digitizer Pen
+
+ baseclass.id 0x009
+&subclass.id 0x02
++subclass.name Mouse controller
+
+ baseclass.id 0x009
+&subclass.id 0x03
++subclass.name Scanner controller
+
+ baseclass.id 0x009
+&subclass.id 0x04
++subclass.name Gameport controller
+
+ baseclass.id 0x009
+&subclass.id 0x04
+&progif.id 0x00
++progif.name Generic
+
+ baseclass.id 0x009
+&subclass.id 0x04
+&progif.id 0x10
++progif.name Extended
+
+ baseclass.id 0x009
+&subclass.id 0x80
++subclass.name Input device controller
+
+ baseclass.id 0x00a
++baseclass.name Docking station
+
+ baseclass.id 0x00a
+&subclass.id 0x00
++subclass.name Generic Docking Station
+
+ baseclass.id 0x00a
+&subclass.id 0x80
++subclass.name Docking Station
+
+ baseclass.id 0x00b
++baseclass.name Processor
+
+ baseclass.id 0x00b
+&subclass.id 0x00
++subclass.name 386
+
+ baseclass.id 0x00b
+&subclass.id 0x01
++subclass.name 486
+
+ baseclass.id 0x00b
+&subclass.id 0x02
++subclass.name Pentium
+
+ baseclass.id 0x00b
+&subclass.id 0x10
++subclass.name Alpha
+
+ baseclass.id 0x00b
+&subclass.id 0x20
++subclass.name Power PC
+
+ baseclass.id 0x00b
+&subclass.id 0x30
++subclass.name MIPS
+
+ baseclass.id 0x00b
+&subclass.id 0x40
++subclass.name Co-processor
+
+ baseclass.id 0x00c
++baseclass.name Serial bus controller
+
+ baseclass.id 0x00c
+&subclass.id 0x00
++subclass.name FireWire (IEEE 1394)
+
+ baseclass.id 0x00c
+&subclass.id 0x00
+&progif.id 0x00
++progif.name Generic
+
+ baseclass.id 0x00c
+&subclass.id 0x00
+&progif.id 0x10
++progif.name OHCI
+
+ baseclass.id 0x00c
+&subclass.id 0x01
++subclass.name ACCESS Bus
+
+ baseclass.id 0x00c
+&subclass.id 0x02
++subclass.name SSA
+
+ baseclass.id 0x00c
+&subclass.id 0x03
++subclass.name USB Controller
+
+ baseclass.id 0x00c
+&subclass.id 0x03
+&progif.id 0x00
++progif.name UHCI
+
+ baseclass.id 0x00c
+&subclass.id 0x03
+&progif.id 0x10
++progif.name OHCI
+
+ baseclass.id 0x00c
+&subclass.id 0x03
+&progif.id 0x20
++progif.name EHCI
+
+ baseclass.id 0x00c
+&subclass.id 0x03
+&progif.id 0x80
++progif.name Unspecified
+
+ baseclass.id 0x00c
+&subclass.id 0x03
+&progif.id 0xfe
++progif.name USB Device
+
+ baseclass.id 0x00c
+&subclass.id 0x04
++subclass.name Fibre Channel
+
+ baseclass.id 0x00c
+&subclass.id 0x05
++subclass.name SMBus
+
+ baseclass.id 0x00c
+&subclass.id 0x06
++subclass.name InfiniBand
+
+ baseclass.id 0x00d
++baseclass.name Wireless controller
+
+ baseclass.id 0x00d
+&subclass.id 0x00
++subclass.name IRDA controller
+
+ baseclass.id 0x00d
+&subclass.id 0x01
++subclass.name Consumer IR controller
+
+ baseclass.id 0x00d
+&subclass.id 0x10
++subclass.name RF controller
+
+ baseclass.id 0x00d
+&subclass.id 0x80
++subclass.name Wireless controller
+
+ baseclass.id 0x00e
++baseclass.name Intelligent controller
+
+ baseclass.id 0x00e
+&subclass.id 0x00
++subclass.name I2O
+
+ baseclass.id 0x00f
++baseclass.name Satellite communications controller
+
+ baseclass.id 0x00f
+&subclass.id 0x00
++subclass.name Satellite TV controller
+
+ baseclass.id 0x00f
+&subclass.id 0x01
++subclass.name Satellite audio communication controller
+
+ baseclass.id 0x00f
+&subclass.id 0x03
++subclass.name Satellite voice communication controller
+
+ baseclass.id 0x00f
+&subclass.id 0x04
++subclass.name Satellite data communication controller
+
+ baseclass.id 0x010
++baseclass.name Encryption controller
+
+ baseclass.id 0x010
+&subclass.id 0x00
++subclass.name Network and computing encryption device
+
+ baseclass.id 0x010
+&subclass.id 0x10
++subclass.name Entertainment encryption device
+
+ baseclass.id 0x010
+&subclass.id 0x80
++subclass.name Encryption controller
+
+ baseclass.id 0x011
++baseclass.name Signal processing controller
+
+ baseclass.id 0x011
+&subclass.id 0x00
++subclass.name DPIO module
+
+ baseclass.id 0x011
+&subclass.id 0x01
++subclass.name Performance counters
+
+ baseclass.id 0x011
+&subclass.id 0x10
++subclass.name Communication synchronizer
+
+ baseclass.id 0x011
+&subclass.id 0x80
++subclass.name Signal processing controller
+
+
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+# our own class definitions
+
+ baseclass.id 0x0ff
++baseclass.name Unclassified device
+
+ baseclass.id 0x100
++baseclass.name Monitor
+
+ baseclass.id 0x100
+&subclass.id 0x01
++subclass.name CRT Monitor
+
+ baseclass.id 0x100
+&subclass.id 0x02
++subclass.name LCD Monitor
+
+ baseclass.id 0x101
++baseclass.name Internally Used Class
+
+ baseclass.id 0x101
+&subclass.id 0x01
++subclass.name ISA PnP Interface
+
+ baseclass.id 0x101
+&subclass.id 0x02
++subclass.name Main Memory
+
+ baseclass.id 0x101
+&subclass.id 0x03
++subclass.name CPU
+
+ baseclass.id 0x101
+&subclass.id 0x04
++subclass.name FPU
+
+ baseclass.id 0x101
+&subclass.id 0x05
++subclass.name BIOS
+
+ baseclass.id 0x101
+&subclass.id 0x06
++subclass.name PROM
+
+ baseclass.id 0x101
+&subclass.id 0x07
++subclass.name System
+
+ baseclass.id 0x102
++baseclass.name Modem
+
+ baseclass.id 0x102
+&subclass.id 0x00
++subclass.name Modem
+
+ baseclass.id 0x102
+&subclass.id 0x01+4
++subclass.name LinModem
+
+ baseclass.id 0x103
++baseclass.name ISDN Adapter
+
+ baseclass.id 0x104
++baseclass.name PS/2 Controller
+
+ baseclass.id 0x105
++baseclass.name Mouse
+
+ baseclass.id 0x105
+&subclass.id 0x00
++subclass.name PS/2 Mouse
+
+ baseclass.id 0x105
+&subclass.id 0x01
++subclass.name Serial Mouse
+
+ baseclass.id 0x105
+&subclass.id 0x02
++subclass.name Bus Mouse
+
+ baseclass.id 0x105
+&subclass.id 0x03
++subclass.name USB Mouse
+
+ baseclass.id 0x105
+&subclass.id 0x80
++subclass.name Mouse
+
+ baseclass.id 0x106
++baseclass.name Mass Storage Device
+
+ baseclass.id 0x106
+&subclass.id 0x00
++subclass.name Disk
+
+ baseclass.id 0x106
+&subclass.id 0x01
++subclass.name Tape
+
+ baseclass.id 0x106
+&subclass.id 0x02
++subclass.name CD-ROM
+
+ baseclass.id 0x106
+&subclass.id 0x02
+&progif.id 0x01
++progif.name CD-R
+
+ baseclass.id 0x106
+&subclass.id 0x02
+&progif.id 0x02
++progif.name CD-RW
+
+ baseclass.id 0x106
+&subclass.id 0x02
+&progif.id 0x03
++progif.name DVD
+
+ baseclass.id 0x106
+&subclass.id 0x02
+&progif.id 0x04
++progif.name DVD-R
+
+ baseclass.id 0x106
+&subclass.id 0x02
+&progif.id 0x05
++progif.name DVD-RAM
+
+ baseclass.id 0x106
+&subclass.id 0x03
++subclass.name Floppy Disk
+
+ baseclass.id 0x106
+&subclass.id 0x80
++subclass.name Storage Device
+
+ baseclass.id 0x107
++baseclass.name Network Interface
+
+ baseclass.id 0x107
+&subclass.id 0x00
++subclass.name Loopback
+
+ baseclass.id 0x107
+&subclass.id 0x01
++subclass.name Ethernet
+
+ baseclass.id 0x107
+&subclass.id 0x02
++subclass.name Tokenring
+
+ baseclass.id 0x107
+&subclass.id 0x03
++subclass.name FDDI
+
+ baseclass.id 0x107
+&subclass.id 0x04
++subclass.name CTC
+
+ baseclass.id 0x107
+&subclass.id 0x05
++subclass.name IUCV
+
+ baseclass.id 0x107
+&subclass.id 0x06
++subclass.name HSI
+
+ baseclass.id 0x107
+&subclass.id 0x07
++subclass.name QETH
+
+ baseclass.id 0x107
+&subclass.id 0x08
++subclass.name ESCON
+
+ baseclass.id 0x107
+&subclass.id 0x09
++subclass.name Myrinet
+
+ baseclass.id 0x107
+&subclass.id 0x0a
++subclass.name WLAN
+
+ baseclass.id 0x107
+&subclass.id 0x0b
++subclass.name XPNET
+
+ baseclass.id 0x107
+&subclass.id 0x0c
++subclass.name USB-Link
+
+ baseclass.id 0x107
+&subclass.id 0x80
++subclass.name Network Interface
+
+ baseclass.id 0x108
++baseclass.name Keyboard
+
+ baseclass.id 0x108
+&subclass.id 0x00
++subclass.name Keyboard
+
+ baseclass.id 0x108
+&subclass.id 0x01
++subclass.name Console
+
+ baseclass.id 0x109
++baseclass.name Printer
+
+ baseclass.id 0x10a
++baseclass.name Hub
+
+ baseclass.id 0x10a
+&subclass.id 0x01
++subclass.name USB Hub
+
+ baseclass.id 0x10b
++baseclass.name Braille Display
+
+ baseclass.id 0x10c
++baseclass.name Scanner
+
+ baseclass.id 0x10c
+&subclass.id 0x01
++subclass.name HP OfficeJet Scanner
+
+ baseclass.id 0x10d
++baseclass.name Joystick
+
+ baseclass.id 0x10d
+&subclass.id 0x01
++subclass.name Gamepad
+
+ baseclass.id 0x10e
++baseclass.name Chipcard Reader
+
+ baseclass.id 0x10f
++baseclass.name Camera
+
+ baseclass.id 0x10f
+&subclass.id 0x01
++subclass.name WebCam
+
+ baseclass.id 0x10f
+&subclass.id 0x02
++subclass.name Digital Camera
+
+ baseclass.id 0x110
++baseclass.name Framebuffer
+
+ baseclass.id 0x110
+&subclass.id 0x01
++subclass.name VESA Framebuffer
+
+ baseclass.id 0x111
++baseclass.name DVB Card
+
+ baseclass.id 0x111
+&subclass.id 0x01
++subclass.name DVB-C Card
+
+ baseclass.id 0x111
+&subclass.id 0x02
++subclass.name DVB-S Card
+
+ baseclass.id 0x111
+&subclass.id 0x03
++subclass.name DVB-T Card
+
+ baseclass.id 0x112
++baseclass.name TV Card
+
+ baseclass.id 0x113
++baseclass.name Partition
+
+ baseclass.id 0x114
++baseclass.name DSL Card
+
+ baseclass.id 0x115
++baseclass.name Bluetooth Device
+
--- /dev/null
+# dvb cards
+
+ vendor.id pci 0x13d0
+&device.id pci 0x2103
+|vendor.id pci 0x13d0
+&device.id pci 0x2200
++baseclass.id 0x111
++subclass.id 0x00
++driver.module.modprobe skystar2
+
+ vendor.id pci 0x109e
+&device.id pci 0x0878
++driver.module.modprobe bt878
+
+ vendor.id pci 0x109e
+&device.id pci 0x0878
+&subvendor.id pci 0x0071
+&subdevice.id pci 0x0101
++baseclass.id 0x111
++subclass.id 0x00
++driver.module.modprobe bt878
++subdevice.name "Nebula Electronics DigiTV"
+
+ vendor.id pci 0x109e
+&device.id pci 0x0878
+&subvendor.id pci 0x1461
+&subdevice.id pci 0x0761
++baseclass.id 0x111
++subclass.id 0x00
++driver.module.modprobe bt878
++subdevice.name "AverMedia AverTV DVB-T"
+
+ vendor.id pci 0x109e
+&device.id pci 0x0878
+&subvendor.id pci 0x11bd
+&subdevice.id pci 0x0026
++baseclass.id 0x111
++subclass.id 0x00
++driver.module.modprobe bt878
++subdevice.name "Pinnacle PCTV SAT CI"
+
+ vendor.id pci 0x109e
+&device.id pci 0x0878
+&subvendor.id pci 0x1822
+&subdevice.id pci 0x0001
++baseclass.id 0x111
++subclass.id 0x00
++driver.module.modprobe bt878
++subdevice.name "Twinhan VisionPlus DVB-T"
+
+ vendor.id pci 0x109e
+&device.id pci 0x0878
+&subvendor.id pci 0x270f
+&subdevice.id pci 0xfc00
++baseclass.id 0x111
++subclass.id 0x00
++driver.module.modprobe bt878
++subdevice.name "ChainTech digitop DST-1000 DVB-S"
+
+ vendor.id pci 0x109e
+&device.id pci 0x0878
+&subvendor.id pci 0x1461
+&subdevice.id pci 0x0771
++baseclass.id 0x111
++subclass.id 0x00
++driver.module.modprobe bt878
++subdevice.name "AVermedia DVB-T 771"
+
+ vendor.id pci 0x109e
+&device.id pci 0x0878
+&subvendor.id pci 0x18ac
+&subdevice.id pci 0xdb10
++baseclass.id 0x111
++subclass.id 0x00
++driver.module.modprobe bt878
++subdevice.name "DVICO FusionHDTV DVB-T Lite"
+
+ vendor.id pci 0x109e
+&device.id pci 0x0878
+&subvendor.id pci 0x11bd
+&subdevice.id pci 0x001c
++baseclass.id 0x111
++subclass.id 0x00
++driver.module.modprobe bt878
++subdevice.name "Pinnacle PCTV Sat"
+
+ vendor.id pci 0x1131
+&device.id pci 0x7146
+&subvendor.id pci 0x00a1
+&subdevice.id pci 0x00a1
+|vendor.id pci 0x1131
+&device.id pci 0x7146
+&subvendor.id pci 0x00a1
+&subdevice.id pci 0xa1a0
+|vendor.id pci 0x1131
+&device.id pci 0x7146
+&subvendor.id pci 0x110a
+&subdevice.id pci 0x0000
+|vendor.id pci 0x1131
+&device.id pci 0x7146
+&subvendor.id pci 0x110a
+&subdevice.id pci 0xffff
+|vendor.id pci 0x1131
+&device.id pci 0x7146
+&subvendor.id pci 0x13c2
+&subdevice.id pci 0x0000+0x0005
+|vendor.id pci 0x1131
+&device.id pci 0x7146
+&subvendor.id pci 0x13c2
+&subdevice.id pci 0x0006
+|vendor.id pci 0x1131
+&device.id pci 0x7146
+&subvendor.id pci 0x13c2
+&subdevice.id pci 0x0008
+|vendor.id pci 0x1131
+&device.id pci 0x7146
+&subvendor.id pci 0x13c2
+&subdevice.id pci 0x000a
+|vendor.id pci 0x1131
+&device.id pci 0x7146
+&subvendor.id pci 0x13c2
+&subdevice.id pci 0x1002
+|vendor.id pci 0x1131
+&device.id pci 0x7146
+&subvendor.id pci 0x13c2
+&subdevice.id pci 0x1102
+|vendor.id pci 0x1131
+&device.id pci 0x7146
+&subvendor.id pci 0xffc2
+&subdevice.id pci 0x0000
++baseclass.id 0x111
++subclass.id 0x00
++driver.module.modprobe dvb-ttpci
+
+ vendor.id pci 0x1131
+&device.id pci 0x7146
+&subvendor.id pci 0x1131
+&subdevice.id pci 0x4f56
++baseclass.id 0x111
++subclass.id 0x00
++driver.module.modprobe budget-av
+
+ vendor.id pci 0x1131
+&device.id pci 0x7146
+&subvendor.id pci 0x13c2
+&subdevice.id pci 0x1003+0x0003
+|vendor.id pci 0x1131
+&device.id pci 0x7146
+&subvendor.id pci 0x13c2
+&subdevice.id pci 0x1013
++baseclass.id 0x111
++subclass.id 0x00
++driver.module.modprobe budget
+
+ vendor.id pci 0x1131
+&device.id pci 0x7146
+&subvendor.id pci 0x13c2
+&subdevice.id pci 0x100c
+|vendor.id pci 0x1131
+&device.id pci 0x7146
+&subvendor.id pci 0x13c2
+&subdevice.id pci 0x100f
+|vendor.id pci 0x1131
+&device.id pci 0x7146
+&subvendor.id pci 0x13c2
+&subdevice.id pci 0x1011
++baseclass.id 0x111
++subclass.id 0x00
++driver.module.modprobe budget-ci
+
+
+ vendor.id pci 0x14f1
+&device.id pci 0x8802
+&subvendor.id pci 0x17de
+&subdevice.id pci 0x08a6
+|vendor.id pci 0x14f1
+&device.id pci 0x8802
+&subvendor.id pci 0x18AC
+&subdevice.id pci 0xDB00
+|vendor.id pci 0x14f1
+&device.id pci 0x8802
+&subvendor.id pci 0x0070
+&subdevice.id pci 0x9002
+|vendor.id pci 0x14f1
+&device.id pci 0x8802
+&subvendor.id pci 0x14f1
+&subdevice.id pci 0x0187
++baseclass.id 0x111
++subclass.id 0x00
++driver.module.modprobe cx88-dvb
+
+
--- /dev/null
+# some special entries
+# drop most of them???
+
+
+ vendor.id pci 0x1000
+&device.id pci 0x0001
++baseclass.id 0x001
++subclass.id 0x00
++device.name 53c810
+
+ vendor.id pci 0x1000
+&device.id pci 0x000a
++device.name 53C1510D
+
+ vendor.id pci 0x1011
+&device.id pci 0x1065
++device.name DAC960
+
+ vendor.id pci 0x1039
+&device.id pci 0x7016
++device.name SiS 7016 (RealTek RTL8139) Fast Ethernet
+
+ vendor.id pci 0x103c
+&device.id pci 0x100a
++device.name HP FX6 OpenGL
+
+ vendor.id pci 0x1050
+&device.id pci 0x5a5a
++device.name Winbond
+
+ vendor.id pci 0x106b
+&device.id pci 0x0003
++baseclass.id 0x003
++subclass.id 0x80
+
+ vendor.id pci 0x106b
+&device.id pci 0x0021
++baseclass.id 0x002
++subclass.id 0x00
++device.name GMAC Ethernet Controller
+
+ vendor.id pci 0x106b
+&device.id pci 0x0024
++baseclass.id 0x002
++subclass.id 0x00
++device.name GMAC Ethernet Controller
+
+ vendor.id pci 0x106b
+&device.id pci 0x0022
++device.name Keylargo Mac I/O
+
+ vendor.id pci 0x1077
+&device.id pci 0x1016
++device.name QLA10160
+
+ vendor.id pci 0x1077
+&device.id pci 0x1080
++device.name QLA1080
+
+ vendor.id pci 0x1077
+&device.id pci 0x1216
++device.name QLA12160
+
+ vendor.id pci 0x1077
+&device.id pci 0x1240
++device.name QLA1240
+
+ vendor.id pci 0x1077
+&device.id pci 0x1280
++device.name QLA1280
+
+ vendor.id pci 0x10b7
+&device.id pci 0x5055
++device.name 3c555 Laptop Hurricane
+
+ vendor.id pci 0x10b7
+&device.id pci 0x6560
++device.name 3CCFE656 Cyclone CardBus
+
+ vendor.id pci 0x10b7
+&device.id pci 0x7646
++device.name 3cSOHO100-TX Hurricane
+
+ vendor.id pci 0x10de
+&device.id pci 0x0020
++device.name Riva TNT
+
+ vendor.id pci 0x10ec
+&device.id pci 0x8138
++device.name RTL8139B
+
+ vendor.id pci 0x1101
+&device.id pci 0x0002
++device.name INI-A100U2W
+
+ vendor.id pci 0x1101
+&device.id pci 0x1060
++device.name INI-A100U2W
+
+ vendor.id pci 0x1179
+&device.id pci 0x0601
++device.name Pentium Host Bridge for Notebooks
+
+ vendor.id pci 0x11ad
+&device.id pci 0xc115
++device.name Lite-On LC82C115 PNIC-II
+
+ vendor.id pci 0x12c3
+&device.id pci 0x0058
++device.name HT80232
+
+ vendor.id pci 0x12c3
+&device.id pci 0x5598
++device.name HT80229
+
+ vendor.id pci 0x12eb
++vendor.name Aureal Semiconductor
+
+ vendor.id pci 0x12eb
+&device.id pci 0x0001
++device.name AU8820 Vortex Digital Audio Processor
+
+ vendor.id pci 0x12eb
+&device.id pci 0x0001
+&subvendor.id pci 0x5053
+&subdevice.id pci 0x3355
++subdevice.name TBS Montego A3D
+
+ vendor.id pci 0x134a
+&device.id pci 0x0002
++device.name INI-920
+
+ vendor.id pci 0x15ad
++vendor.name VMWare, Inc.
+
+ vendor.id pci 0x15ad
+&device.id pci 0x0405
++baseclass.id 0x003
++subclass.id 0x00
+
+ vendor.id pci 0x15ad
+&device.id pci 0x0710
++baseclass.id 0x003
++subclass.id 0x00
+
+
+# internal modems
+# (just started...)
+ vendor.id pci 0x127a
++vendor.name Rockwell International
+
+ vendor.id pci 0x127a
+&device.id pci 0x1004
++device.name HCF 56k V90 FaxModem
+
+ vendor.id pci 0x127a
+&device.id pci 0x1005
++device.name PCI56RVP Modem
+
+ vendor.id pci 0x12b9
++vendor.name U.S. Robotics, Inc.
+
+ vendor.id pci 0x12b9
+&device.id pci 0x1006
++device.name 56k voice modem
+
+ vendor.id pci 0x1318
+&device.id pci 0x0911
++device.name Hamachi GNIC-II
+
+
+# new gdth.o (21/06/2001)
+ vendor.id pci 0x1119
+&device.id pci 0x0136
++device.name GDT6x13RS
+
+ vendor.id pci 0x1119
+&device.id pci 0x0137
++device.name GDT6x23RS
+
+ vendor.id pci 0x1119
+&device.id pci 0x013c
++device.name GDT6x33RS
+
+ vendor.id pci 0x1119
+&device.id pci 0x013d
++device.name GDT6x43RS
+
+ vendor.id pci 0x1119
+&device.id pci 0x013e
++device.name GDT6x53RS
+
+ vendor.id pci 0x1119
+&device.id pci 0x013f
++device.name GDT6x63RS
+
+ vendor.id pci 0x1119
+&device.id pci 0x01d6
++device.name GDT4x13RZ
+
+ vendor.id pci 0x1119
+&device.id pci 0x01d7
++device.name GDT4x23RZ
+
+ vendor.id pci 0x1119
+&device.id pci 0x01f6
++device.name GDT8x13RZ
+
+ vendor.id pci 0x1119
+&device.id pci 0x01f7
++device.name GDT8x23RZ
+
+ vendor.id pci 0x1119
+&device.id pci 0x01fc
++device.name GDT8x33RZ
+
+ vendor.id pci 0x1119
+&device.id pci 0x01fd
++device.name GDT8x43RZ
+
+ vendor.id pci 0x1119
+&device.id pci 0x01fe
++device.name GDT8x53RZ
+
+ vendor.id pci 0x1119
+&device.id pci 0x01ff
++device.name GDT8x63RZ
+
+ vendor.id pci 0x1119
+&device.id pci 0x0300
++device.name ICP vortex GDT RAID Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x0600
++device.name RAID Controller
+
+
+# cf #9638
+ vendor.id pci 0x14e4
++vendor.name Broadcom
+
+ vendor.id pci 0x14e4
+&device.id pci 0x1647
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0x0099
++subdevice.name NC7780 Gigabit Server Adapter
+
+ vendor.id pci 0x14e4
+&device.id pci 0x1647
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0x009a
++subdevice.name NC7770 Gigabit Server Adapter
+
+
+# IBM ServeRAID adapters (#20268)
+ vendor.id pci 0x1014
+&device.id pci 0x002e
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x022e
++subdevice.name ServeRAID 4H
+
+ vendor.id pci 0x1014
+&device.id pci 0x01bd
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x01be
++subdevice.name ServeRAID 4M
+
+ vendor.id pci 0x1014
+&device.id pci 0x01bd
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x01bf
++subdevice.name ServeRAID 4L
+
+ vendor.id pci 0x1014
+&device.id pci 0x01bd
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x0208
++subdevice.name ServeRAID 4Mx
+
+ vendor.id pci 0x1014
+&device.id pci 0x01bd
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x020e
++subdevice.name ServeRAID 4Lx
+
+ vendor.id pci 0x1014
+&device.id pci 0x01bd
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x0258
++subdevice.name ServeRAID 5i
+
+ vendor.id pci 0x1014
+&device.id pci 0x01bd
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x0259
++subdevice.name ServeRAID 5i
+
+ vendor.id pci 0x1022
++vendor.name AMD
+
+# 63973
+ vendor.id pci 0x10a9
++vendor.name SGI
+
--- /dev/null
+ vendor.id ACC
++vendor.name Accton
+
+ vendor.id ADD
++vendor.name Addtron
+
+ vendor.id ADP
++vendor.name Adaptec
+
+ vendor.id ADP
+&device.id eisa 0x1505
++baseclass.id 0x001
++subclass.id 0x00
++device.name Adaptec AVA-1505AE
+
+ vendor.id ADS
++vendor.name Analog Devices
+
+ vendor.id ADS
+&device.id eisa 0x7150
+|vendor.id ADS
+&device.id eisa 0x7181
+|vendor.id ADV
+&device.id eisa 0x550a
+|vendor.id ADV
+&device.id eisa 0x55ff
+|vendor.id ALS
+&device.id eisa 0x0001
+|vendor.id ALS
+&device.id eisa 0x0110
+|vendor.id ALS
+&device.id eisa 0x0120
+|vendor.id ALS
+&device.id eisa 0x0200
+|vendor.id AZT
+&device.id eisa 0x1008
+|vendor.id AZT
+&device.id eisa 0x2320
+|vendor.id AZT
+&device.id eisa 0x3000
+|vendor.id AZT
+&device.id eisa 0x3002
+|vendor.id AZT
+&device.id eisa 0x3005
+|vendor.id AZT
+&device.id eisa 0x3011
+|vendor.id CDC
+&device.id eisa 0x1111
+|vendor.id CMI
+&device.id eisa 0x0001
+|vendor.id CSC
+&device.id eisa 0x0000
+|vendor.id CSC
+&device.id eisa 0x0225
+|vendor.id CSC
+&device.id eisa 0x0437
+|vendor.id CSC
+&device.id eisa 0x0b35
+|vendor.id CSC
+&device.id eisa 0x0d32
+|vendor.id CSC
+&device.id eisa 0x1425
+|vendor.id CSC
+&device.id eisa 0x1525
+|vendor.id CSC
+&device.id eisa 0x1a32
+|vendor.id CSC
+&device.id eisa 0x1e37
+|vendor.id CSC
+&device.id eisa 0x4232
+|vendor.id CSC
+&device.id eisa 0x4236+0x0002
+|vendor.id CSC
+&device.id eisa 0x4336
+|vendor.id CSC
+&device.id eisa 0x4536
+|vendor.id CSC
+&device.id eisa 0x4637
+|vendor.id CSC
+&device.id eisa 0x4837
+|vendor.id CSC
+&device.id eisa 0x6835+0x0002
+|vendor.id CSC
+&device.id eisa 0x7532
+|vendor.id CSC
+&device.id eisa 0x7537
+|vendor.id CSC
+&device.id eisa 0x7632
+|vendor.id CSC
+&device.id eisa 0x8025
+|vendor.id CSC
+&device.id eisa 0x8037
+|vendor.id CSC
+&device.id eisa 0x9836+0x0002
+|vendor.id CSC
+&device.id eisa 0xa836
+|vendor.id CSC
+&device.id eisa 0xc835
+|vendor.id CSC
+&device.id eisa 0xd925
+|vendor.id CSC
+&device.id eisa 0xd937
+|vendor.id CSC
+&device.id eisa 0xe825
+|vendor.id CSC
+&device.id eisa 0xf032
+|vendor.id CSC
+&device.id eisa 0xf235
+|vendor.id CSC
+&device.id eisa 0xf238
+|vendor.id CTL
+&device.id eisa 0x002a
+|vendor.id CTL
+&device.id eisa 0x002c
+|vendor.id CTL
+&device.id eisa 0x0035
+|vendor.id CTL
+&device.id eisa 0x0045
+|vendor.id CTL
+&device.id eisa 0x009a
+|vendor.id CTL
+&device.id eisa 0x009f
+|vendor.id CTL
+&device.id eisa 0x00ed
+|vendor.id DXP
+&device.id eisa 0x3201
+|vendor.id ESS
+&device.id eisa 0x0003
+|vendor.id ESS
+&device.id eisa 0x0968
+|vendor.id ESS
+&device.id eisa 0x1868+0x0002
+|vendor.id ESS
+&device.id eisa 0x1878+0x0002
+|vendor.id LWC
+&device.id eisa 0x1060+0x0002
+|vendor.id MDK
+&device.id eisa 0x1605
+|vendor.id NMX
+&device.id eisa 0x2200
+|vendor.id OPT
+&device.id eisa 0x0924+0x0002
+|vendor.id OPT
+&device.id eisa 0x0931
+|vendor.id RTL
+&device.id eisa 0x3000
+|vendor.id RWB
+&device.id eisa 0x1688
+|vendor.id SMM
+&device.id eisa 0x7180
+|vendor.id STB
+&device.id eisa 0x011a
+|vendor.id YMH
+&device.id eisa 0x0020
+|vendor.id YMH
+&device.id eisa 0x0030
+|vendor.id YMH
+&device.id eisa 0x0800
++baseclass.id 0x004
++subclass.id 0x01
+
+ vendor.id ADV
++vendor.name Advanced Micro Devices
+
+ vendor.id ALN
++vendor.name Acer
+
+ vendor.id ALS
++vendor.name Avance Logic, Inc.
+
+ vendor.id ATI
+|vendor.id ATK
++vendor.name Allied Telesyn
+
+ vendor.id AVM
++vendor.name AVM
+
+ vendor.id AVM
+&device.id eisa 0x0900
++baseclass.id 0x103
++subclass.id 0x00
++device.name AVM ISDN-Controller FRITZ!Card
+
+ vendor.id AZT
++vendor.name Aztech Systems
+
+ vendor.id BRI
++vendor.name Boca Research
+
+ vendor.id CSC
++vendor.name Crystal Semiconductor
+
+ vendor.id CTL
++vendor.name Creative Technology Ltd.
+
+ vendor.id CTL
+&device.id eisa 0x0024
+|vendor.id CTL
+&device.id eisa 0x0026+0x0004
+|vendor.id CTL
+&device.id eisa 0x002b
++baseclass.id 0x004
++subclass.id 0x01
++device.name Sound Blaster 16
+
+ vendor.id CTL
+&device.id eisa 0x0039
+|vendor.id CTL
+&device.id eisa 0x0042+0x0003
+|vendor.id CTL
+&device.id eisa 0x0047
+|vendor.id CTL
+&device.id eisa 0x0054
+|vendor.id CTL
+&device.id eisa 0x009c
++baseclass.id 0x004
++subclass.id 0x01
++device.name Sound Blaster AWE 32
+
+ vendor.id CTL
+&device.id eisa 0x0048
++baseclass.id 0x004
++subclass.id 0x01
++device.name Creative SB32
+
+ vendor.id CTL
+&device.id eisa 0x0051
++baseclass.id 0x004
++subclass.id 0x01
++device.name Sound Blaster Vibra16S
+
+ vendor.id CTL
+&device.id eisa 0x0070
++baseclass.id 0x004
++subclass.id 0x01
++device.name Sound Blaster Vibra16C
+
+ vendor.id CTL
+&device.id eisa 0x0080
++baseclass.id 0x004
++subclass.id 0x01
++device.name Sound Blaster Vibra16CL
+
+ vendor.id CTL
+&device.id eisa 0x009d
+|vendor.id CTL
+&device.id eisa 0x00c1
+|vendor.id CTL
+&device.id eisa 0x00c3
+|vendor.id CTL
+&device.id eisa 0x00c5
+|vendor.id CTL
+&device.id eisa 0x00c7
+|vendor.id CTL
+&device.id eisa 0x00e4
++baseclass.id 0x004
++subclass.id 0x01
++device.name Sound Blaster AWE 64
+
+ vendor.id CTL
+&device.id eisa 0x009e
+|vendor.id CTL
+&device.id eisa 0x00b2
++baseclass.id 0x004
++subclass.id 0x01
++device.name Creative SB AWE64 Gold
+
+ vendor.id CTL
+&device.id eisa 0x00f0
++baseclass.id 0x004
++subclass.id 0x01
++device.name Creative ViBRA16X
+
+ vendor.id DLK
++vendor.name D-Link Corporation
+
+ vendor.id ELS
++vendor.name ELSA International
+
+ vendor.id ELS
+&device.id eisa 0x0133
++baseclass.id 0x103
++subclass.id 0x00
++device.name ELSA QuickStep 1000
+
+ vendor.id ELS
+&device.id eisa 0x0213
++device.name MicroLink 33.6TQV
+
+ vendor.id ELS
+&device.id eisa 0x0754
++device.name MicroLink 56k basic
+
+ vendor.id ESS
++vendor.name ESS Technology, Inc.
+
+ vendor.id GRV
+&device.id eisa 0x0001
++baseclass.id 0x004
++subclass.id 0x01
++device.name Gravis Ultrasound
+
+ vendor.id GWY
++vendor.name Gateway
+
+ vendor.id GWY
+&device.id eisa 0x001c
++baseclass.id 0x102
++subclass.id 0x01
++device.name Telepath for Windows with x2
+
+ vendor.id JQE
++vendor.name Cnet
+
+ vendor.id KYE
++vendor.name Genius
+
+ vendor.id KYE
+&device.id eisa 0x0001
++device.name Genius PnP Mouse
+
+ vendor.id LGI
++vendor.name Logitech
+
+ vendor.id LGI
+&device.id eisa 0x8001
++device.name Logitech First/Pilot Mouse
+
+ vendor.id LGI
+&device.id eisa 0x800b+0x0002
++device.name Logitech MouseMan
+
+ vendor.id MDY
++vendor.name Microdyne
+
+ vendor.id NDC
++vendor.name NDC
+
+ vendor.id PNP
++vendor.name PnP
+
+ vendor.id PNP
+&device.id eisa 0x0500
++device.name Standard PC COM port
+
+ vendor.id PNP
+&device.id eisa 0x0501
++device.name 16550A-compatible COM port
+
+ vendor.id PNP
+&device.id eisa 0x0f00
++device.name Microsoft Bus Mouse
+
+ vendor.id PNP
+&device.id eisa 0x0f01
++device.name Microsoft Serial Mouse
+
+ vendor.id PNP
+&device.id eisa 0x0f02
++device.name Microsoft InPort Mouse
+
+ vendor.id PNP
+&device.id eisa 0x0f03
++device.name Microsoft PS/2-style Mouse
+
+ vendor.id PNP
+&device.id eisa 0x0f04
++device.name Mouse Systems Mouse
+
+ vendor.id PNP
+&device.id eisa 0x0f05
++device.name Mouse Systems 3-Button Mouse
+
+ vendor.id PNP
+&device.id eisa 0x0f06
++device.name Genius Mouse
+
+ vendor.id PNP
+&device.id eisa 0x0f07
++device.name Genius Mouse
+
+ vendor.id PNP
+&device.id eisa 0x0f08
++device.name Logitech Serial Mouse
+
+ vendor.id PNP
+&device.id eisa 0x0f09
++device.name Microsoft BallPoint Serial Mouse
+
+ vendor.id PNP
+&device.id eisa 0x0f0a
++device.name Microsoft Mouse
+
+ vendor.id PNP
+&device.id eisa 0x0f0b
++device.name Microsoft Plug and Play BallPoint Mouse
+
+ vendor.id PNP
+&device.id eisa 0x0f0c
++device.name MS-compatible Serial Mouse
+
+ vendor.id PNP
+&device.id eisa 0x0f0d
++device.name MS-compatible InPort-compatible Mouse
+
+ vendor.id PNP
+&device.id eisa 0x0f0e
++device.name Generic PS/2 Mouse
+
+ vendor.id PNP
+&device.id eisa 0x0f0f
++device.name MS-compatible Serial BallPoint-compatible Mouse
+
+ vendor.id PNP
+&device.id eisa 0x0f10
++device.name Texas Instruments QuickPort Mouse
+
+ vendor.id PNP
+&device.id eisa 0x0f11
++device.name MS-compatible Bus Mouse
+
+ vendor.id PNP
+&device.id eisa 0x0f12
++device.name Logitech PS/2-style Mouse
+
+ vendor.id PNP
+&device.id eisa 0x0f13
++device.name PS/2 Port for PS/2-style Mice
+
+ vendor.id PNP
+&device.id eisa 0x0f14
++device.name Microsoft Kids Mouse
+
+ vendor.id PNP
+&device.id eisa 0x0f15
++device.name Logitech bus mouse
+
+ vendor.id PNP
+&device.id eisa 0x0f16
++device.name Logitech SWIFT device
+
+ vendor.id PNP
+&device.id eisa 0x0f17
++device.name Logitech-compatible serial mouse
+
+ vendor.id PNP
+&device.id eisa 0x0f18
++device.name Logitech-compatible bus mouse
+
+ vendor.id PNP
+&device.id eisa 0x0f19
++device.name Logitech-compatible PS/2-style Mouse
+
+ vendor.id PNP
+&device.id eisa 0x0f1a
++device.name Logitech-compatible SWIFT Device
+
+ vendor.id PNP
+&device.id eisa 0x0f1b
++device.name HP Omnibook Mouse
+
+ vendor.id PNP
+&device.id eisa 0x0f1c
++device.name Compaq LTE Trackball PS/2-style Mouse
+
+ vendor.id PNP
+&device.id eisa 0x0f1d
++device.name Compaq LTE Trackball Serial Mouse
+
+ vendor.id PNP
+&device.id eisa 0x0f1e
++device.name Microsoft Kids Trackball Mouse
+
+ vendor.id PNP
+&device.id eisa 0x80d6
++baseclass.id 0x002
++subclass.id 0x00
++device.name NE2000 Compatible
+
+ vendor.id PNP
+&device.id eisa 0x80f7
++baseclass.id 0x002
++subclass.id 0x00
++device.name 3Com EtherLink III
+
+ vendor.id PNP
+&device.id eisa 0x80f8
++baseclass.id 0x002
++subclass.id 0x00
++device.name 3Com Generic Etherlink PnP Device
+
+ vendor.id PNP
+&device.id eisa 0xb006
++device.name MPU401 compatible
+
+ vendor.id PNP
+&device.id eisa 0xb02f
++device.name Joystick/Game port
+
+ vendor.id RPT
++vendor.name RPTI
+
+ vendor.id RTL
++vendor.name Realtek
+
+ vendor.id SKD
++vendor.name SysKonnect
+
+ vendor.id SMC
++vendor.name SMC
+
+ vendor.id SVE
++vendor.name SVEC
+
+ vendor.id TCM
++vendor.name 3Com
+
+ vendor.id TCM
+&device.id eisa 0x5090+0x0002
+|vendor.id TCM
+&device.id eisa 0x5094+0x0002
+|vendor.id TCM
+&device.id eisa 0x5098
++baseclass.id 0x002
++subclass.id 0x00
+
+ vendor.id TER
++vendor.name Terratec
+
+ vendor.id TER
+&device.id eisa 0x1411
++baseclass.id 0x004
++subclass.id 0x01
++device.name Soundsystem Base 1
+
+ vendor.id USR
++vendor.name U.S. Robotics, Inc.
+
+ vendor.id USR
+&device.id eisa 0x9100
++device.name U.S. Robotics 56K Message
+
+ vendor.id YMH
++vendor.name Yamaha
+
--- /dev/null
+ vendor.id pci 0x8086
+&device.id pci 0x1040
++baseclass.id 0x102
++subclass.id 0x02
++requires Intel-536ep
+
+ vendor.id pci 0x115d
+&device.id pci 0x0101
+|vendor.id pci 0x115d
+&device.id pci 0x0440+0x001d
+|vendor.id pci 0x11c1
+&device.id pci 0x0440+0x001d
++baseclass.id 0x102
++subclass.id 0x03
++requires ltmodem
++driver.module.modprobe lt_serial
+
--- /dev/null
+# modinfo
+ subclass.id 0x03
+&vendor.id pci 0x1039
+&device.id pci 0x7013
+|subclass.id 0x03
+&vendor.id pci 0x1039
+&device.id pci 0x7018
+|vendor.id pci 0x1022
+&device.id pci 0x7446
+|vendor.id pci 0x1055
+&device.id pci 0x9178
+|vendor.id pci 0x10a5
+&device.id pci 0x3052
+|vendor.id pci 0x10a5
+&device.id pci 0x5459
+|vendor.id pci 0x10b9
+&device.id pci 0x5457
+|vendor.id pci 0x10b9
+&device.id pci 0x5459+0x0002
+|vendor.id pci 0x10de
+&device.id pci 0x01c1
+|vendor.id pci 0x10ec
+&device.id pci 0x8197
+|vendor.id pci 0x1106
+&device.id pci 0x3068
+|vendor.id pci 0x1131
+&device.id pci 0x3400
+|vendor.id pci 0x163c
+&device.id pci 0x3052
+|vendor.id pci 0x163c
+&device.id pci 0x5459
+|vendor.id pci 0x2000
+&device.id pci 0x2800
+|vendor.id pci 0x2003
+&device.id pci 0x8800
+|vendor.id pci 0x8086
+&device.id pci 0x2416
+|vendor.id pci 0x8086
+&device.id pci 0x2426
+|vendor.id pci 0x8086
+&device.id pci 0x2446
+|vendor.id pci 0x8086
+&device.id pci 0x2486
+|vendor.id pci 0x8086
+&device.id pci 0x24c6
+|vendor.id pci 0x8086
+&device.id pci 0x24d6
+|vendor.id pci 0x8086
+&device.id pci 0x7196
++driver.module.modprobe slamr
++baseclass.id 0x102
++subclass.id 0x04
++requires kernel-nongpl|smartlink-softmodem
+
+ vendor.id pci 0x1131
+&device.id pci 0x5402
+&subvendor.id pci 0x1244
+&subdevice.id pci 0x0f00
++driver.module.modprobe fcdsl
++requires kernel-nongpl
+
+ vendor.id pci 0x1244
+&device.id pci 0x0a00
+|vendor.id pci 0x1244
+&device.id pci 0x0e00
++driver.module.modprobe fcpci
++requires kernel-nongpl
+
+ vendor.id pci 0x1244
+&device.id pci 0x2700
++driver.module.modprobe fcdslsl
++requires kernel-nongpl
+
+ vendor.id pci 0x1244
+&device.id pci 0x2900
++driver.module.modprobe fcdsl2
++requires kernel-nongpl
+
+ vendor.id AVM
+&device.id eisa 0x0900
++driver.module.modprobe fcpnp
++requires kernel-nongpl
+
+ vendor.id usb 0x0483
+&device.id usb 0x7554
++driver.module.modprobe slusb
++requires kernel-nongpl
+
+ vendor.id usb 0x057c
+&device.id usb 0x0c00
++driver.module.modprobe fcusb
++requires kernel-nongpl
+
+ vendor.id usb 0x057c
+&device.id usb 0x1000
+|vendor.id usb 0x057c
+&device.id usb 0x1900
++driver.module.modprobe fcusb2
++requires kernel-nongpl
+
+ vendor.id usb 0x057c
+&device.id usb 0x2000
++driver.module.modprobe fxusb
++requires kernel-nongpl
+
+ vendor.id usb 0x057c
+&device.id usb 0x2300
++driver.module.modprobe fcdslusb
++requires kernel-nongpl
+
+ vendor.id usb 0x057c
+&device.id usb 0x2800
++driver.module.modprobe fxusb_CZ
++requires kernel-nongpl
+
+ vendor.id usb 0x057c
+&device.id usb 0x2805
+|vendor.id usb 0x057c
+&device.id usb 0x4401
++driver.module.modprobe e2220pc
++requires kernel-nongpl
+
+ vendor.id usb 0x057c
+&device.id usb 0x2806
+|vendor.id usb 0x057c
+&device.id usb 0x4601
++driver.module.modprobe e5520pc
++requires kernel-nongpl
+
+ vendor.id usb 0x057c
+&device.id usb 0x3000
++driver.module.modprobe fcdslusba
++requires kernel-nongpl
+
+ vendor.id usb 0x057c
+&device.id usb 0x3500
++driver.module.modprobe fcdslslusb
++requires kernel-nongpl
+
+ vendor.id usb 0x057c
+&device.id usb 0x3600
++driver.module.modprobe fcdslusb2
++requires kernel-nongpl
--- /dev/null
+# monitors, LCDs
+
+
+ vendor.id AOC
++vendor.name AOC
+
+ vendor.id AOC
+&device.id eisa 0xa566
++device.name SPECTRUM 5NLR
++driver.display 1280x1024|30-64|50-100|85
+
+ vendor.id AOC
+&device.id eisa 0xa782
++device.name SPECTRUM 7NLR
++driver.display |50-110|30-82
+
+ vendor.id AOC
+&device.id eisa 0xd350
++device.name 4VA
+
+ vendor.id AOC
+&device.id eisa 0xd566
++device.name SPECTRUM 5VLR & 5VLRA
++driver.display |50-100|30-66
+
+ vendor.id AOC
+&device.id eisa 0xe570
++device.name SPECTRUM 5GLR
++driver.display |50-120|30-64
+
+ vendor.id AOC
+&device.id eisa 0xe750
++device.name SPECTRUM 7DLRA
++driver.display |50-120|30-68
+
+ vendor.id API
++vendor.name ACER
+
+ vendor.id API
+&device.id eisa 0x0037
++device.name ACERVIEW 55
++driver.display |55-90|31-70
+
+ vendor.id API
+&device.id eisa 0x424c
++device.name ACERVIEW 76IE
++driver.display |50-110|30-69
+
+ vendor.id API
+&device.id eisa 0x440b
++device.name ACERVIEW 11D
++driver.display |55-90|31-40
+
+ vendor.id API
+&device.id eisa 0x4421
++device.name ACERVIEW 33D
++driver.display |55-90|31-40
+
+ vendor.id API
+&device.id eisa 0x4522
++device.name ACERVIEW 7134E
++driver.display |55-90|31-60
+
+ vendor.id API
+&device.id eisa 0x4536
++device.name ACERVIEW 7154E
++driver.display |55-90|31-60
+
+ vendor.id API
+&device.id eisa 0x4538
++device.name ACERVIEW 7156E
++driver.display |55-90|31-70
+
+ vendor.id API
+&device.id eisa 0x454c
++device.name ACERVIEW 7176IE
++driver.display |55-90|31-70
+
+ vendor.id API
+&device.id eisa 0x454e
++device.name ACERVIEW 7178IE
++driver.display |55-90|31-90
+
+ vendor.id API
+&device.id eisa 0x4938
++device.name ACERVIEW 7156I
++driver.display |55-90|31-70
+
+ vendor.id API
+&device.id eisa 0x494c
++device.name ACERVIEW 76I
++driver.display |55-90|31-70
+
+ vendor.id API
+&device.id eisa 0x494e
++device.name ACERVIEW 78I
++driver.display |55-90|31-90
+
+ vendor.id API
+&device.id eisa 0x4962
++device.name ACERVIEW 98I
++driver.display |55-90|31-90
+
+ vendor.id API
+&device.id eisa 0x4c21
++device.name ACERVIEW 33DL
++driver.display |55-90|31-40
+
+ vendor.id API
+&device.id eisa 0x4c22
++device.name ACERVIEW 34TL
++driver.display |55-90|31-50
+
+ vendor.id API
+&device.id eisa 0x4c37
++device.name ACERVIEW 55L
++driver.display |55-90|31-70
+
+ vendor.id API
+&device.id eisa 0x4c38
++device.name ACERVIEW 56L
++driver.display |55-90|31-70
+
+ vendor.id API
+&device.id eisa 0x4e4c
++device.name ACERVIEW 76N
++driver.display |55-90|31-70
+
+ vendor.id API
+&device.id eisa 0x5321
++device.name ACERVIEW 7133S
++driver.display |55-90|31-40
+
+ vendor.id API
+&device.id eisa 0x5322
++device.name ACERVIEW 7134S
++driver.display |55-90|31-60
+
+ vendor.id API
+&device.id eisa 0x5336
++device.name ACERVIEW 7154S
++driver.display |55-90|31-60
+
+ vendor.id API
+&device.id eisa 0x5338
++device.name ACERVIEW 7156IS
++driver.display |55-90|31-70
+
+ vendor.id API
+&device.id eisa 0x534c
++device.name ACERVIEW 7176IS
++driver.display |55-90|31-70
+
+ vendor.id API
+&device.id eisa 0x5422
++device.name ACERVIEW 34T
++driver.display |55-90|31-50
+
+ vendor.id APP
++vendor.name Apple
+
+ vendor.id APP
+&device.id eisa 0x0352
++device.name AppleVision 850
+
+ vendor.id APP
+&device.id eisa 0x9214
++driver.display |50-78|31-65
+
+ vendor.id APP
+&device.id eisa 0x9d03
++driver.display |58-75|31-60
+
+ vendor.id AST
++vendor.name AST
+
+ vendor.id AST
+&device.id eisa 0x8001
++device.name 4V
+
+ vendor.id AST
+&device.id eisa 0x8002
++device.name 4I
++driver.display |50-90|30-38
+
+ vendor.id AST
+&device.id eisa 0x8003
++device.name 4N
++driver.display |50-90|30-64
+
+ vendor.id AST
+&device.id eisa 0x8004
++device.name ASTVISION 4L
++driver.display |50-90|30-64
+
+ vendor.id AST
+&device.id eisa 0x8005
++device.name ASTVISION 5L
++driver.display |50-90|30-64
+
+ vendor.id AST
+&device.id eisa 0x8006
++device.name ASTVISION 7L
++driver.display |50-90|30-64
+
+ vendor.id AST
+&device.id eisa 0x8007
++device.name ASTVISION 7H
++driver.display |50-90|30-82
+
+ vendor.id AST
+&device.id eisa 0x8008
++device.name ASTVISION 20H
++driver.display |50-150|29-82
+
+ vendor.id AST
+&device.id eisa 0x8009
++device.name SABRE
++driver.display |50-90|30-64
+
+ vendor.id AST
+&device.id eisa 0x800a
++device.name ASTVISION 5V
++driver.display |50-120|30-50
+
+ vendor.id BRG
++vendor.name BRIDGE
+
+ vendor.id BRG
+&device.id eisa 0x00ab
++device.name BM17C
++driver.display |50-160|30-70
+
+ vendor.id CPL
++vendor.name Alpha
+
+ vendor.id CPL
+&device.id eisa 0x096b
++device.name TH-450
+
+ vendor.id CPQ
++vendor.name COMPAQ
+
+ vendor.id CPQ
+&device.id eisa 0x0011+0x0006
++device.name COMPAQ 1024
+
+ vendor.id CPQ
+&device.id eisa 0x0017+0x0004
++device.name COMPAQ PRB
+
+ vendor.id CPQ
+&device.id eisa 0x0020+0x0002
++device.name COMPAQ PRB
+
+ vendor.id CPQ
+&device.id eisa 0x0022+0x0007
++device.name 151FS
+
+ vendor.id CPQ
+&device.id eisa 0x0029+0x0004
++device.name COMPAQ PRB
+
+ vendor.id CPQ
+&device.id eisa 0x002d+0x0007
++device.name 171FS
+
+ vendor.id CPQ
+&device.id eisa 0x0040+0x0002
++device.name QVISION 200
+
+ vendor.id CPQ
+&device.id eisa 0x0042
++device.name QVISION 172
+
+ vendor.id CPQ
+&device.id eisa 0x0043+0x0006
++device.name QVISION 200
+
+ vendor.id CPQ
+&device.id eisa 0x0049
++device.name QVISION 210
+
+ vendor.id CPQ
+&device.id eisa 0x0100
++device.name COMPAQ 1024
+
+ vendor.id CPQ
+&device.id eisa 0x0146
++device.name COMPAQ 1024
+
+ vendor.id CPQ
+&device.id eisa 0x0147
++device.name 1024
+
+ vendor.id CPQ
+&device.id eisa 0x0346+0x0006
++device.name 151FS
+
+ vendor.id CPQ
+&device.id eisa 0x0546+0x0004
++device.name 171FS
+
+ vendor.id CPQ
+&device.id eisa 0x0746+0x0002
++device.name COMPAQ PRB
+
+ vendor.id CPQ
+&device.id eisa 0x0846+0x0007
++device.name COMPAQ PRA
+
+ vendor.id CPQ
+&device.id eisa 0x084d
++device.name PRESARIO 140
++driver.display |48-80|31-49
+
+ vendor.id CPQ
+&device.id eisa 0x0946+0x0004
++device.name COMPAQ PRB
+
+ vendor.id CPQ
+&device.id eisa 0x0a46+0x0007
++device.name COMPAQ PRA
+
+ vendor.id CPQ
+&device.id eisa 0x0a4d
++device.name PRESARIO 150
++driver.display |48-80|31-49
+
+ vendor.id CPQ
+&device.id eisa 0x0d46+0x0007
++device.name COMPAQ 140
+
+ vendor.id CPQ
+&device.id eisa 0x0d4d
++device.name 140
++driver.display |48-80|31-49
+
+ vendor.id CPQ
+&device.id eisa 0x0f46+0x0007
++device.name COMPAQ 150
+
+ vendor.id CPQ
+&device.id eisa 0x0f4d
++device.name 150
++driver.display |48-80|31-49
+
+ vendor.id CPQ
+&device.id eisa 0x1320
++device.name P70
++driver.display |48-150|30-92
+
+ vendor.id CPQ
+&device.id eisa 0x1321
++device.name P110
++driver.display |48-160|30-107
+
+ vendor.id CPQ
+&device.id eisa 0x1322
++device.name V50
++driver.display |50-125|30-60
+
+ vendor.id CPQ
+&device.id eisa 0x1324
++device.name TFT500
++driver.display |57-85|32-60
+
+ vendor.id CPQ
+&device.id eisa 0x1325
++device.name V900-
++driver.display |48-160|30-96
+
+ vendor.id CPQ
+&device.id eisa 0x1327
++device.name P1610
++driver.display |48-160|30-96
+
+ vendor.id CPQ
+&device.id eisa 0x1329
++device.name TFT8000-
++driver.display |58-85|31-80
+
+ vendor.id CPQ
+&device.id eisa 0x1330
++device.name P75
++driver.display |50-150|30-85
+
+ vendor.id CPQ
+&device.id eisa 0x1331
++device.name V55
++driver.display |48-125|30-60
+
+ vendor.id CPQ
+&device.id eisa 0x1332
++device.name V75
++driver.display |48-125|30-69
+
+ vendor.id CPQ
+&device.id eisa 0x1333
++device.name TFT450
++driver.display |57-85|32-60
+
+ vendor.id CPQ
+&device.id eisa 0x1334
++device.name V40
++driver.display |50-100|31-48
+
+ vendor.id CPQ
+&device.id eisa 0x1338
++device.name V45
++driver.display |50-100|31-48
+
+ vendor.id CPQ
+&device.id eisa 0x1349
++device.name S700-
++driver.display |50-160|30-70
+
+ vendor.id CPQ
+&device.id eisa 0x1350
++device.name S900-
++driver.display |50-160|30-95
+
+ vendor.id CPQ
+&device.id eisa 0x170a
++device.name V70
++driver.display |50-125|30-69
+
+ vendor.id CPQ
+&device.id eisa 0x1730
++device.name V90
++driver.display |48-160|30-94
+
+ vendor.id CPQ
+&device.id eisa 0x3012
++device.name PRESARIO MV500-
++driver.display |50-90|31-54
+
+ vendor.id CPQ
+&device.id eisa 0x3013
++device.name PRESARIO MV700-
++driver.display |50-100|30-70
+
+ vendor.id CPQ
+&device.id eisa 0x3014
++device.name PRESARIO MV400-
++driver.display |50-90|31-50
+
+ vendor.id CTX
++vendor.name CTX
+
+ vendor.id CTX
+&device.id eisa 0x0150
++device.name 1569
++driver.display |50-130|30-70
+
+ vendor.id CTX
+&device.id eisa 0x1451
++device.name 1451
++driver.display |45-90|30-50
+
+ vendor.id CTX
+&device.id eisa 0x1551
++device.name 1551
++driver.display |45-90|30-50
+
+ vendor.id CTX
+&device.id eisa 0x1562
++device.name 1562
++driver.display |45-90|30-62
+
+ vendor.id CTX
+&device.id eisa 0x1565
++device.name 1565
++driver.display |45-90|30-65
+
+ vendor.id CTX
+&device.id eisa 0x1569
++device.name CTX 1569S 15-inch
+
+ vendor.id CTX
+&device.id eisa 0x1765
++device.name 1765
++driver.display |45-110|30-65
+
+ vendor.id CTX
+&device.id eisa 0x1785
++device.name 1785
++driver.display |45-110|30-85
+
+ vendor.id CTX
+&device.id eisa 0x2085
++device.name 2085
++driver.display |45-110|30-85
+
+ vendor.id CTX
+&device.id eisa 0x2185
++device.name 2185
++driver.display |45-110|30-85
+
+ vendor.id CTX
+&device.id eisa 0x3621
++device.name VL700
++driver.display |50-120|30-70
+
+ vendor.id DEC
++vendor.name DIGITAL
+
+ vendor.id DEC
+&device.id eisa 0x043a
++device.name (FR-PCXAV-AZ) (24 ZOLL)
++driver.display |50-160|30-96
+
+ vendor.id DEC
+&device.id eisa 0x0479
++device.name 19 ZOLL (FR-PCXAV-CY)
++driver.display |48-160|30-95
+
+ vendor.id DEC
+&device.id eisa 0x047a
++device.name 19 ZOLL (FR-PCXAV-CZ)
++driver.display |48-160|30-95
+
+ vendor.id DEC
+&device.id eisa 0x06fa
++device.name 21 ZOLL (FR-PCXAV-WZ)
++driver.display |50-152|30-95
+
+ vendor.id DEC
+&device.id eisa 0x073a
++device.name 17 ZOLL (FR-PCXAV-YZ)
++driver.display |48-150|30-85
+
+ vendor.id DEC
+&device.id eisa 0x770c
++device.name 14 ZOLL (FR-PCXCV-C*)
++driver.display |50-90|30-54
+
+ vendor.id DEC
+&device.id eisa 0x970c
++device.name 15 ZOLL (FR-PCXCV-D*)
++driver.display |50-90|30-54
+
+ vendor.id DEC
+&device.id eisa 0x9a06
++device.name (FR-PCXAV-TZ) (19 ZOLL)
++driver.display |50-160|30-96
+
+ vendor.id DEC
+&device.id eisa 0xba08
++device.name 15 ZOLL (FR-PCXBV-E*)
++driver.display |50-110|30-69
+
+ vendor.id DEC
+&device.id eisa 0xda08
++device.name 17 ZOLL (FR-PCXBV-F*)
++driver.display |50-120|30-69
+
+ vendor.id DEL
++vendor.name DELL
+
+ vendor.id DEL
+&device.id eisa 0x139a+0x0003
++device.name Dell Ultrascan 14XE
+
+ vendor.id DEL
+&device.id eisa 0x139d
++device.name ULTRASCAN 14XE
++driver.display |50-120|30-62
+
+ vendor.id DEL
+&device.id eisa 0x1569
++device.name 1569
++driver.display |50-110|30-69
+
+ vendor.id DEL
+&device.id eisa 0x2210+0x0003
++device.name Dell Ultrascan V17X
+
+ vendor.id DEL
+&device.id eisa 0x2213
++device.name ULTRASCAN V17X
++driver.display |50-130|30-85
+
+ vendor.id DEL
+&device.id eisa 0x2214+0x0003
++device.name Dell Ultrascan 21TE
+
+ vendor.id DEL
+&device.id eisa 0x2217
++device.name ULTRASCAN 21TE
++driver.display |50-152|30-93
+
+ vendor.id DEL
+&device.id eisa 0x3024+0x0003
++device.name Dell VS17X
+
+ vendor.id DEL
+&device.id eisa 0x3027
++device.name VS17X
++driver.display |50-120|30-65
+
+ vendor.id DEL
+&device.id eisa 0x3276
++device.name D1428L
++driver.display |43-75|31-48
+
+ vendor.id DEL
+&device.id eisa 0x32fe
++device.name D828L
++driver.display |50-120|31-54
+
+ vendor.id DEL
+&device.id eisa 0x3319
++device.name 828FI
++driver.display |50-120|31-70
+
+ vendor.id DEL
+&device.id eisa 0x4273
++device.name V15X
++driver.display |55-90|47-64
+
+ vendor.id DEL
+&device.id eisa 0x5033
++device.name D825HT
++driver.display |50-120|31-70
+
+ vendor.id DEL
+&device.id eisa 0x5062
++device.name D1025HTX
++driver.display |50-120|31-70
+
+ vendor.id DEL
+&device.id eisa 0x50dd
++device.name P990
++driver.display |48-120|30-96
+
+ vendor.id DEL
+&device.id eisa 0x512c
++device.name D825TM
++driver.display |50-120|30-70
+
+ vendor.id DEL
+&device.id eisa 0x5155
++device.name D1025TM
++driver.display |50-160|31-85
+
+ vendor.id DEL
+&device.id eisa 0x515b
++device.name D1626HT
++driver.display |50-160|31-107
+
+ vendor.id DEL
+&device.id eisa 0x5314
++device.name D2026T
++driver.display |50-100|31-96
+
+ vendor.id DEL
+&device.id eisa 0x5319
++device.name 1726T-HS/D1025HT
++driver.display |50-100|31-85
+
+ vendor.id DEL
+&device.id eisa 0x5697
++device.name 800M
++driver.display |50-120|30-70
+
+ vendor.id DEL
+&device.id eisa 0x602f
++device.name D2128-TCO
++driver.display |50-150|31-102
+
+ vendor.id DEL
+&device.id eisa 0x6124
++device.name D1025HE
++driver.display |50-120|31-92
+
+ vendor.id DEL
+&device.id eisa 0x62ff
++device.name D825HR
++driver.display |50-120|31-70
+
+ vendor.id DEL
+&device.id eisa 0x635e
++device.name ES-17
++driver.display |50-100|31-85
+
+ vendor.id DEL
+&device.id eisa 0x7077
++device.name D1226H
++driver.display |50-160|30-95
+
+ vendor.id DEL
+&device.id eisa 0x715d
++device.name 1500FP
++driver.display |56-75|30-61
+
+ vendor.id DEL
+&device.id eisa 0x71a5
++device.name M770
++driver.display |48-160|30-69
+
+ vendor.id DEL
+&device.id eisa 0x730b
++device.name D1028L
++driver.display |50-120|31-70
+
+ vendor.id DEL
+&device.id eisa 0x8162
++device.name TFT 1400FP
++driver.display |55-86|31-60
+
+ vendor.id DEL
+&device.id eisa 0x93d5
++device.name M1110
++driver.display |50-160|30-107
+
+ vendor.id DPC
++vendor.name DELTA
+
+ vendor.id DPC
+&device.id eisa 0x0456
++device.name Delta DA-456
+
+ vendor.id DPC
+&device.id eisa 0x0570
++device.name DA-570
++driver.display |50-100|30-70
+
+ vendor.id DPC
+&device.id eisa 0x0770
++device.name DB-770
++driver.display |50-100|30-70
+
+ vendor.id DPC
+&device.id eisa 0x0995
++device.name DA-995
++driver.display |50-180|30-95
+
+ vendor.id DPC
+&device.id eisa 0x1565
++device.name DA-1565
++driver.display |50-100|30-65
+
+ vendor.id DPC
+&device.id eisa 0x1765
++device.name DB-1765
++driver.display |50-100|30-65
+
+ vendor.id DPC
+&device.id eisa 0x1770
++device.name DC-770
++driver.display |50-120|30-70
+
+ vendor.id DPC
+&device.id eisa 0x4570
++device.name DE-570
++driver.display |50-120|30-70
+
+ vendor.id DWE
++vendor.name DAEWOO
+
+ vendor.id DWE
+&device.id eisa 0x1423
++device.name CMC-1423B1
++driver.display |50-120|30-64
+
+ vendor.id DWE
+&device.id eisa 0x1427
++device.name CMC-1427X1
++driver.display |50-100|30-48
+
+ vendor.id DWE
+&device.id eisa 0x1502
++device.name CMC-1502B1
++driver.display |50-120|30-64
+
+ vendor.id DWE
+&device.id eisa 0x1505
++device.name CMC-1505X
++driver.display |50-100|30-50
+
+ vendor.id DWE
+&device.id eisa 0x1507
++device.name CMC-1507X1
++driver.display |50-100|30-48
+
+ vendor.id DWE
+&device.id eisa 0x1703
++device.name CMC-1703B
++driver.display |50-120|30-64
+
+ vendor.id DWE
+&device.id eisa 0x4312
++device.name 431X
++driver.display |50-120|30-54
+
+ vendor.id DWE
+&device.id eisa 0x5093
++device.name 1509B
++driver.display |50-120|30-69
+
+ vendor.id DWE
+&device.id eisa 0x5113
++device.name 511B
++driver.display |50-120|30-69
+
+ vendor.id DWE
+&device.id eisa 0x5123
++device.name 512B
++driver.display |50-120|30-69
+
+ vendor.id DWE
+&device.id eisa 0x5133
++device.name Daewoo CMC-1511B
+
+ vendor.id DWE
+&device.id eisa 0x5182
++device.name 518X
++driver.display |50-120|30-54
+
+ vendor.id DWE
+&device.id eisa 0x5183
++device.name 518B
++driver.display |50-120|30-69
+
+ vendor.id DWE
+&device.id eisa 0x5193
++device.name 519B
++driver.display |50-120|30-69
+
+ vendor.id DWE
+&device.id eisa 0x7044
++device.name CMC-1704C
++driver.display |50-150|24-86
+
+ vendor.id DWE
+&device.id eisa 0x7053
++device.name 1705B
++driver.display |50-120|30-69
+
+ vendor.id DWE
+&device.id eisa 0x7073
++device.name 707B
++driver.display |50-120|30-69
+
+ vendor.id DWE
+&device.id eisa 0x7103
++device.name 710B
++driver.display |50-160|30-69
+
+ vendor.id DWE
+&device.id eisa 0x7104
++device.name 710C
++driver.display |50-160|30-86
+
+ vendor.id DWE
+&device.id eisa 0x9015
++device.name 901D
++driver.display |50-160|30-95
+
+ vendor.id ECS
++vendor.name ECS
+
+ vendor.id ECS
+&device.id eisa 0x0001
++device.name VERTOS 1401
++driver.display |50-100|30-50
+
+ vendor.id ECS
+&device.id eisa 0x0002
++device.name VERTOS 1501
++driver.display |50-100|24-64
+
+ vendor.id ECS
+&device.id eisa 0x0003
++device.name VERTOS 1502
++driver.display |50-100|24-64
+
+ vendor.id ECS
+&device.id eisa 0x0004
++device.name VERTOS 1503
++driver.display |50-100|24-64
+
+ vendor.id ECS
+&device.id eisa 0x0005
++device.name VERTOS 1700
++driver.display |50-100|24-64
+
+ vendor.id ECS
+&device.id eisa 0x0006
++device.name VERTOS 1701
++driver.display |50-100|24-82
+
+ vendor.id ECS
+&device.id eisa 0x0007
++device.name VERTOS 1702
++driver.display |50-100|24-64
+
+ vendor.id ECS
+&device.id eisa 0x0008
++device.name VERTOS 2101
++driver.display |50-100|24-90
+
+ vendor.id ECS
+&device.id eisa 0x0009
++device.name VERTOS 2102
++driver.display |50-100|24-90
+
+ vendor.id EIZ
++vendor.name EIZO
+
+ vendor.id EIZ
+&device.id eisa 0x0200
++device.name FLEXSCAN F351
+
+ vendor.id EIZ
+&device.id eisa 0x0201
++device.name FLEXSCAN F553
+
+ vendor.id EIZ
+&device.id eisa 0x0202
++device.name FLEXSCAN F563
+
+ vendor.id EIZ
+&device.id eisa 0x0203
++device.name FLEXSCAN F764
++driver.display |55-160|30-90
+
+ vendor.id EIZ
+&device.id eisa 0x0204
++device.name FLEXSCAN F784
+
+ vendor.id EIZ
+&device.id eisa 0x0206
++device.name FLEXSCAN 6600
++driver.display |70-90|56-110
+
+ vendor.id EIZ
+&device.id eisa 0x0300
++device.name FLEXSCAN 6500
++driver.display |55-90|56-80
+
+ vendor.id EIZ
+&device.id eisa 0x0302
++device.name 9060S
+
+ vendor.id EIZ
+&device.id eisa 0x0303
++device.name 9065S
++driver.display |50-90|30-50
+
+ vendor.id EIZ
+&device.id eisa 0x0305
++device.name FLEXSCAN T563
+
+ vendor.id EIZ
+&device.id eisa 0x0306
++device.name 9070S
++driver.display |50-90|20-50
+
+ vendor.id EIZ
+&device.id eisa 0x0307
++device.name 9080I
++driver.display |55-90|30-64
+
+ vendor.id EIZ
+&device.id eisa 0x0308
++device.name 9400I
++driver.display |55-90|30-65
+
+ vendor.id EIZ
+&device.id eisa 0x0309
++device.name 9500
++driver.display |55-90|30-78
+
+ vendor.id EIZ
+&device.id eisa 0x030a
++device.name FLEXSCAN F340IW
+
+ vendor.id EIZ
+&device.id eisa 0x030c
++device.name FLEXSCAN F552
+
+ vendor.id EIZ
+&device.id eisa 0x030d
++device.name FLEXSCAN F560IW
++driver.display |55-90|30-82
+
+ vendor.id EIZ
+&device.id eisa 0x030e
++device.name FLEXSCAN F750I
++driver.display |55-90|30-80
+
+ vendor.id EIZ
+&device.id eisa 0x030f
++device.name FLEXSCAN F760IW
++driver.display |55-90|30-78
+
+ vendor.id EIZ
+&device.id eisa 0x0310
++device.name FLEXSCAN F780IW
++driver.display |55-120|45-100
+
+ vendor.id EIZ
+&device.id eisa 0x0311
++device.name FLEXSCAN T560I
++driver.display |55-90|30-82
+
+ vendor.id EIZ
+&device.id eisa 0x0312
++device.name FLEXSCAN T660I
++driver.display |55-90|30-78
+
+ vendor.id EIZ
+&device.id eisa 0x0313
++device.name FLEXSCAN T562
++driver.display |55-90|30-82
+
+ vendor.id EIZ
+&device.id eisa 0x0314
++device.name FLEXSCAN T662
++driver.display |55-160|30-85
+
+ vendor.id EIZ
+&device.id eisa 0x038c
++device.name FLEXSCAN F550IW
++driver.display |55-90|30-65
+
+ vendor.id EIZ
+&device.id eisa 0x1012
++device.name FLEXSCAN L34
++driver.display |50-85|24-61
+
+ vendor.id EIZ
+&device.id eisa 0x1018
++device.name FLEXSCAN F77S
++driver.display |50-160|30-110
+
+ vendor.id EIZ
+&device.id eisa 0x1020
++device.name FLEXSCAN F57
++driver.display |50-160|30-96
+
+ vendor.id EIZ
+&device.id eisa 0x1418
++device.name NANAO FLEXSCAN FX-E7S
++driver.display |50-160|30-110
+
+ vendor.id EIZ
+&device.id eisa 0x1420
++device.name NANAO FLEXSCAN FX-C7
++driver.display |50-160|30-96
+
+ vendor.id ELS
++vendor.name ELSA
+
+ vendor.id ELS
+&device.id eisa 0x4160
++device.name ECOMO OFFICE
++driver.display |50-130|30-86
+
+ vendor.id ELS
+&device.id eisa 0x7617
++device.name ECOMO 22H99
++driver.display |50-160|31-121
+
+ vendor.id FCM
++vendor.name FUNAI
+
+ vendor.id FCM
+&device.id eisa 0x3313
++device.name 17GD
++driver.display |50-120|30-70
+
+ vendor.id FPA
++vendor.name FUJITSU
+
+ vendor.id FPA
+&device.id eisa 0x0612
++device.name 1554G+
++driver.display |50-120|30-54
+
+ vendor.id FPA
+&device.id eisa 0x2d30
++device.name 1568G1
++driver.display |50-120|30-69
+
+ vendor.id FPA
+&device.id eisa 0x2df9
++device.name 1769G
++driver.display |50-120|30-69
+
+ vendor.id FUJ
++vendor.name FUJITSU
+
+ vendor.id FUJ
+&device.id eisa 0x0119
++device.name X150F
++driver.display |56-75|31-60
+
+ vendor.id FUJ
+&device.id eisa 0x2118
++device.name X176
++driver.display |50-200|30-100
+
+ vendor.id FUJ
+&device.id eisa 0x2218
++device.name X177
++driver.display |50-150|30-92
+
+ vendor.id FUJ
+&device.id eisa 0x2318
++device.name X177A
++driver.display |50-150|30-92
+
+ vendor.id FUJ
+&device.id eisa 0x3118
++device.name E155
++driver.display |50-100|30-54
+
+ vendor.id FUJ
+&device.id eisa 0x5110
++device.name FMV-DP98X1
++driver.display |50-180|30-95
+
+ vendor.id FUJ
+&device.id eisa 0x6110
++device.name FMV-DP97X4
++driver.display |50-120|30-92
+
+ vendor.id FUJ
+&device.id eisa 0x6210
++device.name FMVDP97X5(G)/FMVDP97X6
++driver.display |50-150|30-92
+
+ vendor.id FUJ
+&device.id eisa 0x7110
++device.name FMV-DP84X2
++driver.display |50-100|30-70
+
+ vendor.id FUJ
+&device.id eisa 0x7210
++device.name FMV-DP84X3(G)
++driver.display |50-120|30-70
+
+ vendor.id FUJ
+&device.id eisa 0x8111
++device.name VL-15TX1(G)
+
+ vendor.id FUJ
+&device.id eisa 0x9111
++device.name VL-14TX1
+
+ vendor.id FUJ
+&device.id eisa 0xa901
++device.name FMV-DP97X2
++driver.display |50-120|30-92
+
+ vendor.id FUJ
+&device.id eisa 0xaa01
++device.name FMV-DP97X3
++driver.display |50-150|30-70
+
+ vendor.id FUJ
+&device.id eisa 0xb801
++device.name FMV-DP84X1
++driver.display |50-100|30-70
+
+ vendor.id GSM
++vendor.name LG ELECTRONICS
+
+ vendor.id GSM
+&device.id eisa 0x36b4
++device.name STUDIOWORKS 44M
++driver.display |50-90|30-50
+
+ vendor.id GSM
+&device.id eisa 0x36b9
++device.name STUDIOWORKS 44I
++driver.display |50-89|30-50
+
+ vendor.id GSM
+&device.id eisa 0x36bb
++device.name STUDIOWORKS 45I
++driver.display |50-90|30-54
+
+ vendor.id GSM
+&device.id eisa 0x3aa0
++device.name 1505S
++driver.display |50-90|30-50
+
+ vendor.id GSM
+&device.id eisa 0x3aa2
++device.name STUDIOWORKS 56M
++driver.display |50-110|30-65
+
+ vendor.id GSM
+&device.id eisa 0x3aa8
++device.name STUDIOWORKS 56I
++driver.display |50-120|30-65
+
+ vendor.id GSM
+&device.id eisa 0x3aaf
++device.name STUDIOWORKS 56T
++driver.display |50-120|30-65
+
+ vendor.id GSM
+&device.id eisa 0x3ab0
++device.name LG StudioWorks 5D
+
+ vendor.id GSM
+&device.id eisa 0x3ab6
++device.name STUDIOWORKS 5D
++driver.display |50-120|30-65
+
+ vendor.id GSM
+&device.id eisa 0x3abd
++device.name STUDIOWORKS 55I
++driver.display |50-90|30-54
+
+ vendor.id GSM
+&device.id eisa 0x426c
++device.name STUDIOWORKS 78I
+
+ vendor.id GSM
+&device.id eisa 0x426d
++device.name STUDIOWORKS 78T
++driver.display |50-120|30-85
+
+ vendor.id GSM
+&device.id eisa 0x426e
++device.name STUDIOWORKS 76I
++driver.display |50-110|30-65
+
+ vendor.id GSM
+&device.id eisa 0x4273
++device.name LG StudioWorks 76m
+
+ vendor.id GSM
+&device.id eisa 0x4274
++device.name LG StudioWorks 78m
+
+ vendor.id GSM
+&device.id eisa 0x4277
++device.name LG StudioWorks 74m
+
+ vendor.id GSM
+&device.id eisa 0x4278
++device.name LG StudioWorks 74i
+
+ vendor.id GSM
+&device.id eisa 0x427e
++device.name STUDIOWORKS 7D
++driver.display |50-120|30-65
+
+ vendor.id GSM
+&device.id eisa 0x427f
++device.name STUDIOWORKS 78D
++driver.display |50-120|30-85
+
+ vendor.id GSM
+&device.id eisa 0x4280
++device.name LG StudioWorks 78DT
+
+ vendor.id GSM
+&device.id eisa 0x4281
++device.name LG StudioWorks 7DT
+
+ vendor.id GSM
+&device.id eisa 0x4284
++device.name LG StudioWorks 76T
+
+ vendor.id GSM
+&device.id eisa 0x42cf
++device.name 1725S
++driver.display |50-120|30-65
+
+ vendor.id GSM
+&device.id eisa 0x4e21
++device.name STUDIOWORKS 20I
++driver.display |50-120|30-85
+
+ vendor.id GWY
++vendor.name GATEWAY
+
+ vendor.id GWY
+&device.id eisa 0x00c0
++device.name VX900T
++driver.display |48-120|30-96
+
+ vendor.id GWY
+&device.id eisa 0x044d
++device.name VX700
++driver.display |50-130|30-86
+
+ vendor.id GWY
+&device.id eisa 0x0454
++device.name VX1100
++driver.display |50-152|30-108
+
+ vendor.id GWY
+&device.id eisa 0x0a8d
++device.name DESTINATION DL27
++driver.display |50-90|24-40
+
+ vendor.id GWY
+&device.id eisa 0x0e11
++device.name DESTINATION DL36
++driver.display |50-90|24-40
+
+ vendor.id GWY
+&device.id eisa 0x138a
++device.name EV500
++driver.display |50-110|30-70
+
+ vendor.id GWY
+&device.id eisa 0x1b5c
++device.name EV700
++driver.display |50-120|30-70
+
+ vendor.id GWY
+&device.id eisa 0x7659
++device.name EV700-H
++driver.display |50-120|30-70
+
+ vendor.id GWY
+&device.id eisa 0x8883
++device.name EV900
++driver.display |50-160|30-95
+
+ vendor.id GWY
+&device.id eisa 0x9095
++device.name VX900
++driver.display |50-160|30-95
+
+ vendor.id HEI
++vendor.name HYUNDAI
+
+ vendor.id HEI
+&device.id eisa 0x0b42
++device.name DELUXSCAN 21
++driver.display |45-100|30-82
+
+ vendor.id HEI
+&device.id eisa 0x12f0
++device.name DELUXSCAN 14S
++driver.display |50-120|30-48
+
+ vendor.id HEI
+&device.id eisa 0x16d8
++device.name DELUXSCAN 15B
++driver.display |50-120|30-48
+
+ vendor.id HEI
+&device.id eisa 0x16e8
++device.name DELUXSCAN 15G
++driver.display |50-90|30-64
+
+ vendor.id HEI
+&device.id eisa 0x16ee
++device.name DELUXSCAN 15G+
++driver.display |50-120|30-70
+
+ vendor.id HEI
+&device.id eisa 0x1e02
++device.name DELUXSCAN 17 PRO
++driver.display |45-100|30-82
+
+ vendor.id HEI
+&device.id eisa 0x1eb8
++device.name DELUXSCAN 17B
++driver.display |50-100|30-64
+
+ vendor.id HEI
+&device.id eisa 0x1ebe
++device.name DELUXSCAN 17B+
++driver.display |50-120|30-70
+
+ vendor.id HEI
+&device.id eisa 0x5864
++device.name DELUXSCAN 15 PRO
++driver.display |50-120|30-64
+
+ vendor.id HEI
+&device.id eisa 0x768b
++device.name 7687
++driver.display |50-150|30-87
+
+ vendor.id HEI
+&device.id eisa 0xb81e
++device.name DELUXSCAN 17
++driver.display |50-90|30-64
+
+ vendor.id HIG
++vendor.name HIGHSCREEN
+
+ vendor.id HIG
+&device.id eisa 0x5620
++device.name DX1595
++driver.display |50-120|30-65
+
+ vendor.id HIG
+&device.id eisa 0x5624
++device.name DX15T
++driver.display |50-100|30-64
+
+ vendor.id HIG
+&device.id eisa 0x5626
++device.name DX1795
++driver.display |50-120|30-65
+
+ vendor.id HIT
++vendor.name HITACHI
+
+ vendor.id HIT
+&device.id eisa 0x1717
++device.name ACCUVUE GX17L
++driver.display |50-100|30-64
+
+ vendor.id HIT
+&device.id eisa 0x1727
++device.name HM1764
++driver.display |50-100|30-64
+
+ vendor.id HIT
+&device.id eisa 0x1827
++device.name HM1782
++driver.display |50-100|30-82
+
+ vendor.id HIT
+&device.id eisa 0x2147
++device.name HM4721
++driver.display |50-152|30-95
+
+ vendor.id HIT
+&device.id eisa 0x2149
++device.name HM4921
++driver.display |50-152|30-107
+
+ vendor.id HIT
+&device.id eisa 0x4020
++device.name HM4020
++driver.display |60-120|60-85
+
+ vendor.id HIT
+&device.id eisa 0x4021
++device.name HM4021
++driver.display |60-120|60-85
+
+ vendor.id HIT
+&device.id eisa 0x4711
++device.name ACCUVUE UX4721
++driver.display |50-152|30-95
+
+ vendor.id HIT
+&device.id eisa 0x4810
++device.name ACCUVUE GX20
++driver.display |50-152|28-90
+
+ vendor.id HIT
+&device.id eisa 0x4811
++device.name ACCUVUE GX21
++driver.display |50-152|28-90
+
+ vendor.id HIT
+&device.id eisa 0x4820
++device.name HM4820
++driver.display |50-152|28-90
+
+ vendor.id HIT
+&device.id eisa 0x4821
++device.name HM4821
++driver.display |50-152|28-90
+
+ vendor.id HIT
+&device.id eisa 0x4830
++device.name ACCUVUE GX20H
++driver.display |50-152|28-90
+
+ vendor.id HIT
+&device.id eisa 0x4911
++device.name ACCUVUE UX4921
++driver.display |50-152|30-107
+
+ vendor.id HIT
+&device.id eisa 0x6421
++device.name HM6421
++driver.display |72-77|100-102
+
+ vendor.id HIT
+&device.id eisa 0x6811
++device.name ACCUVUE UX6821
++driver.display |50-152|30-107
+
+ vendor.id HIT
+&device.id eisa 0x6821
++device.name HM6821
++driver.display |50-152|30-107
+
+ vendor.id HSL
++vendor.name HANSOL
+
+ vendor.id HSL
+&device.id eisa 0x0579
++device.name ELECTRONICS MAZELLAN14PX
++driver.display |50-120|30-54
+
+ vendor.id HSL
+&device.id eisa 0x057a
++device.name ELECTRONICS MAZELLAN400A
++driver.display |50-120|30-50
+
+ vendor.id HSL
+&device.id eisa 0x05dd
++device.name ELECTRONICS MAZELLAN15AX
++driver.display |50-120|30-54
+
+ vendor.id HSL
+&device.id eisa 0x05de
++device.name ELECTRONICS MAZELLAN500P
++driver.display |50-120|30-69
+
+ vendor.id HSL
+&device.id eisa 0x06a5
++device.name ELECTRONICS MAZELLAN700P
++driver.display |50-120|30-85
+
+ vendor.id HSL
+&device.id eisa 0x06a6
++device.name ELECTRONICS MAZELLAN700A
++driver.display |50-120|30-69
+
+ vendor.id HSL
+&device.id eisa 0xa605
++device.name ELECTRONICS MAZELLAN17PX
++driver.display |50-120|30-85
+
+ vendor.id HTC
++vendor.name HITACHI
+
+ vendor.id HTC
+&device.id eisa 0xab6f
++device.name LTD CM-1711M
+
+ vendor.id HTC
+&device.id eisa 0xabc2
++device.name LTD CM-2112M
++driver.display |50-160|31-107
+
+ vendor.id HTC
+&device.id eisa 0xabc7
++device.name LTD CM-2111M
++driver.display |50-160|31-95
+
+ vendor.id HTC
+&device.id eisa 0xabcc
++device.name LTD CM-2110M
++driver.display |50-160|31-85
+
+ vendor.id HTC
+&device.id eisa 0xabe0
++device.name LTD CM802
++driver.display |50-160|31-100
+
+ vendor.id HTC
+&device.id eisa 0xabe2
++device.name LTD CM801
++driver.display |50-160|31-96
+
+ vendor.id HTC
+&device.id eisa 0xabe3
++device.name LTD CM800
++driver.display |50-160|31-89
+
+ vendor.id HTC
+&device.id eisa 0xabea
++device.name LTD CM803
++driver.display |50-160|31-115
+
+ vendor.id HTC
+&device.id eisa 0xabf4
++device.name LTD CM701
++driver.display |50-160|31-96
+
+ vendor.id HTC
+&device.id eisa 0xac13
++device.name CM751
++driver.display |50-160|30-94
+
+ vendor.id HTC
+&device.id eisa 0xac15
++device.name CM752
++driver.display |50-160|31-101
+
+ vendor.id HTC
+&device.id eisa 0xac22
++device.name CM753
++driver.display |50-160|31-107
+
+ vendor.id HTC
+&device.id eisa 0xac46
++device.name CM811
++driver.display |50-160|31-96
+
+ vendor.id HTC
+&device.id eisa 0xac47
++device.name CM812
++driver.display |50-160|31-107
+
+ vendor.id HTC
+&device.id eisa 0xac48
++device.name CM813
++driver.display |50-160|31-115
+
+ vendor.id HTC
+&device.id eisa 0xac49
++device.name CM814
++driver.display |50-160|31-125
+
+ vendor.id HTC
+&device.id eisa 0xafc8
++device.name LTD CM500
++driver.display |50-100|30-69
+
+ vendor.id HTC
+&device.id eisa 0xafce
++device.name CM500E
++driver.display |50-100|30-69
+
+ vendor.id HTC
+&device.id eisa 0xafd2
++device.name LTD CM600
++driver.display |47-104|30-64
+
+ vendor.id HTC
+&device.id eisa 0xafd7
++device.name LTD CM611
++driver.display 1152x870|50-120|31-92
+
+ vendor.id HTC
+&device.id eisa 0xafdd
++device.name CM620
++driver.display |47-130|31-69
+
+ vendor.id HTC
+&device.id eisa 0xafe2
++device.name CM630
++driver.display |47-130|31-86
+
+ vendor.id HTC
+&device.id eisa 0xafec
++device.name CM641
++driver.display |50-130|31-95
+
+ vendor.id HWP
++vendor.name HP
+
+ vendor.id HWP
+&device.id eisa 0x0af0
++device.name D2800A 21
++driver.display |50-160|30-82
+
+ vendor.id HWP
+&device.id eisa 0x0af6
++device.name D2806A 15
++driver.display |50-100|30-64
+
+ vendor.id HWP
+&device.id eisa 0x0af8
++device.name HP D2808 1024 Low Emission
+
+ vendor.id HWP
+&device.id eisa 0x0aff
++device.name D1815A 14 1024
+
+ vendor.id HWP
+&device.id eisa 0x0b0a
++device.name D2826-MONITOR (15 ZOLL)
++driver.display |50-120|31-54
+
+ vendor.id HWP
+&device.id eisa 0x0b10
++device.name D2832A
++driver.display |50-120|30-70
+
+ vendor.id HWP
+&device.id eisa 0x0b13
++device.name D2835
++driver.display |50-160|30-69
+
+ vendor.id HWP
+&device.id eisa 0x0b16
++device.name HP D2838 M700 17"
++driver.display |50-160|30-86
+
+ vendor.id HWP
+&device.id eisa 0x0b18
++device.name D2840 ERGO 1280
++driver.display |50-150|31-92
+
+ vendor.id HWP
+&device.id eisa 0x0b1d
++device.name D2845 ERGO 1600
+
+ vendor.id HWP
+&device.id eisa 0x0b1e
++device.name HP D2846 21
++driver.display 1600x1200|50-160|30-107|230
+
+ vendor.id HWP
+&device.id eisa 0x0f11
++device.name D3857A 15
+
+ vendor.id HWP
+&device.id eisa 0x0f12
++device.name D3858A 14
+
+ vendor.id IBM
++vendor.name IBM
+
+ vendor.id IBM
+&device.id eisa 0x0844
++device.name 2116 MM55 MULTIMEDIA
++driver.display |50-120|30-69
+
+ vendor.id IBM
+&device.id eisa 0x0850
++device.name 2128 MM75 MULTIMEDIA
++driver.display |50-160|30-69
+
+ vendor.id IBM
+&device.id eisa 0x08bb
++device.name 2235 C50
++driver.display |50-120|30-54
+
+ vendor.id IBM
+&device.id eisa 0x08bd
++device.name 2237 C71
++driver.display |50-120|30-69
+
+ vendor.id IBM
+&device.id eisa 0x0a2e
++device.name THINKPAD TFT
++driver.display |50-65|40-60
+
+ vendor.id IBM
+&device.id eisa 0x0a41
++device.name THINKPAD DSTN
++driver.display |50-65|40-60
+
+ vendor.id IBM
+&device.id eisa 0x0a4b
++device.name THINKPAD TFT
++driver.display |50-65|40-60
+
+ vendor.id IBM
+&device.id eisa 0x0a50
++device.name THINKPAD DSTN
++driver.display |50-65|40-60
+
+ vendor.id IBM
+&device.id eisa 0x0a55
++device.name THINKPAD TFT
++driver.display |50-65|40-60
+
+ vendor.id IBM
+&device.id eisa 0x198c
++device.name 6540 G42
++driver.display |55-100|30-50
+
+ vendor.id IBM
+&device.id eisa 0x198d
++device.name 6541 G51
++driver.display |55-100|30-54
+
+ vendor.id IBM
+&device.id eisa 0x198e
++device.name G41
+
+ vendor.id IBM
+&device.id eisa 0x198f
++device.name G50
+
+ vendor.id IBM
+&device.id eisa 0x1990
++device.name G70
++driver.display |50-105|31-64
+
+ vendor.id IBM
+&device.id eisa 0x1991
++device.name G200
++driver.display |50-120|31-82
+
+ vendor.id IBM
+&device.id eisa 0x1992
++device.name 6546 G52
++driver.display |50-120|30-69
+
+ vendor.id IBM
+&device.id eisa 0x1993
++device.name 6547 G72
++driver.display |50-120|30-69
+
+ vendor.id IBM
+&device.id eisa 0x1995
++device.name 6549 G94
++driver.display |50-160|30-95
+
+ vendor.id IBM
+&device.id eisa 0x1999
++device.name P50
++driver.display |50-120|30-69
+
+ vendor.id IBM
+&device.id eisa 0x199a
++device.name P70
++driver.display |50-120|29-82
+
+ vendor.id IBM
+&device.id eisa 0x199b
++device.name P200
++driver.display |50-120|29-90
+
+ vendor.id IBM
+&device.id eisa 0x199c
++device.name 6556 P72
++driver.display |50-150|30-85
+
+ vendor.id IBM
+&device.id eisa 0x199d
++device.name 6557 P92
++driver.display |50-160|30-94
+
+ vendor.id IBM
+&device.id eisa 0x199e
++device.name 6558 P202
++driver.display |50-160|30-107
+
+ vendor.id IBM
+&device.id eisa 0x1bb7
++device.name 7095
++driver.display |50-120|30-69
+
+ vendor.id IBM
+&device.id eisa 0x1bb9
++device.name 7097
++driver.display |50-120|30-69
+
+ vendor.id IBM
+&device.id eisa 0x2112
++device.name 2112
++driver.display |50-80|31-38
+
+ vendor.id IBM
+&device.id eisa 0x2113
++device.name 2113
++driver.display |50-80|31-38
+
+ vendor.id IBM
+&device.id eisa 0x2114
++device.name 2114
++driver.display |50-120|31-62
+
+ vendor.id IBM
+&device.id eisa 0x2115
++device.name 2115
++driver.display |50-120|31-62
+
+ vendor.id IBM
+&device.id eisa 0x2117
++device.name 2117
++driver.display |50-120|31-65
+
+ vendor.id IBM
+&device.id eisa 0x2215
++device.name 2215
++driver.display |50-120|31-64
+
+ vendor.id IBM
+&device.id eisa 0x2221
++device.name 2122
++driver.display |50-120|30-54
+
+ vendor.id IBM
+&device.id eisa 0x2236
++device.name 2236
++driver.display |50-120|30-70
+
+ vendor.id IBM
+&device.id eisa 0x2238
++device.name 2238
++driver.display |50-80|31-38
+
+ vendor.id IBM
+&device.id eisa 0x2248
++device.name 2248
++driver.display |50-100|31-48
+
+ vendor.id IBM
+&device.id eisa 0x2264
++device.name 2264
++driver.display |50-120|31-64
+
+ vendor.id IBM
+&device.id eisa 0x2421
++device.name 2124
++driver.display |50-120|30-54
+
+ vendor.id IBM
+&device.id eisa 0x2529
++device.name 9513 T55A TFT-MONITOR
++driver.display |56-75|30-61
+
+ vendor.id IBM
+&device.id eisa 0x252a
++device.name 9514-B TFT
++driver.display |55-75|31-65
+
+ vendor.id IBM
+&device.id eisa 0x2535
++device.name 9525-0X1
++driver.display |50-110|30-64
+
+ vendor.id IBM
+&device.id eisa 0x254a
++device.name THINKPAD LCD
++driver.display |50-65|40-60
+
+ vendor.id IBM
+&device.id eisa 0x254c
++device.name THINKPAD TFT
++driver.display |50-65|40-60
+
+ vendor.id IBM
+&device.id eisa 0x2621
++device.name 2126
++driver.display |50-110|30-69
+
+ vendor.id IBM
+&device.id eisa 0x26ac
++device.name APTIVA 9900
++driver.display |50-120|30-54
+
+ vendor.id IBM
+&device.id eisa 0x2721
++device.name 2127
++driver.display |50-120|30-72
+
+ vendor.id IBM
+&device.id eisa 0x27ad
++device.name APTIVA 9901
++driver.display |50-120|30-54
+
+ vendor.id IBM
+&device.id eisa 0x3121
++device.name 2131
++driver.display |50-120|30-69
+
+ vendor.id IBM
+&device.id eisa 0x3221
++device.name 2132
++driver.display |50-120|30-72
+
+ vendor.id IBM
+&device.id eisa 0x6312
++device.name 6312
++driver.display |47-100|31-50
+
+ vendor.id IBM
+&device.id eisa 0x6314
++device.name 6314
++driver.display |50-120|30-60
+
+ vendor.id IBM
+&device.id eisa 0x6315
++device.name 6315
+
+ vendor.id IBM
+&device.id eisa 0x6317
++device.name 6317
++driver.display |50-110|30-64
+
+ vendor.id IBM
+&device.id eisa 0x6319
++device.name 6319
++driver.display |50-120|30-60
+
+ vendor.id IBM
+&device.id eisa 0x6321
++device.name 6321
+
+ vendor.id IBM
+&device.id eisa 0x6322
++device.name 6322
+
+ vendor.id IBM
+&device.id eisa 0x6324
++device.name 6324
++driver.display |50-110|30-64
+
+ vendor.id IBM
+&device.id eisa 0x6325
++device.name 6325
++driver.display |50-110|30-64
+
+ vendor.id IBM
+&device.id eisa 0x6327
++device.name 6327
++driver.display |50-130|30-64
+
+ vendor.id IBM
+&device.id eisa 0x7234
++device.name 2122-XXL
++driver.display |50-110|30-54
+
+ vendor.id IBM
+&device.id eisa 0x7254
++device.name 2124-XXL
++driver.display |50-110|30-54
+
+ vendor.id IBM
+&device.id eisa 0x8504
++device.name 8504
+
+ vendor.id IBM
+&device.id eisa 0x8511
++device.name 8511
+
+ vendor.id IBM
+&device.id eisa 0x8512
++device.name 8512
+
+ vendor.id IBM
+&device.id eisa 0x8513
++device.name 8513
+
+ vendor.id IBM
+&device.id eisa 0x8514
++device.name 8514
+
+ vendor.id IBM
+&device.id eisa 0x8515
++device.name 8515
+
+ vendor.id IBM
+&device.id eisa 0x8517
++device.name 8517
+
+ vendor.id IBM
+&device.id eisa 0x8518
++device.name 8518
+
+ vendor.id IBM
+&device.id eisa 0x9504
++device.name 9504
+
+ vendor.id IBM
+&device.id eisa 0x9515
++device.name 9515
+
+ vendor.id IBM
+&device.id eisa 0x9517
++device.name 9517
++driver.display |50-90|27-59
+
+ vendor.id IBM
+&device.id eisa 0x9518
++device.name 9518
+
+ vendor.id IBM
+&device.id eisa 0x9521
++device.name 9521
++driver.display |50-110|30-82
+
+ vendor.id IBM
+&device.id eisa 0x9524
++device.name 9524
++driver.display |50-110|30-64
+
+ vendor.id IBM
+&device.id eisa 0x9525
++device.name 9525
++driver.display |50-110|30-64
+
+ vendor.id IBM
+&device.id eisa 0x9527
++device.name 9527
++driver.display |50-110|30-82
+
+ vendor.id ICL
++vendor.name FUJITSU
+
+ vendor.id ICL
+&device.id eisa 0x0100
++device.name ICL ERGOPRO 211V
++driver.display |50-120|24-82
+
+ vendor.id ICL
+&device.id eisa 0x0200
++device.name ICL ERGOPRO 171P
++driver.display |50-110|30-82
+
+ vendor.id ICL
+&device.id eisa 0x0400
++device.name ICL ERGOPRO 171V
++driver.display |50-100|30-64
+
+ vendor.id ICL
+&device.id eisa 0x0700
++device.name ICL ERGOPRO 151P
++driver.display |48-100|30-64
+
+ vendor.id ICL
+&device.id eisa 0x0800
++device.name ICL ERGOPRO 151P AUTOBRITE
++driver.display |48-100|30-64
+
+ vendor.id ICL
+&device.id eisa 0x0a00
++device.name ICL ERGOPRO 151V
++driver.display |50-100|30-64
+
+ vendor.id ICL
+&device.id eisa 0x0b00
++device.name ICL ERGOPRO 141V
+
+ vendor.id ICL
+&device.id eisa 0x0d00
++device.name ICL ERGOPRO 141P
+
+ vendor.id ICL
+&device.id eisa 0x0f00
++device.name ICL ERGOPRO 152V
++driver.display |50-100|30-64
+
+ vendor.id ICL
+&device.id eisa 0x1400
++device.name ICL ERGOPRO 142V
+
+ vendor.id ICL
+&device.id eisa 0x1600
++device.name ICL ERGOPRO E153
++driver.display |50-100|30-66
+
+ vendor.id ICL
+&device.id eisa 0x1900
++device.name ICL ERGOPRO X173
++driver.display |48-100|31-85
+
+ vendor.id ICL
+&device.id eisa 0x1a00
++device.name ICL ERGOPRO X173A
++driver.display |48-100|31-85
+
+ vendor.id ICL
+&device.id eisa 0x1c00
++device.name ICL ERGOPRO X152
++driver.display |50-100|30-65
+
+ vendor.id ICL
+&device.id eisa 0x1d00
++device.name ICL ERGOPRO E173
++driver.display |50-120|30-65
+
+ vendor.id ICL
+&device.id eisa 0x2100
++device.name ERGOPRO X153
++driver.display |50-160|30-69
+
+ vendor.id ICL
+&device.id eisa 0x2200
++device.name ERGOPRO E154
++driver.display |50-100|30-54
+
+ vendor.id ICL
+&device.id eisa 0x2300
++device.name ERGOPRO E174
++driver.display |50-160|30-69
+
+ vendor.id ICL
+&device.id eisa 0x2400
++device.name ERGOPRO X174
++driver.display |50-150|30-92
+
+ vendor.id ICL
+&device.id eisa 0x2500
++device.name E175
++driver.display |50-120|30-85
+
+ vendor.id ICL
+&device.id eisa 0x2700
++device.name E213
++driver.display |50-150|30-107
+
+ vendor.id ICL
+&device.id eisa 0x2800
++device.name X191
++driver.display |50-160|30-96
+
+ vendor.id ICL
+&device.id eisa 0x2900
++device.name X154
++driver.display |50-120|30-70
+
+ vendor.id ICL
+&device.id eisa 0x2a00
++device.name E176
++driver.display |50-120|30-70
+
+ vendor.id IVM
++vendor.name IIYAMA
+
+ vendor.id IVM
+&device.id eisa 0x1501
++device.name VISION MASTER
++driver.display |50-160|27-69
+
+ vendor.id IVM
+&device.id eisa 0x1700
++device.name VISION MASTER (1700)
++driver.display |50-160|27-86
+
+ vendor.id IVM
+&device.id eisa 0x1701
++device.name VISION MASTER (1701)
++driver.display |50-160|27-86
+
+ vendor.id IVM
+&device.id eisa 0x1702
++device.name VISION MASTER 400 (2)
++driver.display |50-160|27-96
+
+ vendor.id IVM
+&device.id eisa 0x1703
++device.name VISION MASTER 400
++driver.display |50-160|27-96
+
+ vendor.id IVM
+&device.id eisa 0x1711
++device.name VISION MASTER PRO 400
++driver.display |50-160|27-96
+
+ vendor.id IVM
+&device.id eisa 0x1740
++device.name VISION MASTER PRO 410
++driver.display |50-160|27-96
+
+ vendor.id IVM
+&device.id eisa 0x17a8
++device.name S700JT1
++driver.display |50-100|27-90
+
+ vendor.id IVM
+&device.id eisa 0x1900
++device.name VISION MASTER 450
++driver.display |50-160|27-102
+
+ vendor.id IVM
+&device.id eisa 0x1901
++device.name VISION MASTER PRO 450
++driver.display 1600x1200|50-160|25-115|230
+
+ vendor.id IVM
+&device.id eisa 0x1918
++device.name VISION MASTER PRO 451
++driver.display |50-160|27-110
+
+ vendor.id IVM
+&device.id eisa 0x2110
++device.name VISION MASTER 501
++driver.display |50-160|27-96
+
+ vendor.id IVM
+&device.id eisa 0x2118
++device.name VISION MASTER PRO 501
++driver.display |50-160|27-96
+
+ vendor.id IVM
+&device.id eisa 0x2120
++device.name VISION MASTER 502
++driver.display |50-160|27-110
+
+ vendor.id IVM
+&device.id eisa 0x2128
++device.name VISION MASTER PRO 502
++driver.display |50-160|27-110
+
+ vendor.id IVM
+&device.id eisa 0x2130
++device.name VISION MASTER PRO
++driver.display |50-160|24-94
+
+ vendor.id IVM
+&device.id eisa 0x3601
++device.name PROLITE36 (3601)
+
+ vendor.id IVM
+&device.id eisa 0x3602
++device.name PROLITE36
+
+ vendor.id IVM
+&device.id eisa 0x3801
++device.name PROLITE38
+
+ vendor.id IVM
+&device.id eisa 0x3808
++device.name PROLITE38C
+
+ vendor.id IVM
+&device.id eisa 0x3900
++device.name PROLITE39
+
+ vendor.id IVM
+&device.id eisa 0x4600
++device.name PROLITE46
+
+ vendor.id KDS
++vendor.name KOREA
+
+ vendor.id KDS
+&device.id eisa 0x05ac
++device.name DATA SYSTEMS VISUAL SENSATION VS-4(KD-1452)
++driver.display |40-120|28-50
+
+ vendor.id KDS
+&device.id eisa 0x05af
++device.name DATA SYSTEMS VISUAL SENSATION VS-4D
++driver.display |40-120|28-55
+
+ vendor.id KDS
+&device.id eisa 0x05e6
++device.name DATA SYSTEMS VISUAL SENSATION VS-5/VS-51/VSX-5
++driver.display |50-120|30-70
+
+ vendor.id KDS
+&device.id eisa 0x05f5
++device.name DATA SYSTEMS VISUAL SENSATION VS-55
++driver.display |40-120|28-55
+
+ vendor.id KDS
+&device.id eisa 0x06c2
++device.name DATA SYSTEMS VISUAL SENSATION VS-7/VSX-7
++driver.display |50-120|30-70
+
+ vendor.id KDS
+&device.id eisa 0x06d6
++device.name DATA SYSTEMS VISUAL SENSATION VS-9
++driver.display |50-120|31-95
+
+ vendor.id KDS
+&device.id eisa 0x07d0
++device.name DATA SYSTEMS VISUAL SENSATION VS-19
++driver.display |50-120|31-95
+
+ vendor.id KDS
+&device.id eisa 0x0834
++device.name DATA SYSTEMS VISUAL SENSATION VS-21
++driver.display |50-160|30-117
+
+ vendor.id KDS
+&device.id eisa 0x1540
++device.name DATA SYSTEMS AVITRON AV-5T
++driver.display |50-120|30-70
+
+ vendor.id KDS
+&device.id eisa 0x1740
++device.name DATA SYSTEMS AVITRON AV-7T
++driver.display |50-120|30-70
+
+ vendor.id KDS
+&device.id eisa 0x1980
++device.name DATA SYSTEMS VISUAL SENSATION VS-195
++driver.display |50-120|30-95
+
+ vendor.id KDS
+&device.id eisa 0x1981
++device.name DATA SYSTEMS VISUAL SENSATION VS-19SN
++driver.display |50-120|30-95
+
+ vendor.id LKM
++vendor.name AZALEA
+
+ vendor.id LNK
++vendor.name LINK Technologies, Inc.
+
+ vendor.id MAG
++vendor.name MAGIC
+
+ vendor.id MAG
+&device.id eisa 0x4577
++device.name D410
++driver.display |50-100|30-54
+
+ vendor.id MAG
+&device.id eisa 0x5620
++device.name DX-1595
++driver.display |50-120|30-64
+
+ vendor.id MAG
+&device.id eisa 0x5624
++device.name DX-15T
++driver.display |50-120|30-64
+
+ vendor.id MAG
+&device.id eisa 0x5626
++device.name DX1795
+
+ vendor.id MAG
+&device.id eisa 0x5775
++device.name DJ530
++driver.display |50-120|30-70
+
+ vendor.id MAG
+&device.id eisa 0x5776
++device.name XJ530
++driver.display |50-120|30-70
+
+ vendor.id MAG
+&device.id eisa 0x5779
++device.name XJ500T
++driver.display |50-120|30-70
+
+ vendor.id MAG
+&device.id eisa 0x5781
++device.name DX500T
++driver.display |50-120|30-70
+
+ vendor.id MAG
+&device.id eisa 0x5801
++device.name XJ500
++driver.display |50-120|30-70
+
+ vendor.id MAG
+&device.id eisa 0x7626
++device.name DX-1795
++driver.display |50-120|30-64
+
+ vendor.id MAG
+&device.id eisa 0x7740
++device.name DX-700T
++driver.display |50-120|30-70
+
+ vendor.id MAG
+&device.id eisa 0x7752
++device.name DJ707
++driver.display |50-120|30-70
+
+ vendor.id MAG
+&device.id eisa 0x7771
++device.name XJ700
++driver.display |50-120|30-70
+
+ vendor.id MAG
+&device.id eisa 0x7772
++device.name XJ707
++driver.display |50-120|30-70
+
+ vendor.id MAG
+&device.id eisa 0x7780
++device.name XJ700T
++driver.display |50-120|30-70
+
+ vendor.id MAG
+&device.id eisa 0x7842
++device.name DX715T
++driver.display |50-120|30-86
+
+ vendor.id MAG
+&device.id eisa 0x7854
++device.name DJ717
++driver.display |50-160|30-86
+
+ vendor.id MAG
+&device.id eisa 0x7874
++device.name XJ717
++driver.display |50-160|30-86
+
+ vendor.id MAG
+&device.id eisa 0x8997
++device.name XJ810
++driver.display |50-160|30-95
+
+ vendor.id MAX
++vendor.name BELINEA
+
+ vendor.id MAX
+&device.id eisa 0x0582
++device.name 101410
++driver.display |50-77|24-61
+
+ vendor.id MAX
+&device.id eisa 0x05e6
++device.name 101510
++driver.display |50-77|30-61
+
+ vendor.id MAX
+&device.id eisa 0x05f0
++device.name 101520
+
+ vendor.id MAX
+&device.id eisa 0x05fa
++device.name 101530
++driver.display |50-85|30-70
+
+ vendor.id MAX
+&device.id eisa 0x060e
++device.name 101550
++driver.display |50-85|30-70
+
+ vendor.id MAX
+&device.id eisa 0x0712
++device.name 101810
++driver.display |50-85|31-80
+
+ vendor.id MAX
+&device.id eisa 0x07e4
++device.name 102020
++driver.display 1152x864|50-120|30-70|86
+
+ vendor.id MAX
+&device.id eisa 0x07ee
++device.name 102030
++driver.display |50-120|30-70
+
+ vendor.id MAX
+&device.id eisa 0x07fa
++device.name 102010
++driver.display |50-120|30-54
+
+ vendor.id MAX
+&device.id eisa 0x0bc2
++device.name 103010
++driver.display |50-120|30-70
+
+ vendor.id MAX
+&device.id eisa 0x0bc7
++device.name 103015
++driver.display |50-120|30-70
+
+ vendor.id MAX
+&device.id eisa 0x0bcc
++device.name 103020
++driver.display |50-120|30-70
+
+ vendor.id MAX
+&device.id eisa 0x0bd6
++device.name 103030
++driver.display |50-150|30-70
+
+ vendor.id MAX
+&device.id eisa 0x0be0
++device.name 103040
++driver.display |50-150|30-86
+
+ vendor.id MAX
+&device.id eisa 0x0bea
++device.name 103050
++driver.display 1280x1024|50-160|30-95
+
+ vendor.id MAX
+&device.id eisa 0x0bf4
++device.name 103060
++driver.display |50-150|30-95
+
+ vendor.id MAX
+&device.id eisa 0x0bfe
++device.name 103070
++driver.display |50-160|30-95
+
+ vendor.id MAX
+&device.id eisa 0x0faa
++device.name 104010
++driver.display |50-120|30-54
+
+ vendor.id MAX
+&device.id eisa 0x0fc8
++device.name 104040
++driver.display |50-90|30-38
+
+ vendor.id MAX
+&device.id eisa 0x0fe1
++device.name 104065
++driver.display |50-120|30-50
+
+ vendor.id MAX
+&device.id eisa 0x13a6
++device.name 105030
++driver.display |50-100|30-64
+
+ vendor.id MAX
+&device.id eisa 0x13ab
++device.name 105035
++driver.display 1024x768|50-120|30-69
+
+ vendor.id MAX
+&device.id eisa 0x13b5
++device.name 105045
++driver.display |50-120|30-70
+
+ vendor.id MAX
+&device.id eisa 0x13b6
++device.name 105046
++driver.display |50-120|30-70
+
+ vendor.id MAX
+&device.id eisa 0x13ba
++device.name 105050
++driver.display |50-100|30-64
+
+ vendor.id MAX
+&device.id eisa 0x13d3
++device.name 105075
++driver.display |50-120|30-69
+
+ vendor.id MAX
+&device.id eisa 0x13d4
++device.name 105076
++driver.display |50-120|30-69
+
+ vendor.id MAX
+&device.id eisa 0x13d8
++device.name 105080
++driver.display |50-120|30-70
+
+ vendor.id MAX
+&device.id eisa 0x15ae
++device.name 105550
++driver.display |50-120|24-69
+
+ vendor.id MAX
+&device.id eisa 0x15c2
++device.name 105570
++driver.display |50-120|30-69
+
+ vendor.id MAX
+&device.id eisa 0x15c7
++device.name 105575
++driver.display |50-120|30-69
+
+ vendor.id MAX
+&device.id eisa 0x15c8
++device.name 105576
++driver.display |50-120|30-69
+
+ vendor.id MAX
+&device.id eisa 0x15d2
++device.name 105586
++driver.display |50-120|30-69
+
+ vendor.id MAX
+&device.id eisa 0x15d6
++device.name 105590
++driver.display |50-120|30-85
+
+ vendor.id MAX
+&device.id eisa 0x15db
++device.name 105595
++driver.display |50-120|30-85
+
+ vendor.id MAX
+&device.id eisa 0x15dc
++device.name 105596
++driver.display |50-120|30-85
+
+ vendor.id MAX
+&device.id eisa 0x1784
++device.name 106020
++driver.display |50-150|30-95
+
+ vendor.id MAX
+&device.id eisa 0x17a2
++device.name 106050
++driver.display |50-120|30-85
+
+ vendor.id MAX
+&device.id eisa 0x17ac
++device.name 106060
++driver.display |50-160|30-95
+
+ vendor.id MAX
+&device.id eisa 0x17b6
++device.name 106070
++driver.display |50-180|30-95
+
+ vendor.id MAX
+&device.id eisa 0x17ca
++device.name 106090
++driver.display |50-150|30-95
+
+ vendor.id MAX
+&device.id eisa 0x1b62
++device.name 107010
++driver.display |50-160|30-69
+
+ vendor.id MAX
+&device.id eisa 0x1b67
++device.name 107015
++driver.display |50-160|30-70
+
+ vendor.id MAX
+&device.id eisa 0x1b6c
++device.name 107020
++driver.display |50-120|30-70
+
+ vendor.id MAX
+&device.id eisa 0x1b71
++device.name 107025
++driver.display |50-180|30-70
+
+ vendor.id MAX
+&device.id eisa 0x1b76
++device.name 107030
++driver.display |50-160|30-86
+
+ vendor.id MAX
+&device.id eisa 0x1b7b
++device.name 107035
++driver.display |50-180|30-95
+
+ vendor.id MAX
+&device.id eisa 0x1b80
++device.name 107040
++driver.display |50-120|30-85
+
+ vendor.id MAX
+&device.id eisa 0x1b8a
++device.name 107050
++driver.display |50-160|30-95
+
+ vendor.id MAX
+&device.id eisa 0x1b94
++device.name 107060
++driver.display |50-120|30-70
+
+ vendor.id MAX
+&device.id eisa 0x1b99
++device.name 107065
++driver.display |50-160|30-95
+
+ vendor.id MAX
+&device.id eisa 0x1f4a
++device.name 108010
++driver.display |50-160|30-115
+
+ vendor.id MAX
+&device.id eisa 0x1f4f
++device.name 108015
++driver.display |50-160|30-115
+
+ vendor.id MAX
+&device.id eisa 0x1f54
++device.name 108020
++driver.display |50-160|30-107
+
+ vendor.id MAX
+&device.id eisa 0x1f72
++device.name 108050
++driver.display |50-160|30-95
+
+ vendor.id MAX
+&device.id eisa 0x1f7c
++device.name 108060
++driver.display |50-160|30-115
+
+ vendor.id MAX
+&device.id eisa 0x1f9a
++device.name 108090
++driver.display |50-160|30-95
+
+ vendor.id MAX
+&device.id eisa 0x1f9f
++device.name 108095
++driver.display |50-160|30-95
+
+ vendor.id MAX
+&device.id eisa 0x3430
++device.name 105540
++driver.display |50-90|30-64
+
+ vendor.id MAX
+&device.id eisa 0x3539
++device.name 105095
++driver.display |55-90|30-64
+
+ vendor.id MAX
+&device.id eisa 0x4065
++device.name 10 40 65
++driver.display |50-120|30-50
+
+ vendor.id MAX
+&device.id eisa 0x5620
++device.name 105065
++driver.display |50-100|30-64
+
+ vendor.id MAX
+&device.id eisa 0x5624
++device.name 105066
++driver.display |50-120|30-64
+
+ vendor.id MAX
+&device.id eisa 0x7555
++device.name 10 55 75
++driver.display |50-120|30-69
+
+ vendor.id MEI
++vendor.name PANASONIC
+
+ vendor.id MEI
+&device.id eisa 0x0c81
++device.name P70
++driver.display |50-180|30-95
+
+ vendor.id MEI
+&device.id eisa 0x0c96
++device.name SL70I(TX-D7S36)
++driver.display |50-180|30-70
+
+ vendor.id MEI
+&device.id eisa 0x0c9b
++device.name PL70I(TX-D7S55)
++driver.display |50-180|30-97
+
+ vendor.id MEI
+&device.id eisa 0x1007
++device.name PF70
++driver.display |50-160|30-86
+
+ vendor.id MEI
+&device.id eisa 0x120d
++device.name SL90 (TX-D9S54)
++driver.display |50-180|30-95
+
+ vendor.id MEI
+&device.id eisa 0x1604
++device.name TX-D2151W-ES
++driver.display |50-160|30-82
+
+ vendor.id MEI
+&device.id eisa 0x1610
++device.name TX-D2151NM
++driver.display |50-160|30-82
+
+ vendor.id MEI
+&device.id eisa 0x1649
++device.name S110
++driver.display |50-180|30-95
+
+ vendor.id MEI
+&device.id eisa 0x1e02
++device.name LC40
++driver.display |50-77|24-61
+
+ vendor.id MEI
+&device.id eisa 0x1e07
++device.name LC50S (TX-D5L31F)
++driver.display |50-77|30-61
+
+ vendor.id MEI
+&device.id eisa 0x2622
++device.name S15
++driver.display |50-120|30-67
+
+ vendor.id MEI
+&device.id eisa 0x2632
++device.name P50
++driver.display |50-180|30-69
+
+ vendor.id MEI
+&device.id eisa 0x2637
++device.name E50
++driver.display |50-120|30-61
+
+ vendor.id MEL
++vendor.name MITSUBISHI
+
+ vendor.id MEL
+&device.id eisa 0x0040
++device.name DIAMOND PRO 21TX (THN9105)
++driver.display |50-152|30-93
+
+ vendor.id MEL
+&device.id eisa 0x1040
++device.name RD21G
++driver.display |50-152|30-93
+
+ vendor.id MEL
+&device.id eisa 0x2040
++device.name DIAMOND PRO 20X (FR8905)
++driver.display |50-120|30-82
+
+ vendor.id MEL
+&device.id eisa 0x4040
++device.name DIAMOND PRO 17TX (TFG8705)
++driver.display |50-152|30-86
+
+ vendor.id MEL
+&device.id eisa 0x4064
++device.name DIAMOND PRO 67TXV (TFV6705)
++driver.display |50-130|30-69
+
+ vendor.id MEL
+&device.id eisa 0x4065
++device.name RD17GR
++driver.display |55-125|30-69
+
+ vendor.id MEL
+&device.id eisa 0x408f
++device.name DIAMOND SCAN 15VX (SD58XX)
++driver.display |50-100|30-65
+
+ vendor.id MEL
+&device.id eisa 0x409f
++device.name RD15M
++driver.display |50-100|30-65
+
+ vendor.id MEL
+&device.id eisa 0x40c0
++device.name DIAMOND PRO 87TXM (TFM8705)
++driver.display |50-130|30-86
+
+ vendor.id MEL
+&device.id eisa 0x40e0
++device.name DIAMOND PRO 91TXM (TFW9105)
++driver.display |50-130|30-95
+
+ vendor.id MEL
+&device.id eisa 0x40e1
++device.name DIAMOND PLUS 100 (TFW1105)
++driver.display |50-152|30-108
+
+ vendor.id MEL
+&device.id eisa 0x40f0
++device.name RD21GII
++driver.display |50-152|30-95
+
+ vendor.id MEL
+&device.id eisa 0x40f1
++device.name RD21GX
++driver.display |50-132|30-86
+
+ vendor.id MEL
+&device.id eisa 0x4100
++device.name DIAMOND PRO 1000 (TFX1105)
++driver.display |50-152|30-115
+
+ vendor.id MEL
+&device.id eisa 0x4101
++device.name DIAMOND PRO 1010 (TUX1107)
++driver.display |50-152|30-115
+
+ vendor.id MEL
+&device.id eisa 0x4120
++device.name SPECTRAVIEW 1000
++driver.display |50-130|30-95
+
+ vendor.id MEL
+&device.id eisa 0x4140
++device.name RD21GIII
++driver.display |50-152|30-115
+
+ vendor.id MEL
+&device.id eisa 0x4141
++device.name RD21GH
++driver.display |50-152|30-115
+
+ vendor.id MEL
+&device.id eisa 0x4150
++device.name RD17GZ
++driver.display |50-130|30-86
+
+ vendor.id MEL
+&device.id eisa 0x4160
++device.name DIAMOND PLUS 72 (TFV-8705)
++driver.display |50-130|30-86
+
+ vendor.id MEL
+&device.id eisa 0x4190
++device.name DIAMOND PLUS 70 (TF-7700P)
++driver.display |50-180|30-70
+
+ vendor.id MEL
+&device.id eisa 0x41b0
++device.name RDT151
+
+ vendor.id MEL
+&device.id eisa 0x41b3
++device.name TFT MONITOR RDT150S
+
+ vendor.id MEL
+&device.id eisa 0x41f0
++device.name DIAMOND SCAN 50 (SD5904)
++driver.display |50-100|30-70
+
+ vendor.id MEL
+&device.id eisa 0x4210
++device.name DIAMOND SCAN 70 (SD7704)
++driver.display |50-100|30-70
+
+ vendor.id MEL
+&device.id eisa 0x42d0
++device.name TFT MONITOR RDT180S
+
+ vendor.id MEL
+&device.id eisa 0x5040
++device.name RD17GII
++driver.display |50-152|24-86
+
+ vendor.id MEL
+&device.id eisa 0x6040
++device.name RD17F
++driver.display |50-130|30-82
+
+ vendor.id MEL
+&device.id eisa 0x6140
++device.name DIAMOND SCAN 17HX (FFF8705)
++driver.display |50-130|30-82
+
+ vendor.id MEL
+&device.id eisa 0x8040
++device.name DIAMOND SCAN 15HX (SD57XXC)
+
+ vendor.id MEL
+&device.id eisa 0x9040
++device.name RD15G
++driver.display |50-120|30-65
+
+ vendor.id MIR
++vendor.name MIRO
+
+ vendor.id MIR
+&device.id eisa 0x0721
++device.name PROOFSCREEN MIROC21107
+
+ vendor.id MIR
+&device.id eisa 0x6815
++device.name miroD1568
+
+ vendor.id MIR
+&device.id eisa 0x6817
++device.name PROOFSCREEN MIROC1768
++driver.display |50-100|29-68
+
+ vendor.id MIR
+&device.id eisa 0x6917
++device.name miroD1769
+
+ vendor.id MIR
+&device.id eisa 0x8217
++device.name PROOFSCREEN MIROC1782
++driver.display |50-120|29-82
+
+ vendor.id MIR
+&device.id eisa 0x8520
++device.name PROOFSCREEN MIROC2085 E
++driver.display |50-160|29-85
+
+ vendor.id MIR
+&device.id eisa 0x8521
++device.name PROOFSCREEN MIROC2185
++driver.display |50-152|30-85
+
+ vendor.id MIR
+&device.id eisa 0x9321
++device.name PROOFSCREEN MIROC2193
++driver.display |50-150|30-93
+
+ vendor.id MIR
+&device.id eisa 0xa785
++device.name A1785F
++driver.display |50-100|30-85
+
+ vendor.id MTC
++vendor.name MITAC
+
+ vendor.id MTC
+&device.id eisa 0x0001
++device.name 1450FV
++driver.display |50-90|31-50
+
+ vendor.id MTC
+&device.id eisa 0x0002
++device.name 1564FD/1564FS
++driver.display |50-100|30-66
+
+ vendor.id MTC
+&device.id eisa 0x0003
++device.name 1450FD
++driver.display |50-90|31-50
+
+ vendor.id NAN
++vendor.name NANAO
+
+ vendor.id NAN
+&device.id eisa 0x0000
++device.name USA FLEXSCAN T2-20
++driver.display |55-160|30-85
+
+ vendor.id NAN
+&device.id eisa 0x0400
++device.name USA F2-15
+
+ vendor.id NAN
+&device.id eisa 0x0401
++device.name USA F2-17
+
+ vendor.id NAN
+&device.id eisa 0x0402
++device.name USA F2-17EX
+
+ vendor.id NAN
+&device.id eisa 0x0403
++device.name USA F2-21
+
+ vendor.id NAN
+&device.id eisa 0x0404
++device.name USA FX2-21
+
+ vendor.id NAN
+&device.id eisa 0x0405
++device.name USA FLEXSCAN T2-17TS
+
+ vendor.id NAN
+&device.id eisa 0x0406
++device.name FLEXSCAN 6600
++driver.display |70-90|56-110
+
+ vendor.id NAN
+&device.id eisa 0x0502
++device.name NANAO 9060S
+
+ vendor.id NAN
+&device.id eisa 0x0503
++device.name 9065S
++driver.display |50-90|30-50
+
+ vendor.id NAN
+&device.id eisa 0x0506
++device.name NANAO 9070U
+
+ vendor.id NAN
+&device.id eisa 0x0507
++device.name NANAO 9080i
+
+ vendor.id NAN
+&device.id eisa 0x0508
++device.name 9400I
++driver.display |55-90|30-65
+
+ vendor.id NAN
+&device.id eisa 0x0509
++device.name 9500
++driver.display |55-90|30-78
+
+ vendor.id NAN
+&device.id eisa 0x050a
++device.name FLEXSCAN F340IW
+
+ vendor.id NAN
+&device.id eisa 0x050b
++device.name NANAO FlexScan F550i
+
+ vendor.id NAN
+&device.id eisa 0x050c
++device.name FLEXSCAN F550IW
++driver.display |55-90|30-65
+
+ vendor.id NAN
+&device.id eisa 0x050d
++device.name FLEXSCAN F560IW
++driver.display |55-90|30-82
+
+ vendor.id NAN
+&device.id eisa 0x050e
++device.name FLEXSCAN F750I
++driver.display |55-90|30-80
+
+ vendor.id NAN
+&device.id eisa 0x050f
++device.name FLEXSCAN F760IW
++driver.display |55-90|30-78
+
+ vendor.id NAN
+&device.id eisa 0x0510
++device.name FLEXSCAN F780IW
++driver.display |55-120|45-100
+
+ vendor.id NAN
+&device.id eisa 0x0511
++device.name FLEXSCAN T560I
++driver.display |55-90|30-82
+
+ vendor.id NAN
+&device.id eisa 0x0512
++device.name FLEXSCAN T660I
++driver.display |55-90|30-78
+
+ vendor.id NAN
+&device.id eisa 0x0513
++device.name USA FLEXSCAN T2-17
++driver.display |55-160|30-85
+
+ vendor.id NAN
+&device.id eisa 0x0514
++device.name NANAO USA FlexScan T2-20
+
+ vendor.id NAN
+&device.id eisa 0x0580
++device.name USA FLEXSCAN 6300
++driver.display |55-90|56-80
+
+ vendor.id NAN
+&device.id eisa 0x0800
++device.name FLEXSCAN 33F
+
+ vendor.id NAN
+&device.id eisa 0x0802
++device.name FLEXSCAN 88F
+
+ vendor.id NAN
+&device.id eisa 0x0805
++device.name FLEXSCAN 54T
+
+ vendor.id NAN
+&device.id eisa 0x0882
++device.name FLEXSCAN 52F
+
+ vendor.id NAN
+&device.id eisa 0x0900
++device.name FLEXSCAN 6500
++driver.display |55-90|56-80
+
+ vendor.id NAN
+&device.id eisa 0x0902
++device.name 9060S
+
+ vendor.id NAN
+&device.id eisa 0x0906
++device.name 9070U
++driver.display |50-90|20-50
+
+ vendor.id NAN
+&device.id eisa 0x0907
++device.name 9080I
++driver.display |55-90|30-64
+
+ vendor.id NAN
+&device.id eisa 0x090a
++device.name FLEXSCAN F347
+
+ vendor.id NAN
+&device.id eisa 0x090b
++device.name FLEXSCAN F550I
++driver.display |55-90|30-65
+
+ vendor.id NAN
+&device.id eisa 0x090c
++device.name FLEXSCAN F557
+
+ vendor.id NAN
+&device.id eisa 0x090f
++device.name FLEXSCAN 77F
+
+ vendor.id NAN
+&device.id eisa 0x0910
++device.name FLEXSCAN F780IJ
++driver.display |55-120|45-100
+
+ vendor.id NAN
+&device.id eisa 0x0911
++device.name FLEXSCAN T560IJ
++driver.display |55-90|30-82
+
+ vendor.id NAN
+&device.id eisa 0x0912
++device.name FLEXSCAN T660IJ
++driver.display |55-90|30-82
+
+ vendor.id NAN
+&device.id eisa 0x0913
++device.name FLEXSCAN 56T
++driver.display |55-160|30-85
+
+ vendor.id NAN
+&device.id eisa 0x0914
++device.name FLEXSCAN 68T
++driver.display |55-160|30-85
+
+ vendor.id NAN
+&device.id eisa 0x098a
++device.name FLEXSCAN F347II
+
+ vendor.id NAN
+&device.id eisa 0x098c
++device.name FLEXSCAN 55F
+
+ vendor.id NAN
+&device.id eisa 0x098f
++device.name FLEXSCAN 76F
++driver.display |55-90|30-78
+
+ vendor.id NAN
+&device.id eisa 0x0991
++device.name FLEXSCAN T567
++driver.display |55-90|30-82
+
+ vendor.id NAN
+&device.id eisa 0x0993
++device.name FLEXSCAN 53T
++driver.display |55-160|30-85
+
+ vendor.id NAN
+&device.id eisa 0x1212
++device.name FLEXSCAN E151L
++driver.display |50-85|24-61
+
+ vendor.id NAN
+&device.id eisa 0x1218
++device.name FLEXSCAN E76F
++driver.display |50-160|30-110
+
+ vendor.id NAN
+&device.id eisa 0x1220
++device.name FLEXSCAN E54F
++driver.display |50-160|30-96
+
+ vendor.id NEC
++vendor.name NEC
+
+ vendor.id NEC
+&device.id eisa 0x000a
++device.name INTEGRIERTER PC-9821XC13/S5
++driver.display |50-63|27-59
+
+ vendor.id NEC
+&device.id eisa 0x0014
++device.name D171
++driver.display |50-63|27-59
+
+ vendor.id NEC
+&device.id eisa 0x001e
++device.name NEC INTEGRIERTER PC-9821CT16
++driver.display |50-70|27-59
+
+ vendor.id NEC
+&device.id eisa 0x0032
++device.name D17A1
++driver.display |50-63|27-59
+
+ vendor.id NEC
+&device.id eisa 0x0046
++device.name D17C2
++driver.display |50-63|27-59
+
+ vendor.id NEC
+&device.id eisa 0x0050
++device.name D15A1
++driver.display |50-63|27-59
+
+ vendor.id NEC
+&device.id eisa 0x005a
++device.name D17B1
++driver.display |50-63|27-59
+
+ vendor.id NEC
+&device.id eisa 0x006e
++device.name DV15A1
++driver.display |60-75|30-63
+
+ vendor.id NEC
+&device.id eisa 0x0078
++device.name DV17A1
++driver.display |60-75|30-67
+
+ vendor.id NEC
+&device.id eisa 0x0082
++device.name DV17B1
++driver.display |60-75|30-67
+
+ vendor.id NEC
+&device.id eisa 0x008c
++device.name DV17C1
++driver.display |60-75|30-67
+
+ vendor.id NEC
+&device.id eisa 0x0096
++device.name DV17C2
++driver.display |60-75|30-83
+
+ vendor.id NEC
+&device.id eisa 0x00a0
++device.name F14T1
++driver.display |60-75|24-63
+
+ vendor.id NEC
+&device.id eisa 0x00aa
++device.name DV15D1
++driver.display |60-75|30-63
+
+ vendor.id NEC
+&device.id eisa 0x00c8
++device.name PK-DH172
++driver.display |60-85|30-63
+
+ vendor.id NEC
+&device.id eisa 0x00dc
++device.name F14T2H
++driver.display |59-76|31-61
+
+ vendor.id NEC
+&device.id eisa 0x00e6
++device.name F14T2L
++driver.display |59-76|31-61
+
+ vendor.id NEC
+&device.id eisa 0x0190
++device.name D172
++driver.display |50-63|27-59
+
+ vendor.id NEC
+&device.id eisa 0x019a
++device.name DV15A2
++driver.display |59-86|30-71
+
+ vendor.id NEC
+&device.id eisa 0x01a4
++device.name DV17C3
++driver.display |59-86|30-71
+
+ vendor.id NEC
+&device.id eisa 0x01ae
++device.name DV17B2
++driver.display |59-86|30-71
+
+ vendor.id NEC
+&device.id eisa 0x0320
++device.name MULTISYNC LT80
++driver.display |50-85|15-60
+
+ vendor.id NEC
+&device.id eisa 0x0afa
++device.name DH28W2
++driver.display |60-75|30-38
+
+ vendor.id NEC
+&device.id eisa 0x0c8a
++device.name DH32W2
++driver.display |60-75|30-38
+
+ vendor.id NEC
+&device.id eisa 0x1d4d
++device.name MULTISYNC 50
++driver.display |55-120|31-69
+
+ vendor.id NEC
+&device.id eisa 0x1e15
++device.name MULTISYNC 70
++driver.display |55-120|31-69
+
+ vendor.id NEC
+&device.id eisa 0x1fa4
++device.name MULTISYNC MT810
++driver.display |50-85|15-60
+
+ vendor.id NEC
+&device.id eisa 0x2710
++device.name MULTISYNC MT1000
++driver.display |50-85|15-80
+
+ vendor.id NEC
+&device.id eisa 0x2fb2
++device.name LCD200
++driver.display |53-85|24-62
+
+ vendor.id NEC
+&device.id eisa 0x3782
++device.name MULTISYNC LCD400
++driver.display |55-86|24-60
+
+ vendor.id NEC
+&device.id eisa 0x378c
++device.name MULTISYNC LCD400V
++driver.display |55-86|24-60
+
+ vendor.id NEC
+&device.id eisa 0x37fa
++device.name NEC MultiSync XV14
+
+ vendor.id NEC
+&device.id eisa 0x37fb
++device.name MULTISYNC XV14
++driver.display |55-100|30-57
+
+ vendor.id NEC
+&device.id eisa 0x3a66
++device.name MULTISYNC C400
++driver.display |47-120|30-64
+
+ vendor.id NEC
+&device.id eisa 0x3c00
++device.name NEC MultiSync XE15
+
+ vendor.id NEC
+&device.id eisa 0x3c0a
++device.name MULTISYNC XP15
++driver.display |55-160|31-65
+
+ vendor.id NEC
+&device.id eisa 0x3c14
++device.name MULTISYNC XV15
++driver.display |55-100|31-65
+
+ vendor.id NEC
+&device.id eisa 0x3c1e
++device.name MULTISYNC XE15
++driver.display |55-120|31-65
+
+ vendor.id NEC
+&device.id eisa 0x3d5e
++device.name MULTISYNC XV15+
++driver.display |55-100|31-65
+
+ vendor.id NEC
+&device.id eisa 0x3d68
++device.name MULTISYNC M500
++driver.display |55-120|30-69
+
+ vendor.id NEC
+&device.id eisa 0x3d7c
++device.name MULTISYNC V500
++driver.display |55-100|31-65
+
+ vendor.id NEC
+&device.id eisa 0x3d86
++device.name MULTISYNC E500
++driver.display |55-120|31-69
+
+ vendor.id NEC
+&device.id eisa 0x3d90
++device.name MULTISYNC A500
++driver.display |55-120|31-65
+
+ vendor.id NEC
+&device.id eisa 0x3e4e
++device.name MULTISYNC C500
++driver.display |47-120|30-64
+
+ vendor.id NEC
+&device.id eisa 0x3e53
++device.name CS500-MULTIMEDIAMONITOR
++driver.display |50-120|30-64
+
+ vendor.id NEC
+&device.id eisa 0x43a8
++device.name NEC MultiSync XE17
+
+ vendor.id NEC
+&device.id eisa 0x43b2
++device.name MULTISYNC XE17
++driver.display |55-120|31-65
+
+ vendor.id NEC
+&device.id eisa 0x43bc
++device.name MULTISYNC XV17
++driver.display |55-100|31-65
+
+ vendor.id NEC
+&device.id eisa 0x43c6
++device.name MULTISYNC M700
++driver.display |55-120|30-69
+
+ vendor.id NEC
+&device.id eisa 0x43d0
++device.name MULTISYNC A700
++driver.display |55-120|31-65
+
+ vendor.id NEC
+&device.id eisa 0x4416
++device.name MULTISYNC XP17
++driver.display |55-160|31-82
+
+ vendor.id NEC
+&device.id eisa 0x4420
++device.name MULTISYNC P750
++driver.display |55-160|31-94
+
+ vendor.id NEC
+&device.id eisa 0x442a
++device.name MULTISYNC XV17+ (-2)
++driver.display |55-100|31-82
+
+ vendor.id NEC
+&device.id eisa 0x4434
++device.name MULTISYNC E700
++driver.display |55-120|31-82
+
+ vendor.id NEC
+&device.id eisa 0x4bd2
++device.name MULTISYNC E900
++driver.display |55-120|31-92
+
+ vendor.id NEC
+&device.id eisa 0x4bdc
++device.name MULTISYNC E900+
++driver.display |55-160|31-96
+
+ vendor.id NEC
+&device.id eisa 0x4be6
++device.name MULTISYNC A900
++driver.display |55-160|31-92
+
+ vendor.id NEC
+&device.id eisa 0x4bf0
++device.name MULTISYNC 90
++driver.display |55-160|31-92
+
+ vendor.id NEC
+&device.id eisa 0x4f56
++device.name MULTISYNC LCD2000
++driver.display |55-85|24-81
+
+ vendor.id NEC
+&device.id eisa 0x4f60
++device.name MULTISYNC LCD2010
++driver.display |55-85|24-81
+
+ vendor.id NEC
+&device.id eisa 0x533e
++device.name MULTISYNC XE21
++driver.display |55-120|31-69
+
+ vendor.id NEC
+&device.id eisa 0x53b6
++device.name MULTISYNC XP21
++driver.display |55-160|31-89
+
+ vendor.id NEC
+&device.id eisa 0x53c0
++device.name MULTISYNC E1100
++driver.display |55-120|31-82
+
+ vendor.id NEC
+&device.id eisa 0x53ca
++device.name MULTISYNC P1150
++driver.display |55-160|31-94
+
+ vendor.id NEC
+&device.id eisa 0x53de
++device.name MULTISYNC E1100+
++driver.display |55-160|31-96
+
+ vendor.id NEC
+&device.id eisa 0x53e8
++device.name MULTISYNC P1250+
++driver.display |55-160|31-110
+
+ vendor.id NEC
+&device.id eisa 0xea69
++device.name C900
++driver.display |50-150|30-95
+
+ vendor.id NEC
+&device.id eisa 0xea8b
++device.name VISTASCAN 7000
++driver.display |50-120|30-69
+
+ vendor.id NOK
++vendor.name NOKIA
+
+ vendor.id NOK
+&device.id eisa 0x008d
++device.name NOKIA 449M
+
+ vendor.id NOK
+&device.id eisa 0x0098
++device.name NOKIA 449X
+
+ vendor.id NOK
+&device.id eisa 0x00a3
++device.name NOKIA 447KC
+
+ vendor.id NOK
+&device.id eisa 0x00a9
++device.name 447XI
++driver.display |45-150|31-92
+
+ vendor.id NOK
+&device.id eisa 0x00ab
++device.name NOKIA 447KA
+
+ vendor.id NOK
+&device.id eisa 0x00ad
++device.name 447M
++driver.display |55-110|31-64
+
+ vendor.id NOK
+&device.id eisa 0x00b7
++device.name 447W
++driver.display |48-100|31-85
+
+ vendor.id NOK
+&device.id eisa 0x00b8
++device.name NOKIA 447X
+
+ vendor.id NOK
+&device.id eisa 0x00bb
++device.name NOKIA 447XAV
+
+ vendor.id NOK
+&device.id eisa 0x00bc
++device.name NOKIA 447K
+
+ vendor.id NOK
+&device.id eisa 0x00d2
++device.name NOKIA 445R
+
+ vendor.id OQI
++vendor.name OPTIQUEST
+
+ vendor.id OQI
+&device.id eisa 0x3138
++device.name VA656
++driver.display |50-120|30-69
+
+ vendor.id OQI
+&device.id eisa 0x3141
++device.name OPTIQUEST 14ES
+
+ vendor.id OQI
+&device.id eisa 0x3232
++device.name 1562A-2
+
+ vendor.id OQI
+&device.id eisa 0x3233
++device.name OPTIQUEST 1769DC
+
+ vendor.id OQI
+&device.id eisa 0x3234
++device.name 1000S
+
+ vendor.id OQI
+&device.id eisa 0x3332
++device.name V655
++driver.display |50-100|30-66
+
+ vendor.id OQI
+&device.id eisa 0x3333
++device.name V775
++driver.display |50-130|30-82
+
+ vendor.id OQI
+&device.id eisa 0x3432
++device.name OPTIQUEST V650
+
+ vendor.id OQI
+&device.id eisa 0x3832
++device.name OPTIQUEST V665
+
+ vendor.id OQI
+&device.id eisa 0x4132
++device.name V641
+
+ vendor.id OQI
+&device.id eisa 0x4136
++device.name Q41
++driver.display |50-90|30-48
+
+ vendor.id OQI
+&device.id eisa 0x4432
++device.name V655-2
++driver.display |50-100|30-65
+
+ vendor.id OQI
+&device.id eisa 0x4433
++device.name Q53
++driver.display |50-100|30-70
+
+ vendor.id OQI
+&device.id eisa 0x4434
++device.name V655-3
++driver.display |50-100|30-70
+
+ vendor.id OQI
+&device.id eisa 0x4435
++device.name Q51
++driver.display |50-100|30-54
+
+ vendor.id OQI
+&device.id eisa 0x4436
++device.name V55
++driver.display |50-160|30-70
+
+ vendor.id OQI
+&device.id eisa 0x4637
++device.name 1769DC
++driver.display |50-120|30-69
+
+ vendor.id OQI
+&device.id eisa 0x4732
++device.name V775-2
++driver.display |50-120|30-85
+
+ vendor.id OQI
+&device.id eisa 0x4733
++device.name V773
++driver.display |50-160|30-69
+
+ vendor.id OQI
+&device.id eisa 0x4735
++device.name Q71
++driver.display |50-120|30-70
+
+ vendor.id OQI
+&device.id eisa 0x4736
++device.name V773-2
++driver.display |50-180|30-70
+
+ vendor.id OQI
+&device.id eisa 0x4738
++device.name Q71-2
++driver.display |50-120|30-70
+
+ vendor.id OQI
+&device.id eisa 0x4739
++device.name V75
++driver.display |50-160|30-96
+
+ vendor.id OQI
+&device.id eisa 0x4a31
++device.name Q100
++driver.display |50-120|30-86
+
+ vendor.id OQI
+&device.id eisa 0x4a32
++device.name V95
++driver.display |50-150|30-95
+
+ vendor.id OQI
+&device.id eisa 0x4d31
++device.name V115
++driver.display |50-160|30-95
+
+ vendor.id OQI
+&device.id eisa 0x4d32
++device.name V115T
++driver.display |50-150|30-96
+
+ vendor.id OQI
+&device.id eisa 0x5634
++device.name V73
++driver.display |50-160|30-70
+
+ vendor.id PBN
++vendor.name PACKARD
+
+ vendor.id PBN
+&device.id eisa 0x4234
++device.name BELL 1024S
++driver.display |50-90|30-50
+
+ vendor.id PBN
+&device.id eisa 0x4483
++device.name BELL PLUG & PLAY 4480
++driver.display |55-75|30-50
+
+ vendor.id PBN
+&device.id eisa 0x5234
++device.name BELL PLUG & PLAY 2024S
++driver.display |50-90|30-54
+
+ vendor.id PBN
+&device.id eisa 0x5483
++device.name BELL PLUG & PLAY 5480
++driver.display |50-90|30-69
+
+ vendor.id PBN
+&device.id eisa 0x7483
++device.name BELL PLUG & PLAY 7480
++driver.display |50-90|30-69
+
+ vendor.id PGS
++vendor.name PRINCETON
+
+ vendor.id PGS
+&device.id eisa 0x003b
++device.name GRAPHIC SYSTEMS EO15
++driver.display |50-120|30-70
+
+ vendor.id PGS
+&device.id eisa 0x003c
++device.name GRAPHIC SYSTEMS EO75
++driver.display |50-120|30-95
+
+ vendor.id PGS
+&device.id eisa 0x003d
++device.name GRAPHIC SYSTEMS EO17
++driver.display |50-120|30-70
+
+ vendor.id PGS
+&device.id eisa 0x004d
++device.name GRAPHIC SYSTEMS ULTRA 50
++driver.display |50-90|30-50
+
+ vendor.id PGS
+&device.id eisa 0x004e
++device.name GRAPHIC SYSTEMS EO40
++driver.display |50-90|30-50
+
+ vendor.id PGS
+&device.id eisa 0x004f
++device.name GRAPHIC SYSTEMS EO50
++driver.display |50-120|30-70
+
+ vendor.id PGS
+&device.id eisa 0x0050
++device.name GRAPHIC SYSTEMS EO70
++driver.display |50-120|30-70
+
+ vendor.id PGS
+&device.id eisa 0x0051
++device.name GRAPHIC SYSTEMS ULTRA 40
++driver.display |50-90|30-50
+
+ vendor.id PGS
+&device.id eisa 0x0052
++device.name GRAPHIC SYSTEMS EO72
++driver.display |50-120|30-70
+
+ vendor.id PGS
+&device.id eisa 0x008b
++device.name GRAPHIC SYSTEMS C2001
++driver.display |50-160|30-107
+
+ vendor.id PGS
+&device.id eisa 0x008e
++device.name GRAPHIC SYSTEMS EO500
++driver.display |50-120|30-70
+
+ vendor.id PGS
+&device.id eisa 0x008f
++device.name GRAPHIC SYSTEMS EO710
++driver.display |50-120|30-70
+
+ vendor.id PGS
+&device.id eisa 0x009d
++device.name GRAPHIC SYSTEMS EO400
++driver.display |50-90|30-54
+
+ vendor.id PGS
+&device.id eisa 0x00b6
++device.name GRAPHIC SYSTEMS EO700
++driver.display |50-120|30-70
+
+ vendor.id PGS
+&device.id eisa 0x00b7
++device.name GRAPHIC SYSTEMS EO720
++driver.display |50-120|30-70
+
+ vendor.id PHL
++vendor.name PHILIPS
+
+ vendor.id PHL
+&device.id eisa 0x0107
++device.name BRILLIANCE 107 (17 ZOLL/CM8800)
++driver.display |50-160|30-86
+
+ vendor.id PHL
+&device.id eisa 0x0200
++device.name CM0200 (15C)
++driver.display |50-100|31-48
+
+ vendor.id PHL
+&device.id eisa 0x0201
++device.name BRILLIANCE 201CS
++driver.display |50-170|30-107
+
+ vendor.id PHL
+&device.id eisa 0x0500
++device.name CM0500 (20C)
++driver.display |50-120|31-64
+
+ vendor.id PHL
+&device.id eisa 0x0700
++device.name CM0700 (20T)
++driver.display |50-160|30-90
+
+ vendor.id PHL
+&device.id eisa 0x0800
++device.name CM0800 (15B)
++driver.display |50-100|30-58
+
+ vendor.id PHL
+&device.id eisa 0x104b
++device.name 104B (14 ZOLL/CM1300)
++driver.display |50-110|30-54
+
+ vendor.id PHL
+&device.id eisa 0x105a
++device.name BRILLIANCE 105 (15 ZOLL/CM2200)
++driver.display |50-120|30-69
+
+ vendor.id PHL
+&device.id eisa 0x105c
++device.name 105S (15 ZOLL/CM1300)
++driver.display |50-110|30-54
+
+ vendor.id PHL
+&device.id eisa 0x107c
++device.name 107S (17 ZOLL/CM6800)
++driver.display |50-130|30-66
+
+ vendor.id PHL
+&device.id eisa 0x1107
++device.name BRILLIANCE 107 (PRODUCT ID 17A58...)
++driver.display |50-160|30-95
+
+ vendor.id PHL
+&device.id eisa 0x1109
++device.name BRILLIANCE 109 (PRODUCT ID 19A58...)
++driver.display |50-160|30-95
+
+ vendor.id PHL
+&device.id eisa 0x1200
++device.name CM1200 (15A)
++driver.display |50-110|31-66
+
+ vendor.id PHL
+&device.id eisa 0x1800
++device.name CM1800 (15A)
++driver.display |50-110|31-66
+
+ vendor.id PHL
+&device.id eisa 0x2000
++device.name CM0200 (14B)
++driver.display |50-100|31-48
+
+ vendor.id PHL
+&device.id eisa 0x200d
++device.name 200T (20 ZOLL/CM0700)
++driver.display |50-160|30-90
+
+ vendor.id PHL
+&device.id eisa 0x201a
++device.name BRILLIANCE 201 (21 ZOLL/CM1700)
+
+ vendor.id PHL
+&device.id eisa 0x201b
++device.name 201B (21 ZOLL/CM0770)
++driver.display |48-160|30-94
+
+ vendor.id PHL
+&device.id eisa 0x2600
++device.name 17TCM26
++driver.display |50-100|30-66
+
+ vendor.id PHL
+&device.id eisa 0x2800
++device.name 17BCM28
++driver.display |50-130|30-66
+
+ vendor.id PHL
+&device.id eisa 0x3109
++device.name MAGNAVOX 109S
++driver.display |50-160|30-95
+
+ vendor.id PHL
+&device.id eisa 0x3800
++device.name 17ACM38
++driver.display |50-160|30-82
+
+ vendor.id PHL
+&device.id eisa 0x4109
++device.name 109S
++driver.display |50-160|30-95
+
+ vendor.id PHL
+&device.id eisa 0x4500
++device.name BRILLIANCE AX4500 (14.5 LCD-MONITOR)
++driver.display |56-75|30-60
+
+ vendor.id PHL
+&device.id eisa 0x5600
++device.name CM5600 (20B)
++driver.display |50-120|31-82
+
+ vendor.id PHL
+&device.id eisa 0x5f1f
++device.name 29PX8031 MONITOR/TV
+
+ vendor.id PHL
+&device.id eisa 0x6800
++device.name 107B (17 ZOLL/CM6800)
++driver.display |50-130|30-69
+
+ vendor.id PHL
+&device.id eisa 0x700b
++device.name CM0700 (21B)
++driver.display |50-160|30-94
+
+ vendor.id PHL
+&device.id eisa 0x8000
++device.name CM0800 (14A)
++driver.display |50-100|30-58
+
+ vendor.id PHL
+&device.id eisa 0xa15b
++device.name 105B (15 ZOLL/CM1200)
++driver.display |50-110|30-66
+
+ vendor.id PHL
+&device.id eisa 0xa17b
++device.name MAGNAVOX MB7000 (17 ZOLL/CM6800)
++driver.display |50-130|30-66
+
+ vendor.id PHL
+&device.id eisa 0xa17c
++device.name 107S (17 ZOLL/CM1300)
++driver.display |50-120|30-69
+
+ vendor.id PHL
+&device.id eisa 0xa513
++device.name PD5029S MONITOR/TV
+
+ vendor.id PHL
+&device.id eisa 0xb14b
++device.name 104B (14-ZOLL/CM2300)
++driver.display |50-120|30-54
+
+ vendor.id PHL
+&device.id eisa 0xb15c
++device.name 105S (15 ZOLL/CM2300)
++driver.display |50-120|30-60
+
+ vendor.id PLB
++vendor.name PLB
+
+ vendor.id PLB
+&device.id eisa 0x1410
++device.name 1410 MODEL
++driver.display |50-120|30-54
+
+ vendor.id PLB
+&device.id eisa 0x1510
++device.name 1510 MODEL
++driver.display |50-120|30-69
+
+ vendor.id PLB
+&device.id eisa 0x1710
++device.name 1710
++driver.display |50-120|30-70
+
+ vendor.id PLB
+&device.id eisa 0x1910
++device.name 1910
++driver.display |50-150|30-95
+
+ vendor.id PTS
++vendor.name PROVIEW
+
+ vendor.id PTS
+&device.id eisa 0x023a
++device.name 570
++driver.display |50-150|30-70
+
+ vendor.id PTS
+&device.id eisa 0x0302
++device.name 770
++driver.display |50-150|30-76
+
+ vendor.id PTS
+&device.id eisa 0x035c
++device.name 860
++driver.display |50-150|30-54
+
+ vendor.id REL
++vendor.name RELISYS
+
+ vendor.id REL
+&device.id eisa 0x0451
++device.name RE451
++driver.display |50-100|30-54
+
+ vendor.id REL
+&device.id eisa 0x0518
++device.name RE518
++driver.display |50-100|30-69
+
+ vendor.id REL
+&device.id eisa 0x0550
++device.name RE550
++driver.display |50-100|30-50
+
+ vendor.id REL
+&device.id eisa 0x0551
++device.name RE551
++driver.display |50-100|30-54
+
+ vendor.id REL
+&device.id eisa 0x0767
++device.name RE767
++driver.display |50-100|30-69
+
+ vendor.id SAM
++vendor.name SAMSUNG
+
+ vendor.id SAM
+&device.id eisa 0x0000
++device.name SYNCMASTER 3NE
+
+ vendor.id SAM
+&device.id eisa 0x0100
++device.name SYNCMASTER 4S
+
+ vendor.id SAM
+&device.id eisa 0x0cf1
++device.name SYNCMASTER 1000S (CGP1607*)
++driver.display |50-160|30-96
+
+ vendor.id SAM
+&device.id eisa 0x0d65
++device.name SYNCMASTER 500(M)S PLUS (CKE5507*)
++driver.display |50-120|30-60
+
+ vendor.id SAM
+&device.id eisa 0x0d66
++device.name SYNCMASTER 500B PLUS (CKF5607*)
++driver.display |50-160|30-69
+
+ vendor.id SAM
+&device.id eisa 0x0d67
++device.name SYNCMASTER 700(M)S PLUS (CKG7507*)
++driver.display |50-160|30-69
+
+ vendor.id SAM
+&device.id eisa 0x1530
++device.name 15GLSI
++driver.display |50-100|24-66
+
+ vendor.id SAM
+&device.id eisa 0x1c53
++device.name SYNCMASTER 500B
++driver.display |50-160|30-69
+
+ vendor.id SAM
+&device.id eisa 0x1c54
++device.name SAMTRON 5(M)B (CGB5617*)
++driver.display |50-160|30-69
+
+ vendor.id SAM
+&device.id eisa 0x1c73
++device.name SYNCMASTER 500(M)P (CGC5607*)
++driver.display |50-160|30-69
+
+ vendor.id SAM
+&device.id eisa 0x1cb3
++device.name SYNCMASTER 700(M)S (CGE7507*)
++driver.display |50-160|30-69
+
+ vendor.id SAM
+&device.id eisa 0x1d73
++device.name SYNCMASTER 500(M)S (CGK5507*)
++driver.display |50-120|30-54
+
+ vendor.id SAM
+&device.id eisa 0x1d74
++device.name SAMTRON 5(M)E (CGK5517*)
++driver.display |50-120|30-54
+
+ vendor.id SAM
+&device.id eisa 0x1db3
++device.name SYNCMASTER 700(M)B (CGM7607*)
++driver.display |50-160|30-69
+
+ vendor.id SAM
+&device.id eisa 0x1f13
++device.name SYNCMASTER 1000P
++driver.display |50-160|30-107
+
+ vendor.id SAM
+&device.id eisa 0x1f14
++device.name SYNCMASTER 1000B (CGX1607*)
++driver.display |50-160|30-107
+
+ vendor.id SAM
+&device.id eisa 0x202e
++device.name SAMTRON 40BN
++driver.display |50-120|30-55
+
+ vendor.id SAM
+&device.id eisa 0x2033
++device.name SYNCMASTER 410B(CHA4217*)
++driver.display |50-120|30-55
+
+ vendor.id SAM
+&device.id eisa 0x2034
++device.name SAMTRON 40B
++driver.display |50-120|30-55
+
+ vendor.id SAM
+&device.id eisa 0x2035
++device.name SYNCMASTER 510(M)S (CHA5807*)
++driver.display |50-120|30-61
+
+ vendor.id SAM
+&device.id eisa 0x2036
++device.name SAMTRON 50(M)E
++driver.display |50-120|30-61
+
+ vendor.id SAM
+&device.id eisa 0x2041
++device.name SYNCMASTER 610(M)B(CHB6107*)
++driver.display |50-160|30-70
+
+ vendor.id SAM
+&device.id eisa 0x2042
++device.name SAMTRON 60(M)B
++driver.display |50-160|30-70
+
+ vendor.id SAM
+&device.id eisa 0x2055
++device.name SYNCMASTER 510B(CHB5707*)
++driver.display |50-160|30-70
+
+ vendor.id SAM
+&device.id eisa 0x2056
++device.name SAMTRON 50B
++driver.display |50-160|30-70
+
+ vendor.id SAM
+&device.id eisa 0x2057
++device.name SYNCMASTER 710(M)S (CHB7707*)
++driver.display |50-160|30-70
+
+ vendor.id SAM
+&device.id eisa 0x2058
++device.name SAMTRON 70(M)E
++driver.display |50-160|30-70
+
+ vendor.id SAM
+&device.id eisa 0x2059
++device.name SYNCMASTER 710(M)B (CHB7709*)
++driver.display |50-160|30-70
+
+ vendor.id SAM
+&device.id eisa 0x2c33
++device.name SAMTRON 4BI
++driver.display |50-120|30-55
+
+ vendor.id SAM
+&device.id eisa 0x2c34
++device.name SYNCMASTER 400B (CKA4217*)
++driver.display |50-120|30-55
+
+ vendor.id SAM
+&device.id eisa 0x2c35
++device.name SAMTRON 5EI
++driver.display |50-120|30-55
+
+ vendor.id SAM
+&device.id eisa 0x2c36
++device.name 5E (CKA52*)
++driver.display |50-120|30-55
+
+ vendor.id SAM
+&device.id eisa 0x2c55
++device.name SAMTRON 5BI
++driver.display |50-120|30-70
+
+ vendor.id SAM
+&device.id eisa 0x2c56
++device.name 5B (CKB52*)
++driver.display |50-120|30-70
+
+ vendor.id SAM
+&device.id eisa 0x2c57
++device.name SAMTRON 7EI
++driver.display |50-120|30-70
+
+ vendor.id SAM
+&device.id eisa 0x2c58
++device.name 7E (CKB72*)
++driver.display |50-120|30-70
+
+ vendor.id SAM
+&device.id eisa 0x2cf8
++device.name SYNCMASTER 700B PLUS
++driver.display |50-160|30-70
+
+ vendor.id SAM
+&device.id eisa 0x4610
++device.name SYNCMASTER 21GLS
++driver.display |50-160|30-85
+
+ vendor.id SAM
+&device.id eisa 0x4690
++device.name SYNCMASTER 20GLSI
++driver.display |50-120|30-82
+
+ vendor.id SAM
+&device.id eisa 0x49d5
++device.name SYNCMASTER 570 B TFT
++driver.display |50-75|30-61
+
+ vendor.id SAM
+&device.id eisa 0x4d50
++device.name SYNCMASTER 15GLE
+
+ vendor.id SAM
+&device.id eisa 0x4d51
++device.name SYNCMASTER 15GLI
++driver.display |50-120|30-65
+
+ vendor.id SAM
+&device.id eisa 0x4d52
++device.name SYNCMASTER 15M
++driver.display |50-120|30-65
+
+ vendor.id SAM
+&device.id eisa 0x4d70
++device.name SYNCMASTER 17GLI
++driver.display |50-120|30-65
+
+ vendor.id SAM
+&device.id eisa 0x4d71
++device.name SYNCMASTER 17GLSI
++driver.display |50-120|30-85
+
+ vendor.id SAM
+&device.id eisa 0x4d72
++device.name SYNCMASTER 6NE
++driver.display |50-100|30-65
+
+ vendor.id SAM
+&device.id eisa 0x4d73
++device.name 17GLI
++driver.display |50-120|24-65
+
+ vendor.id SAM
+&device.id eisa 0x4d74
++device.name 17GLSI
++driver.display |50-120|24-85
+
+ vendor.id SAM
+&device.id eisa 0x4db9
++device.name SYNCMASTER 900SL (CSM92*)
++driver.display |50-160|30-96
+
+ vendor.id SAM
+&device.id eisa 0x4ee6
++device.name SYNCMASTER 700P PLUS (CSH7839*)
++driver.display |50-160|30-96
+
+ vendor.id SAM
+&device.id eisa 0x4ee9
++device.name SYNCMASTER 700IFT (CSH780B*)
++driver.display |50-160|30-96
+
+ vendor.id SAM
+&device.id eisa 0x4f26
++device.name SYNCMASTER 900P (CSH9839*)
++driver.display |50-160|30-96
+
+ vendor.id SAM
+&device.id eisa 0x4f27
++device.name SAMTRON 9P
++driver.display |50-160|30-96
+
+ vendor.id SAM
+&device.id eisa 0x4f29
++device.name SYNCMASTER 900IFT
++driver.display |50-160|30-96
+
+ vendor.id SAM
+&device.id eisa 0x5450
++device.name SYNCMASTER 15ME
++driver.display |50-120|30-50
+
+ vendor.id SAM
+&device.id eisa 0x6053
++device.name SYNCMASTER 320TFT (LXB310*)
++driver.display |50-75|30-61
+
+ vendor.id SAM
+&device.id eisa 0x6054
++device.name SYNCMASTER 330/331TFT (LXB350*)
++driver.display |50-75|30-61
+
+ vendor.id SAM
+&device.id eisa 0x6055
++device.name SYNCMASTER 520TFT (LXB530*)
++driver.display |50-75|30-61
+
+ vendor.id SAM
+&device.id eisa 0x6056
++device.name SYNCMASTER 530/531TFT (LXB550*)
++driver.display |50-75|30-61
+
+ vendor.id SAM
+&device.id eisa 0x6d20
++device.name SYNCMASTER 15GLE
++driver.display |50-120|30-50
+
+ vendor.id SDI
++vendor.name SAMTRON
+
+ vendor.id SDI
+&device.id eisa 0x1428
++device.name 428PT/PTL
+
+ vendor.id SDI
+&device.id eisa 0x1528
++device.name SC-528TXL
++driver.display |50-100|30-48
+
+ vendor.id SDI
+&device.id eisa 0x1529
++device.name SC-528UXL
++driver.display |50-120|30-65
+
+ vendor.id SDI
+&device.id eisa 0x1530
++device.name SC-528MXLJ
++driver.display |50-100|24-66
+
+ vendor.id SDI
+&device.id eisa 0x4690
++device.name SC-208DXL+
++driver.display |50-120|30-82
+
+ vendor.id SDI
+&device.id eisa 0x4d70
++device.name SC-728FXL
++driver.display |50-120|30-65
+
+ vendor.id SDI
+&device.id eisa 0x4d71
++device.name SC-726GXL
++driver.display |50-120|30-85
+
+ vendor.id SDI
+&device.id eisa 0x4d73
++device.name SC-728FXLJ
++driver.display |50-120|24-65
+
+ vendor.id SDI
+&device.id eisa 0x5451
++device.name SC-528MDL
++driver.display |50-120|30-48
+
+ vendor.id SML
++vendor.name SMILE
+
+ vendor.id SML
+&device.id eisa 0x6425
++device.name CA6425DL/CB6425DL
++driver.display |50-100|30-54
+
+ vendor.id SML
+&device.id eisa 0x6525
++device.name CA6525DL/CB6525DL
++driver.display |50-100|30-54
+
+ vendor.id SML
+&device.id eisa 0x6546
++device.name CA6546SL/CB6546SL
++driver.display |50-120|30-69
+
+ vendor.id SML
+&device.id eisa 0x6719
++device.name CA6719SL/CB6719SL
++driver.display |50-150|30-95
+
+ vendor.id SML
+&device.id eisa 0x6738
++device.name 85KHZ-MONITOR
++driver.display |50-150|30-86
+
+ vendor.id SML
+&device.id eisa 0x6746
++device.name CA6746SL/CB6746SL
++driver.display |50-120|30-69
+
+ vendor.id SML
+&device.id eisa 0x6748
++device.name CA6748SL/CB6748SL
++driver.display |50-150|30-86
+
+ vendor.id SML
+&device.id eisa 0x6919
++device.name CA6919SL/CB6919SL
++driver.display |50-150|30-95
+
+ vendor.id SNI
++vendor.name Siemens Nixdorf
+
+ vendor.id SNY
++vendor.name SONY
+
+ vendor.id SNY
+&device.id eisa 0x0030
++device.name CPD-L133
++driver.display |50-65|30-70
+
+ vendor.id SNY
+&device.id eisa 0x0071
++device.name CPD-220GS
++driver.display |48-120|30-85
+
+ vendor.id SNY
+&device.id eisa 0x0090
++device.name GDM-400PS/400PST/19PS
++driver.display |48-160|30-95
+
+ vendor.id SNY
+&device.id eisa 0x0091
++device.name CPD-420GS
++driver.display |48-120|30-96
+
+ vendor.id SNY
+&device.id eisa 0x00b0
++device.name GDM-500PS
++driver.display |48-160|30-107
+
+ vendor.id SNY
+&device.id eisa 0x00e0
++device.name GDM-W900
++driver.display |50-160|30-96
+
+ vendor.id SNY
+&device.id eisa 0x0150
++device.name CPD-100SF
++driver.display |50-120|30-70
+
+ vendor.id SNY
+&device.id eisa 0x0170
++device.name GDM-17SE2T
++driver.display |48-150|30-85
+
+ vendor.id SNY
+&device.id eisa 0x017b
++device.name CPD-2003GT
++driver.display |50-120|30-85
+
+ vendor.id SNY
+&device.id eisa 0x0270
++device.name CPD-200SF
++driver.display |50-120|30-80
+
+ vendor.id SNY
+&device.id eisa 0x02b0
++device.name CPD-520GS/520GST/21GS2
++driver.display |48-160|30-96
+
+ vendor.id SNY
+&device.id eisa 0x0370
++device.name CPD-200SFT
++driver.display |50-120|30-80
+
+ vendor.id SNY
+&device.id eisa 0x03a0
++device.name CPD-300SFT
++driver.display |48-150|30-86
+
+ vendor.id SNY
+&device.id eisa 0x0450
++device.name CPD-100ES
++driver.display |50-120|30-70
+
+ vendor.id SNY
+&device.id eisa 0x0470
++device.name CPD-17SF9
++driver.display |50-120|24-80
+
+ vendor.id SNY
+&device.id eisa 0x0550
++device.name CPD-100GS
++driver.display |50-120|30-70
+
+ vendor.id SNY
+&device.id eisa 0x0570
++device.name CPD-200SX
++driver.display |50-150|30-70
+
+ vendor.id SNY
+&device.id eisa 0x0650
++device.name CPD-120VS
++driver.display |50-120|30-70
+
+ vendor.id SNY
+&device.id eisa 0x0670
++device.name CPD-220VS
++driver.display |50-120|30-70
+
+ vendor.id SNY
+&device.id eisa 0x0770
++device.name CPD-200ES
++driver.display |50-120|30-70
+
+ vendor.id SNY
+&device.id eisa 0x0950
++device.name CPD-L150
++driver.display |50-65|30-70
+
+ vendor.id SNY
+&device.id eisa 0x0a50
++device.name CPD-101VS IGPE
++driver.display |50-120|30-70
+
+ vendor.id SNY
+&device.id eisa 0x0a70
++device.name CPD-200GS
++driver.display |50-120|30-85
+
+ vendor.id SNY
+&device.id eisa 0x0c70
++device.name GDM-200PS
++driver.display |48-160|30-92
+
+ vendor.id SNY
+&device.id eisa 0x8050
++device.name CPD-100SX
++driver.display |50-120|30-65
+
+ vendor.id STC
++vendor.name ALPHASCAN
+
+ vendor.id STC
+&device.id eisa 0x02c7
++device.name 711
++driver.display |50-120|30-70
+
+ vendor.id STC
+&device.id eisa 0x02c8
++device.name 712
++driver.display |50-120|30-70
+
+ vendor.id STC
+&device.id eisa 0x032b
++device.name 811
++driver.display |50-150|30-95
+
+ vendor.id STC
+&device.id eisa 0x0800
++device.name 800S
++driver.display |50-150|30-95
+
+ vendor.id SUN
++vendor.name Sun
+
+ vendor.id SUN
+&device.id eisa 0x0567
++device.name 21" Premium Color Monitor
+
+ vendor.id TAT
++vendor.name TATUNG
+
+ vendor.id TAT
+&device.id eisa 0x1f65
++device.name TM651X SERIE
++driver.display |50-90|31-65
+
+ vendor.id TAT
+&device.id eisa 0x1f67
++device.name TM671X SERIE
++driver.display |50-110|31-65
+
+ vendor.id TAT
+&device.id eisa 0x2f44
++device.name TM442X SERIE
++driver.display |50-100|30-50
+
+ vendor.id TAT
+&device.id eisa 0x2f45
++device.name TM452X SERIE
++driver.display |50-100|30-50
+
+ vendor.id TAT
+&device.id eisa 0x3044
++device.name C5D
++driver.display |50-100|30-54
+
+ vendor.id TAT
+&device.id eisa 0x3054
++device.name PC DIVISION V70 (XJ63754)
++driver.display |50-100|30-70
+
+ vendor.id TAT
+&device.id eisa 0x434d
++device.name CM-17MC
+
+ vendor.id TAT
+&device.id eisa 0x4855
++device.name CM-14UH
+
+ vendor.id TAX
++vendor.name ERGOVISION
+
+ vendor.id TAX
+&device.id eisa 0xe430
++device.name 430LR
++driver.display |50-110|30-54
+
+ vendor.id TAX
+&device.id eisa 0xe550
++device.name 550TCO95/TCO95-S
++driver.display |55-110|30-69
+
+ vendor.id TAX
+&device.id eisa 0xe730
++device.name 730TCO95/TCO95-S
++driver.display |50-120|30-69
+
+ vendor.id TAX
+&device.id eisa 0xe740
++device.name 740TCO95/TCO95-S
++driver.display |55-120|30-85
+
+ vendor.id TAX
+&device.id eisa 0xe750
++device.name 750TCO95
++driver.display |50-130|30-86
+
+ vendor.id TAX
+&device.id eisa 0xe760
++device.name 760TCO95/TCO95-S
++driver.display |50-120|30-70
+
+ vendor.id TAX
+&device.id eisa 0xe975
++device.name 975TCO95
++driver.display |50-150|30-95
+
+ vendor.id TOS
++vendor.name TOSHIBA
+
+ vendor.id TOS
+&device.id eisa 0x5000
++device.name CRT17002
++driver.display |50-130|30-66
+
+ vendor.id TOS
+&device.id eisa 0x5001
++device.name CRT15003
++driver.display |50-110|30-66
+
+ vendor.id TOS
+&device.id eisa 0x5002
++device.name CRT21002
++driver.display |50-152|30-95
+
+ vendor.id TRL
++vendor.name TRL/RIC
+
+ vendor.id TRL
+&device.id eisa 0x0010
++device.name RH-1450
++driver.display |47-90|29-50
+
+ vendor.id TRL
+&device.id eisa 0x0110
++device.name DL-1564M/DL-1564
++driver.display |47-120|29-64
+
+ vendor.id TRL
+&device.id eisa 0x0310
++device.name DL-1750MU
++driver.display |47-120|29-70
+
+ vendor.id TRL
+&device.id eisa 0x0410
++device.name DH-1570M/DH-1570
++driver.display |47-120|29-70
+
+ vendor.id TRL
+&device.id eisa 0x0510
++device.name DH-1764M/DH-1764
++driver.display |47-120|29-70
+
+ vendor.id TRL
+&device.id eisa 0x0610
++device.name DH-1764UM/DH-1764U
++driver.display |47-120|29-85
+
+ vendor.id TRL
+&device.id eisa 0x061c
++device.name DL-1564
++driver.display |47-100|29-64
+
+ vendor.id TRL
+&device.id eisa 0x0622
++device.name DH-1570
++driver.display |47-120|29-64
+
+ vendor.id TSB
++vendor.name TOSHIBA
+
+ vendor.id TSB
+&device.id eisa 0x5002
++device.name EQUIUM 15-ZOLL MONITOR
++driver.display |50-100|30-66
+
+ vendor.id TSB
+&device.id eisa 0x5003
++device.name EQUIUM 17-ZOLL MONITOR
++driver.display |50-160|30-82
+
+ vendor.id TSB
+&device.id eisa 0x5004
++device.name DR569M (PV2001U)
++driver.display |50-110|30-69
+
+ vendor.id TSB
+&device.id eisa 0x5005
++device.name DR769MF (PV2002U)
++driver.display |50-110|30-69
+
+ vendor.id TVM
++vendor.name TVM
+
+ vendor.id TVM
+&device.id eisa 0x0487
++device.name AS4DP/LR4DP-MODELL
++driver.display |50-120|30-55
+
+ vendor.id TVM
+&device.id eisa 0x0588
++device.name AS5S-MODELL
++driver.display |50-120|30-69
+
+ vendor.id TVM
+&device.id eisa 0x0589
++device.name TCO5S-MODELL
++driver.display |50-120|30-69
+
+ vendor.id TVM
+&device.id eisa 0x0688
++device.name TCO6S-MODELL
++driver.display |50-120|30-69
+
+ vendor.id UNM
++vendor.name UNISYS
+
+ vendor.id UNM
+&device.id eisa 0x1002
++device.name EVG1000-E2
++driver.display |50-65|30-50
+
+ vendor.id UNM
+&device.id eisa 0x2001
++device.name EVG2000-E
++driver.display |50-130|30-54
+
+ vendor.id UNM
+&device.id eisa 0x2002
++device.name EVG2000-P
++driver.display |50-150|30-70
+
+ vendor.id UNM
+&device.id eisa 0x2014
++device.name EVG-142-COL
++driver.display |50-120|30-48
+
+ vendor.id UNM
+&device.id eisa 0x2015
++device.name EVG-152-COL
++driver.display |50-130|30-48
+
+ vendor.id UNM
+&device.id eisa 0x2101
++device.name EVG2100-E
++driver.display |50-130|30-54
+
+ vendor.id UNM
+&device.id eisa 0x2102
++device.name EVG2100-P
++driver.display |50-150|30-70
+
+ vendor.id UNM
+&device.id eisa 0x3001
++device.name EVG3000-E
++driver.display |50-160|30-69
+
+ vendor.id UNM
+&device.id eisa 0x3002
++device.name EVG3000-P
++driver.display |50-160|30-95
+
+ vendor.id UNM
+&device.id eisa 0x3015
++device.name EVG-153-COL
++driver.display |50-120|30-65
+
+ vendor.id UNM
+&device.id eisa 0x3101
++device.name EVG3100-E
++driver.display |50-75|30-65
+
+ vendor.id UNM
+&device.id eisa 0x3102
++device.name EVG3100-P
++driver.display |50-160|30-95
+
+ vendor.id UNM
+&device.id eisa 0x4002
++device.name EVG4000-P
++driver.display |50-160|30-95
+
+ vendor.id UNM
+&device.id eisa 0x4017
++device.name EVG-174-COL
++driver.display |50-120|30-85
+
+ vendor.id UNM
+&device.id eisa 0x5002
++device.name EVG5000-P
++driver.display |50-160|30-95
+
+ vendor.id UNM
+&device.id eisa 0x5021
++device.name EVG-215-COL
++driver.display |50-160|30-95
+
+ vendor.id VSC
++vendor.name VIEWSONIC
+
+ vendor.id VSC
+&device.id eisa 0x0c00
++device.name 17GS
++driver.display |50-160|30-69
+
+ vendor.id VSC
+&device.id eisa 0x0c0f
++device.name 17PS
++driver.display |50-160|30-82
+
+ vendor.id VSC
+&device.id eisa 0x0c1f
++device.name 17GA
++driver.display |50-160|30-69
+
+ vendor.id VSC
+&device.id eisa 0x1600
++device.name 21PS
++driver.display |50-160|30-82
+
+ vendor.id VSC
+&device.id eisa 0x2600
++device.name ViewSonic 15GS-2
+
+ vendor.id VSC
+&device.id eisa 0x2601
++device.name ViewSonic 15GS
+
+ vendor.id VSC
+&device.id eisa 0x3141
++device.name 14ES
++driver.display |50-75|31-51
+
+ vendor.id VSC
+&device.id eisa 0x3142+0x0002
++device.name ViewSonic 14ES
+
+ vendor.id VSC
+&device.id eisa 0x3145
++device.name 15GS-3
++driver.display |50-120|30-69
+
+ vendor.id VSC
+&device.id eisa 0x3252+0x0002
++device.name ViewSonic 21PS-2
+
+ vendor.id VSC
+&device.id eisa 0x3254
++device.name PJ800
+
+ vendor.id VSC
+&device.id eisa 0x334b+0x0002
++device.name ViewSonic 17GS-2
+
+ vendor.id VSC
+&device.id eisa 0x3351
++device.name PT810
++driver.display |50-130|30-86
+
+ vendor.id VSC
+&device.id eisa 0x3441
++device.name E641
++driver.display |50-100|30-54
+
+ vendor.id VSC
+&device.id eisa 0x344b+0x0002
++device.name ViewSonic 17PS-2
+
+ vendor.id VSC
+&device.id eisa 0x3451
++device.name PT810-2
++driver.display |50-130|30-95
+
+ vendor.id VSC
+&device.id eisa 0x3454
++device.name PJ1000
++driver.display |50-85|31-64
+
+ vendor.id VSC
+&device.id eisa 0x354d
++device.name GT800
++driver.display |50-150|30-85
+
+ vendor.id VSC
+&device.id eisa 0x354e
++device.name ViewSonic GT800
+
+ vendor.id VSC
+&device.id eisa 0x3550
++device.name ViewSonic GT800
+
+ vendor.id VSC
+&device.id eisa 0x3551
++device.name P810
++driver.display |50-160|30-95
+
+ vendor.id VSC
+&device.id eisa 0x3552
++device.name P810-E
++driver.display |50-160|30-95
+
+ vendor.id VSC
+&device.id eisa 0x3554
++device.name PJL802
++driver.display |50-85|31-61
+
+ vendor.id VSC
+&device.id eisa 0x3641
++device.name E641-2
++driver.display |50-100|30-54
+
+ vendor.id VSC
+&device.id eisa 0x3644
++device.name 15GA
++driver.display |50-160|30-69
+
+ vendor.id VSC
+&device.id eisa 0x3645
++device.name G653
++driver.display |50-120|30-70
+
+ vendor.id VSC
+&device.id eisa 0x3646
++device.name ViewSonic 15GA
+
+ vendor.id VSC
+&device.id eisa 0x3648
++device.name ViewSonic 15GA
+
+ vendor.id VSC
+&device.id eisa 0x364a
++device.name PT770
++driver.display |50-130|30-82
+
+ vendor.id VSC
+&device.id eisa 0x364b+0x0002
++device.name ViewSonic PT770
+
+ vendor.id VSC
+&device.id eisa 0x3651
++device.name P815
++driver.display |50-160|30-115
+
+ vendor.id VSC
+&device.id eisa 0x3744
++device.name 15G-2
++driver.display |50-100|30-66
+
+ vendor.id VSC
+&device.id eisa 0x3745
++device.name E655-2
++driver.display |50-100|30-70
+
+ vendor.id VSC
+&device.id eisa 0x3746
++device.name ViewSonic 15G-2
+
+ vendor.id VSC
+&device.id eisa 0x3748
++device.name ViewSonic 15G-2
+
+ vendor.id VSC
+&device.id eisa 0x374b+0x0002
++device.name ViewSonic 17GA
+
+ vendor.id VSC
+&device.id eisa 0x374d
++device.name G800
++driver.display |50-120|30-86
+
+ vendor.id VSC
+&device.id eisa 0x3751
++device.name G810
++driver.display |50-160|30-89
+
+ vendor.id VSC
+&device.id eisa 0x3844
++device.name 15ES-2
++driver.display |50-100|31-62
+
+ vendor.id VSC
+&device.id eisa 0x3845
++device.name VP150
++driver.display |50-77|30-61
+
+ vendor.id VSC
+&device.id eisa 0x3846
++device.name ViewSonic 15ES-2
+
+ vendor.id VSC
+&device.id eisa 0x3848
++device.name ViewSonic 15ES-2
+
+ vendor.id VSC
+&device.id eisa 0x384a
++device.name 17EA
++driver.display |50-120|30-65
+
+ vendor.id VSC
+&device.id eisa 0x384b+0x0002
++device.name ViewSonic 17EA
+
+ vendor.id VSC
+&device.id eisa 0x384d
++device.name G790
++driver.display |50-180|30-95
+
+ vendor.id VSC
+&device.id eisa 0x3851
++device.name PT810-3
++driver.display |50-160|30-96
+
+ vendor.id VSC
+&device.id eisa 0x3854
++device.name PJ820
++driver.display |50-85|30-69
+
+ vendor.id VSC
+&device.id eisa 0x3944
++device.name ViewSonic 15GS-2
+
+ vendor.id VSC
+&device.id eisa 0x3946
++device.name ViewSonic 15GS-2
+
+ vendor.id VSC
+&device.id eisa 0x3948
++device.name ViewSonic 15GS-2
+
+ vendor.id VSC
+&device.id eisa 0x394a
++device.name 17GS-2
++driver.display |50-160|30-69
+
+ vendor.id VSC
+&device.id eisa 0x394b+0x0002
++device.name ViewSonic 17GS-2
+
+ vendor.id VSC
+&device.id eisa 0x4145
++device.name GA655
++driver.display |50-180|30-70
+
+ vendor.id VSC
+&device.id eisa 0x4151
++device.name PT813
++driver.display |50-160|30-107
+
+ vendor.id VSC
+&device.id eisa 0x4244
++device.name EA771B
++driver.display |50-120|30-70
+
+ vendor.id VSC
+&device.id eisa 0x4245
++device.name P655
++driver.display |50-180|30-70
+
+ vendor.id VSC
+&device.id eisa 0x424a
++device.name GT770
++driver.display |50-120|30-65
+
+ vendor.id VSC
+&device.id eisa 0x424b+0x0002
++device.name ViewSonic GT770
+
+ vendor.id VSC
+&device.id eisa 0x434a
++device.name 17PS-2
++driver.display |50-160|30-86
+
+ vendor.id VSC
+&device.id eisa 0x434b+0x0002
++device.name ViewSonic 17PS-2
+
+ vendor.id VSC
+&device.id eisa 0x434d
++device.name PS790
++driver.display |50-180|30-95
+
+ vendor.id VSC
+&device.id eisa 0x4439
++device.name ViewSonic 15GS-2
+
+ vendor.id VSC
+&device.id eisa 0x444a
++device.name 17GA-2
++driver.display |50-160|30-69
+
+ vendor.id VSC
+&device.id eisa 0x4637
++device.name ViewSonic 1769DC
+
+ vendor.id VSC
+&device.id eisa 0x474a
++device.name PT775
++driver.display |50-160|30-96
+
+ vendor.id VSC
+&device.id eisa 0x4851
++device.name P810-3
++driver.display |50-180|30-95
+
+ vendor.id VSC
+&device.id eisa 0x4951
++device.name G810-2
++driver.display |50-180|30-92
+
+ vendor.id VSC
+&device.id eisa 0x4b4a
++device.name GT775
++driver.display |50-160|30-86
+
+ vendor.id VSC
+&device.id eisa 0x4c4a
++device.name G771
++driver.display |50-180|30-70
+
+ vendor.id VSC
+&device.id eisa 0x4d4a
++device.name EA771
++driver.display |50-120|30-70
+
+ vendor.id VSC
+&device.id eisa 0x504a
++device.name P775
++driver.display |50-180|30-95
+
+ vendor.id VSC
+&device.id eisa 0x514a
++device.name GA771
++driver.display |50-180|30-70
+
+ vendor.id VSC
+&device.id eisa 0x524a
++device.name G773
++driver.display |50-160|30-70
+
+ vendor.id VSC
+&device.id eisa 0x564a
++device.name E771
++driver.display |50-120|30-70
+
+ vendor.id VSC
+&device.id eisa 0x594a
++device.name GS771
++driver.display |50-180|30-70
+
+ vendor.id VSC
+&device.id eisa 0x5a4a
++device.name PT771
++driver.display |50-160|30-92
+
--- /dev/null
+# mice
+
+
+# KYE: protocol info not verified
+ vendor.id KYE
+&device.id eisa 0x0001
+|vendor.id LGI
+&device.id eisa 0x8001
++driver.mouse microsoft|ms|3|0
+
+ vendor.id LGI
+&device.id eisa 0x800b+0x0002
++driver.mouse mouseman|mman|3|0
+
+ vendor.id PNP
+&device.id eisa 0x0f04
+|vendor.id PNP
+&device.id eisa 0x0f05
++driver.mouse mousesystems|msc|3|0
+
+ vendor.id PNP
+&device.id eisa 0x0f01
+|vendor.id PNP
+&device.id eisa 0x0f02
+|vendor.id PNP
+&device.id eisa 0x0f0a
+|vendor.id PNP
+&device.id eisa 0x0f0b
+|vendor.id PNP
+&device.id eisa 0x0f0c
+|vendor.id PNP
+&device.id eisa 0x0f0d
+|vendor.id special 0x0200
+&device.id special 0x0003
++driver.mouse microsoft|ms
+
+ vendor.id PNP
+&device.id eisa 0x0f0e
++driver.mouse ps/2|ps2||0
+
+ vendor.id special 0x0200
+&device.id special 0x0002
++driver.mouse explorerps/2|exps2||0
+
+# genius usb netmouse pro
+ vendor.id usb 0x0458
+&device.id usb 0x0002
++driver.mouse explorerps/2|exps2|4|0
+
+# MS IntelliMouse Explorer
+ vendor.id usb 0x045e
+&device.id usb 0x001e
+# Logitech Wheelmouse Model M-BB48
+|vendor.id usb 0x046d
+&device.id usb 0xc001
+# Optical(?) Logitech Wheel Mouse
+|vendor.id usb 0x046d
+&device.id usb 0xc00c
+# Optical Logitech Wheel Mouse (#16003)
+|vendor.id usb 0x046d
+&device.id usb 0xc00e
+# Optical Logitech Wheel Mouse (#22797)
+|vendor.id usb 0x046d
+&device.id usb 0xc030
+# some mouse (#29468)
+|vendor.id usb 0x046d
+&device.id usb 0xc404
+# some mouse (#29719)
+|vendor.id usb 0x0461
+&device.id usb 0x4d03
++driver.mouse explorerps/2|exps2|3|1
+
+# MouseMan Dual Optical (#18296)
+# http://www.logitech.com/index.cfm?page=products/details&CRID=3&CONTENTID=4984&countryid=7&languageid=4
+ vendor.id usb 0x046d
+&device.id usb 0xc012
++driver.mouse explorerps/2|exps2|4|1
+
+ vendor.id usb 0x05fe
+&device.id usb 0x0005
++driver.mouse explorerps/2|exps2|3|1
+
+# apple/logitech usb mouse
+ vendor.id usb 0x05ac
+&device.id usb 0x0301
++driver.mouse explorerps/2|exps2|1|0
+
+# Razer Boomslang USB Mouse
+ vendor.id usb 0x05e3
+&device.id usb 0x000b
++driver.mouse explorerps/2|exps2|5|1
+
+# ADB mice
+ vendor.id special 0x0100
+&device.id special 0x0300+0x0100
++driver.mouse explorerps/2|exps2|1|0
+
+# general USB mice
+ vendor.id special 0x0200
+&device.id special 0x0001
++driver.mouse explorerps/2|exps2
+
+ vendor.id special 0x0200
+&device.id special 0x0004
++driver.mouse explorerps/2|exps2|3|1
+
+ vendor.id special 0x0200
+&device.id special 0x0005
++driver.mouse explorerps/2|exps2|5|1
+
+ vendor.id special 0x0200
+&device.id special 0x0006
++driver.mouse ps/2|ps2|2|0
+
+ vendor.id special 0x0200
+&device.id special 0x0007
++driver.mouse ps/2|ps2|3|0
+
+# Sun Mouse (/dev/sunmouse)
+ vendor.id special 0x0202
+&device.id special 0x0000
++driver.mouse mousesystems|sun|3|0
+
+# very special (mouse devices)
+ vendor.id special 0x0210
+&device.id special 0x0000+0x0100
++driver.mouse explorerps/2|exps2
+
+# A4Tech 4D++ super whatever mouse (#24137)
+ vendor.name A4W
++vendor.name A4Tech
+
+ device.id eisa 0x0005
+&vendor.name A4Tech
++device.name Serial Wheel Mouse
++driver.mouse intellimouse|ms3|3|2
+
--- /dev/null
+# network adapter
+
+
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+# pci/isapnp/sbus adapter
+
+# modinfo
+ vendor.id pci 0x14e4
+&device.id pci 0x4401+2
+|vendor.id pci 0x14e4
+&device.id pci 0x170c
++driver.module.modprobe b44
+
+# pcimap
+ vendor.id pci 0x10de
+&device.id pci 0x0066
+|vendor.id pci 0x10de
+&device.id pci 0x00d6
+|vendor.id pci 0x10de
+&device.id pci 0x01c3
++driver.module.modprobe forcedeth
+
+# net/r8169.c
+ vendor.id pci 0x10ec
+&device.id pci 0x8169
++driver.module.modprobe r8169
+
+# net/tokenring/tmspci.c
+ vendor.id pci 0x0e11
+&device.id pci 0x0508
+|vendor.id pci 0x10b7
+&device.id pci 0x3390
+|vendor.id pci 0x10da
+&device.id pci 0x0508
+|vendor.id pci 0x1148
+&device.id pci 0x4200
++driver.module.modprobe tmspci
+
+# net/tlan.c
+ vendor.id pci 0x0e11
+&device.id pci 0xae32
+|vendor.id pci 0x0e11
+&device.id pci 0xae34+0x0002
+|vendor.id pci 0x0e11
+&device.id pci 0xae40
+|vendor.id pci 0x0e11
+&device.id pci 0xae43
+|vendor.id pci 0x0e11
+&device.id pci 0xb011+0x0002
+|vendor.id pci 0x0e11
+&device.id pci 0xb030
+|vendor.id pci 0x0e11
+&device.id pci 0xf130
+|vendor.id pci 0x0e11
+&device.id pci 0xf150
+|vendor.id pci 0x108d
+&device.id pci 0x0012+0x0003
++driver.module.modprobe tlan
+
+# net/yellowfin.c
+ vendor.id pci 0x1000
+&device.id pci 0x0701+0x0002
++driver.module.modprobe yellowfin
+
+# net/natsemi.c
+ vendor.id pci 0x100b
+&device.id pci 0x0020
++driver.module.modprobe natsemi
+
+# net/ns83820.c
+ vendor.id pci 0x100b
+&device.id pci 0x0022
++driver.module.modprobe ns83820
+
+# for an overview of de4x5 vs. tulip see bugs:
+# #7317, #11093, #15303, #16036, #17303, #39127
+
+# net/de4x5.c
+# net/tulip.c
+ vendor.id pci 0x1011
+&device.id pci 0x0014
+|vendor.id pci 0x1011
+&device.id pci 0x0019
+&subvendor.id pci 0x1113
+&subdevice.id pci 0x1207
+|vendor.id pci 0x1011
+&device.id pci 0x0019
+&subvendor.id pci 0x146c
+&subdevice.id pci 0x1430
++driver.module.modprobe de4x5
++driver.module.modprobe tulip
+
+ vendor.id pci 0x1011
+&device.id pci 0x0002
+|vendor.id pci 0x1011
+&device.id pci 0x0009
+|vendor.id pci 0x1011
+&device.id pci 0x0019
++driver.module.modprobe tulip
++driver.module.modprobe de4x5
+
+#pcimap
+ vendor.id pci 0x1011
+&device.id pci 0x0002
+|vendor.id pci 0x1011
+&device.id pci 0x0009
+|vendor.id pci 0x1011
+&device.id pci 0x0014
+|vendor.id pci 0x1011
+&device.id pci 0x0019
+|vendor.id pci 0x104a
+&device.id pci 0x0981
+|vendor.id pci 0x104a
+&device.id pci 0x2774
+|vendor.id pci 0x10d9
+&device.id pci 0x0512
+|vendor.id pci 0x10d9
+&device.id pci 0x0531
+|vendor.id pci 0x1113
+&device.id pci 0x1216+0x0002
+|vendor.id pci 0x1113
+&device.id pci 0x9511
+|vendor.id pci 0x1186
+&device.id pci 0x1561
+|vendor.id pci 0x11ad
+&device.id pci 0x0002
+|vendor.id pci 0x11ad
+&device.id pci 0xc115
+|vendor.id pci 0x11f6
+&device.id pci 0x9881
+|vendor.id pci 0x1259
+&device.id pci 0xa120
+|vendor.id pci 0x125b
+&device.id pci 0x1400
+|vendor.id pci 0x1317
+&device.id pci 0x0981
+|vendor.id pci 0x1317
+&device.id pci 0x0985
+|vendor.id pci 0x1317
+&device.id pci 0x1985
+|vendor.id pci 0x1317
+&device.id pci 0x9511
+|vendor.id pci 0x13d1
+&device.id pci 0xab02+0x0002
+|vendor.id pci 0x13d1
+&device.id pci 0xab08
+|vendor.id pci 0x14f1
+&device.id pci 0x1803
+|vendor.id pci 0x1626
+&device.id pci 0x8410
+|vendor.id pci 0x1737
+&device.id pci 0xab09
+|vendor.id pci 0x17b3
+&device.id pci 0xab08
+|vendor.id pci 0x8086
+&device.id pci 0x0039
++driver.module.modprobe tulip
+
+# pcimap
+ vendor.id pci 0x10b9
+&device.id pci 0x5261
+|vendor.id pci 0x1282
+&device.id pci 0x9009
+|vendor.id pci 0x1282
+&device.id pci 0x9132
++driver.module.modprobe dmfe
+
+# see #19271
+ vendor.id pci 0x1282
+&device.id pci 0x9102
++driver.module.modprobe dmfe
++driver.module.modprobe tulip
+
+ vendor.id pci 0x1282
+&device.id pci 0x9100
++driver.module.modprobe tulip
++driver.module.modprobe dmfe
+
+# net/wan/lmc/lmc_main.c
+ vendor.id pci 0x1011
+&device.id pci 0x0009
+&subvendor.id pci 0x1379
++driver.module.modprobe lmc
+
+# net/defxx.c
+ vendor.id pci 0x1011
+&device.id pci 0x000f
++driver.module.modprobe defxx
+
+# pcimap
+ vendor.id pci 0x1011
+&device.id pci 0x001a
+|vendor.id pci 0x10a9
+&device.id pci 0x0009
+|vendor.id pci 0x10b7
+&device.id pci 0x0001
+|vendor.id pci 0x12ae
+&device.id pci 0x0001+0x0002
+|vendor.id pci 0x12ae
+&device.id pci 0x00fa
+|vendor.id pci 0x1385
+&device.id pci 0x620a
+|vendor.id pci 0x1385
+&device.id pci 0x630a
++driver.module.modprobe acenic
+
+# net/tokenring/lanstreamer.c
+ vendor.id pci 0x1014
+&device.id pci 0x0018
++driver.module.modprobe lanstreamer
+
+# net/olympic.c
+ vendor.id pci 0x1014
+&device.id pci 0x003e
++driver.module.modprobe olympic
+
+# net/hp100.c
+ vendor.id pci 0x101a
+&device.id pci 0x0005
+|vendor.id pci 0x103c
+&device.id pci 0x1030+0x0002
+|vendor.id pci 0x11f6
+&device.id pci 0x0112
++driver.module.modprobe hp100
+
+# net/pcnet32.c
+ vendor.id pci 0x1022
+&device.id pci 0x2000+0x0002
++driver.module.modprobe pcnet32
+
+# net/amd8111e.c
+ vendor.id pci 0x1022
+&device.id pci 0x7462
++driver.module.modprobe amd8111e
+
+# net/sis900.c
+ vendor.id pci 0x1039
+&device.id pci 0x0900
+|vendor.id pci 0x1039
+&device.id pci 0x7016
++driver.module.modprobe sis900
+
+# net/winbond-840.c
+ vendor.id pci 0x1050
+&device.id pci 0x0840
+|vendor.id pci 0x11f6
+&device.id pci 0x2011
++driver.module.modprobe winbond-840
+
+# net/ne2k-pci.c
+ vendor.id pci 0x1050
+&device.id pci 0x0940
+|vendor.id pci 0x1050
+&device.id pci 0x5a5a
+|vendor.id pci 0x10bd
+&device.id pci 0x0e34
+|vendor.id pci 0x10ec
+&device.id pci 0x8029
+|vendor.id pci 0x1106
+&device.id pci 0x0926
+|vendor.id pci 0x11f6
+&device.id pci 0x1401
+|vendor.id pci 0x12c3
+&device.id pci 0x0058
+|vendor.id pci 0x12c3
+&device.id pci 0x5598
+|vendor.id pci 0x4a14
+&device.id pci 0x5000
+|vendor.id pci 0x8e2e
+&device.id pci 0x3000
++driver.module.modprobe ne2k-pci
+
+# net/sungem.c (pci)
+# (used to be gmac)
+ vendor.id pci 0x106b
+&device.id pci 0x0021
+|vendor.id pci 0x106b
+&device.id pci 0x0024
+|vendor.id pci 0x108e
+&device.id pci 0x1101
+|vendor.id pci 0x108e
+&device.id pci 0x2bad
++driver.module.modprobe sungem
+
+# net/fc/iph5526.c
+ vendor.id pci 0x107e
+&device.id pci 0x0004+0x0002
++driver.module.modprobe iph5526
+
+# net/sunhme.c (pci, sbus)
+ vendor.id pci 0x108e
+&device.id pci 0x1001
+|vendor.id special 0x4001
+&device.id special 0x3001
++driver.module.modprobe sunhme
+
+# net/tokenring/abyss.c
+ vendor.id pci 0x10b6
+&device.id pci 0x0002
++driver.module.modprobe abyss
+
+# pcimap
+ vendor.id pci 0x10b7
+&device.id pci 0x4500
+|vendor.id pci 0x10b7
+&device.id pci 0x5055
+|vendor.id pci 0x10b7
+&device.id pci 0x5057
+|vendor.id pci 0x10b7
+&device.id pci 0x5157
+|vendor.id pci 0x10b7
+&device.id pci 0x5257
+|vendor.id pci 0x10b7
+&device.id pci 0x5900
+|vendor.id pci 0x10b7
+&device.id pci 0x5920
+|vendor.id pci 0x10b7
+&device.id pci 0x5950+0x0003
+|vendor.id pci 0x10b7
+&device.id pci 0x5970
+|vendor.id pci 0x10b7
+&device.id pci 0x5b57
+|vendor.id pci 0x10b7
+&device.id pci 0x6055+0x0002
+|vendor.id pci 0x10b7
+&device.id pci 0x6560
+|vendor.id pci 0x10b7
+&device.id pci 0x6562
+|vendor.id pci 0x10b7
+&device.id pci 0x6564
+|vendor.id pci 0x10b7
+&device.id pci 0x7646
+|vendor.id pci 0x10b7
+&device.id pci 0x9000+0x0002
+|vendor.id pci 0x10b7
+&device.id pci 0x9004+0x0003
+|vendor.id pci 0x10b7
+&device.id pci 0x900a
+|vendor.id pci 0x10b7
+&device.id pci 0x9050+0x0002
+|vendor.id pci 0x10b7
+&device.id pci 0x9055
+|vendor.id pci 0x10b7
+&device.id pci 0x9058
+|vendor.id pci 0x10b7
+&device.id pci 0x905a
+|vendor.id pci 0x10b7
+&device.id pci 0x9200+0x0002
+|vendor.id pci 0x10b7
+&device.id pci 0x9800
+|vendor.id pci 0x10b7
+&device.id pci 0x9805
++driver.module.modprobe 3c59x
+
+# net/epic100.c
+ vendor.id pci 0x10b8
+&device.id pci 0x0005+0x0002
++driver.module.modprobe epic100
+
+# modules.alias
+ vendor.id pci 0x018a
+&device.id pci 0x0106
+|vendor.id pci 0x021b
+&device.id pci 0x8139
+|vendor.id pci 0x02ac
+&device.id pci 0x1012
+|vendor.id pci 0x10ec
+&device.id pci 0x8129
+|vendor.id pci 0x10ec
+&device.id pci 0x8138
+|vendor.id pci 0x10ec
+&device.id pci 0x8139
+&rev.id 0x0000+0x0020
+|vendor.id pci 0x1113
+&device.id pci 0x1211
+|vendor.id pci 0x1186
+&device.id pci 0x1300
+|vendor.id pci 0x1186
+&device.id pci 0x1340
+|vendor.id pci 0x11db
+&device.id pci 0x1234
+|vendor.id pci 0x1259
+&device.id pci 0xa117
+|vendor.id pci 0x1259
+&device.id pci 0xa11e
+|vendor.id pci 0x126c
+&device.id pci 0x1211
+|vendor.id pci 0x13d1
+&device.id pci 0xab06
+|vendor.id pci 0x1432
+&device.id pci 0x9130
+|vendor.id pci 0x14ea
+&device.id pci 0xab06+0x0002
+|vendor.id pci 0x1500
+&device.id pci 0x1360
+|vendor.id pci 0x1743
+&device.id pci 0x8139
+|vendor.id pci 0x4033
+&device.id pci 0x1360
+|device.id pci 0x8139
+&subvendor.id pci 0x10ec
+&subdevice.id pci 0x8139
+|device.id pci 0x8139
+&subvendor.id pci 0x1186
+&subdevice.id pci 0x1300
+|device.id pci 0x8139
+&subvendor.id pci 0x13d1
+&subdevice.id pci 0xab06
++driver.module.modprobe 8139too
+
+# modules.alias
+ vendor.id pci 0x10ec
+&device.id pci 0x8139
+&rev.id 0x0020+0x00e0
++driver.module.modprobe 8139cp
+
+# net/via_rhine.c
+ vendor.id pci 0x1106
+&device.id pci 0x3043
+|vendor.id pci 0x1106
+&device.id pci 0x3065
+|vendor.id pci 0x1106
+&device.id pci 0x6100
++driver.module.modprobe via-rhine
+
+# net/skfp/
+ vendor.id pci 0x1148
+&device.id pci 0x4000
++driver.module.modprobe skfp
+
+# net/sk98lin/h/skdrv2nd.h::SK_PCI_ISCOMPLIANT()
+ vendor.id pci 0x1148
+&device.id pci 0x4300
+|vendor.id pci 0x1148
+&device.id pci 0x4320
+|vendor.id pci 0x10b7
+&device.id pci 0x1700
+|vendor.id pci 0x1186
+&device.id pci 0x4c00
+|vendor.id pci 0x11ab
+&device.id pci 0x4320
+|vendor.id pci 0x1371
+&device.id pci 0x434e
+|vendor.id pci 0x1737
+&device.id pci 0x1032
+|vendor.id pci 0x1737
+&device.id pci 0x1064
++driver.module.modprobe sk98lin
+
+# net/dgrs.c
+ vendor.id pci 0x114f
+&device.id pci 0x0003
++driver.module.modprobe dgrs
+
+# net/irda/toshoboe.c
+ vendor.id pci 0x1179
+&device.id pci 0x0701
++driver.module.modprobe toshoboe
+
+# net/sundance.c
+ vendor.id pci 0x1186
+&device.id pci 0x1002
+|vendor.id pci 0x13f0
+&device.id pci 0x0201
++driver.module.modprobe sundance
+
+# net/dl2k.c
+ vendor.id pci 0x1186
+&device.id pci 0x4000
++driver.module.modprobe dl2k
+
+# net/wan/sdladrv.c
+ vendor.id pci 0x11b0
+&device.id pci 0x0002
++driver.module.modprobe sdladrv
+
+# net/rrunner.c
+ vendor.id pci 0x120f
+&device.id pci 0x0001
++driver.module.modprobe rrunner
+
+# net/hamachi.c
+ vendor.id pci 0x1318
+&device.id pci 0x0911
++driver.module.modprobe hamachi
+
+# see #14848
+ vendor.id pci 0x1385
+&device.id pci 0x4100
++driver.module.modprobe prism2_plx
+
+# net/aironet4500_card.c
+ vendor.id pci 0x14b9
+&device.id pci 0x0001
+|vendor.id pci 0x14b9
+&device.id pci 0x4500
+|vendor.id pci 0x14b9
+&device.id pci 0x4800
++driver.module.modprobe aironet4500
+
+# modules.alias
+ vendor.id pci 0x106b
+&device.id pci 0x1645
+|vendor.id pci 0x1148
+&device.id pci 0x4400
+|vendor.id pci 0x1148
+&device.id pci 0x4500
+|vendor.id pci 0x14e4
+&device.id pci 0x164d
+|vendor.id pci 0x173b
+&device.id pci 0x03e8+0x0004
++driver.module.modprobe tg3
+
+# modules.alias
+# tg3 vs. bcm5700: #34486, #36992
+ vendor.id pci 0x14e4
+&device.id pci 0x1644+0x0006
+|vendor.id pci 0x14e4
+&device.id pci 0x1653+0x0002
+|vendor.id pci 0x14e4
+&device.id pci 0x165d+0x0002
+|vendor.id pci 0x14e4
+&device.id pci 0x166e
+|vendor.id pci 0x14e4
+&device.id pci 0x1696
+|vendor.id pci 0x14e4
+&device.id pci 0x169c
+|vendor.id pci 0x14e4
+&device.id pci 0x16a6+0x0003
+|vendor.id pci 0x14e4
+&device.id pci 0x16c6+0x0002
+|vendor.id pci 0x14e4
+&device.id pci 0x170d+0x0002
++driver.module.modprobe tg3
++driver.module.modprobe bcm5700
+
+ vendor.id pci 0x14e4
+&device.id pci 0x4401
++driver.module.modprobe bcm4400
+
+# net/arcnet/com20020-pci.c
+ vendor.id pci 0x1571
+&device.id pci 0xa001+0x0013
+|vendor.id pci 0x1571
+&device.id pci 0xa201+0x0006
++driver.module.modprobe om20020-pci
+
+# net/rcpci45.c
+ vendor.id pci 0x4916
+&device.id pci 0x1960
++driver.module.modprobe rcpci45
+
+# pcimap
+ vendor.id pci 0x8086
+&device.id pci 0x1050+0x0006
++driver.module.modprobe e100
+
+# pcimap
+ vendor.id pci 0x8086
+&device.id pci 0x1035+0x0003
+|vendor.id pci 0x8086
+&device.id pci 0x1227+0x0002
+|vendor.id pci 0x8086
+&device.id pci 0x5200+0x0002
++driver.module.modprobe eepro100
+
+# pcimap
+ vendor.id pci 0x8086
+&device.id pci 0x1029
+|vendor.id pci 0x8086
+&device.id pci 0x1030+0x0005
+|vendor.id pci 0x8086
+&device.id pci 0x1038+0x0007
+|vendor.id pci 0x8086
+&device.id pci 0x1059
+|vendor.id pci 0x8086
+&device.id pci 0x1209
+|vendor.id pci 0x8086
+&device.id pci 0x1229
+|vendor.id pci 0x8086
+&device.id pci 0x2449
+|vendor.id pci 0x8086
+&device.id pci 0x2459
+|vendor.id pci 0x8086
+&device.id pci 0x245d
++driver.module.modprobe e100
++driver.module.modprobe eepro100
+
+# pcimap
+ vendor.id pci 0x8086
+&device.id pci 0x1000+0x0002
+|vendor.id pci 0x8086
+&device.id pci 0x1004
+|vendor.id pci 0x8086
+&device.id pci 0x1008+0x0002
+|vendor.id pci 0x8086
+&device.id pci 0x100c+0x000e
+|vendor.id pci 0x8086
+&device.id pci 0x101d+0x0002
+|vendor.id pci 0x8086
+&device.id pci 0x1026+0x0003
+|vendor.id pci 0x8086
+&device.id pci 0x1075+0x0007
++driver.module.modprobe e1000
+
+# net/starfire.c
+ vendor.id pci 0x9004
+&device.id pci 0x6915
++driver.module.modprobe starfire
+
+
+ vendor.id pci 0x8086
+&device.id pci 0x1043
++driver.module.modprobe ipw2100
+
+
+# make it an ethernet card explicitly (#65852)
+ vendor.id pci 0x10de
+&device.id pci 0x0037+0x0002
+|vendor.id pci 0x10de
+&device.id pci 0x0056+0x0002
+|vendor.id pci 0x10de
+&device.id pci 0x0066
+|vendor.id pci 0x10de
+&device.id pci 0x0086
+|vendor.id pci 0x10de
+&device.id pci 0x008c
+|vendor.id pci 0x10de
+&device.id pci 0x00d6
+|vendor.id pci 0x10de
+&device.id pci 0x00df
+|vendor.id pci 0x10de
+&device.id pci 0x00e6
+|vendor.id pci 0x10de
+&device.id pci 0x01c3
++baseclass.id 0x002
++subclass.id 0x00
++driver.module.modprobe forcedeth
+
+
+# net/ne.c
+ vendor.id AXE
+&device.id eisa 0x2201
+|vendor.id PNP
+&device.id eisa 0x80d6
++driver.module.modprobe ne
++driver.module.config options ne io=<io0> irq=<irq0>
++driver.module.insmod 8390|ne io=<io0> irq=<irq0>
+
+# net/3c509.c
+ vendor.id PNP
+&device.id eisa 0x80f7+0x0002
+|vendor.id TCM
+&device.id eisa 0x5090+0x0002
+|vendor.id TCM
+&device.id eisa 0x5094+0x0002
+|vendor.id TCM
+&device.id eisa 0x5098
++driver.module.modprobe 3c509
+
+# mac ethernet controller
+ vendor.id special 0x0401
+&device.id special 0x0020
++driver.module.modprobe mace
+
+# mac ethernet controller
+ vendor.id special 0x0401
+&device.id special 0x0021+0x0002
++driver.module.modprobe bmac
+
+# net/sunqe.c (sbus)
+ vendor.id special 0x4001
+&device.id special 0x3003
++driver.module.modprobe sunqe
+
+# net/myri_sbus.c (sbus)
+ vendor.id special 0x4001
+&device.id special 0x3004
++driver.module.modprobe myri_sbus
+
+
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+# usb network adapter
+
+ vendor.id usb 0x0411
++vendor.name MELCO
+
+ vendor.id usb 0x0411
+&device.id usb 0x0001
++baseclass.id 0x002
++subclass.id 0x00
++device.name BUFFALO LUA-TX
+
+ vendor.id usb 0x04bb
++vendor.name IO Data
+
+ vendor.id usb 0x04bb
+&device.id usb 0x0904
++baseclass.id 0x002
++subclass.id 0x00
++device.name USB ET/TX
+
+ vendor.id usb 0x056e
++vendor.name LANEED
+
+ vendor.id usb 0x056e
+&device.id usb 0x4002
++baseclass.id 0x002
++subclass.id 0x00
++device.name LD-USB/TX
+
+ vendor.id usb 0x05e9
++vendor.name SONY
+
+ vendor.id usb 0x05e9
+&device.id usb 0x0009
++baseclass.id 0x002
++subclass.id 0x00
++device.name Ethernet USB
+
+ vendor.id usb 0x066b
++vendor.name Linksys
+
+ vendor.id usb 0x066b
+&device.id usb 0x2203+0x0002
++baseclass.id 0x002
++subclass.id 0x00
++device.name USB100TX
+
+ vendor.id usb 0x066b
+&device.id usb 0x2206
++baseclass.id 0x002
++subclass.id 0x00
+
+ vendor.id usb 0x0707
++vendor.name SMC
+
+ vendor.id usb 0x0707
+&device.id usb 0x0100
++baseclass.id 0x002
++subclass.id 0x00
++device.name 2102 EZ Ethernet USB
+
+ vendor.id usb 0x0707
+&device.id usb 0x0200
++baseclass.id 0x002
++subclass.id 0x00
++device.name 202 USB Ethernet
+
+ vendor.id usb 0x07a6
++vendor.name ADMtek
+
+ vendor.id usb 0x07a6
+&device.id usb 0x0986
++baseclass.id 0x002
++subclass.id 0x00
++device.name AN986 USB Ethernet
+
+ vendor.id usb 0x07aa
++vendor.name Corega
+
+ vendor.id usb 0x07aa
+&device.id usb 0x0001
++baseclass.id 0x002
++subclass.id 0x00
++device.name FEther USB-T
+
+ vendor.id usb 0x07aa
+&device.id usb 0x0004
++baseclass.id 0x002
++subclass.id 0x00
++device.name FEther USB-TX
+
+ vendor.id usb 0x07b8
+|vendor.id usb 0x2001
++vendor.name D-Link
+
+ vendor.id usb 0x07b8
+&device.id usb 0x4002
++baseclass.id 0x002
++subclass.id 0x00
++device.name DRU-E100
+
+ vendor.id usb 0x07b8
+&device.id usb 0xabc1
++baseclass.id 0x002
++subclass.id 0x00
++device.name DU-10
+
+ vendor.id usb 0x083a
++vendor.name Accton
+
+ vendor.id usb 0x083a
+&device.id usb 0x1046
++baseclass.id 0x002
++subclass.id 0x00
++device.name USB 10/100 Ethernet Adapter
+
+ vendor.id usb 0x08dd
++vendor.name Billionton
+
+ vendor.id usb 0x08dd
+&device.id usb 0x0986
++baseclass.id 0x002
++subclass.id 0x00
++device.name USB-100
+
+ vendor.id usb 0x2001
+&device.id usb 0x4001+0x0002
++baseclass.id 0x002
++subclass.id 0x00
++device.name DSB-650X
+
+ vendor.id usb 0x2001
+&device.id usb 0x4003
++baseclass.id 0x002
++subclass.id 0x00
++device.name DSB-650X(PNA)
+
+
+ vendor.id usb 0x03e8
+&device.id usb 0x0008
+|vendor.id usb 0x04bb
+&device.id usb 0x0901
+|vendor.id usb 0x0506
+&device.id usb 0x03e8
+|vendor.id usb 0x0506
+&device.id usb 0x11f8
+|vendor.id usb 0x0557
+&device.id usb 0x2002
+|vendor.id usb 0x0557
+&device.id usb 0x4000
+|vendor.id usb 0x0565
+&device.id usb 0x0002+0x0002
+|vendor.id usb 0x0565
+&device.id usb 0x0005
+|vendor.id usb 0x05e9
+&device.id usb 0x0008+0x0002
+|vendor.id usb 0x06e1
+&device.id usb 0x0008+0x0002
+|vendor.id usb 0x0707
+&device.id usb 0x0100
+|vendor.id usb 0x07aa
+&device.id usb 0x0001
+|vendor.id usb 0x07b8
+&device.id usb 0x4000
+|vendor.id usb 0x0846
+&device.id usb 0x1001+0x0002
+|vendor.id usb 0x085a
+&device.id usb 0x0008+0x0002
+|vendor.id usb 0x087d
+&device.id usb 0x5704
+|vendor.id usb 0x0951
+&device.id usb 0x0008
+|vendor.id usb 0x095a
+&device.id usb 0x3003
+|vendor.id usb 0x10bd
+&device.id usb 0x1427
+|vendor.id usb 0x1342
+&device.id usb 0x0204
+|vendor.id usb 0x13d2
+&device.id usb 0x0400
+|vendor.id usb 0x1485
+&device.id usb 0x0001
+|vendor.id usb 0x1645
+&device.id usb 0x0005
+|vendor.id usb 0x1645
+&device.id usb 0x0008
+|vendor.id usb 0x1645
+&device.id usb 0x8005
+|vendor.id usb 0x2001
+&device.id usb 0x4000
++baseclass.id 0x002
++subclass.id 0x00
++driver.module.modprobe kaweth
+
+ vendor.id usb 0x03f0
+&device.id usb 0x811c
+|vendor.id usb 0x0411
+&device.id usb 0x0001
+|vendor.id usb 0x0411
+&device.id usb 0x0005
+|vendor.id usb 0x0411
+&device.id usb 0x0009
+|vendor.id usb 0x045e
+&device.id usb 0x007a
+|vendor.id usb 0x049f
+&device.id usb 0x8511
+|vendor.id usb 0x04bb
+&device.id usb 0x0904
+|vendor.id usb 0x04bb
+&device.id usb 0x0913
+|vendor.id usb 0x0506
+&device.id usb 0x4601
+|vendor.id usb 0x050d
+&device.id usb 0x0121
+|vendor.id usb 0x0557
+&device.id usb 0x2007
+|vendor.id usb 0x056e
+&device.id usb 0x200c
+|vendor.id usb 0x056e
+&device.id usb 0x4002
+|vendor.id usb 0x056e
+&device.id usb 0x400b
+|vendor.id usb 0x056e
+&device.id usb 0xabc1
+|vendor.id usb 0x05cc
+&device.id usb 0x3000
+|vendor.id usb 0x066b
+&device.id usb 0x200c
+|vendor.id usb 0x066b
+&device.id usb 0x2203+0x0002
+|vendor.id usb 0x066b
+&device.id usb 0x2206
+|vendor.id usb 0x066b
+&device.id usb 0x400b
+|vendor.id usb 0x067c
+&device.id usb 0x1001
+|vendor.id usb 0x0707
+&device.id usb 0x0200+0x0002
+|vendor.id usb 0x07a6
+&device.id usb 0x07c2
+|vendor.id usb 0x07a6
+&device.id usb 0x0986
+|vendor.id usb 0x07a6
+&device.id usb 0x8511
+|vendor.id usb 0x07a6
+&device.id usb 0x8513
+|vendor.id usb 0x07a6
+&device.id usb 0x8515
+|vendor.id usb 0x07aa
+&device.id usb 0x0004
+|vendor.id usb 0x07aa
+&device.id usb 0x000d
+|vendor.id usb 0x07b8
+&device.id usb 0x110c
+|vendor.id usb 0x07b8
+&device.id usb 0x200c
+|vendor.id usb 0x07b8
+&device.id usb 0x4002
+|vendor.id usb 0x07b8
+&device.id usb 0x4004
+|vendor.id usb 0x07b8
+&device.id usb 0x4007
+|vendor.id usb 0x07b8
+&device.id usb 0x400b+0x0002
+|vendor.id usb 0x07b8
+&device.id usb 0x4102
+|vendor.id usb 0x07b8
+&device.id usb 0x4104
+|vendor.id usb 0x07b8
+&device.id usb 0xabc1
+|vendor.id usb 0x07c9
+&device.id usb 0xb100
+|vendor.id usb 0x083a
+&device.id usb 0x1046
+|vendor.id usb 0x083a
+&device.id usb 0x5046
+|vendor.id usb 0x0846
+&device.id usb 0x1020
+|vendor.id usb 0x08d1
+&device.id usb 0x0003
+|vendor.id usb 0x08dd
+&device.id usb 0x0986+0x0003
+|vendor.id usb 0x08dd
+&device.id usb 0x8511
+|vendor.id usb 0x0951
+&device.id usb 0x000a
+|vendor.id usb 0x0b39
+&device.id usb 0x0109
+|vendor.id usb 0x0b39
+&device.id usb 0x0901
+|vendor.id usb 0x0db7
+&device.id usb 0x0002
+|vendor.id usb 0x0e66
+&device.id usb 0x400c
+|vendor.id usb 0x1044
+&device.id usb 0x8002
+|vendor.id usb 0x1342
+&device.id usb 0x0304
+|vendor.id usb 0x15e8
+&device.id usb 0x9100
+|vendor.id usb 0x15e8
+&device.id usb 0x9110
+|vendor.id usb 0x2001
+&device.id usb 0x200c
+|vendor.id usb 0x2001
+&device.id usb 0x4001+0x0003
+|vendor.id usb 0x2001
+&device.id usb 0x400b
+|vendor.id usb 0x2001
+&device.id usb 0x4102
+|vendor.id usb 0x2001
+&device.id usb 0xabc1
+|vendor.id usb 0x3334
+&device.id usb 0x1701
++baseclass.id 0x002
++subclass.id 0x00
++driver.module.modprobe pegasus
+
+ vendor.id usb 0x0411
+&device.id usb 0x0012
+|vendor.id usb 0x07b8
+&device.id usb 0x401a
+|vendor.id usb 0x0bda
+&device.id usb 0x8150
+|vendor.id usb 0x3980
+&device.id usb 0x0003
++baseclass.id 0x002
++subclass.id 0x00
++driver.module.modprobe rtl8150
+
+ vendor.id usb 0x0423
+&device.id usb 0x000a
+|vendor.id usb 0x0423
+&device.id usb 0x000c
+|vendor.id usb 0x08d1
+&device.id usb 0x0001
++baseclass.id 0x002
++subclass.id 0x00
++driver.module.modprobe catc
+
+ vendor.id usb 0x066b
+&device.id usb 0x2202
++baseclass.id 0x002
++subclass.id 0x00
++driver.module.modprobe pegasus
++driver.module.modprobe kaweth
+
+
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+# myrinet adapter
+
+ vendor.id pci 0x14c1
++vendor.name Myricom, Inc.
+
+ vendor.id pci 0x14c1
+&device.id pci 0x8043
++baseclass.id 0x002
++subclass.id 0x81
++driver.module.modprobe gm
++device.name Myrinet Adapter
+
+
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+# bluetooth usb devices
+ vendor.id usb 0x044e
+&device.id usb 0x3001+0x0002
+|vendor.id usb 0x04bf
+&device.id usb 0x030a
+|vendor.id usb 0x057c
+&device.id usb 0x3800
+|vendor.id usb 0x0bdb
+&device.id usb 0x1002
++driver.module.modprobe hci_usb
++baseclass.id 0x115
++subclass.id 0x00
+
+
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+# firmware
+
+ vendor.id pci 0x8086
+&device.id pci 0x1043
+&subvendor.id pci 0x103c
+&subdevice.id pci 0x2741
+|vendor.id pci 0x8086
+&device.id pci 0x1043
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x2701+0x0002
+|vendor.id pci 0x8086
+&device.id pci 0x1043
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x2711+0x0002
+|vendor.id pci 0x8086
+&device.id pci 0x1043
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x2721+0x0002
+|vendor.id pci 0x8086
+&device.id pci 0x1043
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x2731+0x0002
+|vendor.id pci 0x8086
+&device.id pci 0x1043
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x2741+0x0002
+|vendor.id pci 0x8086
+&device.id pci 0x1043
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x2751+0x0004
+|vendor.id pci 0x8086
+&device.id pci 0x1043
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x2761+0x0002
+|vendor.id pci 0x8086
+&device.id pci 0x104f
+|vendor.id pci 0x8086
+&device.id pci 0x4220
+|vendor.id pci 0x8086
+&device.id pci 0x4223
++driver.module.modprobe ipw2200
++requires ipw-firmware
+
+ vendor.id pci 0x8086
+&device.id pci 0x1043
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x2520+0x000a
+|vendor.id pci 0x8086
+&device.id pci 0x1043
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x252b+0x0003
+|vendor.id pci 0x8086
+&device.id pci 0x1043
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x2550+0x0002
+|vendor.id pci 0x8086
+&device.id pci 0x1043
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x2553+0x0003
+|vendor.id pci 0x8086
+&device.id pci 0x1043
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x2560+0x0004
+|vendor.id pci 0x8086
+&device.id pci 0x1043
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x2565+0x0003
+|vendor.id pci 0x8086
+&device.id pci 0x1043
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x2570
+|vendor.id pci 0x8086
+&device.id pci 0x1043
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x2580+0x0004
+|vendor.id pci 0x8086
+&device.id pci 0x1043
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x2585+0x0003
+|vendor.id pci 0x8086
+&device.id pci 0x1043
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x2590+0x0004
+|vendor.id pci 0x8086
+&device.id pci 0x1043
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x2596
+|vendor.id pci 0x8086
+&device.id pci 0x1043
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x2598
+|vendor.id pci 0x8086
+&device.id pci 0x1043
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x25a0
++driver.module.modprobe ipw2100
++requires ipw-firmware
+
+
+ vendor.id usb 0x03eb
+&device.id usb 0x4102
+|vendor.id usb 0x03eb
+&device.id usb 0x7605
+|vendor.id usb 0x049f
+&device.id usb 0x0032
+|vendor.id usb 0x04a5
+&device.id usb 0x9001
+|vendor.id usb 0x0506
+&device.id usb 0x0a01
+|vendor.id usb 0x050d
+&device.id usb 0x0050
+|vendor.id usb 0x0681
+&device.id usb 0x001b
+|vendor.id usb 0x069a
+&device.id usb 0x0321
+|vendor.id usb 0x077b
+&device.id usb 0x2219
+|vendor.id usb 0x077b
+&device.id usb 0x2227
+|vendor.id usb 0x07b8
+&device.id usb 0xb000
+|vendor.id usb 0x0864
+&device.id usb 0x4102
+|vendor.id usb 0x1044
+&device.id usb 0x8003
+|vendor.id usb 0x1371
+&device.id usb 0x0002
+|vendor.id usb 0x1371
+&device.id usb 0x5743
+|vendor.id usb 0x1668
+&device.id usb 0x7605
+|vendor.id usb 0x2001
+&device.id usb 0x3200
+|vendor.id usb 0x2019
+&device.id usb 0x3220
++driver.module.modprobe at76c503-rfmd
++requires atmel-firmware
+
+ vendor.id usb 0x03eb
+&device.id usb 0x7603
+|vendor.id usb 0x03f0
+&device.id usb 0x011c
+|vendor.id usb 0x04a5
+&device.id usb 0x9000
+|vendor.id usb 0x04bb
+&device.id usb 0x0919
+|vendor.id usb 0x05dd
+&device.id usb 0xff31
+|vendor.id usb 0x066b
+&device.id usb 0x2211
+|vendor.id usb 0x069a
+&device.id usb 0x0320
+|vendor.id usb 0x069a
+&device.id usb 0x0821
+|vendor.id usb 0x0864
+&device.id usb 0x4100
+|vendor.id usb 0x0b3b
+&device.id usb 0x1612
+|vendor.id usb 0x0cde
+&device.id usb 0x0001
+|vendor.id usb 0x0d5c
+&device.id usb 0xa001
+|vendor.id usb 0x0d8e
+&device.id usb 0x7100
+|vendor.id usb 0x0d8e
+&device.id usb 0x7110
+|vendor.id usb 0x8086
+&device.id usb 0x0200
++driver.module.modprobe at76c503-i3861
++requires atmel-firmware
+
+ vendor.id usb 0x03eb
+&device.id usb 0x7604
+|vendor.id usb 0x055d
+&device.id usb 0xa000
++driver.module.modprobe at76c503-i3863
++requires atmel-firmware
+
+ vendor.id usb 0x03eb
+&device.id usb 0x7606
++driver.module.modprobe at76c505-rfmd
++requires atmel-firmware
+
+ vendor.id usb 0x03eb
+&device.id usb 0x7613
+|vendor.id usb 0x07aa
+&device.id usb 0x7613
+|vendor.id usb 0x0db0
+&device.id usb 0x1020
+|vendor.id usb 0x12fd
+&device.id usb 0x1001
+|vendor.id usb 0x1371
+&device.id usb 0x0013+0x0002
+|vendor.id usb 0x1915
+&device.id usb 0x2233
++driver.module.modprobe at76c505-rfmd2958
++requires atmel-firmware
+
+ vendor.id usb 0x03eb
+&device.id usb 0x7614
+|vendor.id usb 0x03eb
+&device.id usb 0x7617
++driver.module.modprobe at76c505a-rfmd2958
++requires atmel-firmware
+
+ vendor.id usb 0x083a
+&device.id usb 0x3501
+|vendor.id usb 0x0d5c
+&device.id usb 0xa002
++driver.module.modprobe at76c503-rfmd-acc
++requires atmel-firmware
+
+ vendor.id usb 0x0a5c
+&device.id usb 0x2033
++requires bluez-firmware
+
+
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+# usbnet devices
+
+ vendor.id usb 0x0402
+&device.id usb 0x5632
+|vendor.id usb 0x0411
+&device.id usb 0x003d
+|vendor.id usb 0x049f
+&device.id usb 0x505a
+|vendor.id usb 0x050d
+&device.id usb 0x0004
+|vendor.id usb 0x0525
+&device.id usb 0x1080
+|vendor.id usb 0x0525
+&device.id usb 0x2888
+|vendor.id usb 0x0525
+&device.id usb 0x9901
+|vendor.id usb 0x0547
+&device.id usb 0x2720
+|vendor.id usb 0x0547
+&device.id usb 0x2727
+|vendor.id usb 0x0557
+&device.id usb 0x2009
+|vendor.id usb 0x056c
+&device.id usb 0x8100
+|vendor.id usb 0x05e3
+&device.id usb 0x0502
+|vendor.id usb 0x067b
+&device.id usb 0x0000+0x0002
+|vendor.id usb 0x06d0
+&device.id usb 0x0622
+|vendor.id usb 0x077b
+&device.id usb 0x2226
+|vendor.id usb 0x07b8
+&device.id usb 0x420a
+|vendor.id usb 0x0846
+&device.id usb 0x1040
+|vendor.id usb 0x08dd
+&device.id usb 0x90ff
+|vendor.id usb 0x0b95
+&device.id usb 0x1720
+|vendor.id usb 0x0e7e
+&device.id usb 0x1001
+|vendor.id usb 0x2001
+&device.id usb 0x1a00
+|vendor.id usb 0x6189
+&device.id usb 0x182d
+|vendor.id usb 0x8086
+&device.id usb 0x07d3
++driver.module.modprobe usbnet
++baseclass.id 0x002
++subclass.id 0x91
+
--- /dev/null
+ vendor.id pci 0x0000
++vendor.name Gammagraphx, Inc.
+
+ vendor.id pci 0x001a
++vendor.name Ascend Communications, Inc.
+
+ vendor.id pci 0x0033
++vendor.name Paradyne corp.
+
+ vendor.id pci 0x003d
++vendor.name Lockheed Martin-Marietta Corp
+
+ vendor.id pci 0x0059
++vendor.name Tiger Jet Network Inc. (Wrong ID)
+
+ vendor.id pci 0x0070
++vendor.name Hauppauge computer works Inc.
+
+ vendor.id pci 0x0070
+&device.id pci 0x4000
++device.name WinTV PVR-350
+
+ vendor.id pci 0x0070
+&device.id pci 0x4001
++device.name WinTV PVR-250 (v1)
+
+ vendor.id pci 0x0070
+&device.id pci 0x4009
++device.name WinTV PVR-250
+
+ vendor.id pci 0x0070
+&device.id pci 0x4801
++device.name WinTV PVR-250 MCE
+
+ vendor.id pci 0x0071
++vendor.name Nebula Electronics Ltd.
+
+ vendor.id pci 0x0095
++vendor.name Silicon Image, Inc. (Wrong ID)
+
+ vendor.id pci 0x0095
+&device.id pci 0x0680
++device.name Ultra ATA/133 IDE RAID CONTROLLER CARD
+
+ vendor.id pci 0x0100
++vendor.name Ncipher Corp Ltd
+
+ vendor.id pci 0x018a
++vendor.name LevelOne
+
+ vendor.id pci 0x018a
+&device.id pci 0x0106
++device.name FPC-0106TX misprogrammed [RTL81xx]
+
+ vendor.id pci 0x021b
++vendor.name Compaq Computer Corporation
+
+ vendor.id pci 0x021b
+&device.id pci 0x8139
++device.name HNE-300 (RealTek RTL8139c) [iPaq Networking]
+
+ vendor.id pci 0x0291
++vendor.name Davicom Semiconductor, Inc.
+
+ vendor.id pci 0x0291
+&device.id pci 0x8212
++device.name DM9102A(DM9102AE, SM9102AF) Ethernet 100/10 MBit(Rev 40)
+
+ vendor.id pci 0x02ac
++vendor.name SpeedStream
+
+ vendor.id pci 0x02ac
+&device.id pci 0x1012
++device.name 1012 PCMCIA 10/100 Ethernet Card [RTL81xx]
+
+ vendor.id pci 0x0357
++vendor.name TTTech AG
+
+ vendor.id pci 0x0357
+&device.id pci 0x000a
++device.name TTP-Monitoring Card V2.0
+
+ vendor.id pci 0x0432
++vendor.name SCM Microsystems, Inc.
+
+ vendor.id pci 0x05e3
++vendor.name CyberDoor
+
+ vendor.id pci 0x05e3
+&device.id pci 0x0701
++device.name CBD516
+
+ vendor.id pci 0x0675
++vendor.name Dynalink
+
+ vendor.id pci 0x0675
+&device.id pci 0x1700
++device.name IS64PH ISDN Adapter
+
+ vendor.id pci 0x0675
+&device.id pci 0x1702
++device.name IS64PH ISDN Adapter
+
+ vendor.id pci 0x0925
++vendor.name VIA Technologies, Inc. (Wrong ID)
+
+ vendor.id pci 0x09c1
++vendor.name Arris
+
+ vendor.id pci 0x09c1
+&device.id pci 0x0704
++device.name CM 200E Cable Modem
+
+ vendor.id pci 0x0a89
++vendor.name BREA Technologies Inc
+
+ vendor.id pci 0x0b49
++vendor.name ASCII Corporation
+
+ vendor.id pci 0x0b49
+&device.id pci 0x064f
++device.name Trance Vibrator
+
+ vendor.id pci 0x0e11
++vendor.name Compaq Computer Corporation
+
+ vendor.id pci 0x0e11
+&device.id pci 0x0001
++device.name PCI to EISA Bridge
+
+ vendor.id pci 0x0e11
+&device.id pci 0x0002
++device.name PCI to ISA Bridge
+
+ vendor.id pci 0x0e11
+&device.id pci 0x0046
++device.name Smart Array 64xx
+
+ vendor.id pci 0x0e11
+&device.id pci 0x0046
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0x409a
++subdevice.name Smart Array 641
+
+ vendor.id pci 0x0e11
+&device.id pci 0x0046
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0x409b
++subdevice.name Smart Array 642
+
+ vendor.id pci 0x0e11
+&device.id pci 0x0046
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0x409c
++subdevice.name Smart Array 6400
+
+ vendor.id pci 0x0e11
+&device.id pci 0x0046
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0x409d
++subdevice.name Smart Array 6400 EM
+
+ vendor.id pci 0x0e11
+&device.id pci 0x0049
++device.name NC7132 Gigabit Upgrade Module
+
+ vendor.id pci 0x0e11
+&device.id pci 0x004a
++device.name NC6136 Gigabit Server Adapter
+
+ vendor.id pci 0x0e11
+&device.id pci 0x007c
++device.name NC7770 1000BaseTX
+
+ vendor.id pci 0x0e11
+&device.id pci 0x007d
++device.name NC6770 1000BaseTX
+
+ vendor.id pci 0x0e11
+&device.id pci 0x0085
++device.name NC7780 1000BaseTX
+
+ vendor.id pci 0x0e11
+&device.id pci 0x00bb
++device.name NC7760
+
+ vendor.id pci 0x0e11
+&device.id pci 0x00ca
++device.name NC7771
+
+ vendor.id pci 0x0e11
+&device.id pci 0x00cb
++device.name NC7781
+
+ vendor.id pci 0x0e11
+&device.id pci 0x00cf
++device.name NC7772
+
+ vendor.id pci 0x0e11
+&device.id pci 0x00d0
++device.name NC7782
+
+ vendor.id pci 0x0e11
+&device.id pci 0x00d1
++device.name NC7783
+
+ vendor.id pci 0x0e11
+&device.id pci 0x00e3
++device.name NC7761
+
+ vendor.id pci 0x0e11
+&device.id pci 0x0508
++device.name Netelligent 4/16 Token Ring
+
+ vendor.id pci 0x0e11
+&device.id pci 0x1000
++device.name Triflex/Pentium Bridge, Model 1000
+
+ vendor.id pci 0x0e11
+&device.id pci 0x2000
++device.name Triflex/Pentium Bridge, Model 2000
+
+ vendor.id pci 0x0e11
+&device.id pci 0x3032
++device.name QVision 1280/p
+
+ vendor.id pci 0x0e11
+&device.id pci 0x3033
++device.name QVision 1280/p
+
+ vendor.id pci 0x0e11
+&device.id pci 0x3034
++device.name QVision 1280/p
+
+ vendor.id pci 0x0e11
+&device.id pci 0x4000
++device.name 4000 [Triflex]
+
+ vendor.id pci 0x0e11
+&device.id pci 0x4030
++device.name SMART-2/P
+
+ vendor.id pci 0x0e11
+&device.id pci 0x4031
++device.name SMART-2SL
+
+ vendor.id pci 0x0e11
+&device.id pci 0x4032
++device.name Smart Array 3200
+
+ vendor.id pci 0x0e11
+&device.id pci 0x4033
++device.name Smart Array 3100ES
+
+ vendor.id pci 0x0e11
+&device.id pci 0x4034
++device.name Smart Array 221
+
+ vendor.id pci 0x0e11
+&device.id pci 0x4040
++device.name Integrated Array
+
+ vendor.id pci 0x0e11
+&device.id pci 0x4048
++device.name Compaq Raid LC2
+
+ vendor.id pci 0x0e11
+&device.id pci 0x4050
++device.name Smart Array 4200
+
+ vendor.id pci 0x0e11
+&device.id pci 0x4051
++device.name Smart Array 4250ES
+
+ vendor.id pci 0x0e11
+&device.id pci 0x4058
++device.name Smart Array 431
+
+ vendor.id pci 0x0e11
+&device.id pci 0x4070
++device.name Smart Array 5300
+
+ vendor.id pci 0x0e11
+&device.id pci 0x4080
++device.name Smart Array 5i
+
+ vendor.id pci 0x0e11
+&device.id pci 0x4082
++device.name Smart Array 532
+
+ vendor.id pci 0x0e11
+&device.id pci 0x4083
++device.name Smart Array 5312
+
+ vendor.id pci 0x0e11
+&device.id pci 0x4091
++device.name Smart Array 6i
+
+ vendor.id pci 0x0e11
+&device.id pci 0x409a
++device.name Smart Array 641
+
+ vendor.id pci 0x0e11
+&device.id pci 0x409b
++device.name Smart Array 642
+
+ vendor.id pci 0x0e11
+&device.id pci 0x409c
++device.name Smart Array 6400
+
+ vendor.id pci 0x0e11
+&device.id pci 0x409d
++device.name Smart Array 6400 EM
+
+ vendor.id pci 0x0e11
+&device.id pci 0x6010
++device.name HotPlug PCI Bridge 6010
+
+ vendor.id pci 0x0e11
+&device.id pci 0x7020
++device.name USB Controller
+
+ vendor.id pci 0x0e11
+&device.id pci 0xa0ec
++device.name Fibre Channel Host Controller
+
+ vendor.id pci 0x0e11
+&device.id pci 0xa0f0
++device.name Advanced System Management Controller
+
+ vendor.id pci 0x0e11
+&device.id pci 0xa0f3
++device.name Triflex PCI to ISA Bridge
+
+ vendor.id pci 0x0e11
+&device.id pci 0xa0f7
++device.name PCI Hotplug Controller
+
+ vendor.id pci 0x0e11
+&device.id pci 0xa0f7
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x002a
++subdevice.name PCI Hotplug Controller A
+
+ vendor.id pci 0x0e11
+&device.id pci 0xa0f7
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x002b
++subdevice.name PCI Hotplug Controller B
+
+ vendor.id pci 0x0e11
+&device.id pci 0xa0f8
++device.name ZFMicro Chipset USB
+
+ vendor.id pci 0x0e11
+&device.id pci 0xa0fc
++device.name FibreChannel HBA Tachyon
+
+ vendor.id pci 0x0e11
+&device.id pci 0xae10
++device.name Smart-2/P RAID Controller
+
+ vendor.id pci 0x0e11
+&device.id pci 0xae10
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0x4030
++subdevice.name Smart-2/P Array Controller
+
+ vendor.id pci 0x0e11
+&device.id pci 0xae10
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0x4031
++subdevice.name Smart-2SL Array Controller
+
+ vendor.id pci 0x0e11
+&device.id pci 0xae10
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0x4032
++subdevice.name Smart Array Controller
+
+ vendor.id pci 0x0e11
+&device.id pci 0xae10
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0x4033
++subdevice.name Smart 3100ES Array Controller
+
+ vendor.id pci 0x0e11
+&device.id pci 0xae29
++device.name MIS-L
+
+ vendor.id pci 0x0e11
+&device.id pci 0xae2a
++device.name MPC
+
+ vendor.id pci 0x0e11
+&device.id pci 0xae2b
++device.name MIS-E
+
+ vendor.id pci 0x0e11
+&device.id pci 0xae31
++device.name System Management Controller
+
+ vendor.id pci 0x0e11
+&device.id pci 0xae32
++device.name Compaq Netelligent 10/100 TX PCI UTP TLAN 2.3
+
+ vendor.id pci 0x0e11
+&device.id pci 0xae33
++device.name Triflex Dual EIDE Controller
+
+ vendor.id pci 0x0e11
+&device.id pci 0xae34
++device.name Compaq Netelligent 10 T PCI UTP TLAN 2.3
+
+ vendor.id pci 0x0e11
+&device.id pci 0xae35
++device.name Compaq Integrated NetFlex-3/P ThunderLAN 2.3
+
+ vendor.id pci 0x0e11
+&device.id pci 0xae40
++device.name Compaq Netelligent Dual 10/100 TX PCI TLAN 3.03
+
+ vendor.id pci 0x0e11
+&device.id pci 0xae43
++device.name Compaq Integrated Netelligent 10/100 TX PCI TLAN 2.3
+
+ vendor.id pci 0x0e11
+&device.id pci 0xae69
++device.name CETUS-L
+
+ vendor.id pci 0x0e11
+&device.id pci 0xae6c
++device.name Northstar
+
+ vendor.id pci 0x0e11
+&device.id pci 0xae6d
++device.name NorthStar CPU to PCI Bridge
+
+ vendor.id pci 0x0e11
+&device.id pci 0xb011
++device.name Netelligent 10/100 TX Embedded UTP
+
+ vendor.id pci 0x0e11
+&device.id pci 0xb012
++device.name Compaq Netelligent 10 T/2 UTP/Coax PCI
+
+ vendor.id pci 0x0e11
+&device.id pci 0xb01e
++device.name NC3120 Fast Ethernet NIC
+
+ vendor.id pci 0x0e11
+&device.id pci 0xb01f
++device.name NC3122 Fast Ethernet NIC
+
+ vendor.id pci 0x0e11
+&device.id pci 0xb02f
++device.name NC1120 Ethernet NIC
+
+ vendor.id pci 0x0e11
+&device.id pci 0xb030
++device.name Compaq Netelligent 10/100 TX Embedded UTP/Coax Controller (5100)
+
+ vendor.id pci 0x0e11
+&device.id pci 0xb04a
++device.name 10/100 TX PCI Intel WOL UTP Controller
+
+ vendor.id pci 0x0e11
+&device.id pci 0xb060
++device.name Smart Array 5300 Controller
+
+ vendor.id pci 0x0e11
+&device.id pci 0xb0c6
++device.name NC3161 Fast Ethernet NIC
+
+ vendor.id pci 0x0e11
+&device.id pci 0xb0c7
++device.name NC3160 Fast Ethernet NIC
+
+ vendor.id pci 0x0e11
+&device.id pci 0xb0d7
++device.name NC3121 Fast Ethernet NIC
+
+ vendor.id pci 0x0e11
+&device.id pci 0xb0dd
++device.name NC3131 Fast Ethernet NIC
+
+ vendor.id pci 0x0e11
+&device.id pci 0xb0de
++device.name NC3132 Fast Ethernet Module
+
+ vendor.id pci 0x0e11
+&device.id pci 0xb0df
++device.name NC6132 Gigabit Module
+
+ vendor.id pci 0x0e11
+&device.id pci 0xb0e0
++device.name NC6133 Gigabit Module
+
+ vendor.id pci 0x0e11
+&device.id pci 0xb0e1
++device.name NC3133 Fast Ethernet Module
+
+ vendor.id pci 0x0e11
+&device.id pci 0xb123
++device.name NC6134 Gigabit NIC
+
+ vendor.id pci 0x0e11
+&device.id pci 0xb134
++device.name NC3163 Fast Ethernet NIC
+
+ vendor.id pci 0x0e11
+&device.id pci 0xb13c
++device.name NC3162 Fast Ethernet NIC
+
+ vendor.id pci 0x0e11
+&device.id pci 0xb144
++device.name NC3123 Fast Ethernet NIC
+
+ vendor.id pci 0x0e11
+&device.id pci 0xb163
++device.name NC3134 Fast Ethernet NIC
+
+ vendor.id pci 0x0e11
+&device.id pci 0xb164
++device.name NC3165 Fast Ethernet Upgrade Module
+
+ vendor.id pci 0x0e11
+&device.id pci 0xb178
++device.name Smart Array 5i/532
+
+ vendor.id pci 0x0e11
+&device.id pci 0xb178
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0x4080
++subdevice.name Smart Array 5i
+
+ vendor.id pci 0x0e11
+&device.id pci 0xb178
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0x4082
++subdevice.name Smart Array 532
+
+ vendor.id pci 0x0e11
+&device.id pci 0xb178
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0x4083
++subdevice.name Smart Array 5312
+
+ vendor.id pci 0x0e11
+&device.id pci 0xb1a4
++device.name NC7131 Gigabit Server Adapter
+
+ vendor.id pci 0x0e11
+&device.id pci 0xb200
++device.name Memory Hot-Plug Controller
+
+ vendor.id pci 0x0e11
+&device.id pci 0xb203
++device.name Integrated Lights Out Controller
+
+ vendor.id pci 0x0e11
+&device.id pci 0xb204
++device.name Integrated Lights Out Processor
+
+ vendor.id pci 0x0e11
+&device.id pci 0xf130
++device.name Compaq NetFlex-3/P ThunderLAN 1.0
+
+ vendor.id pci 0x0e11
+&device.id pci 0xf150
++device.name Compaq NetFlex-3/P ThunderLAN 2.3
+
+ vendor.id pci 0x0e55
++vendor.name HaSoTec GmbH
+
+ vendor.id pci 0x1000
++vendor.name LSI Logic / Symbios Logic
+
+ vendor.id pci 0x1000
+&device.id pci 0x0001
++device.name 53c810
+
+ vendor.id pci 0x1000
+&device.id pci 0x0001
+&subvendor.id pci 0x1000
+&subdevice.id pci 0x1000
++subdevice.name LSI53C810AE PCI to SCSI I/O Processor
+
+ vendor.id pci 0x1000
+&device.id pci 0x0002
++device.name 53c820
+
+ vendor.id pci 0x1000
+&device.id pci 0x0003
++device.name 53c825
+
+ vendor.id pci 0x1000
+&device.id pci 0x0003
+&subvendor.id pci 0x1000
+&subdevice.id pci 0x1000
++subdevice.name LSI53C825AE PCI to SCSI I/O Processor (Ultra Wide)
+
+ vendor.id pci 0x1000
+&device.id pci 0x0004
++device.name 53c815
+
+ vendor.id pci 0x1000
+&device.id pci 0x0005
++device.name 53c810AP
+
+ vendor.id pci 0x1000
+&device.id pci 0x0006
++device.name 53c860
+
+ vendor.id pci 0x1000
+&device.id pci 0x0006
+&subvendor.id pci 0x1000
+&subdevice.id pci 0x1000
++subdevice.name LSI53C860E PCI to Ultra SCSI I/O Processor
+
+ vendor.id pci 0x1000
+&device.id pci 0x000a
++device.name 53c1510
+
+ vendor.id pci 0x1000
+&device.id pci 0x000a
+&subvendor.id pci 0x1000
+&subdevice.id pci 0x1000
++subdevice.name LSI53C1510 PCI to Dual Channel Wide Ultra2 SCSI Controller (Nonintelligent mode)
+
+ vendor.id pci 0x1000
+&device.id pci 0x000b
++device.name 53C896/897
+
+ vendor.id pci 0x1000
+&device.id pci 0x000b
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0x6004
++subdevice.name EOB003 Series SCSI host adapter
+
+ vendor.id pci 0x1000
+&device.id pci 0x000b
+&subvendor.id pci 0x1000
+&subdevice.id pci 0x1000
++subdevice.name LSI53C896/7 PCI to Dual Channel Ultra2 SCSI Multifunction Controller
+
+ vendor.id pci 0x1000
+&device.id pci 0x000b
+&subvendor.id pci 0x1000
+&subdevice.id pci 0x1010
++subdevice.name LSI22910 PCI to Dual Channel Ultra2 SCSI host adapter
+
+ vendor.id pci 0x1000
+&device.id pci 0x000b
+&subvendor.id pci 0x1000
+&subdevice.id pci 0x1020
++subdevice.name LSI21002 PCI to Dual Channel Ultra2 SCSI host adapter
+
+ vendor.id pci 0x1000
+&device.id pci 0x000b
+&subvendor.id pci 0x13e9
+&subdevice.id pci 0x1000
++subdevice.name 6221L-4U
+
+ vendor.id pci 0x1000
+&device.id pci 0x000c
++device.name 53c895
+
+ vendor.id pci 0x1000
+&device.id pci 0x000c
+&subvendor.id pci 0x1000
+&subdevice.id pci 0x1010
++subdevice.name LSI8951U PCI to Ultra2 SCSI host adapter
+
+ vendor.id pci 0x1000
+&device.id pci 0x000c
+&subvendor.id pci 0x1000
+&subdevice.id pci 0x1020
++subdevice.name LSI8952U PCI to Ultra2 SCSI host adapter
+
+ vendor.id pci 0x1000
+&device.id pci 0x000c
+&subvendor.id pci 0x1de1
+&subdevice.id pci 0x3906
++subdevice.name DC-390U2B SCSI adapter
+
+ vendor.id pci 0x1000
+&device.id pci 0x000c
+&subvendor.id pci 0x1de1
+&subdevice.id pci 0x3907
++subdevice.name DC-390U2W
+
+ vendor.id pci 0x1000
+&device.id pci 0x000d
++device.name 53c885
+
+ vendor.id pci 0x1000
+&device.id pci 0x000f
++device.name 53c875
+
+ vendor.id pci 0x1000
+&device.id pci 0x000f
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0x7004
++subdevice.name Embedded Ultra Wide SCSI Controller
+
+ vendor.id pci 0x1000
+&device.id pci 0x000f
+&subvendor.id pci 0x1000
+&subdevice.id pci 0x1000
++subdevice.name LSI53C876/E PCI to Dual Channel SCSI Controller
+
+ vendor.id pci 0x1000
+&device.id pci 0x000f
+&subvendor.id pci 0x1000
+&subdevice.id pci 0x1010
++subdevice.name LSI22801 PCI to Dual Channel Ultra SCSI host adapter
+
+ vendor.id pci 0x1000
+&device.id pci 0x000f
+&subvendor.id pci 0x1000
+&subdevice.id pci 0x1020
++subdevice.name LSI22802 PCI to Dual Channel Ultra SCSI host adapter
+
+ vendor.id pci 0x1000
+&device.id pci 0x000f
+&subvendor.id pci 0x1092
+&subdevice.id pci 0x8760
++subdevice.name FirePort 40 Dual SCSI Controller
+
+ vendor.id pci 0x1000
+&device.id pci 0x000f
+&subvendor.id pci 0x1de1
+&subdevice.id pci 0x3904
++subdevice.name DC390F/U Ultra Wide SCSI Adapter
+
+ vendor.id pci 0x1000
+&device.id pci 0x000f
+&subvendor.id pci 0x4c53
+&subdevice.id pci 0x1000
++subdevice.name CC7/CR7/CP7/VC7/VP7/VR7 mainboard
+
+ vendor.id pci 0x1000
+&device.id pci 0x000f
+&subvendor.id pci 0x4c53
+&subdevice.id pci 0x1050
++subdevice.name CT7 mainboard
+
+ vendor.id pci 0x1000
+&device.id pci 0x0010
++device.name 53C1510
+
+ vendor.id pci 0x1000
+&device.id pci 0x0010
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0x4040
++subdevice.name Integrated Array Controller
+
+ vendor.id pci 0x1000
+&device.id pci 0x0010
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0x4048
++subdevice.name RAID LC2 Controller
+
+ vendor.id pci 0x1000
+&device.id pci 0x0010
+&subvendor.id pci 0x1000
+&subdevice.id pci 0x1000
++subdevice.name 53C1510 PCI to Dual Channel Wide Ultra2 SCSI Controller (Intelligent mode)
+
+ vendor.id pci 0x1000
+&device.id pci 0x0012
++device.name 53c895a
+
+ vendor.id pci 0x1000
+&device.id pci 0x0012
+&subvendor.id pci 0x1000
+&subdevice.id pci 0x1000
++subdevice.name LSI53C895A PCI to Ultra2 SCSI Controller
+
+ vendor.id pci 0x1000
+&device.id pci 0x0013
++device.name 53c875a
+
+ vendor.id pci 0x1000
+&device.id pci 0x0013
+&subvendor.id pci 0x1000
+&subdevice.id pci 0x1000
++subdevice.name LSI53C875A PCI to Ultra SCSI Controller
+
+ vendor.id pci 0x1000
+&device.id pci 0x0020
++device.name 53c1010 Ultra3 SCSI Adapter
+
+ vendor.id pci 0x1000
+&device.id pci 0x0020
+&subvendor.id pci 0x1000
+&subdevice.id pci 0x1000
++subdevice.name LSI53C1010-33 PCI to Dual Channel Ultra160 SCSI Controller
+
+ vendor.id pci 0x1000
+&device.id pci 0x0020
+&subvendor.id pci 0x1de1
+&subdevice.id pci 0x1020
++subdevice.name DC-390U3W
+
+ vendor.id pci 0x1000
+&device.id pci 0x0021
++device.name 53c1010 66MHz Ultra3 SCSI Adapter
+
+ vendor.id pci 0x1000
+&device.id pci 0x0021
+&subvendor.id pci 0x1000
+&subdevice.id pci 0x1000
++subdevice.name LSI53C1000/1000R/1010R/1010-66 PCI to Ultra160 SCSI Controller
+
+ vendor.id pci 0x1000
+&device.id pci 0x0021
+&subvendor.id pci 0x1000
+&subdevice.id pci 0x1010
++subdevice.name Asus TR-DLS onboard 53C1010-66
+
+ vendor.id pci 0x1000
+&device.id pci 0x0021
+&subvendor.id pci 0x124b
+&subdevice.id pci 0x1070
++subdevice.name PMC-USCSI3
+
+ vendor.id pci 0x1000
+&device.id pci 0x0021
+&subvendor.id pci 0x4c53
+&subdevice.id pci 0x1080
++subdevice.name CT8 mainboard
+
+ vendor.id pci 0x1000
+&device.id pci 0x0021
+&subvendor.id pci 0x4c53
+&subdevice.id pci 0x1300
++subdevice.name P017 mezzanine (32-bit PMC)
+
+ vendor.id pci 0x1000
+&device.id pci 0x0021
+&subvendor.id pci 0x4c53
+&subdevice.id pci 0x1310
++subdevice.name P017 mezzanine (64-bit PMC)
+
+ vendor.id pci 0x1000
+&device.id pci 0x0030
++device.name 53c1030 PCI-X Fusion-MPT Dual Ultra320 SCSI
+
+ vendor.id pci 0x1000
+&device.id pci 0x0030
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x0123
++subdevice.name PowerEdge 2600
+
+ vendor.id pci 0x1000
+&device.id pci 0x0030
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x014a
++subdevice.name PowerEdge 1750
+
+ vendor.id pci 0x1000
+&device.id pci 0x0030
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x016c
++subdevice.name PowerEdge 1850 MPT Fusion SCSI/RAID (Perc 4)
+
+ vendor.id pci 0x1000
+&device.id pci 0x0030
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x1010
++subdevice.name LSI U320 SCSI Controller
+
+ vendor.id pci 0x1000
+&device.id pci 0x0031
++device.name 53c1030ZC PCI-X Fusion-MPT Dual Ultra320 SCSI
+
+ vendor.id pci 0x1000
+&device.id pci 0x0032
++device.name 53c1035 PCI-X Fusion-MPT Dual Ultra320 SCSI
+
+ vendor.id pci 0x1000
+&device.id pci 0x0032
+&subvendor.id pci 0x1000
+&subdevice.id pci 0x1000
++subdevice.name LSI53C1020/1030 PCI-X to Ultra320 SCSI Controller
+
+ vendor.id pci 0x1000
+&device.id pci 0x0033
++device.name 1030ZC_53c1035 PCI-X Fusion-MPT Dual Ultra320 SCSI
+
+ vendor.id pci 0x1000
+&device.id pci 0x0040
++device.name 53c1035 PCI-X Fusion-MPT Dual Ultra320 SCSI
+
+ vendor.id pci 0x1000
+&device.id pci 0x0040
+&subvendor.id pci 0x1000
+&subdevice.id pci 0x0033
++subdevice.name MegaRAID SCSI 320-2XR
+
+ vendor.id pci 0x1000
+&device.id pci 0x0040
+&subvendor.id pci 0x1000
+&subdevice.id pci 0x0066
++subdevice.name MegaRAID SCSI 320-2XRWS
+
+ vendor.id pci 0x1000
+&device.id pci 0x0041
++device.name 53C1035ZC PCI-X Fusion-MPT Dual Ultra320 SCSI
+
+ vendor.id pci 0x1000
+&device.id pci 0x008f
++device.name 53c875J
+
+ vendor.id pci 0x1000
+&device.id pci 0x008f
+&subvendor.id pci 0x1092
+&subdevice.id pci 0x8000
++subdevice.name FirePort 40 SCSI Controller
+
+ vendor.id pci 0x1000
+&device.id pci 0x008f
+&subvendor.id pci 0x1092
+&subdevice.id pci 0x8760
++subdevice.name FirePort 40 Dual SCSI Host Adapter
+
+ vendor.id pci 0x1000
+&device.id pci 0x0407
++device.name MegaRAID
+
+ vendor.id pci 0x1000
+&device.id pci 0x0407
+&subvendor.id pci 0x1000
+&subdevice.id pci 0x0530
++subdevice.name MegaRAID 530 SCSI 320-0X RAID Controller
+
+ vendor.id pci 0x1000
+&device.id pci 0x0407
+&subvendor.id pci 0x1000
+&subdevice.id pci 0x0531
++subdevice.name MegaRAID 531 SCSI 320-4X RAID Controller
+
+ vendor.id pci 0x1000
+&device.id pci 0x0407
+&subvendor.id pci 0x1000
+&subdevice.id pci 0x0532
++subdevice.name MegaRAID 532 SCSI 320-2X RAID Controller
+
+ vendor.id pci 0x1000
+&device.id pci 0x0407
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x0531
++subdevice.name PowerEdge Expandable RAID Controller 4/QC
+
+ vendor.id pci 0x1000
+&device.id pci 0x0407
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x0533
++subdevice.name PowerEdge Expandable RAID Controller 4/QC
+
+ vendor.id pci 0x1000
+&device.id pci 0x0407
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x0530
++subdevice.name MegaRAID Intel RAID Controller SRCZCRX
+
+ vendor.id pci 0x1000
+&device.id pci 0x0407
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x0532
++subdevice.name MegaRAID Intel RAID Controller SRCU42X
+
+ vendor.id pci 0x1000
+&device.id pci 0x0408
++device.name MegaRAID
+
+ vendor.id pci 0x1000
+&device.id pci 0x0408
+&subvendor.id pci 0x1000
+&subdevice.id pci 0x0001
++subdevice.name MegaRAID SCSI 320-1E RAID Controller
+
+ vendor.id pci 0x1000
+&device.id pci 0x0408
+&subvendor.id pci 0x1000
+&subdevice.id pci 0x0002
++subdevice.name MegaRAID SCSI 320-2E RAID Controller
+
+ vendor.id pci 0x1000
+&device.id pci 0x0408
+&subvendor.id pci 0x1025
+&subdevice.id pci 0x004d
++subdevice.name MegaRAID ACER ROMB-2E RAID Controller
+
+ vendor.id pci 0x1000
+&device.id pci 0x0408
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x0001
++subdevice.name PowerEdge RAID Controller PERC4e/SC
+
+ vendor.id pci 0x1000
+&device.id pci 0x0408
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x0002
++subdevice.name PowerEdge RAID Controller PERC4e/DC
+
+ vendor.id pci 0x1000
+&device.id pci 0x0408
+&subvendor.id pci 0x1734
+&subdevice.id pci 0x1065
++subdevice.name FSC MegaRAID PCI Express ROMB
+
+ vendor.id pci 0x1000
+&device.id pci 0x0408
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x0002
++subdevice.name MegaRAID Intel RAID Controller SRCU42E
+
+ vendor.id pci 0x1000
+&device.id pci 0x0409
++device.name MegaRAID
+
+ vendor.id pci 0x1000
+&device.id pci 0x0409
+&subvendor.id pci 0x1000
+&subdevice.id pci 0x3004
++subdevice.name MegaRAID SATA 300-4X RAID Controller
+
+ vendor.id pci 0x1000
+&device.id pci 0x0409
+&subvendor.id pci 0x1000
+&subdevice.id pci 0x3008
++subdevice.name MegaRAID SATA 300-8X RAID Controller
+
+ vendor.id pci 0x1000
+&device.id pci 0x0409
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x3008
++subdevice.name MegaRAID RAID Controller SRCS28X
+
+ vendor.id pci 0x1000
+&device.id pci 0x0409
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x3431
++subdevice.name MegaRAID RAID Controller Alief SROMBU42E
+
+ vendor.id pci 0x1000
+&device.id pci 0x0409
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x3499
++subdevice.name MegaRAID RAID Controller Harwich SROMBU42E
+
+ vendor.id pci 0x1000
+&device.id pci 0x0621
++device.name FC909 Fibre Channel Adapter
+
+ vendor.id pci 0x1000
+&device.id pci 0x0622
++device.name FC929 Fibre Channel Adapter
+
+ vendor.id pci 0x1000
+&device.id pci 0x0622
+&subvendor.id pci 0x1000
+&subdevice.id pci 0x1020
++subdevice.name 44929 O Dual Fibre Channel card
+
+ vendor.id pci 0x1000
+&device.id pci 0x0623
++device.name FC929 LAN
+
+ vendor.id pci 0x1000
+&device.id pci 0x0624
++device.name FC919 Fibre Channel Adapter
+
+ vendor.id pci 0x1000
+&device.id pci 0x0625
++device.name FC919 LAN
+
+ vendor.id pci 0x1000
+&device.id pci 0x0626
++device.name FC929X Fibre Channel Adapter
+
+ vendor.id pci 0x1000
+&device.id pci 0x0626
+&subvendor.id pci 0x1000
+&subdevice.id pci 0x1010
++subdevice.name 7202-XP-LC Dual Fibre Channel card
+
+ vendor.id pci 0x1000
+&device.id pci 0x0627
++device.name FC929X LAN
+
+ vendor.id pci 0x1000
+&device.id pci 0x0628
++device.name FC919X Fibre Channel Adapter
+
+ vendor.id pci 0x1000
+&device.id pci 0x0629
++device.name FC919X LAN
+
+ vendor.id pci 0x1000
+&device.id pci 0x0701
++device.name 83C885 NT50 DigitalScape Fast Ethernet
+
+ vendor.id pci 0x1000
+&device.id pci 0x0702
++device.name Yellowfin G-NIC gigabit ethernet
+
+ vendor.id pci 0x1000
+&device.id pci 0x0702
+&subvendor.id pci 0x1318
+&subdevice.id pci 0x0000
++subdevice.name PEI100X
+
+ vendor.id pci 0x1000
+&device.id pci 0x0804
++device.name SA2010
+
+ vendor.id pci 0x1000
+&device.id pci 0x0805
++device.name SA2010ZC
+
+ vendor.id pci 0x1000
+&device.id pci 0x0806
++device.name SA2020
+
+ vendor.id pci 0x1000
+&device.id pci 0x0807
++device.name SA2020ZC
+
+ vendor.id pci 0x1000
+&device.id pci 0x0901
++device.name 61C102
+
+ vendor.id pci 0x1000
+&device.id pci 0x1000
++device.name 63C815
+
+ vendor.id pci 0x1000
+&device.id pci 0x1960
++device.name MegaRAID
+
+ vendor.id pci 0x1000
+&device.id pci 0x1960
+&subvendor.id pci 0x1000
+&subdevice.id pci 0x0518
++subdevice.name MegaRAID 518 SCSI 320-2 Controller
+
+ vendor.id pci 0x1000
+&device.id pci 0x1960
+&subvendor.id pci 0x1000
+&subdevice.id pci 0x0520
++subdevice.name MegaRAID 520 SCSI 320-1 Controller
+
+ vendor.id pci 0x1000
+&device.id pci 0x1960
+&subvendor.id pci 0x1000
+&subdevice.id pci 0x0522
++subdevice.name MegaRAID 522 i4 133 RAID Controller
+
+ vendor.id pci 0x1000
+&device.id pci 0x1960
+&subvendor.id pci 0x1000
+&subdevice.id pci 0x0523
++subdevice.name MegaRAID SATA 150-6 RAID Controller
+
+ vendor.id pci 0x1000
+&device.id pci 0x1960
+&subvendor.id pci 0x1000
+&subdevice.id pci 0x4523
++subdevice.name MegaRAID SATA 150-4 RAID Controller
+
+ vendor.id pci 0x1000
+&device.id pci 0x1960
+&subvendor.id pci 0x1000
+&subdevice.id pci 0xa520
++subdevice.name MegaRAID ZCR SCSI 320-0 Controller
+
+ vendor.id pci 0x1000
+&device.id pci 0x1960
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x0518
++subdevice.name MegaRAID 518 DELL PERC 4/DC RAID Controller
+
+ vendor.id pci 0x1000
+&device.id pci 0x1960
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x0520
++subdevice.name MegaRAID 520 DELL PERC 4/SC RAID Controller
+
+ vendor.id pci 0x1000
+&device.id pci 0x1960
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x0531
++subdevice.name PowerEdge Expandable RAID Controller 4/QC
+
+ vendor.id pci 0x1000
+&device.id pci 0x1960
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x0533
++subdevice.name PowerEdge Expandable RAID Controller 4/QC
+
+ vendor.id pci 0x1000
+&device.id pci 0x1960
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x0520
++subdevice.name MegaRAIDRAID Controller SRCU41L
+
+ vendor.id pci 0x1000
+&device.id pci 0x1960
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x0523
++subdevice.name MegaRAID RAID Controller SRCS16
+
+ vendor.id pci 0x1001
++vendor.name Kolter Electronic
+
+ vendor.id pci 0x1001
+&device.id pci 0x0010
++device.name PCI 1616 Measurement card with 32 digital I/O lines
+
+ vendor.id pci 0x1001
+&device.id pci 0x0011
++device.name OPTO-PCI Opto-Isolated digital I/O board
+
+ vendor.id pci 0x1001
+&device.id pci 0x0012
++device.name PCI-AD/DA Analogue I/O board
+
+ vendor.id pci 0x1001
+&device.id pci 0x0013
++device.name PCI-OPTO-RELAIS Digital I/O board with relay outputs
+
+ vendor.id pci 0x1001
+&device.id pci 0x0014
++device.name PCI-Counter/Timer Counter Timer board
+
+ vendor.id pci 0x1001
+&device.id pci 0x0015
++device.name PCI-DAC416 Analogue output board
+
+ vendor.id pci 0x1001
+&device.id pci 0x0016
++device.name PCI-MFB Analogue I/O board
+
+ vendor.id pci 0x1001
+&device.id pci 0x0017
++device.name PROTO-3 PCI Prototyping board
+
+ vendor.id pci 0x1001
+&device.id pci 0x9100
++device.name INI-9100/9100W SCSI Host
+
+ vendor.id pci 0x1002
++vendor.name ATI Technologies Inc
+
+ vendor.id pci 0x1002
+&device.id pci 0x3150
++device.name M24 1P [Radeon Mobility X600]
+
+ vendor.id pci 0x1002
+&device.id pci 0x3154
++device.name M24 1T [FireGL M24 GL]
+
+ vendor.id pci 0x1002
+&device.id pci 0x3e50
++device.name RV380 0x3e50 [Radeon X600]
+
+ vendor.id pci 0x1002
+&device.id pci 0x3e54
++device.name RV380 0x3e54 [FireGL V3200]
+
+ vendor.id pci 0x1002
+&device.id pci 0x3e70
++device.name RV380 [Radeon X600] Secondary
+
+ vendor.id pci 0x1002
+&device.id pci 0x4136
++device.name Radeon IGP 320 M
+
+ vendor.id pci 0x1002
+&device.id pci 0x4137
++device.name Radeon IGP330/340/350
+
+ vendor.id pci 0x1002
+&device.id pci 0x4144
++device.name R300 AD [Radeon 9500 Pro]
+
+ vendor.id pci 0x1002
+&device.id pci 0x4145
++device.name R300 AE [Radeon 9700 Pro]
+
+ vendor.id pci 0x1002
+&device.id pci 0x4146
++device.name R300 AF [Radeon 9700 Pro]
+
+ vendor.id pci 0x1002
+&device.id pci 0x4147
++device.name R300 AG [FireGL Z1/X1]
+
+ vendor.id pci 0x1002
+&device.id pci 0x4148
++device.name R350 AH [Radeon 9800]
+
+ vendor.id pci 0x1002
+&device.id pci 0x4149
++device.name R350 AI [Radeon 9800]
+
+ vendor.id pci 0x1002
+&device.id pci 0x414a
++device.name R350 AJ [Radeon 9800]
+
+ vendor.id pci 0x1002
+&device.id pci 0x414b
++device.name R350 AK [Fire GL X2]
+
+ vendor.id pci 0x1002
+&device.id pci 0x4150
++device.name RV350 AP [Radeon 9600]
+
+ vendor.id pci 0x1002
+&device.id pci 0x4150
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x0002
++subdevice.name R9600 Pro primary (Asus OEM for HP)
+
+ vendor.id pci 0x1002
+&device.id pci 0x4150
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x0003
++subdevice.name R9600 Pro secondary (Asus OEM for HP)
+
+ vendor.id pci 0x1002
+&device.id pci 0x4150
+&subvendor.id pci 0x1458
+&subdevice.id pci 0x4024
++subdevice.name Giga-Byte GV-R96128D Primary
+
+ vendor.id pci 0x1002
+&device.id pci 0x4150
+&subvendor.id pci 0x148c
+&subdevice.id pci 0x2064
++subdevice.name PowerColor R96A-C3N
+
+ vendor.id pci 0x1002
+&device.id pci 0x4150
+&subvendor.id pci 0x148c
+&subdevice.id pci 0x2066
++subdevice.name PowerColor R96A-C3N
+
+ vendor.id pci 0x1002
+&device.id pci 0x4150
+&subvendor.id pci 0x174b
+&subdevice.id pci 0x7c19
++subdevice.name Sapphire Atlantis Radeon 9600 Pro
+
+ vendor.id pci 0x1002
+&device.id pci 0x4150
+&subvendor.id pci 0x174b
+&subdevice.id pci 0x7c29
++subdevice.name GC-R9600PRO Primary [Sapphire]
+
+ vendor.id pci 0x1002
+&device.id pci 0x4150
+&subvendor.id pci 0x17ee
+&subdevice.id pci 0x2002
++subdevice.name Radeon 9600 256Mb Primary
+
+ vendor.id pci 0x1002
+&device.id pci 0x4150
+&subvendor.id pci 0x18bc
+&subdevice.id pci 0x0101
++subdevice.name GC-R9600PRO Primary
+
+ vendor.id pci 0x1002
+&device.id pci 0x4151
++device.name RV350 AQ [Radeon 9600]
+
+ vendor.id pci 0x1002
+&device.id pci 0x4151
+&subvendor.id pci 0x1043
+&subdevice.id pci 0xc004
++subdevice.name A9600SE
+
+ vendor.id pci 0x1002
+&device.id pci 0x4152
++device.name RV350 AR [Radeon 9600]
+
+ vendor.id pci 0x1002
+&device.id pci 0x4152
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x0002
++subdevice.name Radeon 9600XT
+
+ vendor.id pci 0x1002
+&device.id pci 0x4152
+&subvendor.id pci 0x1043
+&subdevice.id pci 0xc002
++subdevice.name Radeon 9600 XT TVD
+
+ vendor.id pci 0x1002
+&device.id pci 0x4153
++device.name RV350 AS [Radeon 9600 AS]
+
+ vendor.id pci 0x1002
+&device.id pci 0x4154
++device.name RV350 AT [Fire GL T2]
+
+ vendor.id pci 0x1002
+&device.id pci 0x4155
++device.name RV350 AU [Fire GL T2]
+
+ vendor.id pci 0x1002
+&device.id pci 0x4156
++device.name RV350 AV [Fire GL T2]
+
+ vendor.id pci 0x1002
+&device.id pci 0x4157
++device.name RV350 AW [Fire GL T2]
+
+ vendor.id pci 0x1002
+&device.id pci 0x4158
++device.name 68800AX [Mach32]
+
+ vendor.id pci 0x1002
+&device.id pci 0x4164
++device.name R300 AD [Radeon 9500 Pro] (Secondary)
+
+ vendor.id pci 0x1002
+&device.id pci 0x4165
++device.name R300 AE [Radeon 9700 Pro] (Secondary)
+
+ vendor.id pci 0x1002
+&device.id pci 0x4166
++device.name R300 AF [Radeon 9700 Pro] (Secondary)
+
+ vendor.id pci 0x1002
+&device.id pci 0x4168
++device.name Radeon R350 [Radeon 9800] (Secondary)
+
+ vendor.id pci 0x1002
+&device.id pci 0x4170
++device.name RV350 AP [Radeon 9600] (Secondary)
+
+ vendor.id pci 0x1002
+&device.id pci 0x4170
+&subvendor.id pci 0x1458
+&subdevice.id pci 0x4025
++subdevice.name Giga-Byte GV-R96128D Secondary
+
+ vendor.id pci 0x1002
+&device.id pci 0x4170
+&subvendor.id pci 0x148c
+&subdevice.id pci 0x2067
++subdevice.name PowerColor R96A-C3N (Secondary)
+
+ vendor.id pci 0x1002
+&device.id pci 0x4170
+&subvendor.id pci 0x174b
+&subdevice.id pci 0x7c28
++subdevice.name GC-R9600PRO Secondary [Sapphire]
+
+ vendor.id pci 0x1002
+&device.id pci 0x4170
+&subvendor.id pci 0x17ee
+&subdevice.id pci 0x2003
++subdevice.name Radeon 9600 256Mb Secondary
+
+ vendor.id pci 0x1002
+&device.id pci 0x4170
+&subvendor.id pci 0x18bc
+&subdevice.id pci 0x0100
++subdevice.name GC-R9600PRO Secondary
+
+ vendor.id pci 0x1002
+&device.id pci 0x4171
++device.name RV350 AQ [Radeon 9600] (Secondary)
+
+ vendor.id pci 0x1002
+&device.id pci 0x4171
+&subvendor.id pci 0x1043
+&subdevice.id pci 0xc005
++subdevice.name A9600SE (Secondary)
+
+ vendor.id pci 0x1002
+&device.id pci 0x4172
++device.name RV350 AR [Radeon 9600] (Secondary)
+
+ vendor.id pci 0x1002
+&device.id pci 0x4172
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x0003
++subdevice.name Radeon 9600XT (Secondary)
+
+ vendor.id pci 0x1002
+&device.id pci 0x4172
+&subvendor.id pci 0x1043
+&subdevice.id pci 0xc003
++subdevice.name A9600XT (Secondary)
+
+ vendor.id pci 0x1002
+&device.id pci 0x4173
++device.name RV350 ?? [Radeon 9550] (Secondary)
+
+ vendor.id pci 0x1002
+&device.id pci 0x4237
++device.name Radeon 7000 IGP
+
+ vendor.id pci 0x1002
+&device.id pci 0x4242
++device.name R200 BB [Radeon All in Wonder 8500DV]
+
+ vendor.id pci 0x1002
+&device.id pci 0x4242
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x02aa
++subdevice.name Radeon 8500 AIW DV Edition
+
+ vendor.id pci 0x1002
+&device.id pci 0x4243
++device.name R200 BC [Radeon All in Wonder 8500]
+
+ vendor.id pci 0x1002
+&device.id pci 0x4336
++device.name Radeon Mobility U1
+
+ vendor.id pci 0x1002
+&device.id pci 0x4336
+&subvendor.id pci 0x103c
+&subdevice.id pci 0x0024
++subdevice.name Pavilion ze4400 builtin Video
+
+ vendor.id pci 0x1002
+&device.id pci 0x4337
++device.name Radeon IGP 330M/340M/350M
+
+ vendor.id pci 0x1002
+&device.id pci 0x4337
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x053a
++subdevice.name ThinkPad R40e (2684-HVG) builtin VGA controller
+
+ vendor.id pci 0x1002
+&device.id pci 0x4337
+&subvendor.id pci 0x103c
+&subdevice.id pci 0x0850
++subdevice.name Radeon IGP 345M
+
+ vendor.id pci 0x1002
+&device.id pci 0x4341
++device.name IXP150 AC'97 Audio Controller
+
+ vendor.id pci 0x1002
+&device.id pci 0x4345
++device.name EHCI USB Controller
+
+ vendor.id pci 0x1002
+&device.id pci 0x4347
++device.name OHCI USB Controller #1
+
+ vendor.id pci 0x1002
+&device.id pci 0x4348
++device.name OHCI USB Controller #2
+
+ vendor.id pci 0x1002
+&device.id pci 0x434d
++device.name IXP AC'97 Modem
+
+ vendor.id pci 0x1002
+&device.id pci 0x4353
++device.name ATI SMBus
+
+ vendor.id pci 0x1002
+&device.id pci 0x4354
++device.name 215CT [Mach64 CT]
+
+ vendor.id pci 0x1002
+&device.id pci 0x4358
++device.name 210888CX [Mach64 CX]
+
+ vendor.id pci 0x1002
+&device.id pci 0x4437
++device.name Radeon Mobility 7000 IGP
+
+ vendor.id pci 0x1002
+&device.id pci 0x4554
++device.name 210888ET [Mach64 ET]
+
+ vendor.id pci 0x1002
+&device.id pci 0x4654
++device.name Mach64 VT
+
+ vendor.id pci 0x1002
+&device.id pci 0x4742
++device.name 3D Rage Pro AGP 1X/2X
+
+ vendor.id pci 0x1002
+&device.id pci 0x4742
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x0040
++subdevice.name Rage Pro Turbo AGP 2X
+
+ vendor.id pci 0x1002
+&device.id pci 0x4742
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x0044
++subdevice.name Rage Pro Turbo AGP 2X
+
+ vendor.id pci 0x1002
+&device.id pci 0x4742
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x0061
++subdevice.name Rage Pro AIW AGP 2X
+
+ vendor.id pci 0x1002
+&device.id pci 0x4742
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x0062
++subdevice.name Rage Pro AIW AGP 2X
+
+ vendor.id pci 0x1002
+&device.id pci 0x4742
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x0063
++subdevice.name Rage Pro AIW AGP 2X
+
+ vendor.id pci 0x1002
+&device.id pci 0x4742
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x0080
++subdevice.name Rage Pro Turbo AGP 2X
+
+ vendor.id pci 0x1002
+&device.id pci 0x4742
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x0084
++subdevice.name Rage Pro Turbo AGP 2X
+
+ vendor.id pci 0x1002
+&device.id pci 0x4742
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x4742
++subdevice.name Rage Pro Turbo AGP 2X
+
+ vendor.id pci 0x1002
+&device.id pci 0x4742
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x8001
++subdevice.name Rage Pro Turbo AGP 2X
+
+ vendor.id pci 0x1002
+&device.id pci 0x4742
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x0082
++subdevice.name Rage Pro Turbo AGP 2X
+
+ vendor.id pci 0x1002
+&device.id pci 0x4742
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x4082
++subdevice.name Optiplex GX1 Onboard Display Adapter
+
+ vendor.id pci 0x1002
+&device.id pci 0x4742
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x8082
++subdevice.name Rage Pro Turbo AGP 2X
+
+ vendor.id pci 0x1002
+&device.id pci 0x4742
+&subvendor.id pci 0x1028
+&subdevice.id pci 0xc082
++subdevice.name Rage Pro Turbo AGP 2X
+
+ vendor.id pci 0x1002
+&device.id pci 0x4742
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x4152
++subdevice.name Xpert 98D AGP 2X
+
+ vendor.id pci 0x1002
+&device.id pci 0x4742
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x464a
++subdevice.name Rage Pro Turbo AGP 2X
+
+ vendor.id pci 0x1002
+&device.id pci 0x4744
++device.name 3D Rage Pro AGP 1X
+
+ vendor.id pci 0x1002
+&device.id pci 0x4744
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x4744
++subdevice.name Rage Pro Turbo AGP
+
+ vendor.id pci 0x1002
+&device.id pci 0x4747
++device.name 3D Rage Pro
+
+ vendor.id pci 0x1002
+&device.id pci 0x4749
++device.name 3D Rage Pro
+
+ vendor.id pci 0x1002
+&device.id pci 0x4749
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x0061
++subdevice.name Rage Pro AIW
+
+ vendor.id pci 0x1002
+&device.id pci 0x4749
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x0062
++subdevice.name Rage Pro AIW
+
+ vendor.id pci 0x1002
+&device.id pci 0x474c
++device.name Rage XC
+
+ vendor.id pci 0x1002
+&device.id pci 0x474d
++device.name Rage XL AGP 2X
+
+ vendor.id pci 0x1002
+&device.id pci 0x474d
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x0004
++subdevice.name Xpert 98 RXL AGP 2X
+
+ vendor.id pci 0x1002
+&device.id pci 0x474d
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x0008
++subdevice.name Xpert 98 RXL AGP 2X
+
+ vendor.id pci 0x1002
+&device.id pci 0x474d
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x0080
++subdevice.name Rage XL AGP 2X
+
+ vendor.id pci 0x1002
+&device.id pci 0x474d
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x0084
++subdevice.name Xpert 98 AGP 2X
+
+ vendor.id pci 0x1002
+&device.id pci 0x474d
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x474d
++subdevice.name Rage XL AGP
+
+ vendor.id pci 0x1002
+&device.id pci 0x474d
+&subvendor.id pci 0x1033
+&subdevice.id pci 0x806a
++subdevice.name Rage XL AGP
+
+ vendor.id pci 0x1002
+&device.id pci 0x474e
++device.name Rage XC AGP
+
+ vendor.id pci 0x1002
+&device.id pci 0x474e
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x474e
++subdevice.name Rage XC AGP
+
+ vendor.id pci 0x1002
+&device.id pci 0x474f
++device.name Rage XL
+
+ vendor.id pci 0x1002
+&device.id pci 0x474f
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x0008
++subdevice.name Rage XL
+
+ vendor.id pci 0x1002
+&device.id pci 0x474f
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x474f
++subdevice.name Rage XL
+
+ vendor.id pci 0x1002
+&device.id pci 0x4750
++device.name 3D Rage Pro 215GP
+
+ vendor.id pci 0x1002
+&device.id pci 0x4750
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x0040
++subdevice.name Rage Pro Turbo
+
+ vendor.id pci 0x1002
+&device.id pci 0x4750
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x0044
++subdevice.name Rage Pro Turbo
+
+ vendor.id pci 0x1002
+&device.id pci 0x4750
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x0080
++subdevice.name Rage Pro Turbo
+
+ vendor.id pci 0x1002
+&device.id pci 0x4750
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x0084
++subdevice.name Rage Pro Turbo
+
+ vendor.id pci 0x1002
+&device.id pci 0x4750
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x4750
++subdevice.name Rage Pro Turbo
+
+ vendor.id pci 0x1002
+&device.id pci 0x4751
++device.name 3D Rage Pro 215GQ
+
+ vendor.id pci 0x1002
+&device.id pci 0x4752
++device.name Rage XL
+
+ vendor.id pci 0x1002
+&device.id pci 0x4752
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x0008
++subdevice.name Rage XL
+
+ vendor.id pci 0x1002
+&device.id pci 0x4752
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x4752
++subdevice.name Rage XL
+
+ vendor.id pci 0x1002
+&device.id pci 0x4752
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x8008
++subdevice.name Rage XL
+
+ vendor.id pci 0x1002
+&device.id pci 0x4752
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x00ce
++subdevice.name PowerEdge 1400
+
+ vendor.id pci 0x1002
+&device.id pci 0x4752
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x00d1
++subdevice.name PowerEdge 2550
+
+ vendor.id pci 0x1002
+&device.id pci 0x4752
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x00d9
++subdevice.name PowerEdge 2500
+
+ vendor.id pci 0x1002
+&device.id pci 0x4752
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x3411
++subdevice.name SDS2 Mainboard
+
+ vendor.id pci 0x1002
+&device.id pci 0x4752
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x3427
++subdevice.name S875WP1-E mainboard
+
+ vendor.id pci 0x1002
+&device.id pci 0x4753
++device.name Rage XC
+
+ vendor.id pci 0x1002
+&device.id pci 0x4753
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x4753
++subdevice.name Rage XC
+
+ vendor.id pci 0x1002
+&device.id pci 0x4754
++device.name 3D Rage I/II 215GT [Mach64 GT]
+
+ vendor.id pci 0x1002
+&device.id pci 0x4755
++device.name 3D Rage II+ 215GTB [Mach64 GTB]
+
+ vendor.id pci 0x1002
+&device.id pci 0x4756
++device.name 3D Rage IIC 215IIC [Mach64 GT IIC]
+
+ vendor.id pci 0x1002
+&device.id pci 0x4756
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x4756
++subdevice.name Rage IIC
+
+ vendor.id pci 0x1002
+&device.id pci 0x4757
++device.name 3D Rage IIC AGP
+
+ vendor.id pci 0x1002
+&device.id pci 0x4757
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x4757
++subdevice.name Rage IIC AGP
+
+ vendor.id pci 0x1002
+&device.id pci 0x4757
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x0089
++subdevice.name Rage 3D IIC
+
+ vendor.id pci 0x1002
+&device.id pci 0x4757
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x4082
++subdevice.name Rage 3D IIC
+
+ vendor.id pci 0x1002
+&device.id pci 0x4757
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x8082
++subdevice.name Rage 3D IIC
+
+ vendor.id pci 0x1002
+&device.id pci 0x4757
+&subvendor.id pci 0x1028
+&subdevice.id pci 0xc082
++subdevice.name Rage 3D IIC
+
+ vendor.id pci 0x1002
+&device.id pci 0x4758
++device.name 210888GX [Mach64 GX]
+
+ vendor.id pci 0x1002
+&device.id pci 0x4759
++device.name 3D Rage IIC
+
+ vendor.id pci 0x1002
+&device.id pci 0x475a
++device.name 3D Rage IIC AGP
+
+ vendor.id pci 0x1002
+&device.id pci 0x475a
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x0084
++subdevice.name Rage 3D Pro AGP 2x XPERT 98
+
+ vendor.id pci 0x1002
+&device.id pci 0x475a
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x0087
++subdevice.name Rage 3D IIC
+
+ vendor.id pci 0x1002
+&device.id pci 0x475a
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x475a
++subdevice.name Rage IIC AGP
+
+ vendor.id pci 0x1002
+&device.id pci 0x4964
++device.name Radeon RV250 Id [Radeon 9000]
+
+ vendor.id pci 0x1002
+&device.id pci 0x4965
++device.name Radeon RV250 Ie [Radeon 9000]
+
+ vendor.id pci 0x1002
+&device.id pci 0x4966
++device.name Radeon RV250 If [Radeon 9000]
+
+ vendor.id pci 0x1002
+&device.id pci 0x4966
+&subvendor.id pci 0x10f1
+&subdevice.id pci 0x0002
++subdevice.name RV250 If [Tachyon G9000 PRO]
+
+ vendor.id pci 0x1002
+&device.id pci 0x4966
+&subvendor.id pci 0x148c
+&subdevice.id pci 0x2039
++subdevice.name RV250 If [Radeon 9000 Pro "Evil Commando"]
+
+ vendor.id pci 0x1002
+&device.id pci 0x4966
+&subvendor.id pci 0x1509
+&subdevice.id pci 0x9a00
++subdevice.name RV250 If [Radeon 9000 "AT009"]
+
+ vendor.id pci 0x1002
+&device.id pci 0x4966
+&subvendor.id pci 0x1681
+&subdevice.id pci 0x0040
++subdevice.name RV250 If [3D prophet 9000]
+
+ vendor.id pci 0x1002
+&device.id pci 0x4966
+&subvendor.id pci 0x174b
+&subdevice.id pci 0x7176
++subdevice.name RV250 If [Sapphire Radeon 9000 Pro]
+
+ vendor.id pci 0x1002
+&device.id pci 0x4966
+&subvendor.id pci 0x174b
+&subdevice.id pci 0x7192
++subdevice.name RV250 If [Radeon 9000 "Atlantis"]
+
+ vendor.id pci 0x1002
+&device.id pci 0x4966
+&subvendor.id pci 0x17af
+&subdevice.id pci 0x2005
++subdevice.name RV250 If [Excalibur Radeon 9000 Pro]
+
+ vendor.id pci 0x1002
+&device.id pci 0x4966
+&subvendor.id pci 0x17af
+&subdevice.id pci 0x2006
++subdevice.name RV250 If [Excalibur Radeon 9000]
+
+ vendor.id pci 0x1002
+&device.id pci 0x4967
++device.name Radeon RV250 Ig [Radeon 9000]
+
+ vendor.id pci 0x1002
+&device.id pci 0x496e
++device.name Radeon RV250 [Radeon 9000] (Secondary)
+
+ vendor.id pci 0x1002
+&device.id pci 0x4a48
++device.name R420 JH [Radeon X800]
+
+ vendor.id pci 0x1002
+&device.id pci 0x4a49
++device.name R420 JI [Radeon X800PRO]
+
+ vendor.id pci 0x1002
+&device.id pci 0x4a4a
++device.name R420 JJ [Radeon X800SE]
+
+ vendor.id pci 0x1002
+&device.id pci 0x4a4b
++device.name R420 JK [Radeon X800]
+
+ vendor.id pci 0x1002
+&device.id pci 0x4a4c
++device.name R420 JL [Radeon X800]
+
+ vendor.id pci 0x1002
+&device.id pci 0x4a4d
++device.name R420 JM [FireGL X3]
+
+ vendor.id pci 0x1002
+&device.id pci 0x4a4e
++device.name M18 JN [Radeon Mobility 9800]
+
+ vendor.id pci 0x1002
+&device.id pci 0x4a50
++device.name R420 JP [Radeon X800XT]
+
+ vendor.id pci 0x1002
+&device.id pci 0x4a70
++device.name R420 [X800XT-PE] (Secondary)
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c42
++device.name 3D Rage LT Pro AGP-133
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c42
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0xb0e7
++subdevice.name Rage LT Pro (Compaq Presario 5240)
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c42
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0xb0e8
++subdevice.name Rage 3D LT Pro
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c42
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0xb10e
++subdevice.name 3D Rage LT Pro (Compaq Armada 1750)
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c42
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x0040
++subdevice.name Rage LT Pro AGP 2X
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c42
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x0044
++subdevice.name Rage LT Pro AGP 2X
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c42
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x4c42
++subdevice.name Rage LT Pro AGP 2X
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c42
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x8001
++subdevice.name Rage LT Pro AGP 2X
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c42
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x0085
++subdevice.name Rage 3D LT Pro
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c44
++device.name 3D Rage LT Pro AGP-66
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c45
++device.name Rage Mobility M3 AGP
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c46
++device.name Rage Mobility M3 AGP 2x
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c46
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x00b1
++subdevice.name Latitude C600
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c47
++device.name 3D Rage LT-G 215LG
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c49
++device.name 3D Rage LT Pro
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c49
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x0004
++subdevice.name Rage LT Pro
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c49
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x0040
++subdevice.name Rage LT Pro
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c49
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x0044
++subdevice.name Rage LT Pro
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c49
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x4c49
++subdevice.name Rage LT Pro
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c4d
++device.name Rage Mobility P/M AGP 2x
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c4d
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0xb111
++subdevice.name Armada M700
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c4d
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0xb160
++subdevice.name Armada E500
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c4d
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x0084
++subdevice.name Xpert 98 AGP 2X (Mobility)
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c4d
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x0154
++subdevice.name ThinkPad A20m
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c4d
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x00aa
++subdevice.name Latitude CPt
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c4e
++device.name Rage Mobility L AGP 2x
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c50
++device.name 3D Rage LT Pro
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c50
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x4c50
++subdevice.name Rage LT Pro
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c51
++device.name 3D Rage LT Pro
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c52
++device.name Rage Mobility P/M
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c52
+&subvendor.id pci 0x1033
+&subdevice.id pci 0x8112
++subdevice.name Versa Note VXi
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c53
++device.name Rage Mobility L
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c54
++device.name 264LT [Mach64 LT]
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c57
++device.name Radeon Mobility M7 LW [Radeon Mobility 7500]
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c57
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x0517
++subdevice.name ThinkPad T30
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c57
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x00e6
++subdevice.name Radeon Mobility M7 LW (Dell Inspiron 8100)
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c57
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x012a
++subdevice.name Latitude C640
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c57
+&subvendor.id pci 0x144d
+&subdevice.id pci 0xc006
++subdevice.name Radeon Mobility M7 LW in vpr Matrix 170B4
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c58
++device.name Radeon RV200 LX [Mobility FireGL 7800 M7]
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c59
++device.name Radeon Mobility M6 LY
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c59
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x0235
++subdevice.name ThinkPad A30/A30p (2652/2653)
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c59
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x0239
++subdevice.name ThinkPad X22/X23/X24
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c59
+&subvendor.id pci 0x104d
+&subdevice.id pci 0x80e7
++subdevice.name VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c5a
++device.name Radeon Mobility M6 LZ
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c64
++device.name Radeon R250 Ld [Radeon Mobility 9000 M9]
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c65
++device.name Radeon R250 Le [Radeon Mobility 9000 M9]
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c66
++device.name Radeon R250 Lf [FireGL 9000]
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c67
++device.name Radeon R250 Lg [Radeon Mobility 9000 M9]
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c6e
++device.name Radeon R250 Ln [Radeon Mobility 9000 M9] [Secondary]
+
+ vendor.id pci 0x1002
+&device.id pci 0x4d46
++device.name Rage Mobility M4 AGP
+
+ vendor.id pci 0x1002
+&device.id pci 0x4d4c
++device.name Rage Mobility M4 AGP
+
+ vendor.id pci 0x1002
+&device.id pci 0x4e44
++device.name Radeon R300 ND [Radeon 9700 Pro]
+
+ vendor.id pci 0x1002
+&device.id pci 0x4e45
++device.name Radeon R300 NE [Radeon 9500 Pro]
+
+ vendor.id pci 0x1002
+&device.id pci 0x4e45
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x0002
++subdevice.name Radeon R300 NE [Radeon 9500 Pro]
+
+ vendor.id pci 0x1002
+&device.id pci 0x4e45
+&subvendor.id pci 0x1681
+&subdevice.id pci 0x0002
++subdevice.name Hercules 3D Prophet 9500 PRO [Radeon 9500 Pro]
+
+ vendor.id pci 0x1002
+&device.id pci 0x4e46
++device.name RV350 NF [Radeon 9600]
+
+ vendor.id pci 0x1002
+&device.id pci 0x4e47
++device.name Radeon R300 NG [FireGL X1]
+
+ vendor.id pci 0x1002
+&device.id pci 0x4e48
++device.name Radeon R350 [Radeon 9800 Pro]
+
+ vendor.id pci 0x1002
+&device.id pci 0x4e49
++device.name Radeon R350 [Radeon 9800]
+
+ vendor.id pci 0x1002
+&device.id pci 0x4e4a
++device.name RV350 NJ [Radeon 9800 XT]
+
+ vendor.id pci 0x1002
+&device.id pci 0x4e4b
++device.name R350 NK [Fire GL X2]
+
+ vendor.id pci 0x1002
+&device.id pci 0x4e50
++device.name RV350 [Mobility Radeon 9600 M10]
+
+ vendor.id pci 0x1002
+&device.id pci 0x4e50
+&subvendor.id pci 0x1025
+&subdevice.id pci 0x005a
++subdevice.name TravelMate 290
+
+ vendor.id pci 0x1002
+&device.id pci 0x4e50
+&subvendor.id pci 0x103c
+&subdevice.id pci 0x0890
++subdevice.name NC6000 laptop
+
+ vendor.id pci 0x1002
+&device.id pci 0x4e50
+&subvendor.id pci 0x1734
+&subdevice.id pci 0x1055
++subdevice.name Amilo M1420W
+
+ vendor.id pci 0x1002
+&device.id pci 0x4e51
++device.name M10 NQ [Radeon Mobility 9600]
+
+ vendor.id pci 0x1002
+&device.id pci 0x4e52
++device.name RV350 [Mobility Radeon 9600 M10]
+
+ vendor.id pci 0x1002
+&device.id pci 0x4e53
++device.name M10 NS [Radeon Mobility 9600]
+
+ vendor.id pci 0x1002
+&device.id pci 0x4e54
++device.name M10 NT [FireGL Mobility T2]
+
+ vendor.id pci 0x1002
+&device.id pci 0x4e56
++device.name M11 NV [FireGL Mobility T2e]
+
+ vendor.id pci 0x1002
+&device.id pci 0x4e64
++device.name Radeon R300 [Radeon 9700 Pro] (Secondary)
+
+ vendor.id pci 0x1002
+&device.id pci 0x4e65
++device.name Radeon R300 [Radeon 9500 Pro] (Secondary)
+
+ vendor.id pci 0x1002
+&device.id pci 0x4e65
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x0003
++subdevice.name Radeon R300 NE [Radeon 9500 Pro]
+
+ vendor.id pci 0x1002
+&device.id pci 0x4e65
+&subvendor.id pci 0x1681
+&subdevice.id pci 0x0003
++subdevice.name Hercules 3D Prophet 9500 PRO [Radeon 9500 Pro] (Secondary)
+
+ vendor.id pci 0x1002
+&device.id pci 0x4e66
++device.name RV350 NF [Radeon 9600] (Secondary)
+
+ vendor.id pci 0x1002
+&device.id pci 0x4e67
++device.name Radeon R300 [FireGL X1] (Secondary)
+
+ vendor.id pci 0x1002
+&device.id pci 0x4e68
++device.name Radeon R350 [Radeon 9800 Pro] (Secondary)
+
+ vendor.id pci 0x1002
+&device.id pci 0x4e69
++device.name Radeon R350 [Radeon 9800] (Secondary)
+
+ vendor.id pci 0x1002
+&device.id pci 0x4e6a
++device.name RV350 NJ [Radeon 9800 XT] (Secondary)
+
+ vendor.id pci 0x1002
+&device.id pci 0x5041
++device.name Rage 128 PA/PRO
+
+ vendor.id pci 0x1002
+&device.id pci 0x5042
++device.name Rage 128 PB/PRO AGP 2x
+
+ vendor.id pci 0x1002
+&device.id pci 0x5043
++device.name Rage 128 PC/PRO AGP 4x
+
+ vendor.id pci 0x1002
+&device.id pci 0x5044
++device.name Rage 128 PD/PRO TMDS
+
+ vendor.id pci 0x1002
+&device.id pci 0x5044
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x0028
++subdevice.name Rage 128 AIW
+
+ vendor.id pci 0x1002
+&device.id pci 0x5044
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x0029
++subdevice.name Rage 128 AIW
+
+ vendor.id pci 0x1002
+&device.id pci 0x5045
++device.name Rage 128 PE/PRO AGP 2x TMDS
+
+ vendor.id pci 0x1002
+&device.id pci 0x5046
++device.name Rage 128 PF/PRO AGP 4x TMDS
+
+ vendor.id pci 0x1002
+&device.id pci 0x5046
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x0004
++subdevice.name Rage Fury Pro
+
+ vendor.id pci 0x1002
+&device.id pci 0x5046
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x0008
++subdevice.name Rage Fury Pro/Xpert 2000 Pro
+
+ vendor.id pci 0x1002
+&device.id pci 0x5046
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x0014
++subdevice.name Rage Fury Pro
+
+ vendor.id pci 0x1002
+&device.id pci 0x5046
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x0018
++subdevice.name Rage Fury Pro/Xpert 2000 Pro
+
+ vendor.id pci 0x1002
+&device.id pci 0x5046
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x0028
++subdevice.name Rage 128 Pro AIW AGP
+
+ vendor.id pci 0x1002
+&device.id pci 0x5046
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x002a
++subdevice.name Rage 128 Pro AIW AGP
+
+ vendor.id pci 0x1002
+&device.id pci 0x5046
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x0048
++subdevice.name Rage Fury Pro
+
+ vendor.id pci 0x1002
+&device.id pci 0x5046
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x2000
++subdevice.name Rage Fury MAXX AGP 4x (TMDS) (VGA device)
+
+ vendor.id pci 0x1002
+&device.id pci 0x5046
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x2001
++subdevice.name Rage Fury MAXX AGP 4x (TMDS) (Extra device?!)
+
+ vendor.id pci 0x1002
+&device.id pci 0x5047
++device.name Rage 128 PG/PRO
+
+ vendor.id pci 0x1002
+&device.id pci 0x5048
++device.name Rage 128 PH/PRO AGP 2x
+
+ vendor.id pci 0x1002
+&device.id pci 0x5049
++device.name Rage 128 PI/PRO AGP 4x
+
+ vendor.id pci 0x1002
+&device.id pci 0x504a
++device.name Rage 128 PJ/PRO TMDS
+
+ vendor.id pci 0x1002
+&device.id pci 0x504b
++device.name Rage 128 PK/PRO AGP 2x TMDS
+
+ vendor.id pci 0x1002
+&device.id pci 0x504c
++device.name Rage 128 PL/PRO AGP 4x TMDS
+
+ vendor.id pci 0x1002
+&device.id pci 0x504d
++device.name Rage 128 PM/PRO
+
+ vendor.id pci 0x1002
+&device.id pci 0x504e
++device.name Rage 128 PN/PRO AGP 2x
+
+ vendor.id pci 0x1002
+&device.id pci 0x504f
++device.name Rage 128 PO/PRO AGP 4x
+
+ vendor.id pci 0x1002
+&device.id pci 0x5050
++device.name Rage 128 PP/PRO TMDS [Xpert 128]
+
+ vendor.id pci 0x1002
+&device.id pci 0x5050
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x0008
++subdevice.name Xpert 128
+
+ vendor.id pci 0x1002
+&device.id pci 0x5051
++device.name Rage 128 PQ/PRO AGP 2x TMDS
+
+ vendor.id pci 0x1002
+&device.id pci 0x5052
++device.name Rage 128 PR/PRO AGP 4x TMDS
+
+ vendor.id pci 0x1002
+&device.id pci 0x5053
++device.name Rage 128 PS/PRO
+
+ vendor.id pci 0x1002
+&device.id pci 0x5054
++device.name Rage 128 PT/PRO AGP 2x
+
+ vendor.id pci 0x1002
+&device.id pci 0x5055
++device.name Rage 128 PU/PRO AGP 4x
+
+ vendor.id pci 0x1002
+&device.id pci 0x5056
++device.name Rage 128 PV/PRO TMDS
+
+ vendor.id pci 0x1002
+&device.id pci 0x5057
++device.name Rage 128 PW/PRO AGP 2x TMDS
+
+ vendor.id pci 0x1002
+&device.id pci 0x5058
++device.name Rage 128 PX/PRO AGP 4x TMDS
+
+ vendor.id pci 0x1002
+&device.id pci 0x5144
++device.name Radeon R100 QD [Radeon 7200]
+
+ vendor.id pci 0x1002
+&device.id pci 0x5144
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x0008
++subdevice.name Radeon 7000/Radeon VE
+
+ vendor.id pci 0x1002
+&device.id pci 0x5144
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x0009
++subdevice.name Radeon 7000/Radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x5144
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x000a
++subdevice.name Radeon 7000/Radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x5144
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x001a
++subdevice.name Radeon 7000/Radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x5144
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x0029
++subdevice.name Radeon AIW
+
+ vendor.id pci 0x1002
+&device.id pci 0x5144
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x0038
++subdevice.name Radeon 7000/Radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x5144
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x0039
++subdevice.name Radeon 7000/Radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x5144
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x008a
++subdevice.name Radeon 7000/Radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x5144
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x00ba
++subdevice.name Radeon 7000/Radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x5144
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x0139
++subdevice.name Radeon 7000/Radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x5144
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x028a
++subdevice.name Radeon 7000/Radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x5144
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x02aa
++subdevice.name Radeon AIW
+
+ vendor.id pci 0x1002
+&device.id pci 0x5144
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x053a
++subdevice.name Radeon 7000/Radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x5145
++device.name Radeon R100 QE
+
+ vendor.id pci 0x1002
+&device.id pci 0x5146
++device.name Radeon R100 QF
+
+ vendor.id pci 0x1002
+&device.id pci 0x5147
++device.name Radeon R100 QG
+
+ vendor.id pci 0x1002
+&device.id pci 0x5148
++device.name Radeon R200 QH [Radeon 8500]
+
+ vendor.id pci 0x1002
+&device.id pci 0x5148
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x010a
++subdevice.name FireGL 8800 64Mb
+
+ vendor.id pci 0x1002
+&device.id pci 0x5148
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x0152
++subdevice.name FireGL 8800 128Mb
+
+ vendor.id pci 0x1002
+&device.id pci 0x5148
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x0162
++subdevice.name FireGL 8700 32Mb
+
+ vendor.id pci 0x1002
+&device.id pci 0x5148
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x0172
++subdevice.name FireGL 8700 64Mb
+
+ vendor.id pci 0x1002
+&device.id pci 0x5149
++device.name Radeon R200 QI
+
+ vendor.id pci 0x1002
+&device.id pci 0x514a
++device.name Radeon R200 QJ
+
+ vendor.id pci 0x1002
+&device.id pci 0x514b
++device.name Radeon R200 QK
+
+ vendor.id pci 0x1002
+&device.id pci 0x514c
++device.name Radeon R200 QL [Radeon 8500 LE]
+
+ vendor.id pci 0x1002
+&device.id pci 0x514c
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x003a
++subdevice.name Radeon R200 QL [Radeon 8500 LE]
+
+ vendor.id pci 0x1002
+&device.id pci 0x514c
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x013a
++subdevice.name Radeon 8500
+
+ vendor.id pci 0x1002
+&device.id pci 0x514c
+&subvendor.id pci 0x148c
+&subdevice.id pci 0x2026
++subdevice.name R200 QL [Radeon 8500 Evil Master II Multi Display Edition]
+
+ vendor.id pci 0x1002
+&device.id pci 0x514c
+&subvendor.id pci 0x1681
+&subdevice.id pci 0x0010
++subdevice.name Radeon 8500 [3D Prophet 8500 128Mb]
+
+ vendor.id pci 0x1002
+&device.id pci 0x514c
+&subvendor.id pci 0x174b
+&subdevice.id pci 0x7149
++subdevice.name Radeon R200 QL [Sapphire Radeon 8500 LE]
+
+ vendor.id pci 0x1002
+&device.id pci 0x514d
++device.name Radeon R200 QM [Radeon 9100]
+
+ vendor.id pci 0x1002
+&device.id pci 0x514e
++device.name Radeon R200 QN [Radeon 8500LE]
+
+ vendor.id pci 0x1002
+&device.id pci 0x514f
++device.name Radeon R200 QO [Radeon 8500LE]
+
+ vendor.id pci 0x1002
+&device.id pci 0x5154
++device.name R200 QT [Radeon 8500]
+
+ vendor.id pci 0x1002
+&device.id pci 0x5155
++device.name R200 QU [Radeon 9100]
+
+ vendor.id pci 0x1002
+&device.id pci 0x5157
++device.name Radeon RV200 QW [Radeon 7500]
+
+ vendor.id pci 0x1002
+&device.id pci 0x5157
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x013a
++subdevice.name Radeon 7500
+
+ vendor.id pci 0x1002
+&device.id pci 0x5157
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x103a
++subdevice.name Dell Optiplex GX260
+
+ vendor.id pci 0x1002
+&device.id pci 0x5157
+&subvendor.id pci 0x1458
+&subdevice.id pci 0x4000
++subdevice.name RV200 QW [RADEON 7500 PRO MAYA AR]
+
+ vendor.id pci 0x1002
+&device.id pci 0x5157
+&subvendor.id pci 0x148c
+&subdevice.id pci 0x2024
++subdevice.name RV200 QW [Radeon 7500LE Dual Display]
+
+ vendor.id pci 0x1002
+&device.id pci 0x5157
+&subvendor.id pci 0x148c
+&subdevice.id pci 0x2025
++subdevice.name RV200 QW [Radeon 7500 Evil Master Multi Display Edition]
+
+ vendor.id pci 0x1002
+&device.id pci 0x5157
+&subvendor.id pci 0x148c
+&subdevice.id pci 0x2036
++subdevice.name RV200 QW [Radeon 7500 PCI Dual Display]
+
+ vendor.id pci 0x1002
+&device.id pci 0x5157
+&subvendor.id pci 0x174b
+&subdevice.id pci 0x7146
++subdevice.name RV200 QW [Radeon 7500 LE]
+
+ vendor.id pci 0x1002
+&device.id pci 0x5157
+&subvendor.id pci 0x174b
+&subdevice.id pci 0x7147
++subdevice.name RV200 QW [Sapphire Radeon 7500LE]
+
+ vendor.id pci 0x1002
+&device.id pci 0x5157
+&subvendor.id pci 0x174b
+&subdevice.id pci 0x7161
++subdevice.name Radeon RV200 QW [Radeon 7500 LE]
+
+ vendor.id pci 0x1002
+&device.id pci 0x5157
+&subvendor.id pci 0x17af
+&subdevice.id pci 0x0202
++subdevice.name RV200 QW [Excalibur Radeon 7500LE]
+
+ vendor.id pci 0x1002
+&device.id pci 0x5158
++device.name Radeon RV200 QX [Radeon 7500]
+
+ vendor.id pci 0x1002
+&device.id pci 0x5159
++device.name Radeon RV100 QY [Radeon 7000/VE]
+
+ vendor.id pci 0x1002
+&device.id pci 0x5159
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x000a
++subdevice.name Radeon 7000/Radeon VE
+
+ vendor.id pci 0x1002
+&device.id pci 0x5159
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x000b
++subdevice.name Radeon 7000
+
+ vendor.id pci 0x1002
+&device.id pci 0x5159
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x0038
++subdevice.name Radeon 7000/Radeon VE
+
+ vendor.id pci 0x1002
+&device.id pci 0x5159
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x003a
++subdevice.name Radeon 7000/Radeon VE
+
+ vendor.id pci 0x1002
+&device.id pci 0x5159
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x00ba
++subdevice.name Radeon 7000/Radeon VE
+
+ vendor.id pci 0x1002
+&device.id pci 0x5159
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x013a
++subdevice.name Radeon 7000/Radeon VE
+
+ vendor.id pci 0x1002
+&device.id pci 0x5159
+&subvendor.id pci 0x1458
+&subdevice.id pci 0x4002
++subdevice.name RV100 QY [RADEON 7000 PRO MAYA AV Series]
+
+ vendor.id pci 0x1002
+&device.id pci 0x5159
+&subvendor.id pci 0x148c
+&subdevice.id pci 0x2003
++subdevice.name RV100 QY [Radeon 7000 Multi-Display Edition]
+
+ vendor.id pci 0x1002
+&device.id pci 0x5159
+&subvendor.id pci 0x148c
+&subdevice.id pci 0x2023
++subdevice.name RV100 QY [Radeon 7000 Evil Master Multi-Display]
+
+ vendor.id pci 0x1002
+&device.id pci 0x5159
+&subvendor.id pci 0x174b
+&subdevice.id pci 0x7112
++subdevice.name RV100 QY [Sapphire Radeon VE 7000]
+
+ vendor.id pci 0x1002
+&device.id pci 0x5159
+&subvendor.id pci 0x174b
+&subdevice.id pci 0x7c28
++subdevice.name Sapphire Radeon VE 7000 DDR
+
+ vendor.id pci 0x1002
+&device.id pci 0x5159
+&subvendor.id pci 0x1787
+&subdevice.id pci 0x0202
++subdevice.name RV100 QY [Excalibur Radeon 7000]
+
+ vendor.id pci 0x1002
+&device.id pci 0x515a
++device.name Radeon RV100 QZ [Radeon 7000/VE]
+
+ vendor.id pci 0x1002
+&device.id pci 0x5168
++device.name Radeon R200 Qh
+
+ vendor.id pci 0x1002
+&device.id pci 0x5169
++device.name Radeon R200 Qi
+
+ vendor.id pci 0x1002
+&device.id pci 0x516a
++device.name Radeon R200 Qj
+
+ vendor.id pci 0x1002
+&device.id pci 0x516b
++device.name Radeon R200 Qk
+
+ vendor.id pci 0x1002
+&device.id pci 0x516c
++device.name Radeon R200 Ql
+
+ vendor.id pci 0x1002
+&device.id pci 0x5245
++device.name Rage 128 RE/SG
+
+ vendor.id pci 0x1002
+&device.id pci 0x5245
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x0008
++subdevice.name Xpert 128
+
+ vendor.id pci 0x1002
+&device.id pci 0x5245
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x0028
++subdevice.name Rage 128 AIW
+
+ vendor.id pci 0x1002
+&device.id pci 0x5245
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x0029
++subdevice.name Rage 128 AIW
+
+ vendor.id pci 0x1002
+&device.id pci 0x5245
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x0068
++subdevice.name Rage 128 AIW
+
+ vendor.id pci 0x1002
+&device.id pci 0x5246
++device.name Rage 128 RF/SG AGP
+
+ vendor.id pci 0x1002
+&device.id pci 0x5246
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x0004
++subdevice.name Magnum/Xpert 128/Xpert 99
+
+ vendor.id pci 0x1002
+&device.id pci 0x5246
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x0008
++subdevice.name Magnum/Xpert128/X99/Xpert2000
+
+ vendor.id pci 0x1002
+&device.id pci 0x5246
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x0028
++subdevice.name Rage 128 AIW AGP
+
+ vendor.id pci 0x1002
+&device.id pci 0x5246
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x0044
++subdevice.name Rage Fury/Xpert 128/Xpert 2000
+
+ vendor.id pci 0x1002
+&device.id pci 0x5246
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x0068
++subdevice.name Rage 128 AIW AGP
+
+ vendor.id pci 0x1002
+&device.id pci 0x5246
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x0448
++subdevice.name Rage Fury
+
+ vendor.id pci 0x1002
+&device.id pci 0x5247
++device.name Rage 128 RG
+
+ vendor.id pci 0x1002
+&device.id pci 0x524b
++device.name Rage 128 RK/VR
+
+ vendor.id pci 0x1002
+&device.id pci 0x524c
++device.name Rage 128 RL/VR AGP
+
+ vendor.id pci 0x1002
+&device.id pci 0x524c
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x0008
++subdevice.name Xpert 99/Xpert 2000
+
+ vendor.id pci 0x1002
+&device.id pci 0x524c
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x0088
++subdevice.name Xpert 99
+
+ vendor.id pci 0x1002
+&device.id pci 0x5345
++device.name Rage 128 SE/4x
+
+ vendor.id pci 0x1002
+&device.id pci 0x5346
++device.name Rage 128 SF/4x AGP 2x
+
+ vendor.id pci 0x1002
+&device.id pci 0x5346
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x0048
++subdevice.name RAGE 128 16MB VGA TVOUT AMC PAL
+
+ vendor.id pci 0x1002
+&device.id pci 0x5347
++device.name Rage 128 SG/4x AGP 4x
+
+ vendor.id pci 0x1002
+&device.id pci 0x5348
++device.name Rage 128 SH
+
+ vendor.id pci 0x1002
+&device.id pci 0x534b
++device.name Rage 128 SK/4x
+
+ vendor.id pci 0x1002
+&device.id pci 0x534c
++device.name Rage 128 SL/4x AGP 2x
+
+ vendor.id pci 0x1002
+&device.id pci 0x534d
++device.name Rage 128 SM/4x AGP 4x
+
+ vendor.id pci 0x1002
+&device.id pci 0x534d
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x0008
++subdevice.name Xpert 99/Xpert 2000
+
+ vendor.id pci 0x1002
+&device.id pci 0x534d
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x0018
++subdevice.name Xpert 2000
+
+ vendor.id pci 0x1002
+&device.id pci 0x534e
++device.name Rage 128 4x
+
+ vendor.id pci 0x1002
+&device.id pci 0x5354
++device.name Mach 64 VT
+
+ vendor.id pci 0x1002
+&device.id pci 0x5354
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x5654
++subdevice.name Mach 64 reference
+
+ vendor.id pci 0x1002
+&device.id pci 0x5446
++device.name Rage 128 Pro Ultra TF
+
+ vendor.id pci 0x1002
+&device.id pci 0x5446
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x0004
++subdevice.name Rage Fury Pro
+
+ vendor.id pci 0x1002
+&device.id pci 0x5446
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x0008
++subdevice.name Rage Fury Pro/Xpert 2000 Pro
+
+ vendor.id pci 0x1002
+&device.id pci 0x5446
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x0018
++subdevice.name Rage Fury Pro/Xpert 2000 Pro
+
+ vendor.id pci 0x1002
+&device.id pci 0x5446
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x0028
++subdevice.name Rage 128 AIW Pro AGP
+
+ vendor.id pci 0x1002
+&device.id pci 0x5446
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x0029
++subdevice.name Rage 128 AIW
+
+ vendor.id pci 0x1002
+&device.id pci 0x5446
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x002a
++subdevice.name Rage 128 AIW Pro AGP
+
+ vendor.id pci 0x1002
+&device.id pci 0x5446
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x002b
++subdevice.name Rage 128 AIW
+
+ vendor.id pci 0x1002
+&device.id pci 0x5446
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x0048
++subdevice.name Xpert 2000 Pro
+
+ vendor.id pci 0x1002
+&device.id pci 0x544c
++device.name Rage 128 Pro Ultra TL
+
+ vendor.id pci 0x1002
+&device.id pci 0x5452
++device.name Rage 128 Pro Ultra TR
+
+ vendor.id pci 0x1002
+&device.id pci 0x5452
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x001c
++subdevice.name Rage 128 Pro 4XL
+
+ vendor.id pci 0x1002
+&device.id pci 0x5452
+&subvendor.id pci 0x103c
+&subdevice.id pci 0x1279
++subdevice.name Rage 128 Pro 4XL
+
+ vendor.id pci 0x1002
+&device.id pci 0x5453
++device.name Rage 128 Pro Ultra TS
+
+ vendor.id pci 0x1002
+&device.id pci 0x5454
++device.name Rage 128 Pro Ultra TT
+
+ vendor.id pci 0x1002
+&device.id pci 0x5455
++device.name Rage 128 Pro Ultra TU
+
+ vendor.id pci 0x1002
+&device.id pci 0x5460
++device.name M22 [Radeon Mobility M300]
+
+ vendor.id pci 0x1002
+&device.id pci 0x5464
++device.name M22 [FireGL GL]
+
+ vendor.id pci 0x1002
+&device.id pci 0x5548
++device.name R423 UH [Radeon X800 (PCIE)]
+
+ vendor.id pci 0x1002
+&device.id pci 0x5549
++device.name R423 UI [Radeon X800PRO (PCIE)]
+
+ vendor.id pci 0x1002
+&device.id pci 0x554a
++device.name R423 UJ [Radeon X800LE (PCIE)]
+
+ vendor.id pci 0x1002
+&device.id pci 0x554b
++device.name R423 UK [Radeon X800SE (PCIE)]
+
+ vendor.id pci 0x1002
+&device.id pci 0x5551
++device.name R423 UQ [FireGL V7200 (PCIE)]
+
+ vendor.id pci 0x1002
+&device.id pci 0x5552
++device.name R423 UR [FireGL V5100 (PCIE)]
+
+ vendor.id pci 0x1002
+&device.id pci 0x5554
++device.name R423 UT [FireGL V7100 (PCIE)]
+
+ vendor.id pci 0x1002
+&device.id pci 0x556b
++device.name Radeon R423 UK (PCIE) [X800 SE] (Secondary)
+
+ vendor.id pci 0x1002
+&device.id pci 0x5654
++device.name 264VT [Mach64 VT]
+
+ vendor.id pci 0x1002
+&device.id pci 0x5654
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x5654
++subdevice.name Mach64VT Reference
+
+ vendor.id pci 0x1002
+&device.id pci 0x5655
++device.name 264VT3 [Mach64 VT3]
+
+ vendor.id pci 0x1002
+&device.id pci 0x5656
++device.name 264VT4 [Mach64 VT4]
+
+ vendor.id pci 0x1002
+&device.id pci 0x5830
++device.name RS300 Host Bridge
+
+ vendor.id pci 0x1002
+&device.id pci 0x5831
++device.name RS300 Host Bridge
+
+ vendor.id pci 0x1002
+&device.id pci 0x5832
++device.name RS300 Host Bridge
+
+ vendor.id pci 0x1002
+&device.id pci 0x5833
++device.name Radeon 9100 IGP Host Bridge
+
+ vendor.id pci 0x1002
+&device.id pci 0x5834
++device.name Radeon 9100 IGP
+
+ vendor.id pci 0x1002
+&device.id pci 0x5835
++device.name RS300M AGP [Radeon Mobility 9100IGP]
+
+ vendor.id pci 0x1002
+&device.id pci 0x5838
++device.name Radeon 9100 IGP AGP Bridge
+
+ vendor.id pci 0x1002
+&device.id pci 0x5941
++device.name RV280 [Radeon 9200] (Secondary)
+
+ vendor.id pci 0x1002
+&device.id pci 0x5941
+&subvendor.id pci 0x174b
+&subdevice.id pci 0x7c12
++subdevice.name Sapphire Radeon 9200
+
+ vendor.id pci 0x1002
+&device.id pci 0x5941
+&subvendor.id pci 0x17af
+&subdevice.id pci 0x200d
++subdevice.name Excalibur Radeon 9200
+
+ vendor.id pci 0x1002
+&device.id pci 0x5941
+&subvendor.id pci 0x18bc
+&subdevice.id pci 0x0050
++subdevice.name GeXcube GC-R9200-C3 (Secondary)
+
+ vendor.id pci 0x1002
+&device.id pci 0x5944
++device.name RV280 [Radeon 9200 SE (PCI)]
+
+ vendor.id pci 0x1002
+&device.id pci 0x5960
++device.name RV280 [Radeon 9200 PRO]
+
+ vendor.id pci 0x1002
+&device.id pci 0x5961
++device.name RV280 [Radeon 9200]
+
+ vendor.id pci 0x1002
+&device.id pci 0x5961
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x2f72
++subdevice.name All-in-Wonder 9200 Series
+
+ vendor.id pci 0x1002
+&device.id pci 0x5961
+&subvendor.id pci 0x12ab
+&subdevice.id pci 0x5961
++subdevice.name YUAN SMARTVGA Radeon 9200
+
+ vendor.id pci 0x1002
+&device.id pci 0x5961
+&subvendor.id pci 0x1458
+&subdevice.id pci 0x4018
++subdevice.name Gigabyte Radeon 9200
+
+ vendor.id pci 0x1002
+&device.id pci 0x5961
+&subvendor.id pci 0x174b
+&subdevice.id pci 0x7c13
++subdevice.name Sapphire Radeon 9200
+
+ vendor.id pci 0x1002
+&device.id pci 0x5961
+&subvendor.id pci 0x17af
+&subdevice.id pci 0x200c
++subdevice.name Excalibur Radeon 9200
+
+ vendor.id pci 0x1002
+&device.id pci 0x5961
+&subvendor.id pci 0x18bc
+&subdevice.id pci 0x0050
++subdevice.name Radeon 9200 Game Buster
+
+ vendor.id pci 0x1002
+&device.id pci 0x5961
+&subvendor.id pci 0x18bc
+&subdevice.id pci 0x0051
++subdevice.name GeXcube GC-R9200-C3
+
+ vendor.id pci 0x1002
+&device.id pci 0x5961
+&subvendor.id pci 0x18bc
+&subdevice.id pci 0x0053
++subdevice.name Radeon 9200 Game Buster VIVO
+
+ vendor.id pci 0x1002
+&device.id pci 0x5962
++device.name RV280 [Radeon 9200]
+
+ vendor.id pci 0x1002
+&device.id pci 0x5964
++device.name RV280 [Radeon 9200 SE]
+
+ vendor.id pci 0x1002
+&device.id pci 0x5964
+&subvendor.id pci 0x1043
+&subdevice.id pci 0xc006
++subdevice.name ASUS Radeon 9200 SE / TD / 128M
+
+ vendor.id pci 0x1002
+&device.id pci 0x5964
+&subvendor.id pci 0x1458
+&subdevice.id pci 0x4018
++subdevice.name Radeon 9200 SE
+
+ vendor.id pci 0x1002
+&device.id pci 0x5964
+&subvendor.id pci 0x148c
+&subdevice.id pci 0x2073
++subdevice.name CN-AG92E
+
+ vendor.id pci 0x1002
+&device.id pci 0x5964
+&subvendor.id pci 0x174b
+&subdevice.id pci 0x7c13
++subdevice.name Sapphire Radeon 9200 SE
+
+ vendor.id pci 0x1002
+&device.id pci 0x5964
+&subvendor.id pci 0x1787
+&subdevice.id pci 0x5964
++subdevice.name Excalibur 9200SE VIVO 128M
+
+ vendor.id pci 0x1002
+&device.id pci 0x5964
+&subvendor.id pci 0x17af
+&subdevice.id pci 0x2012
++subdevice.name Radeon 9200 SE Excalibur
+
+ vendor.id pci 0x1002
+&device.id pci 0x5964
+&subvendor.id pci 0x18bc
+&subdevice.id pci 0x0170
++subdevice.name Sapphire Radeon 9200 SE 128MB Game Buster
+
+ vendor.id pci 0x1002
+&device.id pci 0x5964
+&subvendor.id pci 0x18bc
+&subdevice.id pci 0x0173
++subdevice.name GC-R9200L(SE)-C3H [Radeon 9200 Game Buster]
+
+ vendor.id pci 0x1002
+&device.id pci 0x5b60
++device.name RV370 5B60 [Radeon X300 (PCIE)]
+
+ vendor.id pci 0x1002
+&device.id pci 0x5b60
+&subvendor.id pci 0x1043
+&subdevice.id pci 0x002a
++subdevice.name EAX300SE
+
+ vendor.id pci 0x1002
+&device.id pci 0x5b62
++device.name RV370 5B62 [Radeon X600 (PCIE)]
+
+ vendor.id pci 0x1002
+&device.id pci 0x5b64
++device.name RV370 5B64 [FireGL V3100 (PCIE)]
+
+ vendor.id pci 0x1002
+&device.id pci 0x5b65
++device.name RV370 5B65 [FireGL D1100 (PCIE)]
+
+ vendor.id pci 0x1002
+&device.id pci 0x5c61
++device.name M9+ 5C61 [Radeon Mobility 9200 (AGP)]
+
+ vendor.id pci 0x1002
+&device.id pci 0x5c63
++device.name M9+ 5C63 [Radeon Mobility 9200 (AGP)]
+
+ vendor.id pci 0x1002
+&device.id pci 0x5d44
++device.name RV280 [Radeon 9200 SE] (Secondary)
+
+ vendor.id pci 0x1002
+&device.id pci 0x5d44
+&subvendor.id pci 0x1458
+&subdevice.id pci 0x4019
++subdevice.name Radeon 9200 SE (Secondary)
+
+ vendor.id pci 0x1002
+&device.id pci 0x5d44
+&subvendor.id pci 0x174b
+&subdevice.id pci 0x7c12
++subdevice.name Sapphire Radeon 9200 SE (Secondary)
+
+ vendor.id pci 0x1002
+&device.id pci 0x5d44
+&subvendor.id pci 0x1787
+&subdevice.id pci 0x5965
++subdevice.name Excalibur 9200SE VIVO 128M (Secondary)
+
+ vendor.id pci 0x1002
+&device.id pci 0x5d44
+&subvendor.id pci 0x17af
+&subdevice.id pci 0x2013
++subdevice.name Radeon 9200 SE Excalibur (Secondary)
+
+ vendor.id pci 0x1002
+&device.id pci 0x5d44
+&subvendor.id pci 0x18bc
+&subdevice.id pci 0x0171
++subdevice.name Radeon 9200 SE 128MB Game Buster (Secondary)
+
+ vendor.id pci 0x1002
+&device.id pci 0x5d44
+&subvendor.id pci 0x18bc
+&subdevice.id pci 0x0172
++subdevice.name GC-R9200L(SE)-C3H [Radeon 9200 Game Buster]
+
+ vendor.id pci 0x1002
+&device.id pci 0x5d57
++device.name R423 5F57 [Radeon X800XT (PCIE)]
+
+ vendor.id pci 0x1002
+&device.id pci 0x700f
++device.name PCI Bridge [IGP 320M]
+
+ vendor.id pci 0x1002
+&device.id pci 0x7010
++device.name PCI Bridge [IGP 340M]
+
+ vendor.id pci 0x1002
+&device.id pci 0x7834
++device.name Radeon 9100 PRO IGP
+
+ vendor.id pci 0x1002
+&device.id pci 0x7835
++device.name Radeon Mobility 9200 IGP
+
+ vendor.id pci 0x1002
+&device.id pci 0x7c37
++device.name RV350 AQ [Radeon 9600 SE]
+
+ vendor.id pci 0x1002
+&device.id pci 0xcab0
++device.name AGP Bridge [IGP 320M]
+
+ vendor.id pci 0x1002
+&device.id pci 0xcab2
++device.name RS200/RS200M AGP Bridge [IGP 340M]
+
+ vendor.id pci 0x1002
+&device.id pci 0xcbb2
++device.name RS200/RS200M AGP Bridge [IGP 340M]
+
+ vendor.id pci 0x1003
++vendor.name ULSI Systems
+
+ vendor.id pci 0x1003
+&device.id pci 0x0201
++device.name US201
+
+ vendor.id pci 0x1004
++vendor.name VLSI Technology Inc
+
+ vendor.id pci 0x1004
+&device.id pci 0x0005
++device.name 82C592-FC1
+
+ vendor.id pci 0x1004
+&device.id pci 0x0006
++device.name 82C593-FC1
+
+ vendor.id pci 0x1004
+&device.id pci 0x0007
++device.name 82C594-AFC2
+
+ vendor.id pci 0x1004
+&device.id pci 0x0008
++device.name 82C596/7 [Wildcat]
+
+ vendor.id pci 0x1004
+&device.id pci 0x0009
++device.name 82C597-AFC2
+
+ vendor.id pci 0x1004
+&device.id pci 0x000c
++device.name 82C541 [Lynx]
+
+ vendor.id pci 0x1004
+&device.id pci 0x000d
++device.name 82C543 [Lynx]
+
+ vendor.id pci 0x1004
+&device.id pci 0x0101
++device.name 82C532
+
+ vendor.id pci 0x1004
+&device.id pci 0x0102
++device.name 82C534 [Eagle]
+
+ vendor.id pci 0x1004
+&device.id pci 0x0103
++device.name 82C538
+
+ vendor.id pci 0x1004
+&device.id pci 0x0104
++device.name 82C535
+
+ vendor.id pci 0x1004
+&device.id pci 0x0105
++device.name 82C147
+
+ vendor.id pci 0x1004
+&device.id pci 0x0200
++device.name 82C975
+
+ vendor.id pci 0x1004
+&device.id pci 0x0280
++device.name 82C925
+
+ vendor.id pci 0x1004
+&device.id pci 0x0304
++device.name QSound ThunderBird PCI Audio
+
+ vendor.id pci 0x1004
+&device.id pci 0x0304
+&subvendor.id pci 0x1004
+&subdevice.id pci 0x0304
++subdevice.name QSound ThunderBird PCI Audio
+
+ vendor.id pci 0x1004
+&device.id pci 0x0304
+&subvendor.id pci 0x122d
+&subdevice.id pci 0x1206
++subdevice.name DSP368 Audio
+
+ vendor.id pci 0x1004
+&device.id pci 0x0304
+&subvendor.id pci 0x1483
+&subdevice.id pci 0x5020
++subdevice.name XWave Thunder 3D Audio
+
+ vendor.id pci 0x1004
+&device.id pci 0x0305
++device.name QSound ThunderBird PCI Audio Gameport
+
+ vendor.id pci 0x1004
+&device.id pci 0x0305
+&subvendor.id pci 0x1004
+&subdevice.id pci 0x0305
++subdevice.name QSound ThunderBird PCI Audio Gameport
+
+ vendor.id pci 0x1004
+&device.id pci 0x0305
+&subvendor.id pci 0x122d
+&subdevice.id pci 0x1207
++subdevice.name DSP368 Audio Gameport
+
+ vendor.id pci 0x1004
+&device.id pci 0x0305
+&subvendor.id pci 0x1483
+&subdevice.id pci 0x5021
++subdevice.name XWave Thunder 3D Audio Gameport
+
+ vendor.id pci 0x1004
+&device.id pci 0x0306
++device.name QSound ThunderBird PCI Audio Support Registers
+
+ vendor.id pci 0x1004
+&device.id pci 0x0306
+&subvendor.id pci 0x1004
+&subdevice.id pci 0x0306
++subdevice.name QSound ThunderBird PCI Audio Support Registers
+
+ vendor.id pci 0x1004
+&device.id pci 0x0306
+&subvendor.id pci 0x122d
+&subdevice.id pci 0x1208
++subdevice.name DSP368 Audio Support Registers
+
+ vendor.id pci 0x1004
+&device.id pci 0x0306
+&subvendor.id pci 0x1483
+&subdevice.id pci 0x5022
++subdevice.name XWave Thunder 3D Audio Support Registers
+
+ vendor.id pci 0x1004
+&device.id pci 0x0307
++device.name Thunderbird
+
+ vendor.id pci 0x1004
+&device.id pci 0x0308
++device.name Thunderbird
+
+ vendor.id pci 0x1004
+&device.id pci 0x0702
++device.name VAS96011 [Golden Gate II]
+
+ vendor.id pci 0x1004
+&device.id pci 0x0703
++device.name Tollgate
+
+ vendor.id pci 0x1005
++vendor.name Avance Logic Inc. [ALI]
+
+ vendor.id pci 0x1005
+&device.id pci 0x2064
++device.name ALG2032/2064
+
+ vendor.id pci 0x1005
+&device.id pci 0x2128
++device.name ALG2364A
+
+ vendor.id pci 0x1005
+&device.id pci 0x2301
++device.name ALG2301
+
+ vendor.id pci 0x1005
+&device.id pci 0x2302
++device.name ALG2302
+
+ vendor.id pci 0x1005
+&device.id pci 0x2364
++device.name ALG2364
+
+ vendor.id pci 0x1005
+&device.id pci 0x2464
++device.name ALG2364A
+
+ vendor.id pci 0x1005
+&device.id pci 0x2501
++device.name ALG2564A/25128A
+
+ vendor.id pci 0x1006
++vendor.name Reply Group
+
+ vendor.id pci 0x1007
++vendor.name NetFrame Systems Inc
+
+ vendor.id pci 0x1008
++vendor.name Epson
+
+ vendor.id pci 0x100a
++vendor.name Phoenix Technologies
+
+ vendor.id pci 0x100b
++vendor.name National Semiconductor Corporation
+
+ vendor.id pci 0x100b
+&device.id pci 0x0001
++device.name DP83810
+
+ vendor.id pci 0x100b
+&device.id pci 0x0002
++device.name 87415/87560 IDE
+
+ vendor.id pci 0x100b
+&device.id pci 0x000e
++device.name 87560 Legacy I/O
+
+ vendor.id pci 0x100b
+&device.id pci 0x000f
++device.name FireWire Controller
+
+ vendor.id pci 0x100b
+&device.id pci 0x0011
++device.name NS87560 National PCI System I/O
+
+ vendor.id pci 0x100b
+&device.id pci 0x0012
++device.name USB Controller
+
+ vendor.id pci 0x100b
+&device.id pci 0x0020
++device.name DP83815 (MacPhyter) Ethernet Controller
+
+ vendor.id pci 0x100b
+&device.id pci 0x0020
+&subvendor.id pci 0x103c
+&subdevice.id pci 0x0024
++subdevice.name Pavilion ze4400 builtin Network
+
+ vendor.id pci 0x100b
+&device.id pci 0x0020
+&subvendor.id pci 0x1385
+&subdevice.id pci 0xf311
++subdevice.name FA311 / FA312 (FA311 with WoL HW)
+
+ vendor.id pci 0x100b
+&device.id pci 0x0022
++device.name DP83820 10/100/1000 Ethernet Controller
+
+ vendor.id pci 0x100b
+&device.id pci 0x0028
++device.name CS5535 Host bridge
+
+ vendor.id pci 0x100b
+&device.id pci 0x002b
++device.name CS5535 ISA bridge
+
+ vendor.id pci 0x100b
+&device.id pci 0x002d
++device.name CS5535 IDE
+
+ vendor.id pci 0x100b
+&device.id pci 0x002e
++device.name CS5535 Audio
+
+ vendor.id pci 0x100b
+&device.id pci 0x002f
++device.name CS5535 USB
+
+ vendor.id pci 0x100b
+&device.id pci 0x0030
++device.name CS5535 Video
+
+ vendor.id pci 0x100b
+&device.id pci 0x0035
++device.name DP83065 [Saturn] 10/100/1000 Ethernet Controller
+
+ vendor.id pci 0x100b
+&device.id pci 0x0500
++device.name SCx200 Bridge
+
+ vendor.id pci 0x100b
+&device.id pci 0x0501
++device.name SCx200 SMI
+
+ vendor.id pci 0x100b
+&device.id pci 0x0502
++device.name SCx200 IDE
+
+ vendor.id pci 0x100b
+&device.id pci 0x0503
++device.name SCx200 Audio
+
+ vendor.id pci 0x100b
+&device.id pci 0x0504
++device.name SCx200 Video
+
+ vendor.id pci 0x100b
+&device.id pci 0x0505
++device.name SCx200 XBus
+
+ vendor.id pci 0x100b
+&device.id pci 0x0510
++device.name SC1100 Bridge
+
+ vendor.id pci 0x100b
+&device.id pci 0x0511
++device.name SC1100 SMI
+
+ vendor.id pci 0x100b
+&device.id pci 0x0515
++device.name SC1100 XBus
+
+ vendor.id pci 0x100b
+&device.id pci 0xd001
++device.name 87410 IDE
+
+ vendor.id pci 0x100c
++vendor.name Tseng Labs Inc
+
+ vendor.id pci 0x100c
+&device.id pci 0x3202
++device.name ET4000/W32p rev A
+
+ vendor.id pci 0x100c
+&device.id pci 0x3205
++device.name ET4000/W32p rev B
+
+ vendor.id pci 0x100c
+&device.id pci 0x3206
++device.name ET4000/W32p rev C
+
+ vendor.id pci 0x100c
+&device.id pci 0x3207
++device.name ET4000/W32p rev D
+
+ vendor.id pci 0x100c
+&device.id pci 0x3208
++device.name ET6000
+
+ vendor.id pci 0x100c
+&device.id pci 0x4702
++device.name ET6300
+
+ vendor.id pci 0x100d
++vendor.name AST Research Inc
+
+ vendor.id pci 0x100e
++vendor.name Weitek
+
+ vendor.id pci 0x100e
+&device.id pci 0x9000
++device.name P9000 Viper
+
+ vendor.id pci 0x100e
+&device.id pci 0x9001
++device.name P9000 Viper
+
+ vendor.id pci 0x100e
+&device.id pci 0x9002
++device.name P9000 Viper
+
+ vendor.id pci 0x100e
+&device.id pci 0x9100
++device.name P9100 Viper Pro/SE
+
+ vendor.id pci 0x1010
++vendor.name Video Logic, Ltd.
+
+ vendor.id pci 0x1011
++vendor.name Digital Equipment Corporation
+
+ vendor.id pci 0x1011
+&device.id pci 0x0001
++device.name DECchip 21050
+
+ vendor.id pci 0x1011
+&device.id pci 0x0002
++device.name DECchip 21040 [Tulip]
+
+ vendor.id pci 0x1011
+&device.id pci 0x0004
++device.name DECchip 21030 [TGA]
+
+ vendor.id pci 0x1011
+&device.id pci 0x0007
++device.name NVRAM [Zephyr NVRAM]
+
+ vendor.id pci 0x1011
+&device.id pci 0x0008
++device.name KZPSA [KZPSA]
+
+ vendor.id pci 0x1011
+&device.id pci 0x0009
++device.name DECchip 21140 [FasterNet]
+
+ vendor.id pci 0x1011
+&device.id pci 0x0009
+&subvendor.id pci 0x1025
+&subdevice.id pci 0x0310
++subdevice.name 21140 Fast Ethernet
+
+ vendor.id pci 0x1011
+&device.id pci 0x0009
+&subvendor.id pci 0x10b8
+&subdevice.id pci 0x2001
++subdevice.name SMC9332BDT EtherPower 10/100
+
+ vendor.id pci 0x1011
+&device.id pci 0x0009
+&subvendor.id pci 0x10b8
+&subdevice.id pci 0x2002
++subdevice.name SMC9332BVT EtherPower T4 10/100
+
+ vendor.id pci 0x1011
+&device.id pci 0x0009
+&subvendor.id pci 0x10b8
+&subdevice.id pci 0x2003
++subdevice.name SMC9334BDT EtherPower 10/100 (1-port)
+
+ vendor.id pci 0x1011
+&device.id pci 0x0009
+&subvendor.id pci 0x1109
+&subdevice.id pci 0x2400
++subdevice.name ANA-6944A/TX Fast Ethernet
+
+ vendor.id pci 0x1011
+&device.id pci 0x0009
+&subvendor.id pci 0x1112
+&subdevice.id pci 0x2300
++subdevice.name RNS2300 Fast Ethernet
+
+ vendor.id pci 0x1011
+&device.id pci 0x0009
+&subvendor.id pci 0x1112
+&subdevice.id pci 0x2320
++subdevice.name RNS2320 Fast Ethernet
+
+ vendor.id pci 0x1011
+&device.id pci 0x0009
+&subvendor.id pci 0x1112
+&subdevice.id pci 0x2340
++subdevice.name RNS2340 Fast Ethernet
+
+ vendor.id pci 0x1011
+&device.id pci 0x0009
+&subvendor.id pci 0x1113
+&subdevice.id pci 0x1207
++subdevice.name EN-1207-TX Fast Ethernet
+
+ vendor.id pci 0x1011
+&device.id pci 0x0009
+&subvendor.id pci 0x1186
+&subdevice.id pci 0x1100
++subdevice.name DFE-500TX Fast Ethernet
+
+ vendor.id pci 0x1011
+&device.id pci 0x0009
+&subvendor.id pci 0x1186
+&subdevice.id pci 0x1112
++subdevice.name DFE-570TX Fast Ethernet
+
+ vendor.id pci 0x1011
+&device.id pci 0x0009
+&subvendor.id pci 0x1186
+&subdevice.id pci 0x1140
++subdevice.name DFE-660 Cardbus Ethernet 10/100
+
+ vendor.id pci 0x1011
+&device.id pci 0x0009
+&subvendor.id pci 0x1186
+&subdevice.id pci 0x1142
++subdevice.name DFE-660 Cardbus Ethernet 10/100
+
+ vendor.id pci 0x1011
+&device.id pci 0x0009
+&subvendor.id pci 0x11f6
+&subdevice.id pci 0x0503
++subdevice.name Freedomline Fast Ethernet
+
+ vendor.id pci 0x1011
+&device.id pci 0x0009
+&subvendor.id pci 0x1282
+&subdevice.id pci 0x9100
++subdevice.name AEF-380TXD Fast Ethernet
+
+ vendor.id pci 0x1011
+&device.id pci 0x0009
+&subvendor.id pci 0x1385
+&subdevice.id pci 0x1100
++subdevice.name FA310TX Fast Ethernet
+
+ vendor.id pci 0x1011
+&device.id pci 0x0009
+&subvendor.id pci 0x2646
+&subdevice.id pci 0x0001
++subdevice.name KNE100TX Fast Ethernet
+
+ vendor.id pci 0x1011
+&device.id pci 0x000a
++device.name 21230 Video Codec
+
+ vendor.id pci 0x1011
+&device.id pci 0x000d
++device.name PBXGB [TGA2]
+
+ vendor.id pci 0x1011
+&device.id pci 0x000f
++device.name DEFPA
+
+ vendor.id pci 0x1011
+&device.id pci 0x0014
++device.name DECchip 21041 [Tulip Pass 3]
+
+ vendor.id pci 0x1011
+&device.id pci 0x0014
+&subvendor.id pci 0x1186
+&subdevice.id pci 0x0100
++subdevice.name DE-530+
+
+ vendor.id pci 0x1011
+&device.id pci 0x0016
++device.name DGLPB [OPPO]
+
+ vendor.id pci 0x1011
+&device.id pci 0x0017
++device.name PV-PCI Graphics Controller (ZLXp-L)
+
+ vendor.id pci 0x1011
+&device.id pci 0x0019
++device.name DECchip 21142/43
+
+ vendor.id pci 0x1011
+&device.id pci 0x0019
+&subvendor.id pci 0x1011
+&subdevice.id pci 0x500a
++subdevice.name DE500A Fast Ethernet
+
+ vendor.id pci 0x1011
+&device.id pci 0x0019
+&subvendor.id pci 0x1011
+&subdevice.id pci 0x500b
++subdevice.name DE500B Fast Ethernet
+
+ vendor.id pci 0x1011
+&device.id pci 0x0019
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x0001
++subdevice.name 10/100 EtherJet Cardbus
+
+ vendor.id pci 0x1011
+&device.id pci 0x0019
+&subvendor.id pci 0x1025
+&subdevice.id pci 0x0315
++subdevice.name ALN315 Fast Ethernet
+
+ vendor.id pci 0x1011
+&device.id pci 0x0019
+&subvendor.id pci 0x1033
+&subdevice.id pci 0x800c
++subdevice.name PC-9821-CS01 100BASE-TX Interface Card
+
+ vendor.id pci 0x1011
+&device.id pci 0x0019
+&subvendor.id pci 0x1033
+&subdevice.id pci 0x800d
++subdevice.name PC-9821NR-B06 100BASE-TX Interface Card
+
+ vendor.id pci 0x1011
+&device.id pci 0x0019
+&subvendor.id pci 0x108d
+&subdevice.id pci 0x0016
++subdevice.name Rapidfire 2327 10/100 Ethernet
+
+ vendor.id pci 0x1011
+&device.id pci 0x0019
+&subvendor.id pci 0x108d
+&subdevice.id pci 0x0017
++subdevice.name GoCard 2250 Ethernet 10/100 Cardbus
+
+ vendor.id pci 0x1011
+&device.id pci 0x0019
+&subvendor.id pci 0x10b8
+&subdevice.id pci 0x2005
++subdevice.name SMC8032DT Extreme Ethernet 10/100
+
+ vendor.id pci 0x1011
+&device.id pci 0x0019
+&subvendor.id pci 0x10b8
+&subdevice.id pci 0x8034
++subdevice.name SMC8034 Extreme Ethernet 10/100
+
+ vendor.id pci 0x1011
+&device.id pci 0x0019
+&subvendor.id pci 0x10ef
+&subdevice.id pci 0x8169
++subdevice.name Cardbus Fast Ethernet
+
+ vendor.id pci 0x1011
+&device.id pci 0x0019
+&subvendor.id pci 0x1109
+&subdevice.id pci 0x2a00
++subdevice.name ANA-6911A/TX Fast Ethernet
+
+ vendor.id pci 0x1011
+&device.id pci 0x0019
+&subvendor.id pci 0x1109
+&subdevice.id pci 0x2b00
++subdevice.name ANA-6911A/TXC Fast Ethernet
+
+ vendor.id pci 0x1011
+&device.id pci 0x0019
+&subvendor.id pci 0x1109
+&subdevice.id pci 0x3000
++subdevice.name ANA-6922/TX Fast Ethernet
+
+ vendor.id pci 0x1011
+&device.id pci 0x0019
+&subvendor.id pci 0x1113
+&subdevice.id pci 0x1207
++subdevice.name Cheetah Fast Ethernet
+
+ vendor.id pci 0x1011
+&device.id pci 0x0019
+&subvendor.id pci 0x1113
+&subdevice.id pci 0x2220
++subdevice.name Cardbus Fast Ethernet
+
+ vendor.id pci 0x1011
+&device.id pci 0x0019
+&subvendor.id pci 0x115d
+&subdevice.id pci 0x0002
++subdevice.name Cardbus Ethernet 10/100
+
+ vendor.id pci 0x1011
+&device.id pci 0x0019
+&subvendor.id pci 0x1179
+&subdevice.id pci 0x0203
++subdevice.name Fast Ethernet
+
+ vendor.id pci 0x1011
+&device.id pci 0x0019
+&subvendor.id pci 0x1179
+&subdevice.id pci 0x0204
++subdevice.name Cardbus Fast Ethernet
+
+ vendor.id pci 0x1011
+&device.id pci 0x0019
+&subvendor.id pci 0x1186
+&subdevice.id pci 0x1100
++subdevice.name DFE-500TX Fast Ethernet
+
+ vendor.id pci 0x1011
+&device.id pci 0x0019
+&subvendor.id pci 0x1186
+&subdevice.id pci 0x1101
++subdevice.name DFE-500TX Fast Ethernet
+
+ vendor.id pci 0x1011
+&device.id pci 0x0019
+&subvendor.id pci 0x1186
+&subdevice.id pci 0x1102
++subdevice.name DFE-500TX Fast Ethernet
+
+ vendor.id pci 0x1011
+&device.id pci 0x0019
+&subvendor.id pci 0x1186
+&subdevice.id pci 0x1112
++subdevice.name DFE-570TX Quad Fast Ethernet
+
+ vendor.id pci 0x1011
+&device.id pci 0x0019
+&subvendor.id pci 0x1259
+&subdevice.id pci 0x2800
++subdevice.name AT-2800Tx Fast Ethernet
+
+ vendor.id pci 0x1011
+&device.id pci 0x0019
+&subvendor.id pci 0x1266
+&subdevice.id pci 0x0004
++subdevice.name Eagle Fast EtherMAX
+
+ vendor.id pci 0x1011
+&device.id pci 0x0019
+&subvendor.id pci 0x12af
+&subdevice.id pci 0x0019
++subdevice.name NetFlyer Cardbus Fast Ethernet
+
+ vendor.id pci 0x1011
+&device.id pci 0x0019
+&subvendor.id pci 0x1374
+&subdevice.id pci 0x0001
++subdevice.name Cardbus Ethernet Card 10/100
+
+ vendor.id pci 0x1011
+&device.id pci 0x0019
+&subvendor.id pci 0x1374
+&subdevice.id pci 0x0002
++subdevice.name Cardbus Ethernet Card 10/100
+
+ vendor.id pci 0x1011
+&device.id pci 0x0019
+&subvendor.id pci 0x1374
+&subdevice.id pci 0x0007
++subdevice.name Cardbus Ethernet Card 10/100
+
+ vendor.id pci 0x1011
+&device.id pci 0x0019
+&subvendor.id pci 0x1374
+&subdevice.id pci 0x0008
++subdevice.name Cardbus Ethernet Card 10/100
+
+ vendor.id pci 0x1011
+&device.id pci 0x0019
+&subvendor.id pci 0x1385
+&subdevice.id pci 0x2100
++subdevice.name FA510
+
+ vendor.id pci 0x1011
+&device.id pci 0x0019
+&subvendor.id pci 0x1395
+&subdevice.id pci 0x0001
++subdevice.name 10/100 Ethernet CardBus PC Card
+
+ vendor.id pci 0x1011
+&device.id pci 0x0019
+&subvendor.id pci 0x13d1
+&subdevice.id pci 0xab01
++subdevice.name EtherFast 10/100 Cardbus (PCMPC200)
+
+ vendor.id pci 0x1011
+&device.id pci 0x0019
+&subvendor.id pci 0x14cb
+&subdevice.id pci 0x0100
++subdevice.name LNDL-100N 100Base-TX Ethernet PC Card
+
+ vendor.id pci 0x1011
+&device.id pci 0x0019
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x0001
++subdevice.name EtherExpress PRO/100 Mobile CardBus 32
+
+ vendor.id pci 0x1011
+&device.id pci 0x001a
++device.name Farallon PN9000SX Gigabit Ethernet
+
+ vendor.id pci 0x1011
+&device.id pci 0x0021
++device.name DECchip 21052
+
+ vendor.id pci 0x1011
+&device.id pci 0x0022
++device.name DECchip 21150
+
+ vendor.id pci 0x1011
+&device.id pci 0x0023
++device.name DECchip 21150
+
+ vendor.id pci 0x1011
+&device.id pci 0x0024
++device.name DECchip 21152
+
+ vendor.id pci 0x1011
+&device.id pci 0x0025
++device.name DECchip 21153
+
+ vendor.id pci 0x1011
+&device.id pci 0x0026
++device.name DECchip 21154
+
+ vendor.id pci 0x1011
+&device.id pci 0x0034
++device.name 56k Modem Cardbus
+
+ vendor.id pci 0x1011
+&device.id pci 0x0034
+&subvendor.id pci 0x1374
+&subdevice.id pci 0x0003
++subdevice.name 56k Modem Cardbus
+
+ vendor.id pci 0x1011
+&device.id pci 0x0045
++device.name DECchip 21553
+
+ vendor.id pci 0x1011
+&device.id pci 0x0046
++device.name DECchip 21554
+
+ vendor.id pci 0x1011
+&device.id pci 0x0046
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0x4050
++subdevice.name Integrated Smart Array
+
+ vendor.id pci 0x1011
+&device.id pci 0x0046
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0x4051
++subdevice.name Integrated Smart Array
+
+ vendor.id pci 0x1011
+&device.id pci 0x0046
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0x4058
++subdevice.name Integrated Smart Array
+
+ vendor.id pci 0x1011
+&device.id pci 0x0046
+&subvendor.id pci 0x103c
+&subdevice.id pci 0x10c2
++subdevice.name Hewlett-Packard NetRAID-4M
+
+ vendor.id pci 0x1011
+&device.id pci 0x0046
+&subvendor.id pci 0x12d9
+&subdevice.id pci 0x000a
++subdevice.name IP Telephony card
+
+ vendor.id pci 0x1011
+&device.id pci 0x0046
+&subvendor.id pci 0x4c53
+&subdevice.id pci 0x1050
++subdevice.name CT7 mainboard
+
+ vendor.id pci 0x1011
+&device.id pci 0x0046
+&subvendor.id pci 0x4c53
+&subdevice.id pci 0x1051
++subdevice.name CE7 mainboard
+
+ vendor.id pci 0x1011
+&device.id pci 0x0046
+&subvendor.id pci 0x9005
+&subdevice.id pci 0x0364
++subdevice.name 5400S (Mustang)
+
+ vendor.id pci 0x1011
+&device.id pci 0x0046
+&subvendor.id pci 0x9005
+&subdevice.id pci 0x0365
++subdevice.name 5400S (Mustang)
+
+ vendor.id pci 0x1011
+&device.id pci 0x0046
+&subvendor.id pci 0x9005
+&subdevice.id pci 0x1364
++subdevice.name Dell PowerEdge RAID Controller 2
+
+ vendor.id pci 0x1011
+&device.id pci 0x0046
+&subvendor.id pci 0x9005
+&subdevice.id pci 0x1365
++subdevice.name Dell PowerEdge RAID Controller 2
+
+ vendor.id pci 0x1011
+&device.id pci 0x0046
+&subvendor.id pci 0xe4bf
+&subdevice.id pci 0x1000
++subdevice.name CC8-1-BLUES
+
+ vendor.id pci 0x1011
+&device.id pci 0x1065
++device.name StrongARM DC21285
+
+ vendor.id pci 0x1011
+&device.id pci 0x1065
+&subvendor.id pci 0x1069
+&subdevice.id pci 0x0020
++subdevice.name DAC960P / DAC1164P
+
+ vendor.id pci 0x1012
++vendor.name Micronics Computers Inc
+
+ vendor.id pci 0x1013
++vendor.name Cirrus Logic
+
+ vendor.id pci 0x1013
+&device.id pci 0x0038
++device.name GD 7548
+
+ vendor.id pci 0x1013
+&device.id pci 0x0040
++device.name GD 7555 Flat Panel GUI Accelerator
+
+ vendor.id pci 0x1013
+&device.id pci 0x004c
++device.name GD 7556 Video/Graphics LCD/CRT Ctrlr
+
+ vendor.id pci 0x1013
+&device.id pci 0x00a0
++device.name GD 5430/40 [Alpine]
+
+ vendor.id pci 0x1013
+&device.id pci 0x00a2
++device.name GD 5432 [Alpine]
+
+ vendor.id pci 0x1013
+&device.id pci 0x00a4
++device.name GD 5434-4 [Alpine]
+
+ vendor.id pci 0x1013
+&device.id pci 0x00a8
++device.name GD 5434-8 [Alpine]
+
+ vendor.id pci 0x1013
+&device.id pci 0x00ac
++device.name GD 5436 [Alpine]
+
+ vendor.id pci 0x1013
+&device.id pci 0x00b0
++device.name GD 5440
+
+ vendor.id pci 0x1013
+&device.id pci 0x00b8
++device.name GD 5446
+
+ vendor.id pci 0x1013
+&device.id pci 0x00bc
++device.name GD 5480
+
+ vendor.id pci 0x1013
+&device.id pci 0x00bc
+&subvendor.id pci 0x1013
+&subdevice.id pci 0x00bc
++subdevice.name CL-GD5480
+
+ vendor.id pci 0x1013
+&device.id pci 0x00d0
++device.name GD 5462
+
+ vendor.id pci 0x1013
+&device.id pci 0x00d2
++device.name GD 5462 [Laguna I]
+
+ vendor.id pci 0x1013
+&device.id pci 0x00d4
++device.name GD 5464 [Laguna]
+
+ vendor.id pci 0x1013
+&device.id pci 0x00d5
++device.name GD 5464 BD [Laguna]
+
+ vendor.id pci 0x1013
+&device.id pci 0x00d6
++device.name GD 5465 [Laguna]
+
+ vendor.id pci 0x1013
+&device.id pci 0x00d6
+&subvendor.id pci 0x13ce
+&subdevice.id pci 0x8031
++subdevice.name Barco Metheus 2 Megapixel, Dual Head
+
+ vendor.id pci 0x1013
+&device.id pci 0x00d6
+&subvendor.id pci 0x13cf
+&subdevice.id pci 0x8031
++subdevice.name Barco Metheus 2 Megapixel, Dual Head
+
+ vendor.id pci 0x1013
+&device.id pci 0x00e8
++device.name GD 5436U
+
+ vendor.id pci 0x1013
+&device.id pci 0x1100
++device.name CL 6729
+
+ vendor.id pci 0x1013
+&device.id pci 0x1110
++device.name PD 6832 PCMCIA/CardBus Ctrlr
+
+ vendor.id pci 0x1013
+&device.id pci 0x1112
++device.name PD 6834 PCMCIA/CardBus Ctrlr
+
+ vendor.id pci 0x1013
+&device.id pci 0x1113
++device.name PD 6833 PCMCIA/CardBus Ctrlr
+
+ vendor.id pci 0x1013
+&device.id pci 0x1200
++device.name GD 7542 [Nordic]
+
+ vendor.id pci 0x1013
+&device.id pci 0x1202
++device.name GD 7543 [Viking]
+
+ vendor.id pci 0x1013
+&device.id pci 0x1204
++device.name GD 7541 [Nordic Light]
+
+ vendor.id pci 0x1013
+&device.id pci 0x4400
++device.name CD 4400
+
+ vendor.id pci 0x1013
+&device.id pci 0x6001
++device.name CS 4610/11 [CrystalClear SoundFusion Audio Accelerator]
+
+ vendor.id pci 0x1013
+&device.id pci 0x6001
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x1010
++subdevice.name CS4610 SoundFusion Audio Accelerator
+
+ vendor.id pci 0x1013
+&device.id pci 0x6003
++device.name CS 4614/22/24 [CrystalClear SoundFusion Audio Accelerator]
+
+ vendor.id pci 0x1013
+&device.id pci 0x6003
+&subvendor.id pci 0x1013
+&subdevice.id pci 0x4280
++subdevice.name Crystal SoundFusion PCI Audio Accelerator
+
+ vendor.id pci 0x1013
+&device.id pci 0x6003
+&subvendor.id pci 0x1681
+&subdevice.id pci 0x0050
++subdevice.name Game Theater XP
+
+ vendor.id pci 0x1013
+&device.id pci 0x6003
+&subvendor.id pci 0x1681
+&subdevice.id pci 0xa011
++subdevice.name Fortissimo III 7.1
+
+ vendor.id pci 0x1013
+&device.id pci 0x6004
++device.name CS 4614/22/24 [CrystalClear SoundFusion Audio Accelerator]
+
+ vendor.id pci 0x1013
+&device.id pci 0x6005
++device.name Crystal CS4281 PCI Audio
+
+ vendor.id pci 0x1013
+&device.id pci 0x6005
+&subvendor.id pci 0x1013
+&subdevice.id pci 0x4281
++subdevice.name Crystal CS4281 PCI Audio
+
+ vendor.id pci 0x1013
+&device.id pci 0x6005
+&subvendor.id pci 0x10cf
+&subdevice.id pci 0x10a8
++subdevice.name Crystal CS4281 PCI Audio
+
+ vendor.id pci 0x1013
+&device.id pci 0x6005
+&subvendor.id pci 0x10cf
+&subdevice.id pci 0x10a9
++subdevice.name Crystal CS4281 PCI Audio
+
+ vendor.id pci 0x1013
+&device.id pci 0x6005
+&subvendor.id pci 0x10cf
+&subdevice.id pci 0x10aa
++subdevice.name Crystal CS4281 PCI Audio
+
+ vendor.id pci 0x1013
+&device.id pci 0x6005
+&subvendor.id pci 0x10cf
+&subdevice.id pci 0x10ab
++subdevice.name Crystal CS4281 PCI Audio
+
+ vendor.id pci 0x1013
+&device.id pci 0x6005
+&subvendor.id pci 0x10cf
+&subdevice.id pci 0x10ac
++subdevice.name Crystal CS4281 PCI Audio
+
+ vendor.id pci 0x1013
+&device.id pci 0x6005
+&subvendor.id pci 0x10cf
+&subdevice.id pci 0x10ad
++subdevice.name Crystal CS4281 PCI Audio
+
+ vendor.id pci 0x1013
+&device.id pci 0x6005
+&subvendor.id pci 0x10cf
+&subdevice.id pci 0x10b4
++subdevice.name Crystal CS4281 PCI Audio
+
+ vendor.id pci 0x1013
+&device.id pci 0x6005
+&subvendor.id pci 0x1179
+&subdevice.id pci 0x0001
++subdevice.name Crystal CS4281 PCI Audio
+
+ vendor.id pci 0x1013
+&device.id pci 0x6005
+&subvendor.id pci 0x14c0
+&subdevice.id pci 0x000c
++subdevice.name Crystal CS4281 PCI Audio
+
+ vendor.id pci 0x1014
++vendor.name IBM
+
+ vendor.id pci 0x1014
+&device.id pci 0x0002
++device.name PCI to MCA Bridge
+
+ vendor.id pci 0x1014
+&device.id pci 0x0005
++device.name Alta Lite
+
+ vendor.id pci 0x1014
+&device.id pci 0x0007
++device.name Alta MP
+
+ vendor.id pci 0x1014
+&device.id pci 0x000a
++device.name Fire Coral
+
+ vendor.id pci 0x1014
+&device.id pci 0x0017
++device.name CPU to PCI Bridge
+
+ vendor.id pci 0x1014
+&device.id pci 0x0018
++device.name TR Auto LANstreamer
+
+ vendor.id pci 0x1014
+&device.id pci 0x001b
++device.name GXT-150P
+
+ vendor.id pci 0x1014
+&device.id pci 0x001c
++device.name Carrera
+
+ vendor.id pci 0x1014
+&device.id pci 0x001d
++device.name 82G2675
+
+ vendor.id pci 0x1014
+&device.id pci 0x0020
++device.name GXT1000 Graphics Adapter
+
+ vendor.id pci 0x1014
+&device.id pci 0x0022
++device.name IBM27-82351
+
+ vendor.id pci 0x1014
+&device.id pci 0x002d
++device.name Python
+
+ vendor.id pci 0x1014
+&device.id pci 0x002e
++device.name SCSI RAID Adapter [ServeRAID]
+
+ vendor.id pci 0x1014
+&device.id pci 0x002e
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x002e
++subdevice.name ServeRAID-3x
+
+ vendor.id pci 0x1014
+&device.id pci 0x002e
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x022e
++subdevice.name ServeRAID-4H
+
+ vendor.id pci 0x1014
+&device.id pci 0x0031
++device.name 2 Port Serial Adapter
+
+ vendor.id pci 0x1014
+&device.id pci 0x0031
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x0031
++subdevice.name 2721 WAN IOA - 2 Port Sync Serial Adapter
+
+ vendor.id pci 0x1014
+&device.id pci 0x0036
++device.name Miami
+
+ vendor.id pci 0x1014
+&device.id pci 0x0037
++device.name 82660 CPU to PCI Bridge
+
+ vendor.id pci 0x1014
+&device.id pci 0x003a
++device.name CPU to PCI Bridge
+
+ vendor.id pci 0x1014
+&device.id pci 0x003c
++device.name GXT250P/GXT255P Graphics Adapter
+
+ vendor.id pci 0x1014
+&device.id pci 0x003e
++device.name 16/4 Token ring UTP/STP controller
+
+ vendor.id pci 0x1014
+&device.id pci 0x003e
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x003e
++subdevice.name Token-Ring Adapter
+
+ vendor.id pci 0x1014
+&device.id pci 0x003e
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x00cd
++subdevice.name Token-Ring Adapter + Wake-On-LAN
+
+ vendor.id pci 0x1014
+&device.id pci 0x003e
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x00ce
++subdevice.name 16/4 Token-Ring Adapter 2
+
+ vendor.id pci 0x1014
+&device.id pci 0x003e
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x00cf
++subdevice.name 16/4 Token-Ring Adapter Special
+
+ vendor.id pci 0x1014
+&device.id pci 0x003e
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x00e4
++subdevice.name High-Speed 100/16/4 Token-Ring Adapter
+
+ vendor.id pci 0x1014
+&device.id pci 0x003e
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x00e5
++subdevice.name 16/4 Token-Ring Adapter 2 + Wake-On-LAN
+
+ vendor.id pci 0x1014
+&device.id pci 0x003e
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x016d
++subdevice.name iSeries 2744 Card
+
+ vendor.id pci 0x1014
+&device.id pci 0x0045
++device.name SSA Adapter
+
+ vendor.id pci 0x1014
+&device.id pci 0x0046
++device.name MPIC interrupt controller
+
+ vendor.id pci 0x1014
+&device.id pci 0x0047
++device.name PCI to PCI Bridge
+
+ vendor.id pci 0x1014
+&device.id pci 0x0048
++device.name PCI to PCI Bridge
+
+ vendor.id pci 0x1014
+&device.id pci 0x0049
++device.name Warhead SCSI Controller
+
+ vendor.id pci 0x1014
+&device.id pci 0x004e
++device.name ATM Controller (14104e00)
+
+ vendor.id pci 0x1014
+&device.id pci 0x004f
++device.name ATM Controller (14104f00)
+
+ vendor.id pci 0x1014
+&device.id pci 0x0050
++device.name ATM Controller (14105000)
+
+ vendor.id pci 0x1014
+&device.id pci 0x0053
++device.name 25 MBit ATM Controller
+
+ vendor.id pci 0x1014
+&device.id pci 0x0054
++device.name GXT500P/GXT550P Graphics Adapter
+
+ vendor.id pci 0x1014
+&device.id pci 0x0057
++device.name MPEG PCI Bridge
+
+ vendor.id pci 0x1014
+&device.id pci 0x005c
++device.name i82557B 10/100
+
+ vendor.id pci 0x1014
+&device.id pci 0x005e
++device.name GXT800P Graphics Adapter
+
+ vendor.id pci 0x1014
+&device.id pci 0x007c
++device.name ATM Controller (14107c00)
+
+ vendor.id pci 0x1014
+&device.id pci 0x007d
++device.name 3780IDSP [MWave]
+
+ vendor.id pci 0x1014
+&device.id pci 0x008b
++device.name EADS PCI to PCI Bridge
+
+ vendor.id pci 0x1014
+&device.id pci 0x008e
++device.name GXT3000P Graphics Adapter
+
+ vendor.id pci 0x1014
+&device.id pci 0x0090
++device.name GXT 3000P
+
+ vendor.id pci 0x1014
+&device.id pci 0x0090
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x008e
++subdevice.name GXT-3000P
+
+ vendor.id pci 0x1014
+&device.id pci 0x0091
++device.name SSA Adapter
+
+ vendor.id pci 0x1014
+&device.id pci 0x0095
++device.name 20H2999 PCI Docking Bridge
+
+ vendor.id pci 0x1014
+&device.id pci 0x0096
++device.name Chukar chipset SCSI controller
+
+ vendor.id pci 0x1014
+&device.id pci 0x0096
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x0097
++subdevice.name iSeries 2778 DASD IOA
+
+ vendor.id pci 0x1014
+&device.id pci 0x0096
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x0098
++subdevice.name iSeries 2763 DASD IOA
+
+ vendor.id pci 0x1014
+&device.id pci 0x0096
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x0099
++subdevice.name iSeries 2748 DASD IOA
+
+ vendor.id pci 0x1014
+&device.id pci 0x009f
++device.name PCI 4758 Cryptographic Accelerator
+
+ vendor.id pci 0x1014
+&device.id pci 0x00a5
++device.name ATM Controller (1410a500)
+
+ vendor.id pci 0x1014
+&device.id pci 0x00a6
++device.name ATM 155MBPS MM Controller (1410a600)
+
+ vendor.id pci 0x1014
+&device.id pci 0x00b7
++device.name 256-bit Graphics Rasterizer [Fire GL1]
+
+ vendor.id pci 0x1014
+&device.id pci 0x00b7
+&subvendor.id pci 0x1092
+&subdevice.id pci 0x00b8
++subdevice.name FireGL1 AGP 32Mb
+
+ vendor.id pci 0x1014
+&device.id pci 0x00b8
++device.name GXT2000P Graphics Adapter
+
+ vendor.id pci 0x1014
+&device.id pci 0x00be
++device.name ATM 622MBPS Controller (1410be00)
+
+ vendor.id pci 0x1014
+&device.id pci 0x00dc
++device.name Advanced Systems Management Adapter (ASMA)
+
+ vendor.id pci 0x1014
+&device.id pci 0x00fc
++device.name CPC710 Dual Bridge and Memory Controller (PCI-64)
+
+ vendor.id pci 0x1014
+&device.id pci 0x0104
++device.name Gigabit Ethernet-SX Adapter
+
+ vendor.id pci 0x1014
+&device.id pci 0x0105
++device.name CPC710 Dual Bridge and Memory Controller (PCI-32)
+
+ vendor.id pci 0x1014
+&device.id pci 0x010f
++device.name Remote Supervisor Adapter (RSA)
+
+ vendor.id pci 0x1014
+&device.id pci 0x0142
++device.name Yotta Video Compositor Input
+
+ vendor.id pci 0x1014
+&device.id pci 0x0142
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x0143
++subdevice.name Yotta Input Controller (ytin)
+
+ vendor.id pci 0x1014
+&device.id pci 0x0144
++device.name Yotta Video Compositor Output
+
+ vendor.id pci 0x1014
+&device.id pci 0x0144
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x0145
++subdevice.name Yotta Output Controller (ytout)
+
+ vendor.id pci 0x1014
+&device.id pci 0x0156
++device.name 405GP PLB to PCI Bridge
+
+ vendor.id pci 0x1014
+&device.id pci 0x015e
++device.name 622Mbps ATM PCI Adapter
+
+ vendor.id pci 0x1014
+&device.id pci 0x0160
++device.name 64bit/66MHz PCI ATM 155 MMF
+
+ vendor.id pci 0x1014
+&device.id pci 0x016e
++device.name GXT4000P Graphics Adapter
+
+ vendor.id pci 0x1014
+&device.id pci 0x0170
++device.name GXT6000P Graphics Adapter
+
+ vendor.id pci 0x1014
+&device.id pci 0x017d
++device.name GXT300P Graphics Adapter
+
+ vendor.id pci 0x1014
+&device.id pci 0x0180
++device.name Snipe chipset SCSI controller
+
+ vendor.id pci 0x1014
+&device.id pci 0x0180
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x0241
++subdevice.name iSeries 2757 DASD IOA
+
+ vendor.id pci 0x1014
+&device.id pci 0x0180
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x0264
++subdevice.name Quad Channel PCI-X U320 SCSI RAID Adapter (2780)
+
+ vendor.id pci 0x1014
+&device.id pci 0x0188
++device.name EADS-X PCI-X to PCI-X Bridge
+
+ vendor.id pci 0x1014
+&device.id pci 0x01a7
++device.name PCI-X to PCI-X Bridge
+
+ vendor.id pci 0x1014
+&device.id pci 0x01bd
++device.name ServeRAID Controller
+
+ vendor.id pci 0x1014
+&device.id pci 0x01bd
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x01be
++subdevice.name ServeRAID-4M
+
+ vendor.id pci 0x1014
+&device.id pci 0x01bd
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x01bf
++subdevice.name ServeRAID-4L
+
+ vendor.id pci 0x1014
+&device.id pci 0x01bd
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x0208
++subdevice.name ServeRAID-4Mx
+
+ vendor.id pci 0x1014
+&device.id pci 0x01bd
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x020e
++subdevice.name ServeRAID-4Lx
+
+ vendor.id pci 0x1014
+&device.id pci 0x01bd
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x022e
++subdevice.name ServeRAID-4H
+
+ vendor.id pci 0x1014
+&device.id pci 0x01bd
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x0258
++subdevice.name ServeRAID-5i
+
+ vendor.id pci 0x1014
+&device.id pci 0x01bd
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x0259
++subdevice.name ServeRAID-5i
+
+ vendor.id pci 0x1014
+&device.id pci 0x01c1
++device.name 64bit/66MHz PCI ATM 155 UTP
+
+ vendor.id pci 0x1014
+&device.id pci 0x01e6
++device.name Cryptographic Accelerator
+
+ vendor.id pci 0x1014
+&device.id pci 0x01ff
++device.name 10/100 Mbps Ethernet
+
+ vendor.id pci 0x1014
+&device.id pci 0x0219
++device.name Multiport Serial Adapter
+
+ vendor.id pci 0x1014
+&device.id pci 0x0219
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x021a
++subdevice.name Dual RVX
+
+ vendor.id pci 0x1014
+&device.id pci 0x0219
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x0251
++subdevice.name Internal Modem/RVX
+
+ vendor.id pci 0x1014
+&device.id pci 0x0219
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x0252
++subdevice.name Quad Internal Modem
+
+ vendor.id pci 0x1014
+&device.id pci 0x021b
++device.name GXT6500P Graphics Adapter
+
+ vendor.id pci 0x1014
+&device.id pci 0x021c
++device.name GXT4500P Graphics Adapter
+
+ vendor.id pci 0x1014
+&device.id pci 0x0233
++device.name GXT135P Graphics Adapter
+
+ vendor.id pci 0x1014
+&device.id pci 0x0266
++device.name PCI-X Dual Channel SCSI
+
+ vendor.id pci 0x1014
+&device.id pci 0x0268
++device.name Gigabit Ethernet-SX Adapter (PCI-X)
+
+ vendor.id pci 0x1014
+&device.id pci 0x0269
++device.name 10/100/1000 Base-TX Ethernet Adapter (PCI-X)
+
+ vendor.id pci 0x1014
+&device.id pci 0x0302
++device.name Winnipeg PCI-X Host Bridge
+
+ vendor.id pci 0x1014
+&device.id pci 0x0314
++device.name ZISC 036 Neural accelerator card
+
+ vendor.id pci 0x1014
+&device.id pci 0xffff
++device.name MPIC-2 interrupt controller
+
+ vendor.id pci 0x1015
++vendor.name LSI Logic Corp of Canada
+
+ vendor.id pci 0x1016
++vendor.name ICL Personal Systems
+
+ vendor.id pci 0x1017
++vendor.name SPEA Software AG
+
+ vendor.id pci 0x1017
+&device.id pci 0x5343
++device.name SPEA 3D Accelerator
+
+ vendor.id pci 0x1018
++vendor.name Unisys Systems
+
+ vendor.id pci 0x1019
++vendor.name Elitegroup Computer Systems
+
+ vendor.id pci 0x101a
++vendor.name AT&T GIS (NCR)
+
+ vendor.id pci 0x101a
+&device.id pci 0x0005
++device.name 100VG ethernet
+
+ vendor.id pci 0x101b
++vendor.name Vitesse Semiconductor
+
+ vendor.id pci 0x101c
++vendor.name Western Digital
+
+ vendor.id pci 0x101c
+&device.id pci 0x0193
++device.name 33C193A
+
+ vendor.id pci 0x101c
+&device.id pci 0x0196
++device.name 33C196A
+
+ vendor.id pci 0x101c
+&device.id pci 0x0197
++device.name 33C197A
+
+ vendor.id pci 0x101c
+&device.id pci 0x0296
++device.name 33C296A
+
+ vendor.id pci 0x101c
+&device.id pci 0x3193
++device.name 7193
+
+ vendor.id pci 0x101c
+&device.id pci 0x3197
++device.name 7197
+
+ vendor.id pci 0x101c
+&device.id pci 0x3296
++device.name 33C296A
+
+ vendor.id pci 0x101c
+&device.id pci 0x4296
++device.name 34C296
+
+ vendor.id pci 0x101c
+&device.id pci 0x9710
++device.name Pipeline 9710
+
+ vendor.id pci 0x101c
+&device.id pci 0x9712
++device.name Pipeline 9712
+
+ vendor.id pci 0x101c
+&device.id pci 0xc24a
++device.name 90C
+
+ vendor.id pci 0x101e
++vendor.name American Megatrends Inc.
+
+ vendor.id pci 0x101e
+&device.id pci 0x1960
++device.name MegaRAID
+
+ vendor.id pci 0x101e
+&device.id pci 0x1960
+&subvendor.id pci 0x101e
+&subdevice.id pci 0x0471
++subdevice.name MegaRAID 471 Enterprise 1600 RAID Controller
+
+ vendor.id pci 0x101e
+&device.id pci 0x1960
+&subvendor.id pci 0x101e
+&subdevice.id pci 0x0475
++subdevice.name MegaRAID 475 Express 500/500LC RAID Controller
+
+ vendor.id pci 0x101e
+&device.id pci 0x1960
+&subvendor.id pci 0x101e
+&subdevice.id pci 0x0477
++subdevice.name MegaRAID 477 Elite 3100 RAID Controller
+
+ vendor.id pci 0x101e
+&device.id pci 0x1960
+&subvendor.id pci 0x101e
+&subdevice.id pci 0x0493
++subdevice.name MegaRAID 493 Elite 1600 RAID Controller
+
+ vendor.id pci 0x101e
+&device.id pci 0x1960
+&subvendor.id pci 0x101e
+&subdevice.id pci 0x0494
++subdevice.name MegaRAID 494 Elite 1650 RAID Controller
+
+ vendor.id pci 0x101e
+&device.id pci 0x1960
+&subvendor.id pci 0x101e
+&subdevice.id pci 0x0503
++subdevice.name MegaRAID 503 Enterprise 1650 RAID Controller
+
+ vendor.id pci 0x101e
+&device.id pci 0x1960
+&subvendor.id pci 0x101e
+&subdevice.id pci 0x0511
++subdevice.name MegaRAID 511 i4 IDE RAID Controller
+
+ vendor.id pci 0x101e
+&device.id pci 0x1960
+&subvendor.id pci 0x101e
+&subdevice.id pci 0x0522
++subdevice.name MegaRAID 522 i4133 RAID Controller
+
+ vendor.id pci 0x101e
+&device.id pci 0x1960
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x0471
++subdevice.name PowerEdge RAID Controller 3/QC
+
+ vendor.id pci 0x101e
+&device.id pci 0x1960
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x0475
++subdevice.name PowerEdge RAID Controller 3/SC
+
+ vendor.id pci 0x101e
+&device.id pci 0x1960
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x0493
++subdevice.name PowerEdge RAID Controller 3/DC
+
+ vendor.id pci 0x101e
+&device.id pci 0x1960
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x0511
++subdevice.name PowerEdge Cost Effective RAID Controller ATA100/4Ch
+
+ vendor.id pci 0x101e
+&device.id pci 0x9010
++device.name MegaRAID 428 Ultra RAID Controller
+
+ vendor.id pci 0x101e
+&device.id pci 0x9030
++device.name EIDE Controller
+
+ vendor.id pci 0x101e
+&device.id pci 0x9031
++device.name EIDE Controller
+
+ vendor.id pci 0x101e
+&device.id pci 0x9032
++device.name EIDE & SCSI Controller
+
+ vendor.id pci 0x101e
+&device.id pci 0x9033
++device.name SCSI Controller
+
+ vendor.id pci 0x101e
+&device.id pci 0x9040
++device.name Multimedia card
+
+ vendor.id pci 0x101e
+&device.id pci 0x9060
++device.name MegaRAID 434 Ultra GT RAID Controller
+
+ vendor.id pci 0x101e
+&device.id pci 0x9063
++device.name MegaRAC
+
+ vendor.id pci 0x101e
+&device.id pci 0x9063
+&subvendor.id pci 0x101e
+&subdevice.id pci 0x0767
++subdevice.name Dell Remote Assistant Card 2
+
+ vendor.id pci 0x101f
++vendor.name PictureTel
+
+ vendor.id pci 0x1020
++vendor.name Hitachi Computer Products
+
+ vendor.id pci 0x1021
++vendor.name OKI Electric Industry Co. Ltd.
+
+ vendor.id pci 0x1022
++vendor.name Advanced Micro Devices [AMD]
+
+ vendor.id pci 0x1022
+&device.id pci 0x1100
++device.name K8 [Athlon64/Opteron] HyperTransport Technology Configuration
+
+ vendor.id pci 0x1022
+&device.id pci 0x1101
++device.name K8 [Athlon64/Opteron] Address Map
+
+ vendor.id pci 0x1022
+&device.id pci 0x1102
++device.name K8 [Athlon64/Opteron] DRAM Controller
+
+ vendor.id pci 0x1022
+&device.id pci 0x1103
++device.name K8 [Athlon64/Opteron] Miscellaneous Control
+
+ vendor.id pci 0x1022
+&device.id pci 0x2000
++device.name 79c970 [PCnet32 LANCE]
+
+ vendor.id pci 0x1022
+&device.id pci 0x2000
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x2000
++subdevice.name NetFinity 10/100 Fast Ethernet
+
+ vendor.id pci 0x1022
+&device.id pci 0x2000
+&subvendor.id pci 0x1022
+&subdevice.id pci 0x2000
++subdevice.name PCnet - Fast 79C971
+
+ vendor.id pci 0x1022
+&device.id pci 0x2000
+&subvendor.id pci 0x103c
+&subdevice.id pci 0x104c
++subdevice.name Ethernet with LAN remote power Adapter
+
+ vendor.id pci 0x1022
+&device.id pci 0x2000
+&subvendor.id pci 0x103c
+&subdevice.id pci 0x1064
++subdevice.name Ethernet with LAN remote power Adapter
+
+ vendor.id pci 0x1022
+&device.id pci 0x2000
+&subvendor.id pci 0x103c
+&subdevice.id pci 0x1065
++subdevice.name Ethernet with LAN remote power Adapter
+
+ vendor.id pci 0x1022
+&device.id pci 0x2000
+&subvendor.id pci 0x103c
+&subdevice.id pci 0x106c
++subdevice.name Ethernet with LAN remote power Adapter
+
+ vendor.id pci 0x1022
+&device.id pci 0x2000
+&subvendor.id pci 0x103c
+&subdevice.id pci 0x106e
++subdevice.name Ethernet with LAN remote power Adapter
+
+ vendor.id pci 0x1022
+&device.id pci 0x2000
+&subvendor.id pci 0x103c
+&subdevice.id pci 0x10ea
++subdevice.name Ethernet with LAN remote power Adapter
+
+ vendor.id pci 0x1022
+&device.id pci 0x2000
+&subvendor.id pci 0x1113
+&subdevice.id pci 0x1220
++subdevice.name EN1220 10/100 Fast Ethernet
+
+ vendor.id pci 0x1022
+&device.id pci 0x2000
+&subvendor.id pci 0x1259
+&subdevice.id pci 0x2450
++subdevice.name AT-2450 10/100 Fast Ethernet
+
+ vendor.id pci 0x1022
+&device.id pci 0x2000
+&subvendor.id pci 0x1259
+&subdevice.id pci 0x2454
++subdevice.name AT-2450v4 10Mb Ethernet Adapter
+
+ vendor.id pci 0x1022
+&device.id pci 0x2000
+&subvendor.id pci 0x1259
+&subdevice.id pci 0x2700
++subdevice.name AT-2700TX 10/100 Fast Ethernet
+
+ vendor.id pci 0x1022
+&device.id pci 0x2000
+&subvendor.id pci 0x1259
+&subdevice.id pci 0x2701
++subdevice.name AT-2700FX 100Mb Ethernet
+
+ vendor.id pci 0x1022
+&device.id pci 0x2000
+&subvendor.id pci 0x4c53
+&subdevice.id pci 0x1000
++subdevice.name CC7/CR7/CP7/VC7/VP7/VR7 mainboard
+
+ vendor.id pci 0x1022
+&device.id pci 0x2000
+&subvendor.id pci 0x4c53
+&subdevice.id pci 0x1010
++subdevice.name CP5/CR6 mainboard
+
+ vendor.id pci 0x1022
+&device.id pci 0x2000
+&subvendor.id pci 0x4c53
+&subdevice.id pci 0x1020
++subdevice.name VR6 mainboard
+
+ vendor.id pci 0x1022
+&device.id pci 0x2000
+&subvendor.id pci 0x4c53
+&subdevice.id pci 0x1030
++subdevice.name PC5 mainboard
+
+ vendor.id pci 0x1022
+&device.id pci 0x2000
+&subvendor.id pci 0x4c53
+&subdevice.id pci 0x1040
++subdevice.name CL7 mainboard
+
+ vendor.id pci 0x1022
+&device.id pci 0x2000
+&subvendor.id pci 0x4c53
+&subdevice.id pci 0x1060
++subdevice.name PC7 mainboard
+
+ vendor.id pci 0x1022
+&device.id pci 0x2001
++device.name 79c978 [HomePNA]
+
+ vendor.id pci 0x1022
+&device.id pci 0x2001
+&subvendor.id pci 0x1092
+&subdevice.id pci 0x0a78
++subdevice.name Multimedia Home Network Adapter
+
+ vendor.id pci 0x1022
+&device.id pci 0x2001
+&subvendor.id pci 0x1668
+&subdevice.id pci 0x0299
++subdevice.name ActionLink Home Network Adapter
+
+ vendor.id pci 0x1022
+&device.id pci 0x2003
++device.name Am 1771 MBW [Alchemy]
+
+ vendor.id pci 0x1022
+&device.id pci 0x2020
++device.name 53c974 [PCscsi]
+
+ vendor.id pci 0x1022
+&device.id pci 0x2040
++device.name 79c974
+
+ vendor.id pci 0x1022
+&device.id pci 0x3000
++device.name ELanSC520 Microcontroller
+
+ vendor.id pci 0x1022
+&device.id pci 0x7006
++device.name AMD-751 [Irongate] System Controller
+
+ vendor.id pci 0x1022
+&device.id pci 0x7007
++device.name AMD-751 [Irongate] AGP Bridge
+
+ vendor.id pci 0x1022
+&device.id pci 0x700a
++device.name AMD-IGR4 AGP Host to PCI Bridge
+
+ vendor.id pci 0x1022
+&device.id pci 0x700b
++device.name AMD-IGR4 PCI to PCI Bridge
+
+ vendor.id pci 0x1022
+&device.id pci 0x700c
++device.name AMD-760 MP [IGD4-2P] System Controller
+
+ vendor.id pci 0x1022
+&device.id pci 0x700d
++device.name AMD-760 MP [IGD4-2P] AGP Bridge
+
+ vendor.id pci 0x1022
+&device.id pci 0x700e
++device.name AMD-760 [IGD4-1P] System Controller
+
+ vendor.id pci 0x1022
+&device.id pci 0x700f
++device.name AMD-760 [IGD4-1P] AGP Bridge
+
+ vendor.id pci 0x1022
+&device.id pci 0x7400
++device.name AMD-755 [Cobra] ISA
+
+ vendor.id pci 0x1022
+&device.id pci 0x7401
++device.name AMD-755 [Cobra] IDE
+
+ vendor.id pci 0x1022
+&device.id pci 0x7403
++device.name AMD-755 [Cobra] ACPI
+
+ vendor.id pci 0x1022
+&device.id pci 0x7404
++device.name AMD-755 [Cobra] USB
+
+ vendor.id pci 0x1022
+&device.id pci 0x7408
++device.name AMD-756 [Viper] ISA
+
+ vendor.id pci 0x1022
+&device.id pci 0x7409
++device.name AMD-756 [Viper] IDE
+
+ vendor.id pci 0x1022
+&device.id pci 0x740b
++device.name AMD-756 [Viper] ACPI
+
+ vendor.id pci 0x1022
+&device.id pci 0x740c
++device.name AMD-756 [Viper] USB
+
+ vendor.id pci 0x1022
+&device.id pci 0x7410
++device.name AMD-766 [ViperPlus] ISA
+
+ vendor.id pci 0x1022
+&device.id pci 0x7411
++device.name AMD-766 [ViperPlus] IDE
+
+ vendor.id pci 0x1022
+&device.id pci 0x7413
++device.name AMD-766 [ViperPlus] ACPI
+
+ vendor.id pci 0x1022
+&device.id pci 0x7414
++device.name AMD-766 [ViperPlus] USB
+
+ vendor.id pci 0x1022
+&device.id pci 0x7440
++device.name AMD-768 [Opus] ISA
+
+ vendor.id pci 0x1022
+&device.id pci 0x7440
+&subvendor.id pci 0x1043
+&subdevice.id pci 0x8044
++subdevice.name A7M-D Mainboard
+
+ vendor.id pci 0x1022
+&device.id pci 0x7441
++device.name AMD-768 [Opus] IDE
+
+ vendor.id pci 0x1022
+&device.id pci 0x7443
++device.name AMD-768 [Opus] ACPI
+
+ vendor.id pci 0x1022
+&device.id pci 0x7443
+&subvendor.id pci 0x1043
+&subdevice.id pci 0x8044
++subdevice.name A7M-D Mainboard
+
+ vendor.id pci 0x1022
+&device.id pci 0x7445
++device.name AMD-768 [Opus] Audio
+
+ vendor.id pci 0x1022
+&device.id pci 0x7446
++device.name AMD-768 [Opus] MC97 Modem (Smart Link HAMR5600 compatible)
+
+ vendor.id pci 0x1022
+&device.id pci 0x7448
++device.name AMD-768 [Opus] PCI
+
+ vendor.id pci 0x1022
+&device.id pci 0x7449
++device.name AMD-768 [Opus] USB
+
+ vendor.id pci 0x1022
+&device.id pci 0x7450
++device.name AMD-8131 PCI-X Bridge
+
+ vendor.id pci 0x1022
+&device.id pci 0x7451
++device.name AMD-8131 PCI-X APIC
+
+ vendor.id pci 0x1022
+&device.id pci 0x7454
++device.name AMD-8151 System Controller
+
+ vendor.id pci 0x1022
+&device.id pci 0x7455
++device.name AMD-8151 AGP Bridge
+
+ vendor.id pci 0x1022
+&device.id pci 0x7460
++device.name AMD-8111 PCI
+
+ vendor.id pci 0x1022
+&device.id pci 0x7460
+&subvendor.id pci 0x161f
+&subdevice.id pci 0x3017
++subdevice.name HDAMB
+
+ vendor.id pci 0x1022
+&device.id pci 0x7461
++device.name AMD-8111 USB
+
+ vendor.id pci 0x1022
+&device.id pci 0x7462
++device.name AMD-8111 Ethernet
+
+ vendor.id pci 0x1022
+&device.id pci 0x7464
++device.name AMD-8111 USB
+
+ vendor.id pci 0x1022
+&device.id pci 0x7464
+&subvendor.id pci 0x161f
+&subdevice.id pci 0x3017
++subdevice.name HDAMB
+
+ vendor.id pci 0x1022
+&device.id pci 0x7468
++device.name AMD-8111 LPC
+
+ vendor.id pci 0x1022
+&device.id pci 0x7468
+&subvendor.id pci 0x161f
+&subdevice.id pci 0x3017
++subdevice.name HDAMB
+
+ vendor.id pci 0x1022
+&device.id pci 0x7469
++device.name AMD-8111 IDE
+
+ vendor.id pci 0x1022
+&device.id pci 0x7469
+&subvendor.id pci 0x161f
+&subdevice.id pci 0x3017
++subdevice.name HDAMB
+
+ vendor.id pci 0x1022
+&device.id pci 0x746a
++device.name AMD-8111 SMBus 2.0
+
+ vendor.id pci 0x1022
+&device.id pci 0x746b
++device.name AMD-8111 ACPI
+
+ vendor.id pci 0x1022
+&device.id pci 0x746b
+&subvendor.id pci 0x161f
+&subdevice.id pci 0x3017
++subdevice.name HDAMB
+
+ vendor.id pci 0x1022
+&device.id pci 0x746d
++device.name AMD-8111 AC97 Audio
+
+ vendor.id pci 0x1022
+&device.id pci 0x746d
+&subvendor.id pci 0x161f
+&subdevice.id pci 0x3017
++subdevice.name HDAMB
+
+ vendor.id pci 0x1022
+&device.id pci 0x746e
++device.name AMD-8111 MC97 Modem
+
+ vendor.id pci 0x1022
+&device.id pci 0x756b
++device.name AMD-8111 ACPI
+
+ vendor.id pci 0x1023
++vendor.name Trident Microsystems
+
+ vendor.id pci 0x1023
+&device.id pci 0x0194
++device.name 82C194
+
+ vendor.id pci 0x1023
+&device.id pci 0x2000
++device.name 4DWave DX
+
+ vendor.id pci 0x1023
+&device.id pci 0x2001
++device.name 4DWave NX
+
+ vendor.id pci 0x1023
+&device.id pci 0x2001
+&subvendor.id pci 0x122d
+&subdevice.id pci 0x1400
++subdevice.name Trident PCI288-Q3DII (NX)
+
+ vendor.id pci 0x1023
+&device.id pci 0x2100
++device.name CyberBlade XP4m32
+
+ vendor.id pci 0x1023
+&device.id pci 0x8400
++device.name CyberBlade/i7
+
+ vendor.id pci 0x1023
+&device.id pci 0x8400
+&subvendor.id pci 0x1023
+&subdevice.id pci 0x8400
++subdevice.name CyberBlade i7 AGP
+
+ vendor.id pci 0x1023
+&device.id pci 0x8420
++device.name CyberBlade/i7d
+
+ vendor.id pci 0x1023
+&device.id pci 0x8420
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0xb15a
++subdevice.name CyberBlade i7 AGP
+
+ vendor.id pci 0x1023
+&device.id pci 0x8500
++device.name CyberBlade/i1
+
+ vendor.id pci 0x1023
+&device.id pci 0x8520
++device.name CyberBlade i1
+
+ vendor.id pci 0x1023
+&device.id pci 0x8520
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0xb16e
++subdevice.name CyberBlade i1 AGP
+
+ vendor.id pci 0x1023
+&device.id pci 0x8520
+&subvendor.id pci 0x1023
+&subdevice.id pci 0x8520
++subdevice.name CyberBlade i1 AGP
+
+ vendor.id pci 0x1023
+&device.id pci 0x8620
++device.name CyberBlade/i1
+
+ vendor.id pci 0x1023
+&device.id pci 0x8620
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x0502
++subdevice.name ThinkPad R30/T30
+
+ vendor.id pci 0x1023
+&device.id pci 0x8820
++device.name CyberBlade XPAi1
+
+ vendor.id pci 0x1023
+&device.id pci 0x9320
++device.name TGUI 9320
+
+ vendor.id pci 0x1023
+&device.id pci 0x9350
++device.name GUI Accelerator
+
+ vendor.id pci 0x1023
+&device.id pci 0x9360
++device.name Flat panel GUI Accelerator
+
+ vendor.id pci 0x1023
+&device.id pci 0x9382
++device.name Cyber 9382 [Reference design]
+
+ vendor.id pci 0x1023
+&device.id pci 0x9383
++device.name Cyber 9383 [Reference design]
+
+ vendor.id pci 0x1023
+&device.id pci 0x9385
++device.name Cyber 9385 [Reference design]
+
+ vendor.id pci 0x1023
+&device.id pci 0x9386
++device.name Cyber 9386
+
+ vendor.id pci 0x1023
+&device.id pci 0x9388
++device.name Cyber 9388
+
+ vendor.id pci 0x1023
+&device.id pci 0x9397
++device.name Cyber 9397
+
+ vendor.id pci 0x1023
+&device.id pci 0x939a
++device.name Cyber 9397DVD
+
+ vendor.id pci 0x1023
+&device.id pci 0x9420
++device.name TGUI 9420
+
+ vendor.id pci 0x1023
+&device.id pci 0x9430
++device.name TGUI 9430
+
+ vendor.id pci 0x1023
+&device.id pci 0x9440
++device.name TGUI 9440
+
+ vendor.id pci 0x1023
+&device.id pci 0x9460
++device.name TGUI 9460
+
+ vendor.id pci 0x1023
+&device.id pci 0x9470
++device.name TGUI 9470
+
+ vendor.id pci 0x1023
+&device.id pci 0x9520
++device.name Cyber 9520
+
+ vendor.id pci 0x1023
+&device.id pci 0x9525
++device.name Cyber 9525
+
+ vendor.id pci 0x1023
+&device.id pci 0x9525
+&subvendor.id pci 0x10cf
+&subdevice.id pci 0x1094
++subdevice.name Lifebook C6155
+
+ vendor.id pci 0x1023
+&device.id pci 0x9540
++device.name Cyber 9540
+
+ vendor.id pci 0x1023
+&device.id pci 0x9660
++device.name TGUI 9660/938x/968x
+
+ vendor.id pci 0x1023
+&device.id pci 0x9680
++device.name TGUI 9680
+
+ vendor.id pci 0x1023
+&device.id pci 0x9682
++device.name TGUI 9682
+
+ vendor.id pci 0x1023
+&device.id pci 0x9683
++device.name TGUI 9683
+
+ vendor.id pci 0x1023
+&device.id pci 0x9685
++device.name ProVIDIA 9685
+
+ vendor.id pci 0x1023
+&device.id pci 0x9750
++device.name 3DImage 9750
+
+ vendor.id pci 0x1023
+&device.id pci 0x9750
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x9750
++subdevice.name 3DImage 9750
+
+ vendor.id pci 0x1023
+&device.id pci 0x9750
+&subvendor.id pci 0x1023
+&subdevice.id pci 0x9750
++subdevice.name 3DImage 9750
+
+ vendor.id pci 0x1023
+&device.id pci 0x9753
++device.name TGUI 9753
+
+ vendor.id pci 0x1023
+&device.id pci 0x9754
++device.name TGUI 9754
+
+ vendor.id pci 0x1023
+&device.id pci 0x9759
++device.name TGUI 975
+
+ vendor.id pci 0x1023
+&device.id pci 0x9783
++device.name TGUI 9783
+
+ vendor.id pci 0x1023
+&device.id pci 0x9785
++device.name TGUI 9785
+
+ vendor.id pci 0x1023
+&device.id pci 0x9850
++device.name 3DImage 9850
+
+ vendor.id pci 0x1023
+&device.id pci 0x9880
++device.name Blade 3D PCI/AGP
+
+ vendor.id pci 0x1023
+&device.id pci 0x9880
+&subvendor.id pci 0x1023
+&subdevice.id pci 0x9880
++subdevice.name Blade 3D
+
+ vendor.id pci 0x1023
+&device.id pci 0x9910
++device.name CyberBlade/XP
+
+ vendor.id pci 0x1023
+&device.id pci 0x9930
++device.name CyberBlade/XPm
+
+ vendor.id pci 0x1024
++vendor.name Zenith Data Systems
+
+ vendor.id pci 0x1025
++vendor.name Acer Incorporated [ALI]
+
+ vendor.id pci 0x1025
+&device.id pci 0x1435
++device.name M1435
+
+ vendor.id pci 0x1025
+&device.id pci 0x1445
++device.name M1445
+
+ vendor.id pci 0x1025
+&device.id pci 0x1449
++device.name M1449
+
+ vendor.id pci 0x1025
+&device.id pci 0x1451
++device.name M1451
+
+ vendor.id pci 0x1025
+&device.id pci 0x1461
++device.name M1461
+
+ vendor.id pci 0x1025
+&device.id pci 0x1489
++device.name M1489
+
+ vendor.id pci 0x1025
+&device.id pci 0x1511
++device.name M1511
+
+ vendor.id pci 0x1025
+&device.id pci 0x1512
++device.name ALI M1512 Aladdin
+
+ vendor.id pci 0x1025
+&device.id pci 0x1513
++device.name M1513
+
+ vendor.id pci 0x1025
+&device.id pci 0x1521
++device.name ALI M1521 Aladdin III CPU Bridge
+
+ vendor.id pci 0x1025
+&device.id pci 0x1521
+&subvendor.id pci 0x10b9
+&subdevice.id pci 0x1521
++subdevice.name ALI M1521 Aladdin III CPU Bridge
+
+ vendor.id pci 0x1025
+&device.id pci 0x1523
++device.name ALI M1523 ISA Bridge
+
+ vendor.id pci 0x1025
+&device.id pci 0x1523
+&subvendor.id pci 0x10b9
+&subdevice.id pci 0x1523
++subdevice.name ALI M1523 ISA Bridge
+
+ vendor.id pci 0x1025
+&device.id pci 0x1531
++device.name M1531 Northbridge [Aladdin IV/IV+]
+
+ vendor.id pci 0x1025
+&device.id pci 0x1533
++device.name M1533 PCI-to-ISA Bridge
+
+ vendor.id pci 0x1025
+&device.id pci 0x1533
+&subvendor.id pci 0x10b9
+&subdevice.id pci 0x1533
++subdevice.name ALI M1533 Aladdin IV/V ISA South Bridge
+
+ vendor.id pci 0x1025
+&device.id pci 0x1535
++device.name M1535 PCI Bridge + Super I/O + FIR
+
+ vendor.id pci 0x1025
+&device.id pci 0x1541
++device.name M1541 Northbridge [Aladdin V]
+
+ vendor.id pci 0x1025
+&device.id pci 0x1541
+&subvendor.id pci 0x10b9
+&subdevice.id pci 0x1541
++subdevice.name ALI M1541 Aladdin V/V+ AGP+PCI North Bridge
+
+ vendor.id pci 0x1025
+&device.id pci 0x1542
++device.name M1542 Northbridge [Aladdin V]
+
+ vendor.id pci 0x1025
+&device.id pci 0x1543
++device.name M1543 PCI-to-ISA Bridge + Super I/O + FIR
+
+ vendor.id pci 0x1025
+&device.id pci 0x1561
++device.name M1561 Northbridge [Aladdin 7]
+
+ vendor.id pci 0x1025
+&device.id pci 0x1621
++device.name M1621 Northbridge [Aladdin-Pro II]
+
+ vendor.id pci 0x1025
+&device.id pci 0x1631
++device.name M1631 Northbridge+3D Graphics [Aladdin TNT2]
+
+ vendor.id pci 0x1025
+&device.id pci 0x1641
++device.name M1641 Northbridge [Aladdin-Pro IV]
+
+ vendor.id pci 0x1025
+&device.id pci 0x1647
++device.name M1647 [MaGiK1] PCI North Bridge
+
+ vendor.id pci 0x1025
+&device.id pci 0x1671
++device.name M1671 Northbridge [ALADDiN-P4]
+
+ vendor.id pci 0x1025
+&device.id pci 0x1672
++device.name Northbridge [CyberALADDiN-P4]
+
+ vendor.id pci 0x1025
+&device.id pci 0x3141
++device.name M3141
+
+ vendor.id pci 0x1025
+&device.id pci 0x3143
++device.name M3143
+
+ vendor.id pci 0x1025
+&device.id pci 0x3145
++device.name M3145
+
+ vendor.id pci 0x1025
+&device.id pci 0x3147
++device.name M3147
+
+ vendor.id pci 0x1025
+&device.id pci 0x3149
++device.name M3149
+
+ vendor.id pci 0x1025
+&device.id pci 0x3151
++device.name M3151
+
+ vendor.id pci 0x1025
+&device.id pci 0x3307
++device.name M3307 MPEG-I Video Controller
+
+ vendor.id pci 0x1025
+&device.id pci 0x3309
++device.name M3309 MPEG-II Video w/ Software Audio Decoder
+
+ vendor.id pci 0x1025
+&device.id pci 0x3321
++device.name M3321 MPEG-II Audio/Video Decoder
+
+ vendor.id pci 0x1025
+&device.id pci 0x5212
++device.name M4803
+
+ vendor.id pci 0x1025
+&device.id pci 0x5215
++device.name ALI PCI EIDE Controller
+
+ vendor.id pci 0x1025
+&device.id pci 0x5217
++device.name M5217H
+
+ vendor.id pci 0x1025
+&device.id pci 0x5219
++device.name M5219
+
+ vendor.id pci 0x1025
+&device.id pci 0x5225
++device.name M5225
+
+ vendor.id pci 0x1025
+&device.id pci 0x5229
++device.name M5229
+
+ vendor.id pci 0x1025
+&device.id pci 0x5235
++device.name M5235
+
+ vendor.id pci 0x1025
+&device.id pci 0x5237
++device.name M5237 PCI USB Host Controller
+
+ vendor.id pci 0x1025
+&device.id pci 0x5240
++device.name EIDE Controller
+
+ vendor.id pci 0x1025
+&device.id pci 0x5241
++device.name PCMCIA Bridge
+
+ vendor.id pci 0x1025
+&device.id pci 0x5242
++device.name General Purpose Controller
+
+ vendor.id pci 0x1025
+&device.id pci 0x5243
++device.name PCI to PCI Bridge Controller
+
+ vendor.id pci 0x1025
+&device.id pci 0x5244
++device.name Floppy Disk Controller
+
+ vendor.id pci 0x1025
+&device.id pci 0x5247
++device.name M1541 PCI to PCI Bridge
+
+ vendor.id pci 0x1025
+&device.id pci 0x5251
++device.name M5251 P1394 Controller
+
+ vendor.id pci 0x1025
+&device.id pci 0x5427
++device.name PCI to AGP Bridge
+
+ vendor.id pci 0x1025
+&device.id pci 0x5451
++device.name M5451 PCI AC-Link Controller Audio Device
+
+ vendor.id pci 0x1025
+&device.id pci 0x5453
++device.name M5453 PCI AC-Link Controller Modem Device
+
+ vendor.id pci 0x1025
+&device.id pci 0x7101
++device.name M7101 PCI PMU Power Management Controller
+
+ vendor.id pci 0x1025
+&device.id pci 0x7101
+&subvendor.id pci 0x10b9
+&subdevice.id pci 0x7101
++subdevice.name M7101 PCI PMU Power Management Controller
+
+ vendor.id pci 0x1028
++vendor.name Dell
+
+ vendor.id pci 0x1028
+&device.id pci 0x0001
++device.name PowerEdge Expandable RAID Controller 2/Si
+
+ vendor.id pci 0x1028
+&device.id pci 0x0001
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x0001
++subdevice.name PowerEdge 2400
+
+ vendor.id pci 0x1028
+&device.id pci 0x0002
++device.name PowerEdge Expandable RAID Controller 3/Di
+
+ vendor.id pci 0x1028
+&device.id pci 0x0002
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x0002
++subdevice.name PowerEdge 4400
+
+ vendor.id pci 0x1028
+&device.id pci 0x0003
++device.name PowerEdge Expandable RAID Controller 3/Si
+
+ vendor.id pci 0x1028
+&device.id pci 0x0003
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x0003
++subdevice.name PowerEdge 2450
+
+ vendor.id pci 0x1028
+&device.id pci 0x0006
++device.name PowerEdge Expandable RAID Controller 3/Di
+
+ vendor.id pci 0x1028
+&device.id pci 0x0007
++device.name Remote Access Card III
+
+ vendor.id pci 0x1028
+&device.id pci 0x0008
++device.name Remote Access Card III
+
+ vendor.id pci 0x1028
+&device.id pci 0x0009
++device.name Remote Access Card III: BMC/SMIC device not present
+
+ vendor.id pci 0x1028
+&device.id pci 0x000a
++device.name PowerEdge Expandable RAID Controller 3/Di
+
+ vendor.id pci 0x1028
+&device.id pci 0x000c
++device.name Embedded Remote Access or ERA/O
+
+ vendor.id pci 0x1028
+&device.id pci 0x000d
++device.name Embedded Remote Access: BMC/SMIC device
+
+ vendor.id pci 0x1028
+&device.id pci 0x000e
++device.name PowerEdge Expandable RAID controller 4/Di
+
+ vendor.id pci 0x1028
+&device.id pci 0x000f
++device.name PowerEdge Expandable RAID controller 4/Di
+
+ vendor.id pci 0x1028
+&device.id pci 0x0010
++device.name Remote Access Card 4
+
+ vendor.id pci 0x1028
+&device.id pci 0x0011
++device.name Remote Access Card 4 Daughter Card
+
+ vendor.id pci 0x1028
+&device.id pci 0x0012
++device.name Remote Access Card 4 Daughter Card Virtual UART
+
+ vendor.id pci 0x1028
+&device.id pci 0x0013
++device.name PowerEdge Expandable RAID controller 4
+
+ vendor.id pci 0x1028
+&device.id pci 0x0013
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x016c
++subdevice.name PowerEdge Expandable RAID Controller 4e/Si
+
+ vendor.id pci 0x1028
+&device.id pci 0x0013
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x016d
++subdevice.name PowerEdge Expandable RAID Controller 4e/Di
+
+ vendor.id pci 0x1028
+&device.id pci 0x0013
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x016e
++subdevice.name PowerEdge Expandable RAID Controller 4e/Di
+
+ vendor.id pci 0x1028
+&device.id pci 0x0013
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x016f
++subdevice.name PowerEdge Expandable RAID Controller 4e/Di
+
+ vendor.id pci 0x1028
+&device.id pci 0x0013
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x0170
++subdevice.name PowerEdge Expandable RAID Controller 4e/Di
+
+ vendor.id pci 0x1028
+&device.id pci 0x0014
++device.name Remote Access Card 4 Daughter Card SMIC interface
+
+ vendor.id pci 0x1029
++vendor.name Siemens Nixdorf IS
+
+ vendor.id pci 0x102a
++vendor.name LSI Logic
+
+ vendor.id pci 0x102a
+&device.id pci 0x0000
++device.name HYDRA
+
+ vendor.id pci 0x102a
+&device.id pci 0x0010
++device.name ASPEN
+
+ vendor.id pci 0x102a
+&device.id pci 0x001f
++device.name AHA-2940U2/U2W /7890/7891 SCSI Controllers
+
+ vendor.id pci 0x102a
+&device.id pci 0x001f
+&subvendor.id pci 0x9005
+&subdevice.id pci 0x000f
++subdevice.name 2940U2W SCSI Controller
+
+ vendor.id pci 0x102a
+&device.id pci 0x001f
+&subvendor.id pci 0x9005
+&subdevice.id pci 0x0106
++subdevice.name 2940U2W SCSI Controller
+
+ vendor.id pci 0x102a
+&device.id pci 0x001f
+&subvendor.id pci 0x9005
+&subdevice.id pci 0xa180
++subdevice.name 2940U2W SCSI Controller
+
+ vendor.id pci 0x102a
+&device.id pci 0x00c5
++device.name AIC-7899 U160/m SCSI Controller
+
+ vendor.id pci 0x102a
+&device.id pci 0x00c5
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x00c5
++subdevice.name PowerEdge 2550/2650/4600
+
+ vendor.id pci 0x102a
+&device.id pci 0x00cf
++device.name AIC-7899P U160/m
+
+ vendor.id pci 0x102a
+&device.id pci 0x00cf
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x0106
++subdevice.name PowerEdge 4600
+
+ vendor.id pci 0x102a
+&device.id pci 0x00cf
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x0121
++subdevice.name PowerEdge 2650
+
+ vendor.id pci 0x102b
++vendor.name Matrox Graphics, Inc.
+
+ vendor.id pci 0x102b
+&device.id pci 0x0010
++device.name MGA-I [Impression?]
+
+ vendor.id pci 0x102b
+&device.id pci 0x0100
++device.name MGA 1064SG [Mystique]
+
+ vendor.id pci 0x102b
+&device.id pci 0x0518
++device.name MGA-II [Athena]
+
+ vendor.id pci 0x102b
+&device.id pci 0x0519
++device.name MGA 2064W [Millennium]
+
+ vendor.id pci 0x102b
+&device.id pci 0x051a
++device.name MGA 1064SG [Mystique]
+
+ vendor.id pci 0x102b
+&device.id pci 0x051a
+&subvendor.id pci 0x102b
+&subdevice.id pci 0x0100
++subdevice.name MGA-1064SG Mystique
+
+ vendor.id pci 0x102b
+&device.id pci 0x051a
+&subvendor.id pci 0x102b
+&subdevice.id pci 0x1100
++subdevice.name MGA-1084SG Mystique
+
+ vendor.id pci 0x102b
+&device.id pci 0x051a
+&subvendor.id pci 0x102b
+&subdevice.id pci 0x1200
++subdevice.name MGA-1084SG Mystique
+
+ vendor.id pci 0x102b
+&device.id pci 0x051a
+&subvendor.id pci 0x1100
+&subdevice.id pci 0x102b
++subdevice.name MGA-1084SG Mystique
+
+ vendor.id pci 0x102b
+&device.id pci 0x051a
+&subvendor.id pci 0x110a
+&subdevice.id pci 0x0018
++subdevice.name Scenic Pro C5 (D1025)
+
+ vendor.id pci 0x102b
+&device.id pci 0x051b
++device.name MGA 2164W [Millennium II]
+
+ vendor.id pci 0x102b
+&device.id pci 0x051b
+&subvendor.id pci 0x102b
+&subdevice.id pci 0x051b
++subdevice.name MGA-2164W Millennium II
+
+ vendor.id pci 0x102b
+&device.id pci 0x051b
+&subvendor.id pci 0x102b
+&subdevice.id pci 0x1100
++subdevice.name MGA-2164W Millennium II
+
+ vendor.id pci 0x102b
+&device.id pci 0x051b
+&subvendor.id pci 0x102b
+&subdevice.id pci 0x1200
++subdevice.name MGA-2164W Millennium II
+
+ vendor.id pci 0x102b
+&device.id pci 0x051e
++device.name MGA 1064SG [Mystique] AGP
+
+ vendor.id pci 0x102b
+&device.id pci 0x051f
++device.name MGA 2164W [Millennium II] AGP
+
+ vendor.id pci 0x102b
+&device.id pci 0x0520
++device.name MGA G200
+
+ vendor.id pci 0x102b
+&device.id pci 0x0520
+&subvendor.id pci 0x102b
+&subdevice.id pci 0xdbc2
++subdevice.name G200 Multi-Monitor
+
+ vendor.id pci 0x102b
+&device.id pci 0x0520
+&subvendor.id pci 0x102b
+&subdevice.id pci 0xdbc8
++subdevice.name G200 Multi-Monitor
+
+ vendor.id pci 0x102b
+&device.id pci 0x0520
+&subvendor.id pci 0x102b
+&subdevice.id pci 0xdbe2
++subdevice.name G200 Multi-Monitor
+
+ vendor.id pci 0x102b
+&device.id pci 0x0520
+&subvendor.id pci 0x102b
+&subdevice.id pci 0xdbe8
++subdevice.name G200 Multi-Monitor
+
+ vendor.id pci 0x102b
+&device.id pci 0x0520
+&subvendor.id pci 0x102b
+&subdevice.id pci 0xff03
++subdevice.name Millennium G200 SD
+
+ vendor.id pci 0x102b
+&device.id pci 0x0520
+&subvendor.id pci 0x102b
+&subdevice.id pci 0xff04
++subdevice.name Marvel G200
+
+ vendor.id pci 0x102b
+&device.id pci 0x0521
++device.name MGA G200 AGP
+
+ vendor.id pci 0x102b
+&device.id pci 0x0521
+&subvendor.id pci 0x1014
+&subdevice.id pci 0xff03
++subdevice.name Millennium G200 AGP
+
+ vendor.id pci 0x102b
+&device.id pci 0x0521
+&subvendor.id pci 0x102b
+&subdevice.id pci 0x48e9
++subdevice.name Mystique G200 AGP
+
+ vendor.id pci 0x102b
+&device.id pci 0x0521
+&subvendor.id pci 0x102b
+&subdevice.id pci 0x48f8
++subdevice.name Millennium G200 SD AGP
+
+ vendor.id pci 0x102b
+&device.id pci 0x0521
+&subvendor.id pci 0x102b
+&subdevice.id pci 0x4a60
++subdevice.name Millennium G200 LE AGP
+
+ vendor.id pci 0x102b
+&device.id pci 0x0521
+&subvendor.id pci 0x102b
+&subdevice.id pci 0x4a64
++subdevice.name Millennium G200 AGP
+
+ vendor.id pci 0x102b
+&device.id pci 0x0521
+&subvendor.id pci 0x102b
+&subdevice.id pci 0xc93c
++subdevice.name Millennium G200 AGP
+
+ vendor.id pci 0x102b
+&device.id pci 0x0521
+&subvendor.id pci 0x102b
+&subdevice.id pci 0xc9b0
++subdevice.name Millennium G200 AGP
+
+ vendor.id pci 0x102b
+&device.id pci 0x0521
+&subvendor.id pci 0x102b
+&subdevice.id pci 0xc9bc
++subdevice.name Millennium G200 AGP
+
+ vendor.id pci 0x102b
+&device.id pci 0x0521
+&subvendor.id pci 0x102b
+&subdevice.id pci 0xca60
++subdevice.name Millennium G250 LE AGP
+
+ vendor.id pci 0x102b
+&device.id pci 0x0521
+&subvendor.id pci 0x102b
+&subdevice.id pci 0xca6c
++subdevice.name Millennium G250 AGP
+
+ vendor.id pci 0x102b
+&device.id pci 0x0521
+&subvendor.id pci 0x102b
+&subdevice.id pci 0xdbbc
++subdevice.name Millennium G200 AGP
+
+ vendor.id pci 0x102b
+&device.id pci 0x0521
+&subvendor.id pci 0x102b
+&subdevice.id pci 0xdbc2
++subdevice.name Millennium G200 MMS (Dual G200)
+
+ vendor.id pci 0x102b
+&device.id pci 0x0521
+&subvendor.id pci 0x102b
+&subdevice.id pci 0xdbc3
++subdevice.name G200 Multi-Monitor
+
+ vendor.id pci 0x102b
+&device.id pci 0x0521
+&subvendor.id pci 0x102b
+&subdevice.id pci 0xdbc8
++subdevice.name Millennium G200 MMS (Dual G200)
+
+ vendor.id pci 0x102b
+&device.id pci 0x0521
+&subvendor.id pci 0x102b
+&subdevice.id pci 0xdbd2
++subdevice.name G200 Multi-Monitor
+
+ vendor.id pci 0x102b
+&device.id pci 0x0521
+&subvendor.id pci 0x102b
+&subdevice.id pci 0xdbd3
++subdevice.name G200 Multi-Monitor
+
+ vendor.id pci 0x102b
+&device.id pci 0x0521
+&subvendor.id pci 0x102b
+&subdevice.id pci 0xdbd4
++subdevice.name G200 Multi-Monitor
+
+ vendor.id pci 0x102b
+&device.id pci 0x0521
+&subvendor.id pci 0x102b
+&subdevice.id pci 0xdbd5
++subdevice.name G200 Multi-Monitor
+
+ vendor.id pci 0x102b
+&device.id pci 0x0521
+&subvendor.id pci 0x102b
+&subdevice.id pci 0xdbd8
++subdevice.name G200 Multi-Monitor
+
+ vendor.id pci 0x102b
+&device.id pci 0x0521
+&subvendor.id pci 0x102b
+&subdevice.id pci 0xdbd9
++subdevice.name G200 Multi-Monitor
+
+ vendor.id pci 0x102b
+&device.id pci 0x0521
+&subvendor.id pci 0x102b
+&subdevice.id pci 0xdbe2
++subdevice.name Millennium G200 MMS (Quad G200)
+
+ vendor.id pci 0x102b
+&device.id pci 0x0521
+&subvendor.id pci 0x102b
+&subdevice.id pci 0xdbe3
++subdevice.name G200 Multi-Monitor
+
+ vendor.id pci 0x102b
+&device.id pci 0x0521
+&subvendor.id pci 0x102b
+&subdevice.id pci 0xdbe8
++subdevice.name Millennium G200 MMS (Quad G200)
+
+ vendor.id pci 0x102b
+&device.id pci 0x0521
+&subvendor.id pci 0x102b
+&subdevice.id pci 0xdbf2
++subdevice.name G200 Multi-Monitor
+
+ vendor.id pci 0x102b
+&device.id pci 0x0521
+&subvendor.id pci 0x102b
+&subdevice.id pci 0xdbf3
++subdevice.name G200 Multi-Monitor
+
+ vendor.id pci 0x102b
+&device.id pci 0x0521
+&subvendor.id pci 0x102b
+&subdevice.id pci 0xdbf4
++subdevice.name G200 Multi-Monitor
+
+ vendor.id pci 0x102b
+&device.id pci 0x0521
+&subvendor.id pci 0x102b
+&subdevice.id pci 0xdbf5
++subdevice.name G200 Multi-Monitor
+
+ vendor.id pci 0x102b
+&device.id pci 0x0521
+&subvendor.id pci 0x102b
+&subdevice.id pci 0xdbf8
++subdevice.name G200 Multi-Monitor
+
+ vendor.id pci 0x102b
+&device.id pci 0x0521
+&subvendor.id pci 0x102b
+&subdevice.id pci 0xdbf9
++subdevice.name G200 Multi-Monitor
+
+ vendor.id pci 0x102b
+&device.id pci 0x0521
+&subvendor.id pci 0x102b
+&subdevice.id pci 0xf806
++subdevice.name Mystique G200 Video AGP
+
+ vendor.id pci 0x102b
+&device.id pci 0x0521
+&subvendor.id pci 0x102b
+&subdevice.id pci 0xff00
++subdevice.name MGA-G200 AGP
+
+ vendor.id pci 0x102b
+&device.id pci 0x0521
+&subvendor.id pci 0x102b
+&subdevice.id pci 0xff02
++subdevice.name Mystique G200 AGP
+
+ vendor.id pci 0x102b
+&device.id pci 0x0521
+&subvendor.id pci 0x102b
+&subdevice.id pci 0xff03
++subdevice.name Millennium G200 AGP
+
+ vendor.id pci 0x102b
+&device.id pci 0x0521
+&subvendor.id pci 0x102b
+&subdevice.id pci 0xff04
++subdevice.name Marvel G200 AGP
+
+ vendor.id pci 0x102b
+&device.id pci 0x0521
+&subvendor.id pci 0x110a
+&subdevice.id pci 0x0032
++subdevice.name MGA-G200 AGP
+
+ vendor.id pci 0x102b
+&device.id pci 0x0525
++device.name MGA G400 AGP
+
+ vendor.id pci 0x102b
+&device.id pci 0x0525
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0xb16f
++subdevice.name MGA-G400 AGP
+
+ vendor.id pci 0x102b
+&device.id pci 0x0525
+&subvendor.id pci 0x102b
+&subdevice.id pci 0x0328
++subdevice.name Millennium G400 16Mb SDRAM
+
+ vendor.id pci 0x102b
+&device.id pci 0x0525
+&subvendor.id pci 0x102b
+&subdevice.id pci 0x0338
++subdevice.name Millennium G400 16Mb SDRAM
+
+ vendor.id pci 0x102b
+&device.id pci 0x0525
+&subvendor.id pci 0x102b
+&subdevice.id pci 0x0378
++subdevice.name Millennium G400 32Mb SDRAM
+
+ vendor.id pci 0x102b
+&device.id pci 0x0525
+&subvendor.id pci 0x102b
+&subdevice.id pci 0x0541
++subdevice.name Millennium G450 Dual Head
+
+ vendor.id pci 0x102b
+&device.id pci 0x0525
+&subvendor.id pci 0x102b
+&subdevice.id pci 0x0542
++subdevice.name Millennium G450 Dual Head LX
+
+ vendor.id pci 0x102b
+&device.id pci 0x0525
+&subvendor.id pci 0x102b
+&subdevice.id pci 0x0543
++subdevice.name Millennium G450 Single Head LX
+
+ vendor.id pci 0x102b
+&device.id pci 0x0525
+&subvendor.id pci 0x102b
+&subdevice.id pci 0x0641
++subdevice.name Millennium G450 32Mb SDRAM Dual Head
+
+ vendor.id pci 0x102b
+&device.id pci 0x0525
+&subvendor.id pci 0x102b
+&subdevice.id pci 0x0642
++subdevice.name Millennium G450 32Mb SDRAM Dual Head LX
+
+ vendor.id pci 0x102b
+&device.id pci 0x0525
+&subvendor.id pci 0x102b
+&subdevice.id pci 0x0643
++subdevice.name Millennium G450 32Mb SDRAM Single Head LX
+
+ vendor.id pci 0x102b
+&device.id pci 0x0525
+&subvendor.id pci 0x102b
+&subdevice.id pci 0x07c0
++subdevice.name Millennium G450 Dual Head LE
+
+ vendor.id pci 0x102b
+&device.id pci 0x0525
+&subvendor.id pci 0x102b
+&subdevice.id pci 0x07c1
++subdevice.name Millennium G450 SDR Dual Head LE
+
+ vendor.id pci 0x102b
+&device.id pci 0x0525
+&subvendor.id pci 0x102b
+&subdevice.id pci 0x0d41
++subdevice.name Millennium G450 Dual Head PCI
+
+ vendor.id pci 0x102b
+&device.id pci 0x0525
+&subvendor.id pci 0x102b
+&subdevice.id pci 0x0d42
++subdevice.name Millennium G450 Dual Head LX PCI
+
+ vendor.id pci 0x102b
+&device.id pci 0x0525
+&subvendor.id pci 0x102b
+&subdevice.id pci 0x0d43
++subdevice.name Millennium G450 32Mb Dual Head PCI
+
+ vendor.id pci 0x102b
+&device.id pci 0x0525
+&subvendor.id pci 0x102b
+&subdevice.id pci 0x0e00
++subdevice.name Marvel G450 eTV
+
+ vendor.id pci 0x102b
+&device.id pci 0x0525
+&subvendor.id pci 0x102b
+&subdevice.id pci 0x0e01
++subdevice.name Marvel G450 eTV
+
+ vendor.id pci 0x102b
+&device.id pci 0x0525
+&subvendor.id pci 0x102b
+&subdevice.id pci 0x0e02
++subdevice.name Marvel G450 eTV
+
+ vendor.id pci 0x102b
+&device.id pci 0x0525
+&subvendor.id pci 0x102b
+&subdevice.id pci 0x0e03
++subdevice.name Marvel G450 eTV
+
+ vendor.id pci 0x102b
+&device.id pci 0x0525
+&subvendor.id pci 0x102b
+&subdevice.id pci 0x0f80
++subdevice.name Millennium G450 Low Profile
+
+ vendor.id pci 0x102b
+&device.id pci 0x0525
+&subvendor.id pci 0x102b
+&subdevice.id pci 0x0f81
++subdevice.name Millennium G450 Low Profile
+
+ vendor.id pci 0x102b
+&device.id pci 0x0525
+&subvendor.id pci 0x102b
+&subdevice.id pci 0x0f82
++subdevice.name Millennium G450 Low Profile DVI
+
+ vendor.id pci 0x102b
+&device.id pci 0x0525
+&subvendor.id pci 0x102b
+&subdevice.id pci 0x0f83
++subdevice.name Millennium G450 Low Profile DVI
+
+ vendor.id pci 0x102b
+&device.id pci 0x0525
+&subvendor.id pci 0x102b
+&subdevice.id pci 0x19d8
++subdevice.name Millennium G400 16Mb SGRAM
+
+ vendor.id pci 0x102b
+&device.id pci 0x0525
+&subvendor.id pci 0x102b
+&subdevice.id pci 0x19f8
++subdevice.name Millennium G400 32Mb SGRAM
+
+ vendor.id pci 0x102b
+&device.id pci 0x0525
+&subvendor.id pci 0x102b
+&subdevice.id pci 0x2159
++subdevice.name Millennium G400 Dual Head 16Mb
+
+ vendor.id pci 0x102b
+&device.id pci 0x0525
+&subvendor.id pci 0x102b
+&subdevice.id pci 0x2179
++subdevice.name Millennium G400 MAX/Dual Head 32Mb
+
+ vendor.id pci 0x102b
+&device.id pci 0x0525
+&subvendor.id pci 0x102b
+&subdevice.id pci 0x217d
++subdevice.name Millennium G400 Dual Head Max
+
+ vendor.id pci 0x102b
+&device.id pci 0x0525
+&subvendor.id pci 0x102b
+&subdevice.id pci 0x23c0
++subdevice.name Millennium G450
+
+ vendor.id pci 0x102b
+&device.id pci 0x0525
+&subvendor.id pci 0x102b
+&subdevice.id pci 0x23c1
++subdevice.name Millennium G450
+
+ vendor.id pci 0x102b
+&device.id pci 0x0525
+&subvendor.id pci 0x102b
+&subdevice.id pci 0x23c2
++subdevice.name Millennium G450 DVI
+
+ vendor.id pci 0x102b
+&device.id pci 0x0525
+&subvendor.id pci 0x102b
+&subdevice.id pci 0x23c3
++subdevice.name Millennium G450 DVI
+
+ vendor.id pci 0x102b
+&device.id pci 0x0525
+&subvendor.id pci 0x102b
+&subdevice.id pci 0x2f58
++subdevice.name Millennium G400
+
+ vendor.id pci 0x102b
+&device.id pci 0x0525
+&subvendor.id pci 0x102b
+&subdevice.id pci 0x2f78
++subdevice.name Millennium G400
+
+ vendor.id pci 0x102b
+&device.id pci 0x0525
+&subvendor.id pci 0x102b
+&subdevice.id pci 0x3693
++subdevice.name Marvel G400 AGP
+
+ vendor.id pci 0x102b
+&device.id pci 0x0525
+&subvendor.id pci 0x102b
+&subdevice.id pci 0x5dd0
++subdevice.name 4Sight II
+
+ vendor.id pci 0x102b
+&device.id pci 0x0525
+&subvendor.id pci 0x102b
+&subdevice.id pci 0x5f50
++subdevice.name 4Sight II
+
+ vendor.id pci 0x102b
+&device.id pci 0x0525
+&subvendor.id pci 0x102b
+&subdevice.id pci 0x5f51
++subdevice.name 4Sight II
+
+ vendor.id pci 0x102b
+&device.id pci 0x0525
+&subvendor.id pci 0x102b
+&subdevice.id pci 0x5f52
++subdevice.name 4Sight II
+
+ vendor.id pci 0x102b
+&device.id pci 0x0525
+&subvendor.id pci 0x102b
+&subdevice.id pci 0x9010
++subdevice.name Millennium G400 Dual Head
+
+ vendor.id pci 0x102b
+&device.id pci 0x0525
+&subvendor.id pci 0x1458
+&subdevice.id pci 0x0400
++subdevice.name GA-G400
+
+ vendor.id pci 0x102b
+&device.id pci 0x0525
+&subvendor.id pci 0x1705
+&subdevice.id pci 0x0001
++subdevice.name Millennium G450 32MB SGRAM
+
+ vendor.id pci 0x102b
+&device.id pci 0x0525
+&subvendor.id pci 0x1705
+&subdevice.id pci 0x0002
++subdevice.name Millennium G450 16MB SGRAM
+
+ vendor.id pci 0x102b
+&device.id pci 0x0525
+&subvendor.id pci 0x1705
+&subdevice.id pci 0x0003
++subdevice.name Millennium G450 32MB
+
+ vendor.id pci 0x102b
+&device.id pci 0x0525
+&subvendor.id pci 0x1705
+&subdevice.id pci 0x0004
++subdevice.name Millennium G450 16MB
+
+ vendor.id pci 0x102b
+&device.id pci 0x0527
++device.name MGA Parhelia AGP
+
+ vendor.id pci 0x102b
+&device.id pci 0x0527
+&subvendor.id pci 0x102b
+&subdevice.id pci 0x0840
++subdevice.name Parhelia 128Mb
+
+ vendor.id pci 0x102b
+&device.id pci 0x0d10
++device.name MGA Ultima/Impression
+
+ vendor.id pci 0x102b
+&device.id pci 0x1000
++device.name MGA G100 [Productiva]
+
+ vendor.id pci 0x102b
+&device.id pci 0x1000
+&subvendor.id pci 0x102b
+&subdevice.id pci 0xff01
++subdevice.name Productiva G100
+
+ vendor.id pci 0x102b
+&device.id pci 0x1000
+&subvendor.id pci 0x102b
+&subdevice.id pci 0xff05
++subdevice.name Productiva G100 Multi-Monitor
+
+ vendor.id pci 0x102b
+&device.id pci 0x1001
++device.name MGA G100 [Productiva] AGP
+
+ vendor.id pci 0x102b
+&device.id pci 0x1001
+&subvendor.id pci 0x102b
+&subdevice.id pci 0x1001
++subdevice.name MGA-G100 AGP
+
+ vendor.id pci 0x102b
+&device.id pci 0x1001
+&subvendor.id pci 0x102b
+&subdevice.id pci 0xff00
++subdevice.name MGA-G100 AGP
+
+ vendor.id pci 0x102b
+&device.id pci 0x1001
+&subvendor.id pci 0x102b
+&subdevice.id pci 0xff01
++subdevice.name MGA-G100 Productiva AGP
+
+ vendor.id pci 0x102b
+&device.id pci 0x1001
+&subvendor.id pci 0x102b
+&subdevice.id pci 0xff03
++subdevice.name Millennium G100 AGP
+
+ vendor.id pci 0x102b
+&device.id pci 0x1001
+&subvendor.id pci 0x102b
+&subdevice.id pci 0xff04
++subdevice.name MGA-G100 AGP
+
+ vendor.id pci 0x102b
+&device.id pci 0x1001
+&subvendor.id pci 0x102b
+&subdevice.id pci 0xff05
++subdevice.name MGA-G100 Productiva AGP Multi-Monitor
+
+ vendor.id pci 0x102b
+&device.id pci 0x1001
+&subvendor.id pci 0x110a
+&subdevice.id pci 0x001e
++subdevice.name MGA-G100 AGP
+
+ vendor.id pci 0x102b
+&device.id pci 0x2007
++device.name MGA Mistral
+
+ vendor.id pci 0x102b
+&device.id pci 0x2527
++device.name MGA G550 AGP
+
+ vendor.id pci 0x102b
+&device.id pci 0x2527
+&subvendor.id pci 0x102b
+&subdevice.id pci 0x0f83
++subdevice.name Millennium G550
+
+ vendor.id pci 0x102b
+&device.id pci 0x2527
+&subvendor.id pci 0x102b
+&subdevice.id pci 0x0f84
++subdevice.name Millennium G550 Dual Head DDR 32Mb
+
+ vendor.id pci 0x102b
+&device.id pci 0x2527
+&subvendor.id pci 0x102b
+&subdevice.id pci 0x1e41
++subdevice.name Millennium G550
+
+ vendor.id pci 0x102b
+&device.id pci 0x2537
++device.name MGA G650 AGP
+
+ vendor.id pci 0x102b
+&device.id pci 0x4536
++device.name VIA Framegrabber
+
+ vendor.id pci 0x102b
+&device.id pci 0x6573
++device.name Shark 10/100 Multiport SwitchNIC
+
+ vendor.id pci 0x102c
++vendor.name Chips and Technologies
+
+ vendor.id pci 0x102c
+&device.id pci 0x00b8
++device.name F64310
+
+ vendor.id pci 0x102c
+&device.id pci 0x00c0
++device.name F69000 HiQVideo
+
+ vendor.id pci 0x102c
+&device.id pci 0x00c0
+&subvendor.id pci 0x102c
+&subdevice.id pci 0x00c0
++subdevice.name F69000 HiQVideo
+
+ vendor.id pci 0x102c
+&device.id pci 0x00c0
+&subvendor.id pci 0x4c53
+&subdevice.id pci 0x1000
++subdevice.name CC7/CR7/CP7/VC7/VP7/VR7 mainboard
+
+ vendor.id pci 0x102c
+&device.id pci 0x00c0
+&subvendor.id pci 0x4c53
+&subdevice.id pci 0x1010
++subdevice.name CP5/CR6 mainboard
+
+ vendor.id pci 0x102c
+&device.id pci 0x00c0
+&subvendor.id pci 0x4c53
+&subdevice.id pci 0x1020
++subdevice.name VR6 mainboard
+
+ vendor.id pci 0x102c
+&device.id pci 0x00c0
+&subvendor.id pci 0x4c53
+&subdevice.id pci 0x1030
++subdevice.name PC5 mainboard
+
+ vendor.id pci 0x102c
+&device.id pci 0x00c0
+&subvendor.id pci 0x4c53
+&subdevice.id pci 0x1050
++subdevice.name CT7 mainboard
+
+ vendor.id pci 0x102c
+&device.id pci 0x00c0
+&subvendor.id pci 0x4c53
+&subdevice.id pci 0x1051
++subdevice.name CE7 mainboard
+
+ vendor.id pci 0x102c
+&device.id pci 0x00d0
++device.name F65545
+
+ vendor.id pci 0x102c
+&device.id pci 0x00d8
++device.name F65545
+
+ vendor.id pci 0x102c
+&device.id pci 0x00dc
++device.name F65548
+
+ vendor.id pci 0x102c
+&device.id pci 0x00e0
++device.name F65550
+
+ vendor.id pci 0x102c
+&device.id pci 0x00e4
++device.name F65554
+
+ vendor.id pci 0x102c
+&device.id pci 0x00e5
++device.name F65555 HiQVPro
+
+ vendor.id pci 0x102c
+&device.id pci 0x00e5
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0xb049
++subdevice.name Armada 1700 Laptop Display Controller
+
+ vendor.id pci 0x102c
+&device.id pci 0x00f0
++device.name F68554
+
+ vendor.id pci 0x102c
+&device.id pci 0x00f4
++device.name F68554 HiQVision
+
+ vendor.id pci 0x102c
+&device.id pci 0x00f5
++device.name F68555
+
+ vendor.id pci 0x102c
+&device.id pci 0x0c30
++device.name F69030
+
+ vendor.id pci 0x102c
+&device.id pci 0x0c30
+&subvendor.id pci 0x4c53
+&subdevice.id pci 0x1000
++subdevice.name CC7/CR7/CP7/VC7/VP7/VR7 mainboard
+
+ vendor.id pci 0x102c
+&device.id pci 0x0c30
+&subvendor.id pci 0x4c53
+&subdevice.id pci 0x1050
++subdevice.name CT7 mainboard
+
+ vendor.id pci 0x102c
+&device.id pci 0x0c30
+&subvendor.id pci 0x4c53
+&subdevice.id pci 0x1051
++subdevice.name CE7 mainboard
+
+ vendor.id pci 0x102c
+&device.id pci 0x0c30
+&subvendor.id pci 0x4c53
+&subdevice.id pci 0x1080
++subdevice.name CT8 mainboard
+
+ vendor.id pci 0x102d
++vendor.name Wyse Technology Inc.
+
+ vendor.id pci 0x102d
+&device.id pci 0x50dc
++device.name 3328 Audio
+
+ vendor.id pci 0x102e
++vendor.name Olivetti Advanced Technology
+
+ vendor.id pci 0x102f
++vendor.name Toshiba America
+
+ vendor.id pci 0x102f
+&device.id pci 0x0009
++device.name r4x00
+
+ vendor.id pci 0x102f
+&device.id pci 0x000a
++device.name TX3927 MIPS RISC PCI Controller
+
+ vendor.id pci 0x102f
+&device.id pci 0x0020
++device.name ATM Meteor 155
+
+ vendor.id pci 0x102f
+&device.id pci 0x0020
+&subvendor.id pci 0x102f
+&subdevice.id pci 0x00f8
++subdevice.name ATM Meteor 155
+
+ vendor.id pci 0x102f
+&device.id pci 0x0030
++device.name TC35815CF PCI 10/100 Mbit Ethernet Controller
+
+ vendor.id pci 0x102f
+&device.id pci 0x0031
++device.name TC35815CF PCI 10/100 Mbit Ethernet Controller with WOL
+
+ vendor.id pci 0x102f
+&device.id pci 0x0105
++device.name TC86C001 [goku-s] IDE
+
+ vendor.id pci 0x102f
+&device.id pci 0x0106
++device.name TC86C001 [goku-s] USB 1.1 Host
+
+ vendor.id pci 0x102f
+&device.id pci 0x0107
++device.name TC86C001 [goku-s] USB Device Controller
+
+ vendor.id pci 0x102f
+&device.id pci 0x0108
++device.name TC86C001 [goku-s] I2C/SIO/GPIO Controller
+
+ vendor.id pci 0x102f
+&device.id pci 0x0180
++device.name TX4927/38 MIPS RISC PCI Controller
+
+ vendor.id pci 0x102f
+&device.id pci 0x0181
++device.name TX4925 MIPS RISC PCI Controller
+
+ vendor.id pci 0x102f
+&device.id pci 0x0182
++device.name TX4937 MIPS RISC PCI Controller
+
+ vendor.id pci 0x1030
++vendor.name TMC Research
+
+ vendor.id pci 0x1031
++vendor.name Miro Computer Products AG
+
+ vendor.id pci 0x1031
+&device.id pci 0x5601
++device.name DC20 ASIC
+
+ vendor.id pci 0x1031
+&device.id pci 0x5607
++device.name Video I/O & motion JPEG compressor
+
+ vendor.id pci 0x1031
+&device.id pci 0x5631
++device.name Media 3D
+
+ vendor.id pci 0x1031
+&device.id pci 0x6057
++device.name MiroVideo DC10/DC30+
+
+ vendor.id pci 0x1032
++vendor.name Compaq
+
+ vendor.id pci 0x1033
++vendor.name NEC Corporation
+
+ vendor.id pci 0x1033
+&device.id pci 0x0000
++device.name Vr4181A USB Host or Function Control Unit
+
+ vendor.id pci 0x1033
+&device.id pci 0x0001
++device.name PCI to 486-like bus Bridge
+
+ vendor.id pci 0x1033
+&device.id pci 0x0002
++device.name PCI to VL98 Bridge
+
+ vendor.id pci 0x1033
+&device.id pci 0x0003
++device.name ATM Controller
+
+ vendor.id pci 0x1033
+&device.id pci 0x0004
++device.name R4000 PCI Bridge
+
+ vendor.id pci 0x1033
+&device.id pci 0x0005
++device.name PCI to 486-like bus Bridge
+
+ vendor.id pci 0x1033
+&device.id pci 0x0006
++device.name PC-9800 Graphic Accelerator
+
+ vendor.id pci 0x1033
+&device.id pci 0x0007
++device.name PCI to UX-Bus Bridge
+
+ vendor.id pci 0x1033
+&device.id pci 0x0008
++device.name PC-9800 Graphic Accelerator
+
+ vendor.id pci 0x1033
+&device.id pci 0x0009
++device.name PCI to PC9800 Core-Graph Bridge
+
+ vendor.id pci 0x1033
+&device.id pci 0x0016
++device.name PCI to VL Bridge
+
+ vendor.id pci 0x1033
+&device.id pci 0x001a
++device.name [Nile II]
+
+ vendor.id pci 0x1033
+&device.id pci 0x0021
++device.name Vrc4373 [Nile I]
+
+ vendor.id pci 0x1033
+&device.id pci 0x0029
++device.name PowerVR PCX1
+
+ vendor.id pci 0x1033
+&device.id pci 0x002a
++device.name PowerVR 3D
+
+ vendor.id pci 0x1033
+&device.id pci 0x002c
++device.name Star Alpha 2
+
+ vendor.id pci 0x1033
+&device.id pci 0x002d
++device.name PCI to C-bus Bridge
+
+ vendor.id pci 0x1033
+&device.id pci 0x0035
++device.name USB
+
+ vendor.id pci 0x1033
+&device.id pci 0x0035
+&subvendor.id pci 0x1179
+&subdevice.id pci 0x0001
++subdevice.name USB
+
+ vendor.id pci 0x1033
+&device.id pci 0x0035
+&subvendor.id pci 0x12ee
+&subdevice.id pci 0x7000
++subdevice.name Root Hub
+
+ vendor.id pci 0x1033
+&device.id pci 0x0035
+&subvendor.id pci 0x1799
+&subdevice.id pci 0x0001
++subdevice.name Root Hub
+
+ vendor.id pci 0x1033
+&device.id pci 0x0035
+&subvendor.id pci 0x807d
+&subdevice.id pci 0x0035
++subdevice.name PCI-USB2 (OHCI subsystem)
+
+ vendor.id pci 0x1033
+&device.id pci 0x003b
++device.name PCI to C-bus Bridge
+
+ vendor.id pci 0x1033
+&device.id pci 0x003e
++device.name NAPCCARD Cardbus Controller
+
+ vendor.id pci 0x1033
+&device.id pci 0x0046
++device.name PowerVR PCX2 [midas]
+
+ vendor.id pci 0x1033
+&device.id pci 0x005a
++device.name Vrc5074 [Nile 4]
+
+ vendor.id pci 0x1033
+&device.id pci 0x0063
++device.name Firewarden
+
+ vendor.id pci 0x1033
+&device.id pci 0x0067
++device.name PowerVR Neon 250 Chipset
+
+ vendor.id pci 0x1033
+&device.id pci 0x0067
+&subvendor.id pci 0x1010
+&subdevice.id pci 0x0020
++subdevice.name PowerVR Neon 250 AGP 32Mb
+
+ vendor.id pci 0x1033
+&device.id pci 0x0067
+&subvendor.id pci 0x1010
+&subdevice.id pci 0x0080
++subdevice.name PowerVR Neon 250 AGP 16Mb
+
+ vendor.id pci 0x1033
+&device.id pci 0x0067
+&subvendor.id pci 0x1010
+&subdevice.id pci 0x0088
++subdevice.name PowerVR Neon 250 16Mb
+
+ vendor.id pci 0x1033
+&device.id pci 0x0067
+&subvendor.id pci 0x1010
+&subdevice.id pci 0x0090
++subdevice.name PowerVR Neon 250 AGP 16Mb
+
+ vendor.id pci 0x1033
+&device.id pci 0x0067
+&subvendor.id pci 0x1010
+&subdevice.id pci 0x0098
++subdevice.name PowerVR Neon 250 16Mb
+
+ vendor.id pci 0x1033
+&device.id pci 0x0067
+&subvendor.id pci 0x1010
+&subdevice.id pci 0x00a0
++subdevice.name PowerVR Neon 250 AGP 32Mb
+
+ vendor.id pci 0x1033
+&device.id pci 0x0067
+&subvendor.id pci 0x1010
+&subdevice.id pci 0x00a8
++subdevice.name PowerVR Neon 250 32Mb
+
+ vendor.id pci 0x1033
+&device.id pci 0x0067
+&subvendor.id pci 0x1010
+&subdevice.id pci 0x0120
++subdevice.name PowerVR Neon 250 AGP 32Mb
+
+ vendor.id pci 0x1033
+&device.id pci 0x0074
++device.name 56k Voice Modem
+
+ vendor.id pci 0x1033
+&device.id pci 0x0074
+&subvendor.id pci 0x1033
+&subdevice.id pci 0x8014
++subdevice.name RCV56ACF 56k Voice Modem
+
+ vendor.id pci 0x1033
+&device.id pci 0x009b
++device.name Vrc5476
+
+ vendor.id pci 0x1033
+&device.id pci 0x00a5
++device.name VRC4173
+
+ vendor.id pci 0x1033
+&device.id pci 0x00a6
++device.name VRC5477 AC97
+
+ vendor.id pci 0x1033
+&device.id pci 0x00cd
++device.name IEEE 1394 [OrangeLink] Host Controller
+
+ vendor.id pci 0x1033
+&device.id pci 0x00cd
+&subvendor.id pci 0x12ee
+&subdevice.id pci 0x8011
++subdevice.name Root hub
+
+ vendor.id pci 0x1033
+&device.id pci 0x00ce
++device.name IEEE 1394 Host Controller
+
+ vendor.id pci 0x1033
+&device.id pci 0x00df
++device.name Vr4131
+
+ vendor.id pci 0x1033
+&device.id pci 0x00e0
++device.name USB 2.0
+
+ vendor.id pci 0x1033
+&device.id pci 0x00e0
+&subvendor.id pci 0x0ee4
+&subdevice.id pci 0x3383
++subdevice.name Sitecom IEEE 1394 / USB2.0 Combo Card
+
+ vendor.id pci 0x1033
+&device.id pci 0x00e0
+&subvendor.id pci 0x12ee
+&subdevice.id pci 0x7001
++subdevice.name Root hub
+
+ vendor.id pci 0x1033
+&device.id pci 0x00e0
+&subvendor.id pci 0x1799
+&subdevice.id pci 0x0002
++subdevice.name Root Hub
+
+ vendor.id pci 0x1033
+&device.id pci 0x00e0
+&subvendor.id pci 0x807d
+&subdevice.id pci 0x1043
++subdevice.name PCI-USB2 (EHCI subsystem)
+
+ vendor.id pci 0x1033
+&device.id pci 0x00e7
++device.name IEEE 1394 Host Controller
+
+ vendor.id pci 0x1033
+&device.id pci 0x00f2
++device.name uPD72874 IEEE1394 OHCI 1.1 3-port PHY-Link Ctrlr
+
+ vendor.id pci 0x1033
+&device.id pci 0x00f3
++device.name uPD6113x Multimedia Decoder/Processor [EMMA2]
+
+ vendor.id pci 0x1033
+&device.id pci 0x010c
++device.name VR7701
+
+ vendor.id pci 0x1034
++vendor.name Framatome Connectors USA Inc.
+
+ vendor.id pci 0x1035
++vendor.name Comp. & Comm. Research Lab
+
+ vendor.id pci 0x1036
++vendor.name Future Domain Corp.
+
+ vendor.id pci 0x1036
+&device.id pci 0x0000
++device.name TMC-18C30 [36C70]
+
+ vendor.id pci 0x1037
++vendor.name Hitachi Micro Systems
+
+ vendor.id pci 0x1038
++vendor.name AMP, Inc
+
+ vendor.id pci 0x1039
++vendor.name Silicon Integrated Systems [SiS]
+
+ vendor.id pci 0x1039
+&device.id pci 0x0001
++device.name Virtual PCI-to-PCI bridge (AGP)
+
+ vendor.id pci 0x1039
+&device.id pci 0x0002
++device.name SG86C202
+
+ vendor.id pci 0x1039
+&device.id pci 0x0006
++device.name 85C501/2/3
+
+ vendor.id pci 0x1039
+&device.id pci 0x0008
++device.name SiS85C503/5513 (LPC Bridge)
+
+ vendor.id pci 0x1039
+&device.id pci 0x0009
++device.name ACPI
+
+ vendor.id pci 0x1039
+&device.id pci 0x0016
++device.name SiS961/2 SMBus Controller
+
+ vendor.id pci 0x1039
+&device.id pci 0x0018
++device.name SiS85C503/5513 (LPC Bridge)
+
+ vendor.id pci 0x1039
+&device.id pci 0x0180
++device.name RAID bus controller 180 SATA/PATA [SiS]
+
+ vendor.id pci 0x1039
+&device.id pci 0x0181
++device.name SiS SATA
+
+ vendor.id pci 0x1039
+&device.id pci 0x0200
++device.name 5597/5598/6326 VGA
+
+ vendor.id pci 0x1039
+&device.id pci 0x0200
+&subvendor.id pci 0x1039
+&subdevice.id pci 0x0000
++subdevice.name SiS5597 SVGA (Shared RAM)
+
+ vendor.id pci 0x1039
+&device.id pci 0x0204
++device.name 82C204
+
+ vendor.id pci 0x1039
+&device.id pci 0x0205
++device.name SG86C205
+
+ vendor.id pci 0x1039
+&device.id pci 0x0300
++device.name 300/305 PCI/AGP VGA Display Adapter
+
+ vendor.id pci 0x1039
+&device.id pci 0x0300
+&subvendor.id pci 0x107d
+&subdevice.id pci 0x2720
++subdevice.name Leadtek WinFast VR300
+
+ vendor.id pci 0x1039
+&device.id pci 0x0310
++device.name 315H PCI/AGP VGA Display Adapter
+
+ vendor.id pci 0x1039
+&device.id pci 0x0315
++device.name 315 PCI/AGP VGA Display Adapter
+
+ vendor.id pci 0x1039
+&device.id pci 0x0325
++device.name 315PRO PCI/AGP VGA Display Adapter
+
+ vendor.id pci 0x1039
+&device.id pci 0x0330
++device.name 330 [Xabre] PCI/AGP VGA Display Adapter
+
+ vendor.id pci 0x1039
+&device.id pci 0x0406
++device.name 85C501/2
+
+ vendor.id pci 0x1039
+&device.id pci 0x0496
++device.name 85C496
+
+ vendor.id pci 0x1039
+&device.id pci 0x0530
++device.name 530 Host
+
+ vendor.id pci 0x1039
+&device.id pci 0x0540
++device.name 540 Host
+
+ vendor.id pci 0x1039
+&device.id pci 0x0550
++device.name 550 Host
+
+ vendor.id pci 0x1039
+&device.id pci 0x0597
++device.name 5513C
+
+ vendor.id pci 0x1039
+&device.id pci 0x0601
++device.name 85C601
+
+ vendor.id pci 0x1039
+&device.id pci 0x0620
++device.name 620 Host
+
+ vendor.id pci 0x1039
+&device.id pci 0x0630
++device.name 630 Host
+
+ vendor.id pci 0x1039
+&device.id pci 0x0633
++device.name 633 Host
+
+ vendor.id pci 0x1039
+&device.id pci 0x0635
++device.name 635 Host
+
+ vendor.id pci 0x1039
+&device.id pci 0x0645
++device.name SiS645 Host & Memory & AGP Controller
+
+ vendor.id pci 0x1039
+&device.id pci 0x0646
++device.name SiS645DX Host & Memory & AGP Controller
+
+ vendor.id pci 0x1039
+&device.id pci 0x0648
++device.name SiS 645xx
+
+ vendor.id pci 0x1039
+&device.id pci 0x0650
++device.name 650/M650 Host
+
+ vendor.id pci 0x1039
+&device.id pci 0x0651
++device.name 651 Host
+
+ vendor.id pci 0x1039
+&device.id pci 0x0655
++device.name 655 Host
+
+ vendor.id pci 0x1039
+&device.id pci 0x0660
++device.name 660 Host
+
+ vendor.id pci 0x1039
+&device.id pci 0x0661
++device.name 661FX/M661FX/M661MX Host
+
+ vendor.id pci 0x1039
+&device.id pci 0x0730
++device.name 730 Host
+
+ vendor.id pci 0x1039
+&device.id pci 0x0733
++device.name 733 Host
+
+ vendor.id pci 0x1039
+&device.id pci 0x0735
++device.name 735 Host
+
+ vendor.id pci 0x1039
+&device.id pci 0x0740
++device.name 740 Host
+
+ vendor.id pci 0x1039
+&device.id pci 0x0741
++device.name 741/741GX/M741 Host
+
+ vendor.id pci 0x1039
+&device.id pci 0x0745
++device.name 745 Host
+
+ vendor.id pci 0x1039
+&device.id pci 0x0746
++device.name 746 Host
+
+ vendor.id pci 0x1039
+&device.id pci 0x0755
++device.name 755 Host
+
+ vendor.id pci 0x1039
+&device.id pci 0x0760
++device.name 760/M760 Host
+
+ vendor.id pci 0x1039
+&device.id pci 0x0900
++device.name SiS900 PCI Fast Ethernet
+
+ vendor.id pci 0x1039
+&device.id pci 0x0900
+&subvendor.id pci 0x1019
+&subdevice.id pci 0x0a14
++subdevice.name K7S5A motherboard
+
+ vendor.id pci 0x1039
+&device.id pci 0x0900
+&subvendor.id pci 0x1039
+&subdevice.id pci 0x0900
++subdevice.name SiS900 10/100 Ethernet Adapter
+
+ vendor.id pci 0x1039
+&device.id pci 0x0900
+&subvendor.id pci 0x1043
+&subdevice.id pci 0x8035
++subdevice.name CUSI-FX motherboard
+
+ vendor.id pci 0x1039
+&device.id pci 0x0961
++device.name SiS961 [MuTIOL Media IO]
+
+ vendor.id pci 0x1039
+&device.id pci 0x0962
++device.name SiS962 [MuTIOL Media IO]
+
+ vendor.id pci 0x1039
+&device.id pci 0x0963
++device.name SiS963 [MuTIOL Media IO]
+
+ vendor.id pci 0x1039
+&device.id pci 0x0964
++device.name SiS964 [MuTIOL Media IO]
+
+ vendor.id pci 0x1039
+&device.id pci 0x0965
++device.name SiS965 [MuTIOL Media IO]
+
+ vendor.id pci 0x1039
+&device.id pci 0x3602
++device.name 83C602
+
+ vendor.id pci 0x1039
+&device.id pci 0x5107
++device.name 5107
+
+ vendor.id pci 0x1039
+&device.id pci 0x5300
++device.name SiS540 PCI Display Adapter
+
+ vendor.id pci 0x1039
+&device.id pci 0x5315
++device.name 550 PCI/AGP VGA Display Adapter
+
+ vendor.id pci 0x1039
+&device.id pci 0x5401
++device.name 486 PCI Chipset
+
+ vendor.id pci 0x1039
+&device.id pci 0x5511
++device.name 5511/5512
+
+ vendor.id pci 0x1039
+&device.id pci 0x5513
++device.name 5513 [IDE]
+
+ vendor.id pci 0x1039
+&device.id pci 0x5513
+&subvendor.id pci 0x1019
+&subdevice.id pci 0x0970
++subdevice.name P6STP-FL motherboard
+
+ vendor.id pci 0x1039
+&device.id pci 0x5513
+&subvendor.id pci 0x1039
+&subdevice.id pci 0x5513
++subdevice.name SiS5513 EIDE Controller (A,B step)
+
+ vendor.id pci 0x1039
+&device.id pci 0x5513
+&subvendor.id pci 0x1043
+&subdevice.id pci 0x8035
++subdevice.name CUSI-FX motherboard
+
+ vendor.id pci 0x1039
+&device.id pci 0x5517
++device.name 5517
+
+ vendor.id pci 0x1039
+&device.id pci 0x5571
++device.name 5571
+
+ vendor.id pci 0x1039
+&device.id pci 0x5581
++device.name 5581 Pentium Chipset
+
+ vendor.id pci 0x1039
+&device.id pci 0x5582
++device.name 5582
+
+ vendor.id pci 0x1039
+&device.id pci 0x5591
++device.name 5591/5592 Host
+
+ vendor.id pci 0x1039
+&device.id pci 0x5596
++device.name 5596 Pentium Chipset
+
+ vendor.id pci 0x1039
+&device.id pci 0x5597
++device.name 5597 [SiS5582]
+
+ vendor.id pci 0x1039
+&device.id pci 0x5600
++device.name 5600 Host
+
+ vendor.id pci 0x1039
+&device.id pci 0x6204
++device.name Video decoder & MPEG interface
+
+ vendor.id pci 0x1039
+&device.id pci 0x6205
++device.name VGA Controller
+
+ vendor.id pci 0x1039
+&device.id pci 0x6236
++device.name 6236 3D-AGP
+
+ vendor.id pci 0x1039
+&device.id pci 0x6300
++device.name 630/730 PCI/AGP VGA Display Adapter
+
+ vendor.id pci 0x1039
+&device.id pci 0x6300
+&subvendor.id pci 0x1019
+&subdevice.id pci 0x0970
++subdevice.name P6STP-FL motherboard
+
+ vendor.id pci 0x1039
+&device.id pci 0x6300
+&subvendor.id pci 0x1043
+&subdevice.id pci 0x8035
++subdevice.name CUSI-FX motherboard
+
+ vendor.id pci 0x1039
+&device.id pci 0x6306
++device.name 530/620 PCI/AGP VGA Display Adapter
+
+ vendor.id pci 0x1039
+&device.id pci 0x6306
+&subvendor.id pci 0x1039
+&subdevice.id pci 0x6306
++subdevice.name SiS530,620 GUI Accelerator+3D
+
+ vendor.id pci 0x1039
+&device.id pci 0x6325
++device.name 65x/M650/740 PCI/AGP VGA Display Adapter
+
+ vendor.id pci 0x1039
+&device.id pci 0x6326
++device.name 86C326 5598/6326
+
+ vendor.id pci 0x1039
+&device.id pci 0x6326
+&subvendor.id pci 0x1039
+&subdevice.id pci 0x6326
++subdevice.name SiS6326 GUI Accelerator
+
+ vendor.id pci 0x1039
+&device.id pci 0x6326
+&subvendor.id pci 0x1092
+&subdevice.id pci 0x0a50
++subdevice.name SpeedStar A50
+
+ vendor.id pci 0x1039
+&device.id pci 0x6326
+&subvendor.id pci 0x1092
+&subdevice.id pci 0x0a70
++subdevice.name SpeedStar A70
+
+ vendor.id pci 0x1039
+&device.id pci 0x6326
+&subvendor.id pci 0x1092
+&subdevice.id pci 0x4910
++subdevice.name SpeedStar A70
+
+ vendor.id pci 0x1039
+&device.id pci 0x6326
+&subvendor.id pci 0x1092
+&subdevice.id pci 0x4920
++subdevice.name SpeedStar A70
+
+ vendor.id pci 0x1039
+&device.id pci 0x6326
+&subvendor.id pci 0x1569
+&subdevice.id pci 0x6326
++subdevice.name SiS6326 GUI Accelerator
+
+ vendor.id pci 0x1039
+&device.id pci 0x6330
++device.name 661/741/760 PCI/AGP VGA Display Adapter
+
+ vendor.id pci 0x1039
+&device.id pci 0x6330
+&subvendor.id pci 0x1039
+&subdevice.id pci 0x6330
++subdevice.name [M]661xX/[M]741[GX]/[M]760 PCI/AGP VGA Adapter
+
+ vendor.id pci 0x1039
+&device.id pci 0x7001
++device.name USB 1.0 Controller
+
+ vendor.id pci 0x1039
+&device.id pci 0x7001
+&subvendor.id pci 0x1019
+&subdevice.id pci 0x0a14
++subdevice.name K7S5A motherboard
+
+ vendor.id pci 0x1039
+&device.id pci 0x7001
+&subvendor.id pci 0x1039
+&subdevice.id pci 0x7000
++subdevice.name Onboard USB Controller
+
+ vendor.id pci 0x1039
+&device.id pci 0x7002
++device.name USB 2.0 Controller
+
+ vendor.id pci 0x1039
+&device.id pci 0x7002
+&subvendor.id pci 0x1509
+&subdevice.id pci 0x7002
++subdevice.name Onboard USB Controller
+
+ vendor.id pci 0x1039
+&device.id pci 0x7007
++device.name FireWire Controller
+
+ vendor.id pci 0x1039
+&device.id pci 0x7012
++device.name Sound Controller
+
+ vendor.id pci 0x1039
+&device.id pci 0x7013
++device.name AC'97 Modem Controller
+
+ vendor.id pci 0x1039
+&device.id pci 0x7016
++device.name SiS7016 PCI Fast Ethernet Adapter
+
+ vendor.id pci 0x1039
+&device.id pci 0x7016
+&subvendor.id pci 0x1039
+&subdevice.id pci 0x7016
++subdevice.name SiS7016 10/100 Ethernet Adapter
+
+ vendor.id pci 0x1039
+&device.id pci 0x7018
++device.name SiS PCI Audio Accelerator
+
+ vendor.id pci 0x1039
+&device.id pci 0x7018
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x01b6
++subdevice.name SiS PCI Audio Accelerator
+
+ vendor.id pci 0x1039
+&device.id pci 0x7018
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x01b7
++subdevice.name SiS PCI Audio Accelerator
+
+ vendor.id pci 0x1039
+&device.id pci 0x7018
+&subvendor.id pci 0x1019
+&subdevice.id pci 0x7018
++subdevice.name SiS PCI Audio Accelerator
+
+ vendor.id pci 0x1039
+&device.id pci 0x7018
+&subvendor.id pci 0x1025
+&subdevice.id pci 0x000e
++subdevice.name SiS PCI Audio Accelerator
+
+ vendor.id pci 0x1039
+&device.id pci 0x7018
+&subvendor.id pci 0x1025
+&subdevice.id pci 0x0018
++subdevice.name SiS PCI Audio Accelerator
+
+ vendor.id pci 0x1039
+&device.id pci 0x7018
+&subvendor.id pci 0x1039
+&subdevice.id pci 0x7018
++subdevice.name SiS PCI Audio Accelerator
+
+ vendor.id pci 0x1039
+&device.id pci 0x7018
+&subvendor.id pci 0x1043
+&subdevice.id pci 0x800b
++subdevice.name SiS PCI Audio Accelerator
+
+ vendor.id pci 0x1039
+&device.id pci 0x7018
+&subvendor.id pci 0x1054
+&subdevice.id pci 0x7018
++subdevice.name SiS PCI Audio Accelerator
+
+ vendor.id pci 0x1039
+&device.id pci 0x7018
+&subvendor.id pci 0x107d
+&subdevice.id pci 0x5330
++subdevice.name SiS PCI Audio Accelerator
+
+ vendor.id pci 0x1039
+&device.id pci 0x7018
+&subvendor.id pci 0x107d
+&subdevice.id pci 0x5350
++subdevice.name SiS PCI Audio Accelerator
+
+ vendor.id pci 0x1039
+&device.id pci 0x7018
+&subvendor.id pci 0x1170
+&subdevice.id pci 0x3209
++subdevice.name SiS PCI Audio Accelerator
+
+ vendor.id pci 0x1039
+&device.id pci 0x7018
+&subvendor.id pci 0x1462
+&subdevice.id pci 0x400a
++subdevice.name SiS PCI Audio Accelerator
+
+ vendor.id pci 0x1039
+&device.id pci 0x7018
+&subvendor.id pci 0x14a4
+&subdevice.id pci 0x2089
++subdevice.name SiS PCI Audio Accelerator
+
+ vendor.id pci 0x1039
+&device.id pci 0x7018
+&subvendor.id pci 0x14cd
+&subdevice.id pci 0x2194
++subdevice.name SiS PCI Audio Accelerator
+
+ vendor.id pci 0x1039
+&device.id pci 0x7018
+&subvendor.id pci 0x14ff
+&subdevice.id pci 0x1100
++subdevice.name SiS PCI Audio Accelerator
+
+ vendor.id pci 0x1039
+&device.id pci 0x7018
+&subvendor.id pci 0x152d
+&subdevice.id pci 0x8808
++subdevice.name SiS PCI Audio Accelerator
+
+ vendor.id pci 0x1039
+&device.id pci 0x7018
+&subvendor.id pci 0x1558
+&subdevice.id pci 0x1103
++subdevice.name SiS PCI Audio Accelerator
+
+ vendor.id pci 0x1039
+&device.id pci 0x7018
+&subvendor.id pci 0x1558
+&subdevice.id pci 0x2200
++subdevice.name SiS PCI Audio Accelerator
+
+ vendor.id pci 0x1039
+&device.id pci 0x7018
+&subvendor.id pci 0x1563
+&subdevice.id pci 0x7018
++subdevice.name SiS PCI Audio Accelerator
+
+ vendor.id pci 0x1039
+&device.id pci 0x7018
+&subvendor.id pci 0x15c5
+&subdevice.id pci 0x0111
++subdevice.name SiS PCI Audio Accelerator
+
+ vendor.id pci 0x1039
+&device.id pci 0x7018
+&subvendor.id pci 0x270f
+&subdevice.id pci 0xa171
++subdevice.name SiS PCI Audio Accelerator
+
+ vendor.id pci 0x1039
+&device.id pci 0x7018
+&subvendor.id pci 0xa0a0
+&subdevice.id pci 0x0022
++subdevice.name SiS PCI Audio Accelerator
+
+ vendor.id pci 0x1039
+&device.id pci 0x7019
++device.name SiS7019 Audio Accelerator
+
+ vendor.id pci 0x103a
++vendor.name Seiko Epson Corporation
+
+ vendor.id pci 0x103b
++vendor.name Tatung Co. of America
+
+ vendor.id pci 0x103c
++vendor.name Hewlett-Packard Company
+
+ vendor.id pci 0x103c
+&device.id pci 0x1005
++device.name A4977A Visualize EG
+
+ vendor.id pci 0x103c
+&device.id pci 0x1006
++device.name Visualize FX6
+
+ vendor.id pci 0x103c
+&device.id pci 0x1008
++device.name Visualize FX4
+
+ vendor.id pci 0x103c
+&device.id pci 0x100a
++device.name Visualize FX2
+
+ vendor.id pci 0x103c
+&device.id pci 0x1028
++device.name Tach TL Fibre Channel Host Adapter
+
+ vendor.id pci 0x103c
+&device.id pci 0x1029
++device.name Tach XL2 Fibre Channel Host Adapter
+
+ vendor.id pci 0x103c
+&device.id pci 0x1029
+&subvendor.id pci 0x107e
+&subdevice.id pci 0x000f
++subdevice.name Interphase 5560 Fibre Channel Adapter
+
+ vendor.id pci 0x103c
+&device.id pci 0x1029
+&subvendor.id pci 0x9004
+&subdevice.id pci 0x9210
++subdevice.name 1Gb/2Gb Family Fibre Channel Controller
+
+ vendor.id pci 0x103c
+&device.id pci 0x1029
+&subvendor.id pci 0x9004
+&subdevice.id pci 0x9211
++subdevice.name 1Gb/2Gb Family Fibre Channel Controller
+
+ vendor.id pci 0x103c
+&device.id pci 0x102a
++device.name Tach TS Fibre Channel Host Adapter
+
+ vendor.id pci 0x103c
+&device.id pci 0x102a
+&subvendor.id pci 0x107e
+&subdevice.id pci 0x000e
++subdevice.name Interphase 5540/5541 Fibre Channel Adapter
+
+ vendor.id pci 0x103c
+&device.id pci 0x102a
+&subvendor.id pci 0x9004
+&subdevice.id pci 0x9110
++subdevice.name 1Gb/2Gb Family Fibre Channel Controller
+
+ vendor.id pci 0x103c
+&device.id pci 0x102a
+&subvendor.id pci 0x9004
+&subdevice.id pci 0x9111
++subdevice.name 1Gb/2Gb Family Fibre Channel Controller
+
+ vendor.id pci 0x103c
+&device.id pci 0x1030
++device.name J2585A DeskDirect 10/100VG NIC
+
+ vendor.id pci 0x103c
+&device.id pci 0x1031
++device.name J2585B HP 10/100VG PCI LAN Adapter
+
+ vendor.id pci 0x103c
+&device.id pci 0x1031
+&subvendor.id pci 0x103c
+&subdevice.id pci 0x1040
++subdevice.name J2973A DeskDirect 10BaseT NIC
+
+ vendor.id pci 0x103c
+&device.id pci 0x1031
+&subvendor.id pci 0x103c
+&subdevice.id pci 0x1041
++subdevice.name J2585B DeskDirect 10/100VG NIC
+
+ vendor.id pci 0x103c
+&device.id pci 0x1031
+&subvendor.id pci 0x103c
+&subdevice.id pci 0x1042
++subdevice.name J2970A DeskDirect 10BaseT/2 NIC
+
+ vendor.id pci 0x103c
+&device.id pci 0x1040
++device.name J2973A DeskDirect 10BaseT NIC
+
+ vendor.id pci 0x103c
+&device.id pci 0x1041
++device.name J2585B DeskDirect 10/100 NIC
+
+ vendor.id pci 0x103c
+&device.id pci 0x1042
++device.name J2970A DeskDirect 10BaseT/2 NIC
+
+ vendor.id pci 0x103c
+&device.id pci 0x1048
++device.name Diva Serial [GSP] Multiport UART
+
+ vendor.id pci 0x103c
+&device.id pci 0x1048
+&subvendor.id pci 0x103c
+&subdevice.id pci 0x1049
++subdevice.name Tosca Console
+
+ vendor.id pci 0x103c
+&device.id pci 0x1048
+&subvendor.id pci 0x103c
+&subdevice.id pci 0x104a
++subdevice.name Tosca Secondary
+
+ vendor.id pci 0x103c
+&device.id pci 0x1048
+&subvendor.id pci 0x103c
+&subdevice.id pci 0x104b
++subdevice.name Maestro SP2
+
+ vendor.id pci 0x103c
+&device.id pci 0x1048
+&subvendor.id pci 0x103c
+&subdevice.id pci 0x1223
++subdevice.name Superdome Console
+
+ vendor.id pci 0x103c
+&device.id pci 0x1048
+&subvendor.id pci 0x103c
+&subdevice.id pci 0x1226
++subdevice.name Keystone SP2
+
+ vendor.id pci 0x103c
+&device.id pci 0x1048
+&subvendor.id pci 0x103c
+&subdevice.id pci 0x1227
++subdevice.name Powerbar SP2
+
+ vendor.id pci 0x103c
+&device.id pci 0x1048
+&subvendor.id pci 0x103c
+&subdevice.id pci 0x1282
++subdevice.name Everest SP2
+
+ vendor.id pci 0x103c
+&device.id pci 0x1054
++device.name PCI Local Bus Adapter
+
+ vendor.id pci 0x103c
+&device.id pci 0x1064
++device.name 79C970 PCnet Ethernet Controller
+
+ vendor.id pci 0x103c
+&device.id pci 0x108b
++device.name Visualize FXe
+
+ vendor.id pci 0x103c
+&device.id pci 0x10c1
++device.name NetServer Smart IRQ Router
+
+ vendor.id pci 0x103c
+&device.id pci 0x10ed
++device.name TopTools Remote Control
+
+ vendor.id pci 0x103c
+&device.id pci 0x1200
++device.name 82557B 10/100 NIC
+
+ vendor.id pci 0x103c
+&device.id pci 0x1219
++device.name NetServer PCI Hot-Plug Controller
+
+ vendor.id pci 0x103c
+&device.id pci 0x121a
++device.name NetServer SMIC Controller
+
+ vendor.id pci 0x103c
+&device.id pci 0x121b
++device.name NetServer Legacy COM Port Decoder
+
+ vendor.id pci 0x103c
+&device.id pci 0x121c
++device.name NetServer PCI COM Port Decoder
+
+ vendor.id pci 0x103c
+&device.id pci 0x1229
++device.name zx1 System Bus Adapter
+
+ vendor.id pci 0x103c
+&device.id pci 0x122a
++device.name zx1 I/O Controller
+
+ vendor.id pci 0x103c
+&device.id pci 0x122e
++device.name zx1 Local Bus Adapter
+
+ vendor.id pci 0x103c
+&device.id pci 0x127c
++device.name sx1000 I/O Controller
+
+ vendor.id pci 0x103c
+&device.id pci 0x1290
++device.name Auxiliary Diva Serial Port
+
+ vendor.id pci 0x103c
+&device.id pci 0x1291
++device.name Auxiliary Diva Serial Port
+
+ vendor.id pci 0x103c
+&device.id pci 0x2910
++device.name E2910A PCIBus Exerciser
+
+ vendor.id pci 0x103c
+&device.id pci 0x2925
++device.name E2925A 32 Bit, 33 MHzPCI Exerciser & Analyzer
+
+ vendor.id pci 0x103e
++vendor.name Solliday Engineering
+
+ vendor.id pci 0x103f
++vendor.name Synopsys/Logic Modeling Group
+
+ vendor.id pci 0x1040
++vendor.name Accelgraphics Inc.
+
+ vendor.id pci 0x1041
++vendor.name Computrend
+
+ vendor.id pci 0x1042
++vendor.name Micron
+
+ vendor.id pci 0x1042
+&device.id pci 0x1000
++device.name PC Tech RZ1000
+
+ vendor.id pci 0x1042
+&device.id pci 0x1001
++device.name PC Tech RZ1001
+
+ vendor.id pci 0x1042
+&device.id pci 0x3000
++device.name Samurai_0
+
+ vendor.id pci 0x1042
+&device.id pci 0x3010
++device.name Samurai_1
+
+ vendor.id pci 0x1042
+&device.id pci 0x3020
++device.name Samurai_IDE
+
+ vendor.id pci 0x1043
++vendor.name ASUSTeK Computer Inc.
+
+ vendor.id pci 0x1043
+&device.id pci 0x0675
++device.name ISDNLink P-IN100-ST-D
+
+ vendor.id pci 0x1043
+&device.id pci 0x4015
++device.name v7100 SDRAM [GeForce2 MX]
+
+ vendor.id pci 0x1043
+&device.id pci 0x4021
++device.name v7100 Combo Deluxe [GeForce2 MX + TV tuner]
+
+ vendor.id pci 0x1043
+&device.id pci 0x4057
++device.name v8200 GeForce 3
+
+ vendor.id pci 0x1043
+&device.id pci 0x8043
++device.name v8240 PAL 128M [P4T] Motherboard
+
+ vendor.id pci 0x1043
+&device.id pci 0x807b
++device.name v9280/TD [Geforce4 TI4200 8X With TV-Out and DVI]
+
+ vendor.id pci 0x1043
+&device.id pci 0x80bb
++device.name v9180 Magic/T [GeForce4 MX440 AGP 8x 64MB TV-out]
+
+ vendor.id pci 0x1044
++vendor.name Adaptec (formerly DPT)
+
+ vendor.id pci 0x1044
+&device.id pci 0x1012
++device.name Domino RAID Engine
+
+ vendor.id pci 0x1044
+&device.id pci 0xa400
++device.name SmartCache/Raid I-IV Controller
+
+ vendor.id pci 0x1044
+&device.id pci 0xa500
++device.name PCI Bridge
+
+ vendor.id pci 0x1044
+&device.id pci 0xa501
++device.name SmartRAID V Controller
+
+ vendor.id pci 0x1044
+&device.id pci 0xa501
+&subvendor.id pci 0x1044
+&subdevice.id pci 0xc001
++subdevice.name PM1554U2 Ultra2 Single Channel
+
+ vendor.id pci 0x1044
+&device.id pci 0xa501
+&subvendor.id pci 0x1044
+&subdevice.id pci 0xc002
++subdevice.name PM1654U2 Ultra2 Single Channel
+
+ vendor.id pci 0x1044
+&device.id pci 0xa501
+&subvendor.id pci 0x1044
+&subdevice.id pci 0xc003
++subdevice.name PM1564U3 Ultra3 Single Channel
+
+ vendor.id pci 0x1044
+&device.id pci 0xa501
+&subvendor.id pci 0x1044
+&subdevice.id pci 0xc004
++subdevice.name PM1564U3 Ultra3 Dual Channel
+
+ vendor.id pci 0x1044
+&device.id pci 0xa501
+&subvendor.id pci 0x1044
+&subdevice.id pci 0xc005
++subdevice.name PM1554U2 Ultra2 Single Channel (NON ACPI)
+
+ vendor.id pci 0x1044
+&device.id pci 0xa501
+&subvendor.id pci 0x1044
+&subdevice.id pci 0xc00a
++subdevice.name PM2554U2 Ultra2 Single Channel
+
+ vendor.id pci 0x1044
+&device.id pci 0xa501
+&subvendor.id pci 0x1044
+&subdevice.id pci 0xc00b
++subdevice.name PM2654U2 Ultra2 Single Channel
+
+ vendor.id pci 0x1044
+&device.id pci 0xa501
+&subvendor.id pci 0x1044
+&subdevice.id pci 0xc00c
++subdevice.name PM2664U3 Ultra3 Single Channel
+
+ vendor.id pci 0x1044
+&device.id pci 0xa501
+&subvendor.id pci 0x1044
+&subdevice.id pci 0xc00d
++subdevice.name PM2664U3 Ultra3 Dual Channel
+
+ vendor.id pci 0x1044
+&device.id pci 0xa501
+&subvendor.id pci 0x1044
+&subdevice.id pci 0xc00e
++subdevice.name PM2554U2 Ultra2 Single Channel (NON ACPI)
+
+ vendor.id pci 0x1044
+&device.id pci 0xa501
+&subvendor.id pci 0x1044
+&subdevice.id pci 0xc00f
++subdevice.name PM2654U2 Ultra2 Single Channel (NON ACPI)
+
+ vendor.id pci 0x1044
+&device.id pci 0xa501
+&subvendor.id pci 0x1044
+&subdevice.id pci 0xc014
++subdevice.name PM3754U2 Ultra2 Single Channel (NON ACPI)
+
+ vendor.id pci 0x1044
+&device.id pci 0xa501
+&subvendor.id pci 0x1044
+&subdevice.id pci 0xc015
++subdevice.name PM3755U2B Ultra2 Single Channel (NON ACPI)
+
+ vendor.id pci 0x1044
+&device.id pci 0xa501
+&subvendor.id pci 0x1044
+&subdevice.id pci 0xc016
++subdevice.name PM3755F Fibre Channel (NON ACPI)
+
+ vendor.id pci 0x1044
+&device.id pci 0xa501
+&subvendor.id pci 0x1044
+&subdevice.id pci 0xc01e
++subdevice.name PM3757U2 Ultra2 Single Channel
+
+ vendor.id pci 0x1044
+&device.id pci 0xa501
+&subvendor.id pci 0x1044
+&subdevice.id pci 0xc01f
++subdevice.name PM3757U2 Ultra2 Dual Channel
+
+ vendor.id pci 0x1044
+&device.id pci 0xa501
+&subvendor.id pci 0x1044
+&subdevice.id pci 0xc020
++subdevice.name PM3767U3 Ultra3 Dual Channel
+
+ vendor.id pci 0x1044
+&device.id pci 0xa501
+&subvendor.id pci 0x1044
+&subdevice.id pci 0xc021
++subdevice.name PM3767U3 Ultra3 Quad Channel
+
+ vendor.id pci 0x1044
+&device.id pci 0xa501
+&subvendor.id pci 0x1044
+&subdevice.id pci 0xc028
++subdevice.name PM2865U3 Ultra3 Single Channel
+
+ vendor.id pci 0x1044
+&device.id pci 0xa501
+&subvendor.id pci 0x1044
+&subdevice.id pci 0xc029
++subdevice.name PM2865U3 Ultra3 Dual Channel
+
+ vendor.id pci 0x1044
+&device.id pci 0xa501
+&subvendor.id pci 0x1044
+&subdevice.id pci 0xc02a
++subdevice.name PM2865F Fibre Channel
+
+ vendor.id pci 0x1044
+&device.id pci 0xa501
+&subvendor.id pci 0x1044
+&subdevice.id pci 0xc03c
++subdevice.name 2000S Ultra3 Single Channel
+
+ vendor.id pci 0x1044
+&device.id pci 0xa501
+&subvendor.id pci 0x1044
+&subdevice.id pci 0xc03d
++subdevice.name 2000S Ultra3 Dual Channel
+
+ vendor.id pci 0x1044
+&device.id pci 0xa501
+&subvendor.id pci 0x1044
+&subdevice.id pci 0xc03e
++subdevice.name 2000F Fibre Channel
+
+ vendor.id pci 0x1044
+&device.id pci 0xa501
+&subvendor.id pci 0x1044
+&subdevice.id pci 0xc046
++subdevice.name 3000S Ultra3 Single Channel
+
+ vendor.id pci 0x1044
+&device.id pci 0xa501
+&subvendor.id pci 0x1044
+&subdevice.id pci 0xc047
++subdevice.name 3000S Ultra3 Dual Channel
+
+ vendor.id pci 0x1044
+&device.id pci 0xa501
+&subvendor.id pci 0x1044
+&subdevice.id pci 0xc048
++subdevice.name 3000F Fibre Channel
+
+ vendor.id pci 0x1044
+&device.id pci 0xa501
+&subvendor.id pci 0x1044
+&subdevice.id pci 0xc050
++subdevice.name 5000S Ultra3 Single Channel
+
+ vendor.id pci 0x1044
+&device.id pci 0xa501
+&subvendor.id pci 0x1044
+&subdevice.id pci 0xc051
++subdevice.name 5000S Ultra3 Dual Channel
+
+ vendor.id pci 0x1044
+&device.id pci 0xa501
+&subvendor.id pci 0x1044
+&subdevice.id pci 0xc052
++subdevice.name 5000F Fibre Channel
+
+ vendor.id pci 0x1044
+&device.id pci 0xa501
+&subvendor.id pci 0x1044
+&subdevice.id pci 0xc05a
++subdevice.name 2400A UDMA Four Channel
+
+ vendor.id pci 0x1044
+&device.id pci 0xa501
+&subvendor.id pci 0x1044
+&subdevice.id pci 0xc05b
++subdevice.name 2400A UDMA Four Channel DAC
+
+ vendor.id pci 0x1044
+&device.id pci 0xa501
+&subvendor.id pci 0x1044
+&subdevice.id pci 0xc064
++subdevice.name 3010S Ultra3 Dual Channel
+
+ vendor.id pci 0x1044
+&device.id pci 0xa501
+&subvendor.id pci 0x1044
+&subdevice.id pci 0xc065
++subdevice.name 3010S Ultra3 Four Channel
+
+ vendor.id pci 0x1044
+&device.id pci 0xa501
+&subvendor.id pci 0x1044
+&subdevice.id pci 0xc066
++subdevice.name 3010S Fibre Channel
+
+ vendor.id pci 0x1044
+&device.id pci 0xa511
++device.name SmartRAID V Controller
+
+ vendor.id pci 0x1044
+&device.id pci 0xa511
+&subvendor.id pci 0x1044
+&subdevice.id pci 0xc032
++subdevice.name ASR-2005S I2O Zero Channel
+
+ vendor.id pci 0x1045
++vendor.name OPTi Inc.
+
+ vendor.id pci 0x1045
+&device.id pci 0xa0f8
++device.name 82C750 [Vendetta] USB Controller
+
+ vendor.id pci 0x1045
+&device.id pci 0xc101
++device.name 92C264
+
+ vendor.id pci 0x1045
+&device.id pci 0xc178
++device.name 92C178
+
+ vendor.id pci 0x1045
+&device.id pci 0xc556
++device.name 82X556 [Viper]
+
+ vendor.id pci 0x1045
+&device.id pci 0xc557
++device.name 82C557 [Viper-M]
+
+ vendor.id pci 0x1045
+&device.id pci 0xc558
++device.name 82C558 [Viper-M ISA+IDE]
+
+ vendor.id pci 0x1045
+&device.id pci 0xc567
++device.name 82C750 [Vendetta], device 0
+
+ vendor.id pci 0x1045
+&device.id pci 0xc568
++device.name 82C750 [Vendetta], device 1
+
+ vendor.id pci 0x1045
+&device.id pci 0xc569
++device.name 82C579 [Viper XPress+ Chipset]
+
+ vendor.id pci 0x1045
+&device.id pci 0xc621
++device.name 82C621 [Viper-M/N+]
+
+ vendor.id pci 0x1045
+&device.id pci 0xc700
++device.name 82C700 [FireStar]
+
+ vendor.id pci 0x1045
+&device.id pci 0xc701
++device.name 82C701 [FireStar Plus]
+
+ vendor.id pci 0x1045
+&device.id pci 0xc814
++device.name 82C814 [Firebridge 1]
+
+ vendor.id pci 0x1045
+&device.id pci 0xc822
++device.name 82C822
+
+ vendor.id pci 0x1045
+&device.id pci 0xc824
++device.name 82C824
+
+ vendor.id pci 0x1045
+&device.id pci 0xc825
++device.name 82C825 [Firebridge 2]
+
+ vendor.id pci 0x1045
+&device.id pci 0xc832
++device.name 82C832
+
+ vendor.id pci 0x1045
+&device.id pci 0xc861
++device.name 82C861
+
+ vendor.id pci 0x1045
+&device.id pci 0xc895
++device.name 82C895
+
+ vendor.id pci 0x1045
+&device.id pci 0xc935
++device.name EV1935 ECTIVA MachOne PCIAudio
+
+ vendor.id pci 0x1045
+&device.id pci 0xd568
++device.name 82C825 [Firebridge 2]
+
+ vendor.id pci 0x1045
+&device.id pci 0xd721
++device.name IDE [FireStar]
+
+ vendor.id pci 0x1046
++vendor.name IPC Corporation, Ltd.
+
+ vendor.id pci 0x1047
++vendor.name Genoa Systems Corp
+
+ vendor.id pci 0x1048
++vendor.name Elsa AG
+
+ vendor.id pci 0x1048
+&device.id pci 0x0c60
++device.name Gladiac MX
+
+ vendor.id pci 0x1048
+&device.id pci 0x0d22
++device.name Quadro4 900XGL [ELSA GLoria4 900XGL]
+
+ vendor.id pci 0x1048
+&device.id pci 0x1000
++device.name QuickStep 1000
+
+ vendor.id pci 0x1048
+&device.id pci 0x3000
++device.name QuickStep 3000
+
+ vendor.id pci 0x1048
+&device.id pci 0x8901
++device.name Gloria XL
+
+ vendor.id pci 0x1049
++vendor.name Fountain Technologies, Inc.
+
+ vendor.id pci 0x104a
++vendor.name STMicroelectronics
+
+ vendor.id pci 0x104a
+&device.id pci 0x0008
++device.name STG 2000X
+
+ vendor.id pci 0x104a
+&device.id pci 0x0009
++device.name STG 1764X
+
+ vendor.id pci 0x104a
+&device.id pci 0x0010
++device.name STG4000 [3D Prophet Kyro Series]
+
+ vendor.id pci 0x104a
+&device.id pci 0x0209
++device.name STPC Consumer/Industrial North- and Southbridge
+
+ vendor.id pci 0x104a
+&device.id pci 0x020a
++device.name STPC Atlas/ConsumerS/Consumer IIA Northbridge
+
+ vendor.id pci 0x104a
+&device.id pci 0x0210
++device.name STPC Atlas ISA Bridge
+
+ vendor.id pci 0x104a
+&device.id pci 0x021a
++device.name STPC Consumer S Southbridge
+
+ vendor.id pci 0x104a
+&device.id pci 0x021b
++device.name STPC Consumer IIA Southbridge
+
+ vendor.id pci 0x104a
+&device.id pci 0x0500
++device.name ST70137 [Unicorn] ADSL DMT Transceiver
+
+ vendor.id pci 0x104a
+&device.id pci 0x0564
++device.name STPC Client Northbridge
+
+ vendor.id pci 0x104a
+&device.id pci 0x0981
++device.name 21x4x DEC-Tulip compatible 10/100 Ethernet
+
+ vendor.id pci 0x104a
+&device.id pci 0x1746
++device.name STG 1764X
+
+ vendor.id pci 0x104a
+&device.id pci 0x2774
++device.name 21x4x DEC-Tulip compatible 10/100 Ethernet
+
+ vendor.id pci 0x104a
+&device.id pci 0x3520
++device.name MPEG-II decoder card
+
+ vendor.id pci 0x104a
+&device.id pci 0x55cc
++device.name STPC Client Southbridge
+
+ vendor.id pci 0x104b
++vendor.name BusLogic
+
+ vendor.id pci 0x104b
+&device.id pci 0x0140
++device.name BT-946C (old) [multimaster 01]
+
+ vendor.id pci 0x104b
+&device.id pci 0x1040
++device.name BT-946C (BA80C30) [MultiMaster 10]
+
+ vendor.id pci 0x104b
+&device.id pci 0x8130
++device.name Flashpoint LT
+
+ vendor.id pci 0x104c
++vendor.name Texas Instruments
+
+ vendor.id pci 0x104c
+&device.id pci 0x0500
++device.name 100 MBit LAN Controller
+
+ vendor.id pci 0x104c
+&device.id pci 0x0508
++device.name TMS380C2X Compressor Interface
+
+ vendor.id pci 0x104c
+&device.id pci 0x1000
++device.name Eagle i/f AS
+
+ vendor.id pci 0x104c
+&device.id pci 0x104c
++device.name PCI1510 PC card Cardbus Controller
+
+ vendor.id pci 0x104c
+&device.id pci 0x3d04
++device.name TVP4010 [Permedia]
+
+ vendor.id pci 0x104c
+&device.id pci 0x3d07
++device.name TVP4020 [Permedia 2]
+
+ vendor.id pci 0x104c
+&device.id pci 0x3d07
+&subvendor.id pci 0x1011
+&subdevice.id pci 0x4d10
++subdevice.name Comet
+
+ vendor.id pci 0x104c
+&device.id pci 0x3d07
+&subvendor.id pci 0x1040
+&subdevice.id pci 0x000f
++subdevice.name AccelStar II
+
+ vendor.id pci 0x104c
+&device.id pci 0x3d07
+&subvendor.id pci 0x1040
+&subdevice.id pci 0x0011
++subdevice.name AccelStar II
+
+ vendor.id pci 0x104c
+&device.id pci 0x3d07
+&subvendor.id pci 0x1048
+&subdevice.id pci 0x0a31
++subdevice.name WINNER 2000
+
+ vendor.id pci 0x104c
+&device.id pci 0x3d07
+&subvendor.id pci 0x1048
+&subdevice.id pci 0x0a32
++subdevice.name GLoria Synergy
+
+ vendor.id pci 0x104c
+&device.id pci 0x3d07
+&subvendor.id pci 0x1048
+&subdevice.id pci 0x0a35
++subdevice.name GLoria Synergy
+
+ vendor.id pci 0x104c
+&device.id pci 0x3d07
+&subvendor.id pci 0x107d
+&subdevice.id pci 0x2633
++subdevice.name WinFast 3D L2300
+
+ vendor.id pci 0x104c
+&device.id pci 0x3d07
+&subvendor.id pci 0x1092
+&subdevice.id pci 0x0127
++subdevice.name FIRE GL 1000 PRO
+
+ vendor.id pci 0x104c
+&device.id pci 0x3d07
+&subvendor.id pci 0x1092
+&subdevice.id pci 0x0136
++subdevice.name FIRE GL 1000 PRO
+
+ vendor.id pci 0x104c
+&device.id pci 0x3d07
+&subvendor.id pci 0x1092
+&subdevice.id pci 0x0141
++subdevice.name FIRE GL 1000 PRO
+
+ vendor.id pci 0x104c
+&device.id pci 0x3d07
+&subvendor.id pci 0x1092
+&subdevice.id pci 0x0146
++subdevice.name FIRE GL 1000 PRO
+
+ vendor.id pci 0x104c
+&device.id pci 0x3d07
+&subvendor.id pci 0x1092
+&subdevice.id pci 0x0148
++subdevice.name FIRE GL 1000 PRO
+
+ vendor.id pci 0x104c
+&device.id pci 0x3d07
+&subvendor.id pci 0x1092
+&subdevice.id pci 0x0149
++subdevice.name FIRE GL 1000 PRO
+
+ vendor.id pci 0x104c
+&device.id pci 0x3d07
+&subvendor.id pci 0x1092
+&subdevice.id pci 0x0152
++subdevice.name FIRE GL 1000 PRO
+
+ vendor.id pci 0x104c
+&device.id pci 0x3d07
+&subvendor.id pci 0x1092
+&subdevice.id pci 0x0154
++subdevice.name FIRE GL 1000 PRO
+
+ vendor.id pci 0x104c
+&device.id pci 0x3d07
+&subvendor.id pci 0x1092
+&subdevice.id pci 0x0155
++subdevice.name FIRE GL 1000 PRO
+
+ vendor.id pci 0x104c
+&device.id pci 0x3d07
+&subvendor.id pci 0x1092
+&subdevice.id pci 0x0156
++subdevice.name FIRE GL 1000 PRO
+
+ vendor.id pci 0x104c
+&device.id pci 0x3d07
+&subvendor.id pci 0x1092
+&subdevice.id pci 0x0157
++subdevice.name FIRE GL 1000 PRO
+
+ vendor.id pci 0x104c
+&device.id pci 0x3d07
+&subvendor.id pci 0x1097
+&subdevice.id pci 0x3d01
++subdevice.name Jeronimo Pro
+
+ vendor.id pci 0x104c
+&device.id pci 0x3d07
+&subvendor.id pci 0x1102
+&subdevice.id pci 0x100f
++subdevice.name Graphics Blaster Extreme
+
+ vendor.id pci 0x104c
+&device.id pci 0x3d07
+&subvendor.id pci 0x3d3d
+&subdevice.id pci 0x0100
++subdevice.name Reference Permedia 2 3D
+
+ vendor.id pci 0x104c
+&device.id pci 0x8000
++device.name PCILynx/PCILynx2 IEEE 1394 Link Layer Controller
+
+ vendor.id pci 0x104c
+&device.id pci 0x8000
+&subvendor.id pci 0xe4bf
+&subdevice.id pci 0x1010
++subdevice.name CF1-1-SNARE
+
+ vendor.id pci 0x104c
+&device.id pci 0x8000
+&subvendor.id pci 0xe4bf
+&subdevice.id pci 0x1020
++subdevice.name CF1-2-SNARE
+
+ vendor.id pci 0x104c
+&device.id pci 0x8009
++device.name FireWire Controller
+
+ vendor.id pci 0x104c
+&device.id pci 0x8009
+&subvendor.id pci 0x104d
+&subdevice.id pci 0x8032
++subdevice.name 8032 OHCI i.LINK (IEEE 1394) Controller
+
+ vendor.id pci 0x104c
+&device.id pci 0x8017
++device.name PCI4410 FireWire Controller
+
+ vendor.id pci 0x104c
+&device.id pci 0x8019
++device.name TSB12LV23 IEEE-1394 Controller
+
+ vendor.id pci 0x104c
+&device.id pci 0x8019
+&subvendor.id pci 0x11bd
+&subdevice.id pci 0x000a
++subdevice.name Studio DV500-1394
+
+ vendor.id pci 0x104c
+&device.id pci 0x8019
+&subvendor.id pci 0x11bd
+&subdevice.id pci 0x000e
++subdevice.name Studio DV
+
+ vendor.id pci 0x104c
+&device.id pci 0x8019
+&subvendor.id pci 0xe4bf
+&subdevice.id pci 0x1010
++subdevice.name CF2-1-CYMBAL
+
+ vendor.id pci 0x104c
+&device.id pci 0x8020
++device.name TSB12LV26 IEEE-1394 Controller (Link)
+
+ vendor.id pci 0x104c
+&device.id pci 0x8021
++device.name TSB43AA22 IEEE-1394 Controller (PHY/Link Integrated)
+
+ vendor.id pci 0x104c
+&device.id pci 0x8021
+&subvendor.id pci 0x104d
+&subdevice.id pci 0x80df
++subdevice.name Vaio PCG-FX403
+
+ vendor.id pci 0x104c
+&device.id pci 0x8021
+&subvendor.id pci 0x104d
+&subdevice.id pci 0x80e7
++subdevice.name VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP
+
+ vendor.id pci 0x104c
+&device.id pci 0x8022
++device.name TSB43AB22 IEEE-1394a-2000 Controller (PHY/Link)
+
+ vendor.id pci 0x104c
+&device.id pci 0x8023
++device.name TSB43AB22/A IEEE-1394a-2000 Controller (PHY/Link)
+
+ vendor.id pci 0x104c
+&device.id pci 0x8024
++device.name TSB43AB23 IEEE-1394a-2000 Controller (PHY/Link)
+
+ vendor.id pci 0x104c
+&device.id pci 0x8025
++device.name TSB82AA2 IEEE-1394b Link Layer Controller
+
+ vendor.id pci 0x104c
+&device.id pci 0x8025
+&subvendor.id pci 0x55aa
+&subdevice.id pci 0x55aa
++subdevice.name FireWire 800 PCI Card
+
+ vendor.id pci 0x104c
+&device.id pci 0x8026
++device.name TSB43AB21 IEEE-1394a-2000 Controller (PHY/Link)
+
+ vendor.id pci 0x104c
+&device.id pci 0x8027
++device.name PCI4451 IEEE-1394 Controller
+
+ vendor.id pci 0x104c
+&device.id pci 0x8027
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x00e6
++subdevice.name PCI4451 IEEE-1394 Controller (Dell Inspiron 8100)
+
+ vendor.id pci 0x104c
+&device.id pci 0x8029
++device.name PCI4510 IEEE-1394 Controller
+
+ vendor.id pci 0x104c
+&device.id pci 0x8029
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x0163
++subdevice.name Latitude D505
+
+ vendor.id pci 0x104c
+&device.id pci 0x8029
+&subvendor.id pci 0x1071
+&subdevice.id pci 0x8160
++subdevice.name MIM2900
+
+ vendor.id pci 0x104c
+&device.id pci 0x802e
++device.name PCI7x20 1394a-2000 OHCI Two-Port PHY/Link-Layer Controller
+
+ vendor.id pci 0x104c
+&device.id pci 0x8201
++device.name PCI1620 Firmware Loading Function
+
+ vendor.id pci 0x104c
+&device.id pci 0x8400
++device.name ACX 100 22Mbps Wireless Interface
+
+ vendor.id pci 0x104c
+&device.id pci 0x8400
+&subvendor.id pci 0x00fc
+&subdevice.id pci 0x16ec
++subdevice.name U.S. Robotics 22 Mbps Wireless PC Card (model 2210)
+
+ vendor.id pci 0x104c
+&device.id pci 0x8400
+&subvendor.id pci 0x00fd
+&subdevice.id pci 0x16ec
++subdevice.name U.S. Robotics 22Mbps Wireless PCI Adapter (model 2216)
+
+ vendor.id pci 0x104c
+&device.id pci 0x8400
+&subvendor.id pci 0x1186
+&subdevice.id pci 0x3b00
++subdevice.name DWL-650+ PC Card cardbus 22Mbs Wireless Adapter [AirPlus]
+
+ vendor.id pci 0x104c
+&device.id pci 0x8400
+&subvendor.id pci 0x1186
+&subdevice.id pci 0x3b01
++subdevice.name DWL-520+ 22Mbps PCI Wireless Adapter
+
+ vendor.id pci 0x104c
+&device.id pci 0x8401
++device.name ACX 100 22Mbps Wireless Interface
+
+ vendor.id pci 0x104c
+&device.id pci 0x9000
++device.name Wireless Interface (of unknown type)
+
+ vendor.id pci 0x104c
+&device.id pci 0x9066
++device.name ACX 111 54Mbps Wireless Interface
+
+ vendor.id pci 0x104c
+&device.id pci 0xa001
++device.name TDC1570
+
+ vendor.id pci 0x104c
+&device.id pci 0xa100
++device.name TDC1561
+
+ vendor.id pci 0x104c
+&device.id pci 0xa102
++device.name TNETA1575 HyperSAR Plus w/PCI Host i/f & UTOPIA i/f
+
+ vendor.id pci 0x104c
+&device.id pci 0xa106
++device.name TMS320C6205 Fixed Point DSP
+
+ vendor.id pci 0x104c
+&device.id pci 0xa106
+&subvendor.id pci 0x175c
+&subdevice.id pci 0x5000
++subdevice.name ASI50xx Audio Adapter
+
+ vendor.id pci 0x104c
+&device.id pci 0xa106
+&subvendor.id pci 0x175c
+&subdevice.id pci 0x8700
++subdevice.name ASI87xx Radio Tuner card
+
+ vendor.id pci 0x104c
+&device.id pci 0xac10
++device.name PCI1050
+
+ vendor.id pci 0x104c
+&device.id pci 0xac11
++device.name PCI1053
+
+ vendor.id pci 0x104c
+&device.id pci 0xac12
++device.name PCI1130
+
+ vendor.id pci 0x104c
+&device.id pci 0xac13
++device.name PCI1031
+
+ vendor.id pci 0x104c
+&device.id pci 0xac15
++device.name PCI1131
+
+ vendor.id pci 0x104c
+&device.id pci 0xac16
++device.name PCI1250
+
+ vendor.id pci 0x104c
+&device.id pci 0xac16
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x0092
++subdevice.name ThinkPad 600
+
+ vendor.id pci 0x104c
+&device.id pci 0xac17
++device.name PCI1220
+
+ vendor.id pci 0x104c
+&device.id pci 0xac18
++device.name PCI1260
+
+ vendor.id pci 0x104c
+&device.id pci 0xac19
++device.name PCI1221
+
+ vendor.id pci 0x104c
+&device.id pci 0xac1a
++device.name PCI1210
+
+ vendor.id pci 0x104c
+&device.id pci 0xac1b
++device.name PCI1450
+
+ vendor.id pci 0x104c
+&device.id pci 0xac1b
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0xb113
++subdevice.name Armada M700
+
+ vendor.id pci 0x104c
+&device.id pci 0xac1c
++device.name PCI1225
+
+ vendor.id pci 0x104c
+&device.id pci 0xac1c
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0xb121
++subdevice.name Armada E500
+
+ vendor.id pci 0x104c
+&device.id pci 0xac1c
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x0088
++subdevice.name Dell Computer Corporation Latitude CPi A400XT
+
+ vendor.id pci 0x104c
+&device.id pci 0xac1d
++device.name PCI1251A
+
+ vendor.id pci 0x104c
+&device.id pci 0xac1e
++device.name PCI1211
+
+ vendor.id pci 0x104c
+&device.id pci 0xac1f
++device.name PCI1251B
+
+ vendor.id pci 0x104c
+&device.id pci 0xac20
++device.name TI 2030
+
+ vendor.id pci 0x104c
+&device.id pci 0xac21
++device.name PCI2031
+
+ vendor.id pci 0x104c
+&device.id pci 0xac22
++device.name PCI2032 PCI Docking Bridge
+
+ vendor.id pci 0x104c
+&device.id pci 0xac23
++device.name PCI2250 PCI-to-PCI Bridge
+
+ vendor.id pci 0x104c
+&device.id pci 0xac28
++device.name PCI2050 PCI-to-PCI Bridge
+
+ vendor.id pci 0x104c
+&device.id pci 0xac30
++device.name PCI1260 PC card Cardbus Controller
+
+ vendor.id pci 0x104c
+&device.id pci 0xac40
++device.name PCI4450 PC card Cardbus Controller
+
+ vendor.id pci 0x104c
+&device.id pci 0xac41
++device.name PCI4410 PC card Cardbus Controller
+
+ vendor.id pci 0x104c
+&device.id pci 0xac42
++device.name PCI4451 PC card Cardbus Controller
+
+ vendor.id pci 0x104c
+&device.id pci 0xac42
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x00e6
++subdevice.name PCI4451 PC card CardBus Controller (Dell Inspiron 8100)
+
+ vendor.id pci 0x104c
+&device.id pci 0xac44
++device.name PCI4510 PC card Cardbus Controller
+
+ vendor.id pci 0x104c
+&device.id pci 0xac44
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x0163
++subdevice.name Latitude D505
+
+ vendor.id pci 0x104c
+&device.id pci 0xac44
+&subvendor.id pci 0x1071
+&subdevice.id pci 0x8160
++subdevice.name MIM2000
+
+ vendor.id pci 0x104c
+&device.id pci 0xac46
++device.name PCI4520 PC card Cardbus Controller
+
+ vendor.id pci 0x104c
+&device.id pci 0xac50
++device.name PCI1410 PC card Cardbus Controller
+
+ vendor.id pci 0x104c
+&device.id pci 0xac51
++device.name PCI1420
+
+ vendor.id pci 0x104c
+&device.id pci 0xac51
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x023b
++subdevice.name ThinkPad T23 (2647-4MG)
+
+ vendor.id pci 0x104c
+&device.id pci 0xac51
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x00b1
++subdevice.name Latitude C600
+
+ vendor.id pci 0x104c
+&device.id pci 0xac51
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x012a
++subdevice.name Latitude C640
+
+ vendor.id pci 0x104c
+&device.id pci 0xac51
+&subvendor.id pci 0x1033
+&subdevice.id pci 0x80cd
++subdevice.name Versa Note VXi
+
+ vendor.id pci 0x104c
+&device.id pci 0xac51
+&subvendor.id pci 0x10cf
+&subdevice.id pci 0x1095
++subdevice.name Lifebook C6155
+
+ vendor.id pci 0x104c
+&device.id pci 0xac51
+&subvendor.id pci 0xe4bf
+&subdevice.id pci 0x1000
++subdevice.name CP2-2-HIPHOP
+
+ vendor.id pci 0x104c
+&device.id pci 0xac52
++device.name PCI1451 PC card Cardbus Controller
+
+ vendor.id pci 0x104c
+&device.id pci 0xac53
++device.name PCI1421 PC card Cardbus Controller
+
+ vendor.id pci 0x104c
+&device.id pci 0xac54
++device.name PCI1620 PC Card Controller
+
+ vendor.id pci 0x104c
+&device.id pci 0xac55
++device.name PCI1520 PC card Cardbus Controller
+
+ vendor.id pci 0x104c
+&device.id pci 0xac55
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x0512
++subdevice.name ThinkPad T30/T40
+
+ vendor.id pci 0x104c
+&device.id pci 0xac56
++device.name PCI1510 PC card Cardbus Controller
+
+ vendor.id pci 0x104c
+&device.id pci 0xac56
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x0528
++subdevice.name ThinkPad R40e (2684-HVG) Cardbus Controller
+
+ vendor.id pci 0x104c
+&device.id pci 0xac60
++device.name PCI2040 PCI to DSP Bridge Controller
+
+ vendor.id pci 0x104c
+&device.id pci 0xac60
+&subvendor.id pci 0x175c
+&subdevice.id pci 0x5100
++subdevice.name ASI51xx Audio Adapter
+
+ vendor.id pci 0x104c
+&device.id pci 0xac60
+&subvendor.id pci 0x175c
+&subdevice.id pci 0x6100
++subdevice.name ASI61xx Audio Adapter
+
+ vendor.id pci 0x104c
+&device.id pci 0xac60
+&subvendor.id pci 0x175c
+&subdevice.id pci 0x6200
++subdevice.name ASI62xx Audio Adapter
+
+ vendor.id pci 0x104c
+&device.id pci 0xac8d
++device.name PCI 7620
+
+ vendor.id pci 0x104c
+&device.id pci 0xac8e
++device.name PCI7420 CardBus Controller
+
+ vendor.id pci 0x104c
+&device.id pci 0xac8f
++device.name PCI7420/PCI7620 Dual Socket CardBus and Smart Card Cont. w/ 1394a-2000 OHCI Two-Port PHY/Link-Layer Cont. and SD/MS-Pro Sockets
+
+ vendor.id pci 0x104c
+&device.id pci 0xfe00
++device.name FireWire Host Controller
+
+ vendor.id pci 0x104c
+&device.id pci 0xfe03
++device.name 12C01A FireWire Host Controller
+
+ vendor.id pci 0x104d
++vendor.name Sony Corporation
+
+ vendor.id pci 0x104d
+&device.id pci 0x8009
++device.name CXD1947Q i.LINK Controller
+
+ vendor.id pci 0x104d
+&device.id pci 0x8039
++device.name CXD3222 i.LINK Controller
+
+ vendor.id pci 0x104d
+&device.id pci 0x8056
++device.name Rockwell HCF 56K modem
+
+ vendor.id pci 0x104d
+&device.id pci 0x808a
++device.name Memory Stick Controller
+
+ vendor.id pci 0x104e
++vendor.name Oak Technology, Inc
+
+ vendor.id pci 0x104e
+&device.id pci 0x0017
++device.name OTI-64017
+
+ vendor.id pci 0x104e
+&device.id pci 0x0107
++device.name OTI-107 [Spitfire]
+
+ vendor.id pci 0x104e
+&device.id pci 0x0109
++device.name Video Adapter
+
+ vendor.id pci 0x104e
+&device.id pci 0x0111
++device.name OTI-64111 [Spitfire]
+
+ vendor.id pci 0x104e
+&device.id pci 0x0217
++device.name OTI-64217
+
+ vendor.id pci 0x104e
+&device.id pci 0x0317
++device.name OTI-64317
+
+ vendor.id pci 0x104f
++vendor.name Co-time Computer Ltd
+
+ vendor.id pci 0x1050
++vendor.name Winbond Electronics Corp
+
+ vendor.id pci 0x1050
+&device.id pci 0x0000
++device.name NE2000
+
+ vendor.id pci 0x1050
+&device.id pci 0x0001
++device.name W83769F
+
+ vendor.id pci 0x1050
+&device.id pci 0x0105
++device.name W82C105
+
+ vendor.id pci 0x1050
+&device.id pci 0x0840
++device.name W89C840
+
+ vendor.id pci 0x1050
+&device.id pci 0x0840
+&subvendor.id pci 0x1050
+&subdevice.id pci 0x0001
++subdevice.name W89C840 Ethernet Adapter
+
+ vendor.id pci 0x1050
+&device.id pci 0x0840
+&subvendor.id pci 0x1050
+&subdevice.id pci 0x0840
++subdevice.name W89C840 Ethernet Adapter
+
+ vendor.id pci 0x1050
+&device.id pci 0x0940
++device.name W89C940
+
+ vendor.id pci 0x1050
+&device.id pci 0x5a5a
++device.name W89C940F
+
+ vendor.id pci 0x1050
+&device.id pci 0x6692
++device.name W6692
+
+ vendor.id pci 0x1050
+&device.id pci 0x9921
++device.name W99200F MPEG-1 Video Encoder
+
+ vendor.id pci 0x1050
+&device.id pci 0x9922
++device.name W99200F/W9922PF MPEG-1/2 Video Encoder
+
+ vendor.id pci 0x1050
+&device.id pci 0x9970
++device.name W9970CF
+
+ vendor.id pci 0x1051
++vendor.name Anigma, Inc.
+
+ vendor.id pci 0x1052
++vendor.name ?Young Micro Systems
+
+ vendor.id pci 0x1053
++vendor.name Young Micro Systems
+
+ vendor.id pci 0x1054
++vendor.name Hitachi, Ltd
+
+ vendor.id pci 0x1055
++vendor.name Efar Microsystems
+
+ vendor.id pci 0x1055
+&device.id pci 0x9130
++device.name SLC90E66 [Victory66] IDE
+
+ vendor.id pci 0x1055
+&device.id pci 0x9460
++device.name SLC90E66 [Victory66] ISA
+
+ vendor.id pci 0x1055
+&device.id pci 0x9462
++device.name SLC90E66 [Victory66] USB
+
+ vendor.id pci 0x1055
+&device.id pci 0x9463
++device.name SLC90E66 [Victory66] ACPI
+
+ vendor.id pci 0x1056
++vendor.name ICL
+
+ vendor.id pci 0x1057
++vendor.name Motorola
+
+ vendor.id pci 0x1057
+&device.id pci 0x0001
++device.name MPC105 [Eagle]
+
+ vendor.id pci 0x1057
+&device.id pci 0x0002
++device.name MPC106 [Grackle]
+
+ vendor.id pci 0x1057
+&device.id pci 0x0003
++device.name MPC8240 [Kahlua]
+
+ vendor.id pci 0x1057
+&device.id pci 0x0004
++device.name MPC107
+
+ vendor.id pci 0x1057
+&device.id pci 0x0006
++device.name MPC8245 [Unity]
+
+ vendor.id pci 0x1057
+&device.id pci 0x0008
++device.name MPC8540
+
+ vendor.id pci 0x1057
+&device.id pci 0x0009
++device.name MPC8560
+
+ vendor.id pci 0x1057
+&device.id pci 0x0100
++device.name MC145575 [HFC-PCI]
+
+ vendor.id pci 0x1057
+&device.id pci 0x0431
++device.name KTI829c 100VG
+
+ vendor.id pci 0x1057
+&device.id pci 0x1801
++device.name DSP56301 Digital Signal Processor
+
+ vendor.id pci 0x1057
+&device.id pci 0x1801
+&subvendor.id pci 0x14fb
+&subdevice.id pci 0x0101
++subdevice.name Transas Radar Imitator Board [RIM]
+
+ vendor.id pci 0x1057
+&device.id pci 0x1801
+&subvendor.id pci 0x14fb
+&subdevice.id pci 0x0102
++subdevice.name Transas Radar Imitator Board [RIM-2]
+
+ vendor.id pci 0x1057
+&device.id pci 0x1801
+&subvendor.id pci 0x14fb
+&subdevice.id pci 0x0202
++subdevice.name Transas Radar Integrator Board [RIB-2]
+
+ vendor.id pci 0x1057
+&device.id pci 0x1801
+&subvendor.id pci 0x14fb
+&subdevice.id pci 0x0611
++subdevice.name 1 channel CAN bus Controller [CanPci-1]
+
+ vendor.id pci 0x1057
+&device.id pci 0x1801
+&subvendor.id pci 0x14fb
+&subdevice.id pci 0x0612
++subdevice.name 2 channels CAN bus Controller [CanPci-2]
+
+ vendor.id pci 0x1057
+&device.id pci 0x1801
+&subvendor.id pci 0x14fb
+&subdevice.id pci 0x0613
++subdevice.name 3 channels CAN bus Controller [CanPci-3]
+
+ vendor.id pci 0x1057
+&device.id pci 0x1801
+&subvendor.id pci 0x14fb
+&subdevice.id pci 0x0614
++subdevice.name 4 channels CAN bus Controller [CanPci-4]
+
+ vendor.id pci 0x1057
+&device.id pci 0x1801
+&subvendor.id pci 0x14fb
+&subdevice.id pci 0x0621
++subdevice.name 1 channel CAN bus Controller [CanPci2-1]
+
+ vendor.id pci 0x1057
+&device.id pci 0x1801
+&subvendor.id pci 0x14fb
+&subdevice.id pci 0x0622
++subdevice.name 2 channels CAN bus Controller [CanPci2-2]
+
+ vendor.id pci 0x1057
+&device.id pci 0x1801
+&subvendor.id pci 0x14fb
+&subdevice.id pci 0x0810
++subdevice.name Transas VTS Radar Integrator Board [RIB-4]
+
+ vendor.id pci 0x1057
+&device.id pci 0x1801
+&subvendor.id pci 0x175c
+&subdevice.id pci 0x4200
++subdevice.name ASI4215 Audio Adapter
+
+ vendor.id pci 0x1057
+&device.id pci 0x1801
+&subvendor.id pci 0x175c
+&subdevice.id pci 0x4300
++subdevice.name ASI43xx Audio Adapter
+
+ vendor.id pci 0x1057
+&device.id pci 0x1801
+&subvendor.id pci 0x175c
+&subdevice.id pci 0x4400
++subdevice.name ASI4401 Audio Adapter
+
+ vendor.id pci 0x1057
+&device.id pci 0x1801
+&subvendor.id pci 0xecc0
+&subdevice.id pci 0x0030
++subdevice.name Layla
+
+ vendor.id pci 0x1057
+&device.id pci 0x18c0
++device.name MPC8265A/MPC8266
+
+ vendor.id pci 0x1057
+&device.id pci 0x18c1
++device.name MPC8271/MPC8272
+
+ vendor.id pci 0x1057
+&device.id pci 0x4801
++device.name Raven
+
+ vendor.id pci 0x1057
+&device.id pci 0x4802
++device.name Falcon
+
+ vendor.id pci 0x1057
+&device.id pci 0x4803
++device.name Hawk
+
+ vendor.id pci 0x1057
+&device.id pci 0x4806
++device.name CPX8216
+
+ vendor.id pci 0x1057
+&device.id pci 0x4d68
++device.name 20268
+
+ vendor.id pci 0x1057
+&device.id pci 0x5600
++device.name SM56 PCI Modem
+
+ vendor.id pci 0x1057
+&device.id pci 0x5600
+&subvendor.id pci 0x1057
+&subdevice.id pci 0x0300
++subdevice.name SM56 PCI Speakerphone Modem
+
+ vendor.id pci 0x1057
+&device.id pci 0x5600
+&subvendor.id pci 0x1057
+&subdevice.id pci 0x0301
++subdevice.name SM56 PCI Voice Modem
+
+ vendor.id pci 0x1057
+&device.id pci 0x5600
+&subvendor.id pci 0x1057
+&subdevice.id pci 0x0302
++subdevice.name SM56 PCI Fax Modem
+
+ vendor.id pci 0x1057
+&device.id pci 0x5600
+&subvendor.id pci 0x1057
+&subdevice.id pci 0x5600
++subdevice.name SM56 PCI Voice modem
+
+ vendor.id pci 0x1057
+&device.id pci 0x5600
+&subvendor.id pci 0x13d2
+&subdevice.id pci 0x0300
++subdevice.name SM56 PCI Speakerphone Modem
+
+ vendor.id pci 0x1057
+&device.id pci 0x5600
+&subvendor.id pci 0x13d2
+&subdevice.id pci 0x0301
++subdevice.name SM56 PCI Voice modem
+
+ vendor.id pci 0x1057
+&device.id pci 0x5600
+&subvendor.id pci 0x13d2
+&subdevice.id pci 0x0302
++subdevice.name SM56 PCI Fax Modem
+
+ vendor.id pci 0x1057
+&device.id pci 0x5600
+&subvendor.id pci 0x1436
+&subdevice.id pci 0x0300
++subdevice.name SM56 PCI Speakerphone Modem
+
+ vendor.id pci 0x1057
+&device.id pci 0x5600
+&subvendor.id pci 0x1436
+&subdevice.id pci 0x0301
++subdevice.name SM56 PCI Voice modem
+
+ vendor.id pci 0x1057
+&device.id pci 0x5600
+&subvendor.id pci 0x1436
+&subdevice.id pci 0x0302
++subdevice.name SM56 PCI Fax Modem
+
+ vendor.id pci 0x1057
+&device.id pci 0x5600
+&subvendor.id pci 0x144f
+&subdevice.id pci 0x100c
++subdevice.name SM56 PCI Fax Modem
+
+ vendor.id pci 0x1057
+&device.id pci 0x5600
+&subvendor.id pci 0x1494
+&subdevice.id pci 0x0300
++subdevice.name SM56 PCI Speakerphone Modem
+
+ vendor.id pci 0x1057
+&device.id pci 0x5600
+&subvendor.id pci 0x1494
+&subdevice.id pci 0x0301
++subdevice.name SM56 PCI Voice modem
+
+ vendor.id pci 0x1057
+&device.id pci 0x5600
+&subvendor.id pci 0x14c8
+&subdevice.id pci 0x0300
++subdevice.name SM56 PCI Speakerphone Modem
+
+ vendor.id pci 0x1057
+&device.id pci 0x5600
+&subvendor.id pci 0x14c8
+&subdevice.id pci 0x0302
++subdevice.name SM56 PCI Fax Modem
+
+ vendor.id pci 0x1057
+&device.id pci 0x5600
+&subvendor.id pci 0x1668
+&subdevice.id pci 0x0300
++subdevice.name SM56 PCI Speakerphone Modem
+
+ vendor.id pci 0x1057
+&device.id pci 0x5600
+&subvendor.id pci 0x1668
+&subdevice.id pci 0x0302
++subdevice.name SM56 PCI Fax Modem
+
+ vendor.id pci 0x1057
+&device.id pci 0x5803
++device.name MPC5200
+
+ vendor.id pci 0x1057
+&device.id pci 0x6400
++device.name MPC190 Security Processor (S1 family, encryption)
+
+ vendor.id pci 0x1057
+&device.id pci 0x6405
++device.name MPC184 Security Processor (S1 family)
+
+ vendor.id pci 0x1058
++vendor.name Electronics & Telecommunications RSH
+
+ vendor.id pci 0x1059
++vendor.name Teknor Industrial Computers Inc
+
+ vendor.id pci 0x105a
++vendor.name Promise Technology, Inc.
+
+ vendor.id pci 0x105a
+&device.id pci 0x0d30
++device.name PDC20265 (FastTrak100 Lite/Ultra100)
+
+ vendor.id pci 0x105a
+&device.id pci 0x0d30
+&subvendor.id pci 0x105a
+&subdevice.id pci 0x4d33
++subdevice.name Ultra100
+
+ vendor.id pci 0x105a
+&device.id pci 0x0d38
++device.name 20263
+
+ vendor.id pci 0x105a
+&device.id pci 0x0d38
+&subvendor.id pci 0x105a
+&subdevice.id pci 0x4d39
++subdevice.name Fasttrak66
+
+ vendor.id pci 0x105a
+&device.id pci 0x1275
++device.name 20275
+
+ vendor.id pci 0x105a
+&device.id pci 0x3318
++device.name PDC20318 (SATA150 TX4)
+
+ vendor.id pci 0x105a
+&device.id pci 0x3319
++device.name PDC20319 (FastTrak S150 TX4)
+
+ vendor.id pci 0x105a
+&device.id pci 0x3319
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x3427
++subdevice.name S875WP1-E mainboard
+
+ vendor.id pci 0x105a
+&device.id pci 0x3371
++device.name PDC20371 (FastTrak S150 TX2plus)
+
+ vendor.id pci 0x105a
+&device.id pci 0x3373
++device.name PDC20378 (FastTrak 378/SATA 378)
+
+ vendor.id pci 0x105a
+&device.id pci 0x3373
+&subvendor.id pci 0x1043
+&subdevice.id pci 0x80f5
++subdevice.name PC-DL Deluxe motherboard
+
+ vendor.id pci 0x105a
+&device.id pci 0x3373
+&subvendor.id pci 0x1462
+&subdevice.id pci 0x702e
++subdevice.name K8T NEO FIS2R motherboard
+
+ vendor.id pci 0x105a
+&device.id pci 0x3375
++device.name PDC20375 (SATA150 TX2plus)
+
+ vendor.id pci 0x105a
+&device.id pci 0x3376
++device.name PDC20376 (FastTrak 376)
+
+ vendor.id pci 0x105a
+&device.id pci 0x3376
+&subvendor.id pci 0x1043
+&subdevice.id pci 0x809e
++subdevice.name A7V8X motherboard
+
+ vendor.id pci 0x105a
+&device.id pci 0x3574
++device.name PDC20579 SATAII 150 IDE Controller
+
+ vendor.id pci 0x105a
+&device.id pci 0x3d18
++device.name PDC20518 SATAII 150 IDE Controller
+
+ vendor.id pci 0x105a
+&device.id pci 0x4d30
++device.name PDC20267 (FastTrak100/Ultra100)
+
+ vendor.id pci 0x105a
+&device.id pci 0x4d30
+&subvendor.id pci 0x105a
+&subdevice.id pci 0x4d33
++subdevice.name Ultra100
+
+ vendor.id pci 0x105a
+&device.id pci 0x4d30
+&subvendor.id pci 0x105a
+&subdevice.id pci 0x4d39
++subdevice.name FastTrak100
+
+ vendor.id pci 0x105a
+&device.id pci 0x4d33
++device.name 20246
+
+ vendor.id pci 0x105a
+&device.id pci 0x4d33
+&subvendor.id pci 0x105a
+&subdevice.id pci 0x4d33
++subdevice.name 20246 IDE Controller
+
+ vendor.id pci 0x105a
+&device.id pci 0x4d38
++device.name PDC20262 (FastTrak66/Ultra66)
+
+ vendor.id pci 0x105a
+&device.id pci 0x4d38
+&subvendor.id pci 0x105a
+&subdevice.id pci 0x4d30
++subdevice.name Ultra Device on SuperTrak
+
+ vendor.id pci 0x105a
+&device.id pci 0x4d38
+&subvendor.id pci 0x105a
+&subdevice.id pci 0x4d33
++subdevice.name Ultra66
+
+ vendor.id pci 0x105a
+&device.id pci 0x4d38
+&subvendor.id pci 0x105a
+&subdevice.id pci 0x4d39
++subdevice.name FastTrak66
+
+ vendor.id pci 0x105a
+&device.id pci 0x4d68
++device.name PDC20268 (Ultra100 TX2)
+
+ vendor.id pci 0x105a
+&device.id pci 0x4d68
+&subvendor.id pci 0x105a
+&subdevice.id pci 0x4d68
++subdevice.name Ultra100TX2
+
+ vendor.id pci 0x105a
+&device.id pci 0x4d69
++device.name 20269
+
+ vendor.id pci 0x105a
+&device.id pci 0x4d69
+&subvendor.id pci 0x105a
+&subdevice.id pci 0x4d68
++subdevice.name Ultra133TX2
+
+ vendor.id pci 0x105a
+&device.id pci 0x5275
++device.name PDC20276 (MBFastTrak133 Lite)
+
+ vendor.id pci 0x105a
+&device.id pci 0x5275
+&subvendor.id pci 0x105a
+&subdevice.id pci 0x0275
++subdevice.name SuperTrak SX6000 IDE
+
+ vendor.id pci 0x105a
+&device.id pci 0x5275
+&subvendor.id pci 0x105a
+&subdevice.id pci 0x1275
++subdevice.name MBFastTrak133 Lite (tm) Controller (RAID mode)
+
+ vendor.id pci 0x105a
+&device.id pci 0x5275
+&subvendor.id pci 0x1458
+&subdevice.id pci 0xb001
++subdevice.name MBUltra 133
+
+ vendor.id pci 0x105a
+&device.id pci 0x5300
++device.name DC5300
+
+ vendor.id pci 0x105a
+&device.id pci 0x6268
++device.name PDC20270 (FastTrak100 LP/TX2/TX4)
+
+ vendor.id pci 0x105a
+&device.id pci 0x6268
+&subvendor.id pci 0x105a
+&subdevice.id pci 0x4d68
++subdevice.name FastTrak100 TX2
+
+ vendor.id pci 0x105a
+&device.id pci 0x6269
++device.name PDC20271 (FastTrak TX2000)
+
+ vendor.id pci 0x105a
+&device.id pci 0x6269
+&subvendor.id pci 0x105a
+&subdevice.id pci 0x6269
++subdevice.name FastTrak TX2/TX2000
+
+ vendor.id pci 0x105a
+&device.id pci 0x6621
++device.name PDC20621 (FastTrak S150 SX4/FastTrak SX4000 lite)
+
+ vendor.id pci 0x105a
+&device.id pci 0x6622
++device.name PDC20621 [SATA150 SX4] 4 Channel IDE RAID Controller
+
+ vendor.id pci 0x105a
+&device.id pci 0x6626
++device.name PDC20618 (Ultra 618)
+
+ vendor.id pci 0x105a
+&device.id pci 0x6629
++device.name PDC20619 (FastTrak TX4000)
+
+ vendor.id pci 0x105a
+&device.id pci 0x7275
++device.name PDC20277 (SBFastTrak133 Lite)
+
+ vendor.id pci 0x105b
++vendor.name Foxconn International, Inc.
+
+ vendor.id pci 0x105c
++vendor.name Wipro Infotech Limited
+
+ vendor.id pci 0x105d
++vendor.name Number 9 Computer Company
+
+ vendor.id pci 0x105d
+&device.id pci 0x2309
++device.name Imagine 128
+
+ vendor.id pci 0x105d
+&device.id pci 0x2339
++device.name Imagine 128-II
+
+ vendor.id pci 0x105d
+&device.id pci 0x2339
+&subvendor.id pci 0x105d
+&subdevice.id pci 0x0000
++subdevice.name Imagine 128 series 2 4Mb VRAM
+
+ vendor.id pci 0x105d
+&device.id pci 0x2339
+&subvendor.id pci 0x105d
+&subdevice.id pci 0x0001
++subdevice.name Imagine 128 series 2 4Mb VRAM
+
+ vendor.id pci 0x105d
+&device.id pci 0x2339
+&subvendor.id pci 0x105d
+&subdevice.id pci 0x0002
++subdevice.name Imagine 128 series 2 4Mb VRAM
+
+ vendor.id pci 0x105d
+&device.id pci 0x2339
+&subvendor.id pci 0x105d
+&subdevice.id pci 0x0003
++subdevice.name Imagine 128 series 2 4Mb VRAM
+
+ vendor.id pci 0x105d
+&device.id pci 0x2339
+&subvendor.id pci 0x105d
+&subdevice.id pci 0x0004
++subdevice.name Imagine 128 series 2 4Mb VRAM
+
+ vendor.id pci 0x105d
+&device.id pci 0x2339
+&subvendor.id pci 0x105d
+&subdevice.id pci 0x0005
++subdevice.name Imagine 128 series 2 4Mb VRAM
+
+ vendor.id pci 0x105d
+&device.id pci 0x2339
+&subvendor.id pci 0x105d
+&subdevice.id pci 0x0006
++subdevice.name Imagine 128 series 2 4Mb VRAM
+
+ vendor.id pci 0x105d
+&device.id pci 0x2339
+&subvendor.id pci 0x105d
+&subdevice.id pci 0x0007
++subdevice.name Imagine 128 series 2 4Mb VRAM
+
+ vendor.id pci 0x105d
+&device.id pci 0x2339
+&subvendor.id pci 0x105d
+&subdevice.id pci 0x0008
++subdevice.name Imagine 128 series 2e 4Mb DRAM
+
+ vendor.id pci 0x105d
+&device.id pci 0x2339
+&subvendor.id pci 0x105d
+&subdevice.id pci 0x0009
++subdevice.name Imagine 128 series 2e 4Mb DRAM
+
+ vendor.id pci 0x105d
+&device.id pci 0x2339
+&subvendor.id pci 0x105d
+&subdevice.id pci 0x000a
++subdevice.name Imagine 128 series 2 8Mb VRAM
+
+ vendor.id pci 0x105d
+&device.id pci 0x2339
+&subvendor.id pci 0x105d
+&subdevice.id pci 0x000b
++subdevice.name Imagine 128 series 2 8Mb H-VRAM
+
+ vendor.id pci 0x105d
+&device.id pci 0x2339
+&subvendor.id pci 0x11a4
+&subdevice.id pci 0x000a
++subdevice.name Barco Metheus 5 Megapixel
+
+ vendor.id pci 0x105d
+&device.id pci 0x2339
+&subvendor.id pci 0x13cc
+&subdevice.id pci 0x0000
++subdevice.name Barco Metheus 5 Megapixel
+
+ vendor.id pci 0x105d
+&device.id pci 0x2339
+&subvendor.id pci 0x13cc
+&subdevice.id pci 0x0004
++subdevice.name Barco Metheus 5 Megapixel
+
+ vendor.id pci 0x105d
+&device.id pci 0x2339
+&subvendor.id pci 0x13cc
+&subdevice.id pci 0x0005
++subdevice.name Barco Metheus 5 Megapixel
+
+ vendor.id pci 0x105d
+&device.id pci 0x2339
+&subvendor.id pci 0x13cc
+&subdevice.id pci 0x0006
++subdevice.name Barco Metheus 5 Megapixel
+
+ vendor.id pci 0x105d
+&device.id pci 0x2339
+&subvendor.id pci 0x13cc
+&subdevice.id pci 0x0008
++subdevice.name Barco Metheus 5 Megapixel
+
+ vendor.id pci 0x105d
+&device.id pci 0x2339
+&subvendor.id pci 0x13cc
+&subdevice.id pci 0x0009
++subdevice.name Barco Metheus 5 Megapixel
+
+ vendor.id pci 0x105d
+&device.id pci 0x2339
+&subvendor.id pci 0x13cc
+&subdevice.id pci 0x000a
++subdevice.name Barco Metheus 5 Megapixel
+
+ vendor.id pci 0x105d
+&device.id pci 0x2339
+&subvendor.id pci 0x13cc
+&subdevice.id pci 0x000c
++subdevice.name Barco Metheus 5 Megapixel
+
+ vendor.id pci 0x105d
+&device.id pci 0x493d
++device.name Imagine 128 T2R [Ticket to Ride]
+
+ vendor.id pci 0x105d
+&device.id pci 0x493d
+&subvendor.id pci 0x11a4
+&subdevice.id pci 0x000a
++subdevice.name Barco Metheus 5 Megapixel, Dual Head
+
+ vendor.id pci 0x105d
+&device.id pci 0x493d
+&subvendor.id pci 0x11a4
+&subdevice.id pci 0x000b
++subdevice.name Barco Metheus 5 Megapixel, Dual Head
+
+ vendor.id pci 0x105d
+&device.id pci 0x493d
+&subvendor.id pci 0x13cc
+&subdevice.id pci 0x0002
++subdevice.name Barco Metheus 4 Megapixel, Dual Head
+
+ vendor.id pci 0x105d
+&device.id pci 0x493d
+&subvendor.id pci 0x13cc
+&subdevice.id pci 0x0003
++subdevice.name Barco Metheus 5 Megapixel, Dual Head
+
+ vendor.id pci 0x105d
+&device.id pci 0x493d
+&subvendor.id pci 0x13cc
+&subdevice.id pci 0x0007
++subdevice.name Barco Metheus 5 Megapixel, Dual Head
+
+ vendor.id pci 0x105d
+&device.id pci 0x493d
+&subvendor.id pci 0x13cc
+&subdevice.id pci 0x0008
++subdevice.name Barco Metheus 5 Megapixel, Dual Head
+
+ vendor.id pci 0x105d
+&device.id pci 0x493d
+&subvendor.id pci 0x13cc
+&subdevice.id pci 0x0009
++subdevice.name Barco Metheus 5 Megapixel, Dual Head
+
+ vendor.id pci 0x105d
+&device.id pci 0x493d
+&subvendor.id pci 0x13cc
+&subdevice.id pci 0x000a
++subdevice.name Barco Metheus 5 Megapixel, Dual Head
+
+ vendor.id pci 0x105d
+&device.id pci 0x5348
++device.name Revolution 4
+
+ vendor.id pci 0x105d
+&device.id pci 0x5348
+&subvendor.id pci 0x105d
+&subdevice.id pci 0x0037
++subdevice.name Revolution IV-FP AGP (For SGI 1600SW)
+
+ vendor.id pci 0x105e
++vendor.name Vtech Computers Ltd
+
+ vendor.id pci 0x105f
++vendor.name Infotronic America Inc
+
+ vendor.id pci 0x1060
++vendor.name United Microelectronics [UMC]
+
+ vendor.id pci 0x1060
+&device.id pci 0x0001
++device.name UM82C881
+
+ vendor.id pci 0x1060
+&device.id pci 0x0002
++device.name UM82C886
+
+ vendor.id pci 0x1060
+&device.id pci 0x0101
++device.name UM8673F
+
+ vendor.id pci 0x1060
+&device.id pci 0x0881
++device.name UM8881
+
+ vendor.id pci 0x1060
+&device.id pci 0x0886
++device.name UM8886F
+
+ vendor.id pci 0x1060
+&device.id pci 0x0891
++device.name UM8891A
+
+ vendor.id pci 0x1060
+&device.id pci 0x1001
++device.name UM886A
+
+ vendor.id pci 0x1060
+&device.id pci 0x673a
++device.name UM8886BF
+
+ vendor.id pci 0x1060
+&device.id pci 0x673b
++device.name EIDE Master/DMA
+
+ vendor.id pci 0x1060
+&device.id pci 0x8710
++device.name UM8710
+
+ vendor.id pci 0x1060
+&device.id pci 0x886a
++device.name UM8886A
+
+ vendor.id pci 0x1060
+&device.id pci 0x8881
++device.name UM8881F
+
+ vendor.id pci 0x1060
+&device.id pci 0x8886
++device.name UM8886F
+
+ vendor.id pci 0x1060
+&device.id pci 0x888a
++device.name UM8886A
+
+ vendor.id pci 0x1060
+&device.id pci 0x8891
++device.name UM8891A
+
+ vendor.id pci 0x1060
+&device.id pci 0x9017
++device.name UM9017F
+
+ vendor.id pci 0x1060
+&device.id pci 0x9018
++device.name UM9018
+
+ vendor.id pci 0x1060
+&device.id pci 0x9026
++device.name UM9026
+
+ vendor.id pci 0x1060
+&device.id pci 0xe881
++device.name UM8881N
+
+ vendor.id pci 0x1060
+&device.id pci 0xe886
++device.name UM8886N
+
+ vendor.id pci 0x1060
+&device.id pci 0xe88a
++device.name UM8886N
+
+ vendor.id pci 0x1060
+&device.id pci 0xe891
++device.name UM8891N
+
+ vendor.id pci 0x1061
++vendor.name I.I.T.
+
+ vendor.id pci 0x1061
+&device.id pci 0x0001
++device.name AGX016
+
+ vendor.id pci 0x1061
+&device.id pci 0x0002
++device.name IIT3204/3501
+
+ vendor.id pci 0x1062
++vendor.name Maspar Computer Corp
+
+ vendor.id pci 0x1063
++vendor.name Ocean Office Automation
+
+ vendor.id pci 0x1064
++vendor.name Alcatel
+
+ vendor.id pci 0x1065
++vendor.name Texas Microsystems
+
+ vendor.id pci 0x1066
++vendor.name PicoPower Technology
+
+ vendor.id pci 0x1066
+&device.id pci 0x0000
++device.name PT80C826
+
+ vendor.id pci 0x1066
+&device.id pci 0x0001
++device.name PT86C521 [Vesuvius v1] Host Bridge
+
+ vendor.id pci 0x1066
+&device.id pci 0x0002
++device.name PT86C523 [Vesuvius v3] PCI-ISA Bridge Master
+
+ vendor.id pci 0x1066
+&device.id pci 0x0003
++device.name PT86C524 [Nile] PCI-to-PCI Bridge
+
+ vendor.id pci 0x1066
+&device.id pci 0x0004
++device.name PT86C525 [Nile-II] PCI-to-PCI Bridge
+
+ vendor.id pci 0x1066
+&device.id pci 0x0005
++device.name National PC87550 System Controller
+
+ vendor.id pci 0x1066
+&device.id pci 0x8002
++device.name PT86C523 [Vesuvius v3] PCI-ISA Bridge Slave
+
+ vendor.id pci 0x1067
++vendor.name Mitsubishi Electric
+
+ vendor.id pci 0x1067
+&device.id pci 0x0301
++device.name AccelGraphics AccelECLIPSE
+
+ vendor.id pci 0x1067
+&device.id pci 0x0304
++device.name AccelGALAXY A2100 [OEM Evans & Sutherland]
+
+ vendor.id pci 0x1067
+&device.id pci 0x0308
++device.name Tornado 3000 [OEM Evans & Sutherland]
+
+ vendor.id pci 0x1067
+&device.id pci 0x1002
++device.name VG500 [VolumePro Volume Rendering Accelerator]
+
+ vendor.id pci 0x1068
++vendor.name Diversified Technology
+
+ vendor.id pci 0x1069
++vendor.name Mylex Corporation
+
+ vendor.id pci 0x1069
+&device.id pci 0x0001
++device.name DAC960P
+
+ vendor.id pci 0x1069
+&device.id pci 0x0002
++device.name DAC960PD
+
+ vendor.id pci 0x1069
+&device.id pci 0x0010
++device.name DAC960PG
+
+ vendor.id pci 0x1069
+&device.id pci 0x0020
++device.name DAC960LA
+
+ vendor.id pci 0x1069
+&device.id pci 0x0050
++device.name AcceleRAID 352/170/160 support Device
+
+ vendor.id pci 0x1069
+&device.id pci 0xb166
++device.name Gemstone chipset SCSI controller
+
+ vendor.id pci 0x1069
+&device.id pci 0xb166
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x0242
++subdevice.name iSeries 2872 DASD IOA
+
+ vendor.id pci 0x1069
+&device.id pci 0xb166
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x0266
++subdevice.name Dual Channel PCI-X U320 SCSI Adapter
+
+ vendor.id pci 0x1069
+&device.id pci 0xb166
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x0278
++subdevice.name Dual Channel PCI-X U320 SCSI RAID Adapter
+
+ vendor.id pci 0x1069
+&device.id pci 0xba55
++device.name eXtremeRAID 1100 support Device
+
+ vendor.id pci 0x1069
+&device.id pci 0xba56
++device.name eXtremeRAID 2000/3000 support Device
+
+ vendor.id pci 0x106a
++vendor.name Aten Research Inc
+
+ vendor.id pci 0x106b
++vendor.name Apple Computer Inc.
+
+ vendor.id pci 0x106b
+&device.id pci 0x0001
++device.name Bandit PowerPC host bridge
+
+ vendor.id pci 0x106b
+&device.id pci 0x0002
++device.name Grand Central I/O
+
+ vendor.id pci 0x106b
+&device.id pci 0x0003
++device.name Control Video
+
+ vendor.id pci 0x106b
+&device.id pci 0x0004
++device.name PlanB Video-In
+
+ vendor.id pci 0x106b
+&device.id pci 0x0007
++device.name O'Hare I/O
+
+ vendor.id pci 0x106b
+&device.id pci 0x000e
++device.name Hydra Mac I/O
+
+ vendor.id pci 0x106b
+&device.id pci 0x0010
++device.name Heathrow Mac I/O
+
+ vendor.id pci 0x106b
+&device.id pci 0x0017
++device.name Paddington Mac I/O
+
+ vendor.id pci 0x106b
+&device.id pci 0x0018
++device.name UniNorth FireWire
+
+ vendor.id pci 0x106b
+&device.id pci 0x0019
++device.name KeyLargo USB
+
+ vendor.id pci 0x106b
+&device.id pci 0x001e
++device.name UniNorth Internal PCI
+
+ vendor.id pci 0x106b
+&device.id pci 0x001f
++device.name UniNorth PCI
+
+ vendor.id pci 0x106b
+&device.id pci 0x0020
++device.name UniNorth AGP
+
+ vendor.id pci 0x106b
+&device.id pci 0x0021
++device.name UniNorth GMAC (Sun GEM)
+
+ vendor.id pci 0x106b
+&device.id pci 0x0022
++device.name KeyLargo Mac I/O
+
+ vendor.id pci 0x106b
+&device.id pci 0x0024
++device.name UniNorth/Pangea GMAC (Sun GEM)
+
+ vendor.id pci 0x106b
+&device.id pci 0x0025
++device.name KeyLargo/Pangea Mac I/O
+
+ vendor.id pci 0x106b
+&device.id pci 0x0026
++device.name KeyLargo/Pangea USB
+
+ vendor.id pci 0x106b
+&device.id pci 0x0027
++device.name UniNorth/Pangea AGP
+
+ vendor.id pci 0x106b
+&device.id pci 0x0028
++device.name UniNorth/Pangea PCI
+
+ vendor.id pci 0x106b
+&device.id pci 0x0029
++device.name UniNorth/Pangea Internal PCI
+
+ vendor.id pci 0x106b
+&device.id pci 0x002d
++device.name UniNorth 1.5 AGP
+
+ vendor.id pci 0x106b
+&device.id pci 0x002e
++device.name UniNorth 1.5 PCI
+
+ vendor.id pci 0x106b
+&device.id pci 0x002f
++device.name UniNorth 1.5 Internal PCI
+
+ vendor.id pci 0x106b
+&device.id pci 0x0030
++device.name UniNorth/Pangea FireWire
+
+ vendor.id pci 0x106b
+&device.id pci 0x0031
++device.name UniNorth 2 FireWire
+
+ vendor.id pci 0x106b
+&device.id pci 0x0032
++device.name UniNorth 2 GMAC (Sun GEM)
+
+ vendor.id pci 0x106b
+&device.id pci 0x0033
++device.name UniNorth 2 ATA/100
+
+ vendor.id pci 0x106b
+&device.id pci 0x0034
++device.name UniNorth 2 AGP
+
+ vendor.id pci 0x106b
+&device.id pci 0x0035
++device.name UniNorth 2 PCI
+
+ vendor.id pci 0x106b
+&device.id pci 0x0036
++device.name UniNorth 2 Internal PCI
+
+ vendor.id pci 0x106b
+&device.id pci 0x003b
++device.name UniNorth/Intrepid ATA/100
+
+ vendor.id pci 0x106b
+&device.id pci 0x003e
++device.name KeyLargo/Intrepid Mac I/O
+
+ vendor.id pci 0x106b
+&device.id pci 0x003f
++device.name KeyLargo/Intrepid USB
+
+ vendor.id pci 0x106b
+&device.id pci 0x0040
++device.name K2 KeyLargo USB
+
+ vendor.id pci 0x106b
+&device.id pci 0x0041
++device.name K2 KeyLargo Mac/IO
+
+ vendor.id pci 0x106b
+&device.id pci 0x0042
++device.name K2 FireWire
+
+ vendor.id pci 0x106b
+&device.id pci 0x0043
++device.name K2 ATA/100
+
+ vendor.id pci 0x106b
+&device.id pci 0x0045
++device.name K2 HT-PCI Bridge
+
+ vendor.id pci 0x106b
+&device.id pci 0x0046
++device.name K2 HT-PCI Bridge
+
+ vendor.id pci 0x106b
+&device.id pci 0x0047
++device.name K2 HT-PCI Bridge
+
+ vendor.id pci 0x106b
+&device.id pci 0x0048
++device.name K2 HT-PCI Bridge
+
+ vendor.id pci 0x106b
+&device.id pci 0x0049
++device.name K2 HT-PCI Bridge
+
+ vendor.id pci 0x106b
+&device.id pci 0x004b
++device.name U3 AGP
+
+ vendor.id pci 0x106b
+&device.id pci 0x004c
++device.name K2 GMAC (Sun GEM)
+
+ vendor.id pci 0x106b
+&device.id pci 0x004f
++device.name Shasta Mac I/O
+
+ vendor.id pci 0x106b
+&device.id pci 0x0050
++device.name Shasta IDE
+
+ vendor.id pci 0x106b
+&device.id pci 0x0051
++device.name Shasta (Sun GEM)
+
+ vendor.id pci 0x106b
+&device.id pci 0x0052
++device.name Shasta Firewire
+
+ vendor.id pci 0x106b
+&device.id pci 0x0053
++device.name Shasta PCI Bridge
+
+ vendor.id pci 0x106b
+&device.id pci 0x0054
++device.name Shasta PCI Bridge
+
+ vendor.id pci 0x106b
+&device.id pci 0x0055
++device.name Shasta PCI Bridge
+
+ vendor.id pci 0x106b
+&device.id pci 0x0058
++device.name U3L AGP Bridge
+
+ vendor.id pci 0x106b
+&device.id pci 0x1645
++device.name Tigon3 Gigabit Ethernet NIC (BCM5701)
+
+ vendor.id pci 0x106c
++vendor.name Hynix Semiconductor
+
+ vendor.id pci 0x106c
+&device.id pci 0x8801
++device.name Dual Pentium ISA/PCI Motherboard
+
+ vendor.id pci 0x106c
+&device.id pci 0x8802
++device.name PowerPC ISA/PCI Motherboard
+
+ vendor.id pci 0x106c
+&device.id pci 0x8803
++device.name Dual Window Graphics Accelerator
+
+ vendor.id pci 0x106c
+&device.id pci 0x8804
++device.name LAN Controller
+
+ vendor.id pci 0x106c
+&device.id pci 0x8805
++device.name 100-BaseT LAN
+
+ vendor.id pci 0x106d
++vendor.name Sequent Computer Systems
+
+ vendor.id pci 0x106e
++vendor.name DFI, Inc
+
+ vendor.id pci 0x106f
++vendor.name City Gate Development Ltd
+
+ vendor.id pci 0x1070
++vendor.name Daewoo Telecom Ltd
+
+ vendor.id pci 0x1071
++vendor.name Mitac
+
+ vendor.id pci 0x1071
+&device.id pci 0x8160
++device.name Mitac 8060B Mobile Platform
+
+ vendor.id pci 0x1072
++vendor.name GIT Co Ltd
+
+ vendor.id pci 0x1073
++vendor.name Yamaha Corporation
+
+ vendor.id pci 0x1073
+&device.id pci 0x0001
++device.name 3D GUI Accelerator
+
+ vendor.id pci 0x1073
+&device.id pci 0x0002
++device.name YGV615 [RPA3 3D-Graphics Controller]
+
+ vendor.id pci 0x1073
+&device.id pci 0x0003
++device.name YMF-740
+
+ vendor.id pci 0x1073
+&device.id pci 0x0004
++device.name YMF-724
+
+ vendor.id pci 0x1073
+&device.id pci 0x0004
+&subvendor.id pci 0x1073
+&subdevice.id pci 0x0004
++subdevice.name YMF724-Based PCI Audio Adapter
+
+ vendor.id pci 0x1073
+&device.id pci 0x0005
++device.name DS1 Audio
+
+ vendor.id pci 0x1073
+&device.id pci 0x0005
+&subvendor.id pci 0x1073
+&subdevice.id pci 0x0005
++subdevice.name DS-XG PCI Audio CODEC
+
+ vendor.id pci 0x1073
+&device.id pci 0x0006
++device.name DS1 Audio
+
+ vendor.id pci 0x1073
+&device.id pci 0x0008
++device.name DS1 Audio
+
+ vendor.id pci 0x1073
+&device.id pci 0x0008
+&subvendor.id pci 0x1073
+&subdevice.id pci 0x0008
++subdevice.name DS-XG PCI Audio CODEC
+
+ vendor.id pci 0x1073
+&device.id pci 0x000a
++device.name DS1L Audio
+
+ vendor.id pci 0x1073
+&device.id pci 0x000a
+&subvendor.id pci 0x1073
+&subdevice.id pci 0x0004
++subdevice.name DS-XG PCI Audio CODEC
+
+ vendor.id pci 0x1073
+&device.id pci 0x000a
+&subvendor.id pci 0x1073
+&subdevice.id pci 0x000a
++subdevice.name DS-XG PCI Audio CODEC
+
+ vendor.id pci 0x1073
+&device.id pci 0x000c
++device.name YMF-740C [DS-1L Audio Controller]
+
+ vendor.id pci 0x1073
+&device.id pci 0x000c
+&subvendor.id pci 0x107a
+&subdevice.id pci 0x000c
++subdevice.name DS-XG PCI Audio CODEC
+
+ vendor.id pci 0x1073
+&device.id pci 0x000d
++device.name YMF-724F [DS-1 Audio Controller]
+
+ vendor.id pci 0x1073
+&device.id pci 0x000d
+&subvendor.id pci 0x1073
+&subdevice.id pci 0x000d
++subdevice.name DS-XG PCI Audio CODEC
+
+ vendor.id pci 0x1073
+&device.id pci 0x0010
++device.name YMF-744B [DS-1S Audio Controller]
+
+ vendor.id pci 0x1073
+&device.id pci 0x0010
+&subvendor.id pci 0x1073
+&subdevice.id pci 0x0006
++subdevice.name DS-XG PCI Audio CODEC
+
+ vendor.id pci 0x1073
+&device.id pci 0x0010
+&subvendor.id pci 0x1073
+&subdevice.id pci 0x0010
++subdevice.name DS-XG PCI Audio CODEC
+
+ vendor.id pci 0x1073
+&device.id pci 0x0012
++device.name YMF-754 [DS-1E Audio Controller]
+
+ vendor.id pci 0x1073
+&device.id pci 0x0012
+&subvendor.id pci 0x1073
+&subdevice.id pci 0x0012
++subdevice.name DS-XG PCI Audio Codec
+
+ vendor.id pci 0x1073
+&device.id pci 0x0020
++device.name DS-1 Audio
+
+ vendor.id pci 0x1073
+&device.id pci 0x2000
++device.name DS2416 Digital Mixing Card
+
+ vendor.id pci 0x1073
+&device.id pci 0x2000
+&subvendor.id pci 0x1073
+&subdevice.id pci 0x2000
++subdevice.name DS2416 Digital Mixing Card
+
+ vendor.id pci 0x1074
++vendor.name NexGen Microsystems
+
+ vendor.id pci 0x1074
+&device.id pci 0x4e78
++device.name 82c500/1
+
+ vendor.id pci 0x1075
++vendor.name Advanced Integrations Research
+
+ vendor.id pci 0x1076
++vendor.name Chaintech Computer Co. Ltd
+
+ vendor.id pci 0x1077
++vendor.name QLogic Corp.
+
+ vendor.id pci 0x1077
+&device.id pci 0x1016
++device.name ISP10160 Single Channel Ultra3 SCSI Processor
+
+ vendor.id pci 0x1077
+&device.id pci 0x1020
++device.name ISP1020 Fast-wide SCSI
+
+ vendor.id pci 0x1077
+&device.id pci 0x1022
++device.name ISP1022 Fast-wide SCSI
+
+ vendor.id pci 0x1077
+&device.id pci 0x1080
++device.name ISP1080 SCSI Host Adapter
+
+ vendor.id pci 0x1077
+&device.id pci 0x1216
++device.name ISP12160 Dual Channel Ultra3 SCSI Processor
+
+ vendor.id pci 0x1077
+&device.id pci 0x1216
+&subvendor.id pci 0x101e
+&subdevice.id pci 0x8471
++subdevice.name QLA12160 on AMI MegaRAID
+
+ vendor.id pci 0x1077
+&device.id pci 0x1216
+&subvendor.id pci 0x101e
+&subdevice.id pci 0x8493
++subdevice.name QLA12160 on AMI MegaRAID
+
+ vendor.id pci 0x1077
+&device.id pci 0x1240
++device.name ISP1240 SCSI Host Adapter
+
+ vendor.id pci 0x1077
+&device.id pci 0x1280
++device.name ISP1280 SCSI Host Adapter
+
+ vendor.id pci 0x1077
+&device.id pci 0x2020
++device.name ISP2020A Fast!SCSI Basic Adapter
+
+ vendor.id pci 0x1077
+&device.id pci 0x2100
++device.name QLA2100 64-bit Fibre Channel Adapter
+
+ vendor.id pci 0x1077
+&device.id pci 0x2100
+&subvendor.id pci 0x1077
+&subdevice.id pci 0x0001
++subdevice.name QLA2100 64-bit Fibre Channel Adapter
+
+ vendor.id pci 0x1077
+&device.id pci 0x2200
++device.name QLA2200 64-bit Fibre Channel Adapter
+
+ vendor.id pci 0x1077
+&device.id pci 0x2200
+&subvendor.id pci 0x1077
+&subdevice.id pci 0x0002
++subdevice.name QLA2200
+
+ vendor.id pci 0x1077
+&device.id pci 0x2300
++device.name QLA2300 64-bit Fibre Channel Adapter
+
+ vendor.id pci 0x1077
+&device.id pci 0x2312
++device.name QLA2312 Fibre Channel Adapter
+
+ vendor.id pci 0x1078
++vendor.name Cyrix Corporation
+
+ vendor.id pci 0x1078
+&device.id pci 0x0000
++device.name 5510 [Grappa]
+
+ vendor.id pci 0x1078
+&device.id pci 0x0001
++device.name PCI Master
+
+ vendor.id pci 0x1078
+&device.id pci 0x0002
++device.name 5520 [Cognac]
+
+ vendor.id pci 0x1078
+&device.id pci 0x0100
++device.name 5530 Legacy [Kahlua]
+
+ vendor.id pci 0x1078
+&device.id pci 0x0101
++device.name 5530 SMI [Kahlua]
+
+ vendor.id pci 0x1078
+&device.id pci 0x0102
++device.name 5530 IDE [Kahlua]
+
+ vendor.id pci 0x1078
+&device.id pci 0x0103
++device.name 5530 Audio [Kahlua]
+
+ vendor.id pci 0x1078
+&device.id pci 0x0104
++device.name 5530 Video [Kahlua]
+
+ vendor.id pci 0x1078
+&device.id pci 0x0400
++device.name ZFMicro PCI Bridge
+
+ vendor.id pci 0x1078
+&device.id pci 0x0401
++device.name ZFMicro Chipset SMI
+
+ vendor.id pci 0x1078
+&device.id pci 0x0402
++device.name ZFMicro Chipset IDE
+
+ vendor.id pci 0x1078
+&device.id pci 0x0403
++device.name ZFMicro Expansion Bus
+
+ vendor.id pci 0x1079
++vendor.name I-Bus
+
+ vendor.id pci 0x107a
++vendor.name NetWorth
+
+ vendor.id pci 0x107b
++vendor.name Gateway 2000
+
+ vendor.id pci 0x107c
++vendor.name LG Electronics [Lucky Goldstar Co. Ltd]
+
+ vendor.id pci 0x107d
++vendor.name LeadTek Research Inc.
+
+ vendor.id pci 0x107d
+&device.id pci 0x0000
++device.name P86C850
+
+ vendor.id pci 0x107d
+&device.id pci 0x2134
++device.name WinFast 3D S320 II
+
+ vendor.id pci 0x107d
+&device.id pci 0x2971
++device.name [GeForce FX 5900] WinFast A350 TDH MyViVo
+
+ vendor.id pci 0x107e
++vendor.name Interphase Corporation
+
+ vendor.id pci 0x107e
+&device.id pci 0x0001
++device.name 5515 ATM Adapter [Flipper]
+
+ vendor.id pci 0x107e
+&device.id pci 0x0002
++device.name 100 VG AnyLan Controller
+
+ vendor.id pci 0x107e
+&device.id pci 0x0004
++device.name 5526 Fibre Channel Host Adapter
+
+ vendor.id pci 0x107e
+&device.id pci 0x0005
++device.name x526 Fibre Channel Host Adapter
+
+ vendor.id pci 0x107e
+&device.id pci 0x0008
++device.name 5525/5575 ATM Adapter (155 Mbit) [Atlantic]
+
+ vendor.id pci 0x107e
+&device.id pci 0x9003
++device.name 5535-4P-BRI-ST
+
+ vendor.id pci 0x107e
+&device.id pci 0x9007
++device.name 5535-4P-BRI-U
+
+ vendor.id pci 0x107e
+&device.id pci 0x9008
++device.name 5535-1P-SR
+
+ vendor.id pci 0x107e
+&device.id pci 0x900c
++device.name 5535-1P-SR-ST
+
+ vendor.id pci 0x107e
+&device.id pci 0x900e
++device.name 5535-1P-SR-U
+
+ vendor.id pci 0x107e
+&device.id pci 0x9011
++device.name 5535-1P-PRI
+
+ vendor.id pci 0x107e
+&device.id pci 0x9013
++device.name 5535-2P-PRI
+
+ vendor.id pci 0x107e
+&device.id pci 0x9023
++device.name 5536-4P-BRI-ST
+
+ vendor.id pci 0x107e
+&device.id pci 0x9027
++device.name 5536-4P-BRI-U
+
+ vendor.id pci 0x107e
+&device.id pci 0x9031
++device.name 5536-1P-PRI
+
+ vendor.id pci 0x107e
+&device.id pci 0x9033
++device.name 5536-2P-PRI
+
+ vendor.id pci 0x107f
++vendor.name Data Technology Corporation
+
+ vendor.id pci 0x107f
+&device.id pci 0x0802
++device.name SL82C105
+
+ vendor.id pci 0x1080
++vendor.name Contaq Microsystems
+
+ vendor.id pci 0x1080
+&device.id pci 0x0600
++device.name 82C599
+
+ vendor.id pci 0x1080
+&device.id pci 0xc691
++device.name Cypress CY82C691
+
+ vendor.id pci 0x1080
+&device.id pci 0xc693
++device.name 82c693
+
+ vendor.id pci 0x1081
++vendor.name Supermac Technology
+
+ vendor.id pci 0x1081
+&device.id pci 0x0d47
++device.name Radius PCI to NuBUS Bridge
+
+ vendor.id pci 0x1082
++vendor.name EFA Corporation of America
+
+ vendor.id pci 0x1083
++vendor.name Forex Computer Corporation
+
+ vendor.id pci 0x1083
+&device.id pci 0x0001
++device.name FR710
+
+ vendor.id pci 0x1084
++vendor.name Parador
+
+ vendor.id pci 0x1085
++vendor.name Tulip Computers Int.B.V.
+
+ vendor.id pci 0x1086
++vendor.name J. Bond Computer Systems
+
+ vendor.id pci 0x1087
++vendor.name Cache Computer
+
+ vendor.id pci 0x1088
++vendor.name Microcomputer Systems (M) Son
+
+ vendor.id pci 0x1089
++vendor.name Data General Corporation
+
+ vendor.id pci 0x108a
++vendor.name SBS Technologies
+
+ vendor.id pci 0x108a
+&device.id pci 0x0001
++device.name VME Bridge Model 617
+
+ vendor.id pci 0x108a
+&device.id pci 0x0010
++device.name VME Bridge Model 618
+
+ vendor.id pci 0x108a
+&device.id pci 0x0040
++device.name dataBLIZZARD
+
+ vendor.id pci 0x108a
+&device.id pci 0x3000
++device.name VME Bridge Model 2706
+
+ vendor.id pci 0x108c
++vendor.name Oakleigh Systems Inc.
+
+ vendor.id pci 0x108d
++vendor.name Olicom
+
+ vendor.id pci 0x108d
+&device.id pci 0x0001
++device.name Token-Ring 16/4 PCI Adapter (3136/3137)
+
+ vendor.id pci 0x108d
+&device.id pci 0x0002
++device.name 16/4 Token Ring
+
+ vendor.id pci 0x108d
+&device.id pci 0x0004
++device.name RapidFire 3139 Token-Ring 16/4 PCI Adapter
+
+ vendor.id pci 0x108d
+&device.id pci 0x0004
+&subvendor.id pci 0x108d
+&subdevice.id pci 0x0004
++subdevice.name OC-3139/3140 RapidFire Token-Ring 16/4 Adapter
+
+ vendor.id pci 0x108d
+&device.id pci 0x0005
++device.name GoCard 3250 Token-Ring 16/4 CardBus PC Card
+
+ vendor.id pci 0x108d
+&device.id pci 0x0006
++device.name OC-3530 RapidFire Token-Ring 100
+
+ vendor.id pci 0x108d
+&device.id pci 0x0007
++device.name RapidFire 3141 Token-Ring 16/4 PCI Fiber Adapter
+
+ vendor.id pci 0x108d
+&device.id pci 0x0007
+&subvendor.id pci 0x108d
+&subdevice.id pci 0x0007
++subdevice.name OC-3141 RapidFire Token-Ring 16/4 Adapter
+
+ vendor.id pci 0x108d
+&device.id pci 0x0008
++device.name RapidFire 3540 HSTR 100/16/4 PCI Adapter
+
+ vendor.id pci 0x108d
+&device.id pci 0x0008
+&subvendor.id pci 0x108d
+&subdevice.id pci 0x0008
++subdevice.name OC-3540 RapidFire HSTR 100/16/4 Adapter
+
+ vendor.id pci 0x108d
+&device.id pci 0x0011
++device.name OC-2315
+
+ vendor.id pci 0x108d
+&device.id pci 0x0012
++device.name OC-2325
+
+ vendor.id pci 0x108d
+&device.id pci 0x0013
++device.name OC-2183/2185
+
+ vendor.id pci 0x108d
+&device.id pci 0x0014
++device.name OC-2326
+
+ vendor.id pci 0x108d
+&device.id pci 0x0019
++device.name OC-2327/2250 10/100 Ethernet Adapter
+
+ vendor.id pci 0x108d
+&device.id pci 0x0019
+&subvendor.id pci 0x108d
+&subdevice.id pci 0x0016
++subdevice.name OC-2327 Rapidfire 10/100 Ethernet Adapter
+
+ vendor.id pci 0x108d
+&device.id pci 0x0019
+&subvendor.id pci 0x108d
+&subdevice.id pci 0x0017
++subdevice.name OC-2250 GoCard 10/100 Ethernet Adapter
+
+ vendor.id pci 0x108d
+&device.id pci 0x0021
++device.name OC-6151/6152 [RapidFire ATM 155]
+
+ vendor.id pci 0x108d
+&device.id pci 0x0022
++device.name ATM Adapter
+
+ vendor.id pci 0x108e
++vendor.name Sun Microsystems Computer Corp.
+
+ vendor.id pci 0x108e
+&device.id pci 0x0001
++device.name EBUS
+
+ vendor.id pci 0x108e
+&device.id pci 0x1000
++device.name EBUS
+
+ vendor.id pci 0x108e
+&device.id pci 0x1001
++device.name Happy Meal
+
+ vendor.id pci 0x108e
+&device.id pci 0x1100
++device.name RIO EBUS
+
+ vendor.id pci 0x108e
+&device.id pci 0x1101
++device.name RIO GEM
+
+ vendor.id pci 0x108e
+&device.id pci 0x1102
++device.name RIO 1394
+
+ vendor.id pci 0x108e
+&device.id pci 0x1103
++device.name RIO USB
+
+ vendor.id pci 0x108e
+&device.id pci 0x2bad
++device.name GEM
+
+ vendor.id pci 0x108e
+&device.id pci 0x5000
++device.name Simba Advanced PCI Bridge
+
+ vendor.id pci 0x108e
+&device.id pci 0x5043
++device.name SunPCI Co-processor
+
+ vendor.id pci 0x108e
+&device.id pci 0x8000
++device.name Psycho PCI Bus Module
+
+ vendor.id pci 0x108e
+&device.id pci 0x8001
++device.name Schizo PCI Bus Module
+
+ vendor.id pci 0x108e
+&device.id pci 0xa000
++device.name Ultra IIi
+
+ vendor.id pci 0x108e
+&device.id pci 0xa001
++device.name Ultra IIe
+
+ vendor.id pci 0x108e
+&device.id pci 0xa801
++device.name Tomatillo PCI Bus Module
+
+ vendor.id pci 0x108e
+&device.id pci 0xabba
++device.name Cassini 10/100/1000
+
+ vendor.id pci 0x108f
++vendor.name Systemsoft
+
+ vendor.id pci 0x1090
++vendor.name Encore Computer Corporation
+
+ vendor.id pci 0x1091
++vendor.name Intergraph Corporation
+
+ vendor.id pci 0x1091
+&device.id pci 0x0020
++device.name 3D graphics processor
+
+ vendor.id pci 0x1091
+&device.id pci 0x0021
++device.name 3D graphics processor w/Texturing
+
+ vendor.id pci 0x1091
+&device.id pci 0x0040
++device.name 3D graphics frame buffer
+
+ vendor.id pci 0x1091
+&device.id pci 0x0041
++device.name 3D graphics frame buffer
+
+ vendor.id pci 0x1091
+&device.id pci 0x0060
++device.name Proprietary bus bridge
+
+ vendor.id pci 0x1091
+&device.id pci 0x00e4
++device.name Powerstorm 4D50T
+
+ vendor.id pci 0x1091
+&device.id pci 0x0720
++device.name Motion JPEG codec
+
+ vendor.id pci 0x1091
+&device.id pci 0x07a0
++device.name Sun Expert3D-Lite Graphics Accelerator
+
+ vendor.id pci 0x1091
+&device.id pci 0x1091
++device.name Sun Expert3D Graphics Accelerator
+
+ vendor.id pci 0x1092
++vendor.name Diamond Multimedia Systems
+
+ vendor.id pci 0x1092
+&device.id pci 0x00a0
++device.name Speedstar Pro SE
+
+ vendor.id pci 0x1092
+&device.id pci 0x00a8
++device.name Speedstar 64
+
+ vendor.id pci 0x1092
+&device.id pci 0x0550
++device.name Viper V550
+
+ vendor.id pci 0x1092
+&device.id pci 0x08d4
++device.name Supra 2260 Modem
+
+ vendor.id pci 0x1092
+&device.id pci 0x094c
++device.name SupraExpress 56i Pro
+
+ vendor.id pci 0x1092
+&device.id pci 0x1092
++device.name Viper V330
+
+ vendor.id pci 0x1092
+&device.id pci 0x6120
++device.name Maximum DVD
+
+ vendor.id pci 0x1092
+&device.id pci 0x8810
++device.name Stealth SE
+
+ vendor.id pci 0x1092
+&device.id pci 0x8811
++device.name Stealth 64/SE
+
+ vendor.id pci 0x1092
+&device.id pci 0x8880
++device.name Stealth
+
+ vendor.id pci 0x1092
+&device.id pci 0x8881
++device.name Stealth
+
+ vendor.id pci 0x1092
+&device.id pci 0x88b0
++device.name Stealth 64
+
+ vendor.id pci 0x1092
+&device.id pci 0x88b1
++device.name Stealth 64
+
+ vendor.id pci 0x1092
+&device.id pci 0x88c0
++device.name Stealth 64
+
+ vendor.id pci 0x1092
+&device.id pci 0x88c1
++device.name Stealth 64
+
+ vendor.id pci 0x1092
+&device.id pci 0x88d0
++device.name Stealth 64
+
+ vendor.id pci 0x1092
+&device.id pci 0x88d1
++device.name Stealth 64
+
+ vendor.id pci 0x1092
+&device.id pci 0x88f0
++device.name Stealth 64
+
+ vendor.id pci 0x1092
+&device.id pci 0x88f1
++device.name Stealth 64
+
+ vendor.id pci 0x1092
+&device.id pci 0x9999
++device.name DMD-I0928-1 "Monster sound" sound chip
+
+ vendor.id pci 0x1093
++vendor.name National Instruments
+
+ vendor.id pci 0x1093
+&device.id pci 0x0160
++device.name PCI-DIO-96
+
+ vendor.id pci 0x1093
+&device.id pci 0x0162
++device.name PCI-MIO-16XE-50
+
+ vendor.id pci 0x1093
+&device.id pci 0x1170
++device.name PCI-MIO-16XE-10
+
+ vendor.id pci 0x1093
+&device.id pci 0x1180
++device.name PCI-MIO-16E-1
+
+ vendor.id pci 0x1093
+&device.id pci 0x1190
++device.name PCI-MIO-16E-4
+
+ vendor.id pci 0x1093
+&device.id pci 0x1330
++device.name PCI-6031E
+
+ vendor.id pci 0x1093
+&device.id pci 0x1350
++device.name PCI-6071E
+
+ vendor.id pci 0x1093
+&device.id pci 0x14e0
++device.name PCI-6110
+
+ vendor.id pci 0x1093
+&device.id pci 0x14f0
++device.name PCI-6111
+
+ vendor.id pci 0x1093
+&device.id pci 0x17d0
++device.name PCI-6503
+
+ vendor.id pci 0x1093
+&device.id pci 0x1870
++device.name PCI-6713
+
+ vendor.id pci 0x1093
+&device.id pci 0x1880
++device.name PCI-6711
+
+ vendor.id pci 0x1093
+&device.id pci 0x18b0
++device.name PCI-6052E
+
+ vendor.id pci 0x1093
+&device.id pci 0x2410
++device.name PCI-6733
+
+ vendor.id pci 0x1093
+&device.id pci 0x2890
++device.name PCI-6036E
+
+ vendor.id pci 0x1093
+&device.id pci 0x2a60
++device.name PCI-6023E
+
+ vendor.id pci 0x1093
+&device.id pci 0x2a70
++device.name PCI-6024E
+
+ vendor.id pci 0x1093
+&device.id pci 0x2a80
++device.name PCI-6025E
+
+ vendor.id pci 0x1093
+&device.id pci 0x2c80
++device.name PCI-6035E
+
+ vendor.id pci 0x1093
+&device.id pci 0x2ca0
++device.name PCI-6034E
+
+ vendor.id pci 0x1093
+&device.id pci 0xb001
++device.name IMAQ-PCI-1408
+
+ vendor.id pci 0x1093
+&device.id pci 0xb011
++device.name IMAQ-PXI-1408
+
+ vendor.id pci 0x1093
+&device.id pci 0xb021
++device.name IMAQ-PCI-1424
+
+ vendor.id pci 0x1093
+&device.id pci 0xb031
++device.name IMAQ-PCI-1413
+
+ vendor.id pci 0x1093
+&device.id pci 0xb041
++device.name IMAQ-PCI-1407
+
+ vendor.id pci 0x1093
+&device.id pci 0xb051
++device.name IMAQ-PXI-1407
+
+ vendor.id pci 0x1093
+&device.id pci 0xb061
++device.name IMAQ-PCI-1411
+
+ vendor.id pci 0x1093
+&device.id pci 0xb071
++device.name IMAQ-PCI-1422
+
+ vendor.id pci 0x1093
+&device.id pci 0xb081
++device.name IMAQ-PXI-1422
+
+ vendor.id pci 0x1093
+&device.id pci 0xb091
++device.name IMAQ-PXI-1411
+
+ vendor.id pci 0x1093
+&device.id pci 0xc801
++device.name PCI-GPIB
+
+ vendor.id pci 0x1093
+&device.id pci 0xc831
++device.name PCI-GPIB bridge
+
+ vendor.id pci 0x1094
++vendor.name First International Computers [FIC]
+
+ vendor.id pci 0x1095
++vendor.name Silicon Image, Inc. (formerly CMD Technology Inc)
+
+ vendor.id pci 0x1095
+&device.id pci 0x0240
++device.name Adaptec AAR-1210SA SATA HostRAID Controller
+
+ vendor.id pci 0x1095
+&device.id pci 0x0640
++device.name PCI0640
+
+ vendor.id pci 0x1095
+&device.id pci 0x0643
++device.name PCI0643
+
+ vendor.id pci 0x1095
+&device.id pci 0x0646
++device.name PCI0646
+
+ vendor.id pci 0x1095
+&device.id pci 0x0647
++device.name PCI0647
+
+ vendor.id pci 0x1095
+&device.id pci 0x0648
++device.name PCI0648
+
+ vendor.id pci 0x1095
+&device.id pci 0x0649
++device.name SiI 0649 Ultra ATA/100 PCI to ATA Host Controller
+
+ vendor.id pci 0x1095
+&device.id pci 0x0649
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0x005d
++subdevice.name Integrated Ultra ATA-100 Dual Channel Controller
+
+ vendor.id pci 0x1095
+&device.id pci 0x0649
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0x007e
++subdevice.name Integrated Ultra ATA-100 IDE RAID Controller
+
+ vendor.id pci 0x1095
+&device.id pci 0x0649
+&subvendor.id pci 0x101e
+&subdevice.id pci 0x0649
++subdevice.name AMI MegaRAID IDE 100 Controller
+
+ vendor.id pci 0x1095
+&device.id pci 0x0650
++device.name PBC0650A
+
+ vendor.id pci 0x1095
+&device.id pci 0x0670
++device.name USB0670
+
+ vendor.id pci 0x1095
+&device.id pci 0x0670
+&subvendor.id pci 0x1095
+&subdevice.id pci 0x0670
++subdevice.name USB0670
+
+ vendor.id pci 0x1095
+&device.id pci 0x0673
++device.name USB0673
+
+ vendor.id pci 0x1095
+&device.id pci 0x0680
++device.name PCI0680 Ultra ATA-133 Host Controller
+
+ vendor.id pci 0x1095
+&device.id pci 0x0680
+&subvendor.id pci 0x1095
+&subdevice.id pci 0x3680
++subdevice.name Winic W-680 (Silicon Image 680 based)
+
+ vendor.id pci 0x1095
+&device.id pci 0x3112
++device.name SiI 3112 [SATALink/SATARaid] Serial ATA Controller
+
+ vendor.id pci 0x1095
+&device.id pci 0x3112
+&subvendor.id pci 0x1095
+&subdevice.id pci 0x3112
++subdevice.name SiI 3112 SATALink Controller
+
+ vendor.id pci 0x1095
+&device.id pci 0x3112
+&subvendor.id pci 0x1095
+&subdevice.id pci 0x6112
++subdevice.name SiI 3112 SATARaid Controller
+
+ vendor.id pci 0x1095
+&device.id pci 0x3114
++device.name SiI 3114 [SATALink/SATARaid] Serial ATA Controller
+
+ vendor.id pci 0x1095
+&device.id pci 0x3114
+&subvendor.id pci 0x1095
+&subdevice.id pci 0x3114
++subdevice.name SiI 3114 SATALink Controller
+
+ vendor.id pci 0x1095
+&device.id pci 0x3114
+&subvendor.id pci 0x1095
+&subdevice.id pci 0x6114
++subdevice.name SiI 3114 SATARaid Controller
+
+ vendor.id pci 0x1095
+&device.id pci 0x3124
++device.name SiI 3124 PCI-X Serial ATA Controller
+
+ vendor.id pci 0x1095
+&device.id pci 0x3124
+&subvendor.id pci 0x1095
+&subdevice.id pci 0x3124
++subdevice.name SiI 3124 PCI-X Serial ATA Controller
+
+ vendor.id pci 0x1095
+&device.id pci 0x3512
++device.name SiI 3512 [SATALink/SATARaid] Serial ATA Controller
+
+ vendor.id pci 0x1095
+&device.id pci 0x3512
+&subvendor.id pci 0x1095
+&subdevice.id pci 0x3512
++subdevice.name SiI 3512 SATALink Controller
+
+ vendor.id pci 0x1095
+&device.id pci 0x3512
+&subvendor.id pci 0x1095
+&subdevice.id pci 0x6512
++subdevice.name SiI 3512 SATARaid Controller
+
+ vendor.id pci 0x1096
++vendor.name Alacron
+
+ vendor.id pci 0x1097
++vendor.name Appian Technology
+
+ vendor.id pci 0x1098
++vendor.name Quantum Designs (H.K.) Ltd
+
+ vendor.id pci 0x1098
+&device.id pci 0x0001
++device.name QD-8500
+
+ vendor.id pci 0x1098
+&device.id pci 0x0002
++device.name QD-8580
+
+ vendor.id pci 0x1099
++vendor.name Samsung Electronics Co., Ltd
+
+ vendor.id pci 0x109a
++vendor.name Packard Bell
+
+ vendor.id pci 0x109b
++vendor.name Gemlight Computer Ltd.
+
+ vendor.id pci 0x109c
++vendor.name Megachips Corporation
+
+ vendor.id pci 0x109d
++vendor.name Zida Technologies Ltd.
+
+ vendor.id pci 0x109e
++vendor.name Brooktree Corporation
+
+ vendor.id pci 0x109e
+&device.id pci 0x0350
++device.name Bt848 Video Capture
+
+ vendor.id pci 0x109e
+&device.id pci 0x0351
++device.name Bt849A Video capture
+
+ vendor.id pci 0x109e
+&device.id pci 0x0369
++device.name Bt878 Video Capture
+
+ vendor.id pci 0x109e
+&device.id pci 0x0369
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x0001
++subdevice.name TV-Wonder
+
+ vendor.id pci 0x109e
+&device.id pci 0x0369
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x0003
++subdevice.name TV-Wonder/VE
+
+ vendor.id pci 0x109e
+&device.id pci 0x036c
++device.name Bt879(??) Video Capture
+
+ vendor.id pci 0x109e
+&device.id pci 0x036c
+&subvendor.id pci 0x13e9
+&subdevice.id pci 0x0070
++subdevice.name Win/TV (Video Section)
+
+ vendor.id pci 0x109e
+&device.id pci 0x036e
++device.name Bt878 Video Capture
+
+ vendor.id pci 0x109e
+&device.id pci 0x036e
+&subvendor.id pci 0x0070
+&subdevice.id pci 0x13eb
++subdevice.name WinTV Series
+
+ vendor.id pci 0x109e
+&device.id pci 0x036e
+&subvendor.id pci 0x0070
+&subdevice.id pci 0xff01
++subdevice.name Viewcast Osprey 200
+
+ vendor.id pci 0x109e
+&device.id pci 0x036e
+&subvendor.id pci 0x0071
+&subdevice.id pci 0x0101
++subdevice.name DigiTV PCI
+
+ vendor.id pci 0x109e
+&device.id pci 0x036e
+&subvendor.id pci 0x107d
+&subdevice.id pci 0x6606
++subdevice.name WinFast TV 2000
+
+ vendor.id pci 0x109e
+&device.id pci 0x036e
+&subvendor.id pci 0x11bd
+&subdevice.id pci 0x0012
++subdevice.name PCTV pro (TV + FM stereo receiver)
+
+ vendor.id pci 0x109e
+&device.id pci 0x036e
+&subvendor.id pci 0x11bd
+&subdevice.id pci 0x001c
++subdevice.name PCTV Sat (DBC receiver)
+
+ vendor.id pci 0x109e
+&device.id pci 0x036e
+&subvendor.id pci 0x127a
+&subdevice.id pci 0x0001
++subdevice.name Bt878 Mediastream Controller NTSC
+
+ vendor.id pci 0x109e
+&device.id pci 0x036e
+&subvendor.id pci 0x127a
+&subdevice.id pci 0x0002
++subdevice.name Bt878 Mediastream Controller PAL BG
+
+ vendor.id pci 0x109e
+&device.id pci 0x036e
+&subvendor.id pci 0x127a
+&subdevice.id pci 0x0003
++subdevice.name Bt878a Mediastream Controller PAL BG
+
+ vendor.id pci 0x109e
+&device.id pci 0x036e
+&subvendor.id pci 0x127a
+&subdevice.id pci 0x0048
++subdevice.name Bt878/832 Mediastream Controller
+
+ vendor.id pci 0x109e
+&device.id pci 0x036e
+&subvendor.id pci 0x144f
+&subdevice.id pci 0x3000
++subdevice.name MagicTView CPH060 - Video
+
+ vendor.id pci 0x109e
+&device.id pci 0x036e
+&subvendor.id pci 0x1461
+&subdevice.id pci 0x0002
++subdevice.name TV98 Series (TV/No FM/Remote)
+
+ vendor.id pci 0x109e
+&device.id pci 0x036e
+&subvendor.id pci 0x1461
+&subdevice.id pci 0x0004
++subdevice.name AVerTV WDM Video Capture
+
+ vendor.id pci 0x109e
+&device.id pci 0x036e
+&subvendor.id pci 0x1461
+&subdevice.id pci 0x0761
++subdevice.name AverTV DVB-T
+
+ vendor.id pci 0x109e
+&device.id pci 0x036e
+&subvendor.id pci 0x14f1
+&subdevice.id pci 0x0001
++subdevice.name Bt878 Mediastream Controller NTSC
+
+ vendor.id pci 0x109e
+&device.id pci 0x036e
+&subvendor.id pci 0x14f1
+&subdevice.id pci 0x0002
++subdevice.name Bt878 Mediastream Controller PAL BG
+
+ vendor.id pci 0x109e
+&device.id pci 0x036e
+&subvendor.id pci 0x14f1
+&subdevice.id pci 0x0003
++subdevice.name Bt878a Mediastream Controller PAL BG
+
+ vendor.id pci 0x109e
+&device.id pci 0x036e
+&subvendor.id pci 0x14f1
+&subdevice.id pci 0x0048
++subdevice.name Bt878/832 Mediastream Controller
+
+ vendor.id pci 0x109e
+&device.id pci 0x036e
+&subvendor.id pci 0x1822
+&subdevice.id pci 0x0001
++subdevice.name VisionPlus DVB card
+
+ vendor.id pci 0x109e
+&device.id pci 0x036e
+&subvendor.id pci 0x1851
+&subdevice.id pci 0x1850
++subdevice.name FlyVideo'98 - Video
+
+ vendor.id pci 0x109e
+&device.id pci 0x036e
+&subvendor.id pci 0x1851
+&subdevice.id pci 0x1851
++subdevice.name FlyVideo II
+
+ vendor.id pci 0x109e
+&device.id pci 0x036e
+&subvendor.id pci 0x1852
+&subdevice.id pci 0x1852
++subdevice.name FlyVideo'98 - Video (with FM Tuner)
+
+ vendor.id pci 0x109e
+&device.id pci 0x036e
+&subvendor.id pci 0x270f
+&subdevice.id pci 0xfc00
++subdevice.name Digitop DTT-1000
+
+ vendor.id pci 0x109e
+&device.id pci 0x036e
+&subvendor.id pci 0xbd11
+&subdevice.id pci 0x1200
++subdevice.name PCTV pro (TV + FM stereo receiver)
+
+ vendor.id pci 0x109e
+&device.id pci 0x036f
++device.name Bt879 Video Capture
+
+ vendor.id pci 0x109e
+&device.id pci 0x036f
+&subvendor.id pci 0x127a
+&subdevice.id pci 0x0044
++subdevice.name Bt879 Video Capture NTSC
+
+ vendor.id pci 0x109e
+&device.id pci 0x036f
+&subvendor.id pci 0x127a
+&subdevice.id pci 0x0122
++subdevice.name Bt879 Video Capture PAL I
+
+ vendor.id pci 0x109e
+&device.id pci 0x036f
+&subvendor.id pci 0x127a
+&subdevice.id pci 0x0144
++subdevice.name Bt879 Video Capture NTSC
+
+ vendor.id pci 0x109e
+&device.id pci 0x036f
+&subvendor.id pci 0x127a
+&subdevice.id pci 0x0222
++subdevice.name Bt879 Video Capture PAL BG
+
+ vendor.id pci 0x109e
+&device.id pci 0x036f
+&subvendor.id pci 0x127a
+&subdevice.id pci 0x0244
++subdevice.name Bt879a Video Capture NTSC
+
+ vendor.id pci 0x109e
+&device.id pci 0x036f
+&subvendor.id pci 0x127a
+&subdevice.id pci 0x0322
++subdevice.name Bt879 Video Capture NTSC
+
+ vendor.id pci 0x109e
+&device.id pci 0x036f
+&subvendor.id pci 0x127a
+&subdevice.id pci 0x0422
++subdevice.name Bt879 Video Capture NTSC
+
+ vendor.id pci 0x109e
+&device.id pci 0x036f
+&subvendor.id pci 0x127a
+&subdevice.id pci 0x1122
++subdevice.name Bt879 Video Capture PAL I
+
+ vendor.id pci 0x109e
+&device.id pci 0x036f
+&subvendor.id pci 0x127a
+&subdevice.id pci 0x1222
++subdevice.name Bt879 Video Capture PAL BG
+
+ vendor.id pci 0x109e
+&device.id pci 0x036f
+&subvendor.id pci 0x127a
+&subdevice.id pci 0x1322
++subdevice.name Bt879 Video Capture NTSC
+
+ vendor.id pci 0x109e
+&device.id pci 0x036f
+&subvendor.id pci 0x127a
+&subdevice.id pci 0x1522
++subdevice.name Bt879a Video Capture PAL I
+
+ vendor.id pci 0x109e
+&device.id pci 0x036f
+&subvendor.id pci 0x127a
+&subdevice.id pci 0x1622
++subdevice.name Bt879a Video Capture PAL BG
+
+ vendor.id pci 0x109e
+&device.id pci 0x036f
+&subvendor.id pci 0x127a
+&subdevice.id pci 0x1722
++subdevice.name Bt879a Video Capture NTSC
+
+ vendor.id pci 0x109e
+&device.id pci 0x036f
+&subvendor.id pci 0x14f1
+&subdevice.id pci 0x0044
++subdevice.name Bt879 Video Capture NTSC
+
+ vendor.id pci 0x109e
+&device.id pci 0x036f
+&subvendor.id pci 0x14f1
+&subdevice.id pci 0x0122
++subdevice.name Bt879 Video Capture PAL I
+
+ vendor.id pci 0x109e
+&device.id pci 0x036f
+&subvendor.id pci 0x14f1
+&subdevice.id pci 0x0144
++subdevice.name Bt879 Video Capture NTSC
+
+ vendor.id pci 0x109e
+&device.id pci 0x036f
+&subvendor.id pci 0x14f1
+&subdevice.id pci 0x0222
++subdevice.name Bt879 Video Capture PAL BG
+
+ vendor.id pci 0x109e
+&device.id pci 0x036f
+&subvendor.id pci 0x14f1
+&subdevice.id pci 0x0244
++subdevice.name Bt879a Video Capture NTSC
+
+ vendor.id pci 0x109e
+&device.id pci 0x036f
+&subvendor.id pci 0x14f1
+&subdevice.id pci 0x0322
++subdevice.name Bt879 Video Capture NTSC
+
+ vendor.id pci 0x109e
+&device.id pci 0x036f
+&subvendor.id pci 0x14f1
+&subdevice.id pci 0x0422
++subdevice.name Bt879 Video Capture NTSC
+
+ vendor.id pci 0x109e
+&device.id pci 0x036f
+&subvendor.id pci 0x14f1
+&subdevice.id pci 0x1122
++subdevice.name Bt879 Video Capture PAL I
+
+ vendor.id pci 0x109e
+&device.id pci 0x036f
+&subvendor.id pci 0x14f1
+&subdevice.id pci 0x1222
++subdevice.name Bt879 Video Capture PAL BG
+
+ vendor.id pci 0x109e
+&device.id pci 0x036f
+&subvendor.id pci 0x14f1
+&subdevice.id pci 0x1322
++subdevice.name Bt879 Video Capture NTSC
+
+ vendor.id pci 0x109e
+&device.id pci 0x036f
+&subvendor.id pci 0x14f1
+&subdevice.id pci 0x1522
++subdevice.name Bt879a Video Capture PAL I
+
+ vendor.id pci 0x109e
+&device.id pci 0x036f
+&subvendor.id pci 0x14f1
+&subdevice.id pci 0x1622
++subdevice.name Bt879a Video Capture PAL BG
+
+ vendor.id pci 0x109e
+&device.id pci 0x036f
+&subvendor.id pci 0x14f1
+&subdevice.id pci 0x1722
++subdevice.name Bt879a Video Capture NTSC
+
+ vendor.id pci 0x109e
+&device.id pci 0x036f
+&subvendor.id pci 0x1851
+&subdevice.id pci 0x1850
++subdevice.name FlyVideo'98 - Video
+
+ vendor.id pci 0x109e
+&device.id pci 0x036f
+&subvendor.id pci 0x1851
+&subdevice.id pci 0x1851
++subdevice.name FlyVideo II
+
+ vendor.id pci 0x109e
+&device.id pci 0x036f
+&subvendor.id pci 0x1852
+&subdevice.id pci 0x1852
++subdevice.name FlyVideo'98 - Video (with FM Tuner)
+
+ vendor.id pci 0x109e
+&device.id pci 0x0370
++device.name Bt880 Video Capture
+
+ vendor.id pci 0x109e
+&device.id pci 0x0370
+&subvendor.id pci 0x1851
+&subdevice.id pci 0x1850
++subdevice.name FlyVideo'98
+
+ vendor.id pci 0x109e
+&device.id pci 0x0370
+&subvendor.id pci 0x1851
+&subdevice.id pci 0x1851
++subdevice.name FlyVideo'98 EZ - video
+
+ vendor.id pci 0x109e
+&device.id pci 0x0370
+&subvendor.id pci 0x1852
+&subdevice.id pci 0x1852
++subdevice.name FlyVideo'98 (with FM Tuner)
+
+ vendor.id pci 0x109e
+&device.id pci 0x0878
++device.name Bt878 Audio Capture
+
+ vendor.id pci 0x109e
+&device.id pci 0x0878
+&subvendor.id pci 0x0070
+&subdevice.id pci 0x13eb
++subdevice.name WinTV Series
+
+ vendor.id pci 0x109e
+&device.id pci 0x0878
+&subvendor.id pci 0x0070
+&subdevice.id pci 0xff01
++subdevice.name Viewcast Osprey 200
+
+ vendor.id pci 0x109e
+&device.id pci 0x0878
+&subvendor.id pci 0x0071
+&subdevice.id pci 0x0101
++subdevice.name DigiTV PCI
+
+ vendor.id pci 0x109e
+&device.id pci 0x0878
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x0001
++subdevice.name TV-Wonder
+
+ vendor.id pci 0x109e
+&device.id pci 0x0878
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x0003
++subdevice.name TV-Wonder/VE
+
+ vendor.id pci 0x109e
+&device.id pci 0x0878
+&subvendor.id pci 0x11bd
+&subdevice.id pci 0x0012
++subdevice.name PCTV pro (TV + FM stereo receiver, audio section)
+
+ vendor.id pci 0x109e
+&device.id pci 0x0878
+&subvendor.id pci 0x11bd
+&subdevice.id pci 0x001c
++subdevice.name PCTV Sat (DBC receiver)
+
+ vendor.id pci 0x109e
+&device.id pci 0x0878
+&subvendor.id pci 0x127a
+&subdevice.id pci 0x0001
++subdevice.name Bt878 Video Capture (Audio Section)
+
+ vendor.id pci 0x109e
+&device.id pci 0x0878
+&subvendor.id pci 0x127a
+&subdevice.id pci 0x0002
++subdevice.name Bt878 Video Capture (Audio Section)
+
+ vendor.id pci 0x109e
+&device.id pci 0x0878
+&subvendor.id pci 0x127a
+&subdevice.id pci 0x0003
++subdevice.name Bt878 Video Capture (Audio Section)
+
+ vendor.id pci 0x109e
+&device.id pci 0x0878
+&subvendor.id pci 0x127a
+&subdevice.id pci 0x0048
++subdevice.name Bt878 Video Capture (Audio Section)
+
+ vendor.id pci 0x109e
+&device.id pci 0x0878
+&subvendor.id pci 0x13e9
+&subdevice.id pci 0x0070
++subdevice.name Win/TV (Audio Section)
+
+ vendor.id pci 0x109e
+&device.id pci 0x0878
+&subvendor.id pci 0x144f
+&subdevice.id pci 0x3000
++subdevice.name MagicTView CPH060 - Audio
+
+ vendor.id pci 0x109e
+&device.id pci 0x0878
+&subvendor.id pci 0x1461
+&subdevice.id pci 0x0004
++subdevice.name AVerTV WDM Audio Capture
+
+ vendor.id pci 0x109e
+&device.id pci 0x0878
+&subvendor.id pci 0x1461
+&subdevice.id pci 0x0761
++subdevice.name AVerTV DVB-T
+
+ vendor.id pci 0x109e
+&device.id pci 0x0878
+&subvendor.id pci 0x14f1
+&subdevice.id pci 0x0001
++subdevice.name Bt878 Video Capture (Audio Section)
+
+ vendor.id pci 0x109e
+&device.id pci 0x0878
+&subvendor.id pci 0x14f1
+&subdevice.id pci 0x0002
++subdevice.name Bt878 Video Capture (Audio Section)
+
+ vendor.id pci 0x109e
+&device.id pci 0x0878
+&subvendor.id pci 0x14f1
+&subdevice.id pci 0x0003
++subdevice.name Bt878 Video Capture (Audio Section)
+
+ vendor.id pci 0x109e
+&device.id pci 0x0878
+&subvendor.id pci 0x14f1
+&subdevice.id pci 0x0048
++subdevice.name Bt878 Video Capture (Audio Section)
+
+ vendor.id pci 0x109e
+&device.id pci 0x0878
+&subvendor.id pci 0x1822
+&subdevice.id pci 0x0001
++subdevice.name VisionPlus DVB Card
+
+ vendor.id pci 0x109e
+&device.id pci 0x0878
+&subvendor.id pci 0x270f
+&subdevice.id pci 0xfc00
++subdevice.name Digitop DTT-1000
+
+ vendor.id pci 0x109e
+&device.id pci 0x0878
+&subvendor.id pci 0xbd11
+&subdevice.id pci 0x1200
++subdevice.name PCTV pro (TV + FM stereo receiver, audio section)
+
+ vendor.id pci 0x109e
+&device.id pci 0x0879
++device.name Bt879 Audio Capture
+
+ vendor.id pci 0x109e
+&device.id pci 0x0879
+&subvendor.id pci 0x127a
+&subdevice.id pci 0x0044
++subdevice.name Bt879 Video Capture (Audio Section)
+
+ vendor.id pci 0x109e
+&device.id pci 0x0879
+&subvendor.id pci 0x127a
+&subdevice.id pci 0x0122
++subdevice.name Bt879 Video Capture (Audio Section)
+
+ vendor.id pci 0x109e
+&device.id pci 0x0879
+&subvendor.id pci 0x127a
+&subdevice.id pci 0x0144
++subdevice.name Bt879 Video Capture (Audio Section)
+
+ vendor.id pci 0x109e
+&device.id pci 0x0879
+&subvendor.id pci 0x127a
+&subdevice.id pci 0x0222
++subdevice.name Bt879 Video Capture (Audio Section)
+
+ vendor.id pci 0x109e
+&device.id pci 0x0879
+&subvendor.id pci 0x127a
+&subdevice.id pci 0x0244
++subdevice.name Bt879 Video Capture (Audio Section)
+
+ vendor.id pci 0x109e
+&device.id pci 0x0879
+&subvendor.id pci 0x127a
+&subdevice.id pci 0x0322
++subdevice.name Bt879 Video Capture (Audio Section)
+
+ vendor.id pci 0x109e
+&device.id pci 0x0879
+&subvendor.id pci 0x127a
+&subdevice.id pci 0x0422
++subdevice.name Bt879 Video Capture (Audio Section)
+
+ vendor.id pci 0x109e
+&device.id pci 0x0879
+&subvendor.id pci 0x127a
+&subdevice.id pci 0x1122
++subdevice.name Bt879 Video Capture (Audio Section)
+
+ vendor.id pci 0x109e
+&device.id pci 0x0879
+&subvendor.id pci 0x127a
+&subdevice.id pci 0x1222
++subdevice.name Bt879 Video Capture (Audio Section)
+
+ vendor.id pci 0x109e
+&device.id pci 0x0879
+&subvendor.id pci 0x127a
+&subdevice.id pci 0x1322
++subdevice.name Bt879 Video Capture (Audio Section)
+
+ vendor.id pci 0x109e
+&device.id pci 0x0879
+&subvendor.id pci 0x127a
+&subdevice.id pci 0x1522
++subdevice.name Bt879 Video Capture (Audio Section)
+
+ vendor.id pci 0x109e
+&device.id pci 0x0879
+&subvendor.id pci 0x127a
+&subdevice.id pci 0x1622
++subdevice.name Bt879 Video Capture (Audio Section)
+
+ vendor.id pci 0x109e
+&device.id pci 0x0879
+&subvendor.id pci 0x127a
+&subdevice.id pci 0x1722
++subdevice.name Bt879 Video Capture (Audio Section)
+
+ vendor.id pci 0x109e
+&device.id pci 0x0879
+&subvendor.id pci 0x14f1
+&subdevice.id pci 0x0044
++subdevice.name Bt879 Video Capture (Audio Section)
+
+ vendor.id pci 0x109e
+&device.id pci 0x0879
+&subvendor.id pci 0x14f1
+&subdevice.id pci 0x0122
++subdevice.name Bt879 Video Capture (Audio Section)
+
+ vendor.id pci 0x109e
+&device.id pci 0x0879
+&subvendor.id pci 0x14f1
+&subdevice.id pci 0x0144
++subdevice.name Bt879 Video Capture (Audio Section)
+
+ vendor.id pci 0x109e
+&device.id pci 0x0879
+&subvendor.id pci 0x14f1
+&subdevice.id pci 0x0222
++subdevice.name Bt879 Video Capture (Audio Section)
+
+ vendor.id pci 0x109e
+&device.id pci 0x0879
+&subvendor.id pci 0x14f1
+&subdevice.id pci 0x0244
++subdevice.name Bt879 Video Capture (Audio Section)
+
+ vendor.id pci 0x109e
+&device.id pci 0x0879
+&subvendor.id pci 0x14f1
+&subdevice.id pci 0x0322
++subdevice.name Bt879 Video Capture (Audio Section)
+
+ vendor.id pci 0x109e
+&device.id pci 0x0879
+&subvendor.id pci 0x14f1
+&subdevice.id pci 0x0422
++subdevice.name Bt879 Video Capture (Audio Section)
+
+ vendor.id pci 0x109e
+&device.id pci 0x0879
+&subvendor.id pci 0x14f1
+&subdevice.id pci 0x1122
++subdevice.name Bt879 Video Capture (Audio Section)
+
+ vendor.id pci 0x109e
+&device.id pci 0x0879
+&subvendor.id pci 0x14f1
+&subdevice.id pci 0x1222
++subdevice.name Bt879 Video Capture (Audio Section)
+
+ vendor.id pci 0x109e
+&device.id pci 0x0879
+&subvendor.id pci 0x14f1
+&subdevice.id pci 0x1322
++subdevice.name Bt879 Video Capture (Audio Section)
+
+ vendor.id pci 0x109e
+&device.id pci 0x0879
+&subvendor.id pci 0x14f1
+&subdevice.id pci 0x1522
++subdevice.name Bt879 Video Capture (Audio Section)
+
+ vendor.id pci 0x109e
+&device.id pci 0x0879
+&subvendor.id pci 0x14f1
+&subdevice.id pci 0x1622
++subdevice.name Bt879 Video Capture (Audio Section)
+
+ vendor.id pci 0x109e
+&device.id pci 0x0879
+&subvendor.id pci 0x14f1
+&subdevice.id pci 0x1722
++subdevice.name Bt879 Video Capture (Audio Section)
+
+ vendor.id pci 0x109e
+&device.id pci 0x0880
++device.name Bt880 Audio Capture
+
+ vendor.id pci 0x109e
+&device.id pci 0x2115
++device.name BtV 2115 Mediastream controller
+
+ vendor.id pci 0x109e
+&device.id pci 0x2125
++device.name BtV 2125 Mediastream controller
+
+ vendor.id pci 0x109e
+&device.id pci 0x2164
++device.name BtV 2164
+
+ vendor.id pci 0x109e
+&device.id pci 0x2165
++device.name BtV 2165
+
+ vendor.id pci 0x109e
+&device.id pci 0x8230
++device.name Bt8230 ATM Segment/Reassembly Ctrlr (SRC)
+
+ vendor.id pci 0x109e
+&device.id pci 0x8472
++device.name Bt8472
+
+ vendor.id pci 0x109e
+&device.id pci 0x8474
++device.name Bt8474
+
+ vendor.id pci 0x109f
++vendor.name Trigem Computer Inc.
+
+ vendor.id pci 0x10a0
++vendor.name Meidensha Corporation
+
+ vendor.id pci 0x10a1
++vendor.name Juko Electronics Ind. Co. Ltd
+
+ vendor.id pci 0x10a2
++vendor.name Quantum Corporation
+
+ vendor.id pci 0x10a3
++vendor.name Everex Systems Inc
+
+ vendor.id pci 0x10a4
++vendor.name Globe Manufacturing Sales
+
+ vendor.id pci 0x10a5
++vendor.name Smart Link Ltd.
+
+ vendor.id pci 0x10a5
+&device.id pci 0x3052
++device.name SmartPCI562 56K Modem
+
+ vendor.id pci 0x10a5
+&device.id pci 0x5449
++device.name SmartPCI561 modem
+
+ vendor.id pci 0x10a6
++vendor.name Informtech Industrial Ltd.
+
+ vendor.id pci 0x10a7
++vendor.name Benchmarq Microelectronics
+
+ vendor.id pci 0x10a8
++vendor.name Sierra Semiconductor
+
+ vendor.id pci 0x10a8
+&device.id pci 0x0000
++device.name STB Horizon 64
+
+ vendor.id pci 0x10a9
++vendor.name Silicon Graphics, Inc.
+
+ vendor.id pci 0x10a9
+&device.id pci 0x0001
++device.name Crosstalk to PCI Bridge
+
+ vendor.id pci 0x10a9
+&device.id pci 0x0002
++device.name Linc I/O controller
+
+ vendor.id pci 0x10a9
+&device.id pci 0x0003
++device.name IOC3 I/O controller
+
+ vendor.id pci 0x10a9
+&device.id pci 0x0004
++device.name O2 MACE
+
+ vendor.id pci 0x10a9
+&device.id pci 0x0005
++device.name RAD Audio
+
+ vendor.id pci 0x10a9
+&device.id pci 0x0006
++device.name HPCEX
+
+ vendor.id pci 0x10a9
+&device.id pci 0x0007
++device.name RPCEX
+
+ vendor.id pci 0x10a9
+&device.id pci 0x0008
++device.name DiVO VIP
+
+ vendor.id pci 0x10a9
+&device.id pci 0x0009
++device.name AceNIC Gigabit Ethernet
+
+ vendor.id pci 0x10a9
+&device.id pci 0x0009
+&subvendor.id pci 0x10a9
+&subdevice.id pci 0x8002
++subdevice.name AceNIC Gigabit Ethernet
+
+ vendor.id pci 0x10a9
+&device.id pci 0x0010
++device.name AMP Video I/O
+
+ vendor.id pci 0x10a9
+&device.id pci 0x0011
++device.name GRIP
+
+ vendor.id pci 0x10a9
+&device.id pci 0x0012
++device.name SGH PSHAC GSN
+
+ vendor.id pci 0x10a9
+&device.id pci 0x1001
++device.name Magic Carpet
+
+ vendor.id pci 0x10a9
+&device.id pci 0x1002
++device.name Lithium
+
+ vendor.id pci 0x10a9
+&device.id pci 0x1003
++device.name Dual JPEG 1
+
+ vendor.id pci 0x10a9
+&device.id pci 0x1004
++device.name Dual JPEG 2
+
+ vendor.id pci 0x10a9
+&device.id pci 0x1005
++device.name Dual JPEG 3
+
+ vendor.id pci 0x10a9
+&device.id pci 0x1006
++device.name Dual JPEG 4
+
+ vendor.id pci 0x10a9
+&device.id pci 0x1007
++device.name Dual JPEG 5
+
+ vendor.id pci 0x10a9
+&device.id pci 0x1008
++device.name Cesium
+
+ vendor.id pci 0x10a9
+&device.id pci 0x100a
++device.name IOC4 I/O controller
+
+ vendor.id pci 0x10a9
+&device.id pci 0x2001
++device.name Fibre Channel
+
+ vendor.id pci 0x10a9
+&device.id pci 0x2002
++device.name ASDE
+
+ vendor.id pci 0x10a9
+&device.id pci 0x8001
++device.name O2 1394
+
+ vendor.id pci 0x10a9
+&device.id pci 0x8002
++device.name G-net NT
+
+ vendor.id pci 0x10aa
++vendor.name ACC Microelectronics
+
+ vendor.id pci 0x10aa
+&device.id pci 0x0000
++device.name ACCM 2188
+
+ vendor.id pci 0x10ab
++vendor.name Digicom
+
+ vendor.id pci 0x10ac
++vendor.name Honeywell IAC
+
+ vendor.id pci 0x10ad
++vendor.name Symphony Labs
+
+ vendor.id pci 0x10ad
+&device.id pci 0x0001
++device.name W83769F
+
+ vendor.id pci 0x10ad
+&device.id pci 0x0003
++device.name SL82C103
+
+ vendor.id pci 0x10ad
+&device.id pci 0x0005
++device.name SL82C105
+
+ vendor.id pci 0x10ad
+&device.id pci 0x0103
++device.name SL82c103
+
+ vendor.id pci 0x10ad
+&device.id pci 0x0105
++device.name SL82c105
+
+ vendor.id pci 0x10ad
+&device.id pci 0x0565
++device.name W83C553
+
+ vendor.id pci 0x10ae
++vendor.name Cornerstone Technology
+
+ vendor.id pci 0x10af
++vendor.name Micro Computer Systems Inc
+
+ vendor.id pci 0x10b0
++vendor.name CardExpert Technology
+
+ vendor.id pci 0x10b1
++vendor.name Cabletron Systems Inc
+
+ vendor.id pci 0x10b2
++vendor.name Raytheon Company
+
+ vendor.id pci 0x10b3
++vendor.name Databook Inc
+
+ vendor.id pci 0x10b3
+&device.id pci 0x3106
++device.name DB87144
+
+ vendor.id pci 0x10b3
+&device.id pci 0xb106
++device.name DB87144
+
+ vendor.id pci 0x10b4
++vendor.name STB Systems Inc
+
+ vendor.id pci 0x10b4
+&device.id pci 0x1b1d
++device.name Velocity 128 3D
+
+ vendor.id pci 0x10b4
+&device.id pci 0x1b1d
+&subvendor.id pci 0x10b4
+&subdevice.id pci 0x237e
++subdevice.name Velocity 4400
+
+ vendor.id pci 0x10b5
++vendor.name PLX Technology, Inc.
+
+ vendor.id pci 0x10b5
+&device.id pci 0x0001
++device.name i960 PCI bus interface
+
+ vendor.id pci 0x10b5
+&device.id pci 0x1076
++device.name VScom 800 8 port serial adaptor
+
+ vendor.id pci 0x10b5
+&device.id pci 0x1077
++device.name VScom 400 4 port serial adaptor
+
+ vendor.id pci 0x10b5
+&device.id pci 0x1078
++device.name VScom 210 2 port serial and 1 port parallel adaptor
+
+ vendor.id pci 0x10b5
+&device.id pci 0x1103
++device.name VScom 200 2 port serial adaptor
+
+ vendor.id pci 0x10b5
+&device.id pci 0x1146
++device.name VScom 010 1 port parallel adaptor
+
+ vendor.id pci 0x10b5
+&device.id pci 0x1147
++device.name VScom 020 2 port parallel adaptor
+
+ vendor.id pci 0x10b5
+&device.id pci 0x2724
++device.name Thales PCSM Security Card
+
+ vendor.id pci 0x10b5
+&device.id pci 0x9030
++device.name PCI <-> IOBus Bridge Hot Swap
+
+ vendor.id pci 0x10b5
+&device.id pci 0x9030
+&subvendor.id pci 0x10b5
+&subdevice.id pci 0x2862
++subdevice.name Alpermann+Velte PCL PCI LV (3V/5V): Timecode Reader Board
+
+ vendor.id pci 0x10b5
+&device.id pci 0x9030
+&subvendor.id pci 0x10b5
+&subdevice.id pci 0x2906
++subdevice.name Alpermann+Velte PCI TS (3V/5V): Time Synchronisation Board
+
+ vendor.id pci 0x10b5
+&device.id pci 0x9030
+&subvendor.id pci 0x10b5
+&subdevice.id pci 0x2940
++subdevice.name Alpermann+Velte PCL PCI D (3V/5V): Timecode Reader Board
+
+ vendor.id pci 0x10b5
+&device.id pci 0x9030
+&subvendor.id pci 0x15ed
+&subdevice.id pci 0x1002
++subdevice.name MCCS 8-port Serial Hot Swap
+
+ vendor.id pci 0x10b5
+&device.id pci 0x9030
+&subvendor.id pci 0x15ed
+&subdevice.id pci 0x1003
++subdevice.name MCCS 16-port Serial Hot Swap
+
+ vendor.id pci 0x10b5
+&device.id pci 0x9036
++device.name 9036
+
+ vendor.id pci 0x10b5
+&device.id pci 0x9050
++device.name PCI <-> IOBus Bridge
+
+ vendor.id pci 0x10b5
+&device.id pci 0x9050
+&subvendor.id pci 0x10b5
+&subdevice.id pci 0x1067
++subdevice.name IXXAT CAN i165
+
+ vendor.id pci 0x10b5
+&device.id pci 0x9050
+&subvendor.id pci 0x10b5
+&subdevice.id pci 0x1172
++subdevice.name IK220 (Heidenhain)
+
+ vendor.id pci 0x10b5
+&device.id pci 0x9050
+&subvendor.id pci 0x10b5
+&subdevice.id pci 0x2036
++subdevice.name SatPak GPS
+
+ vendor.id pci 0x10b5
+&device.id pci 0x9050
+&subvendor.id pci 0x10b5
+&subdevice.id pci 0x2221
++subdevice.name Alpermann+Velte PCL PCI LV: Timecode Reader Board
+
+ vendor.id pci 0x10b5
+&device.id pci 0x9050
+&subvendor.id pci 0x10b5
+&subdevice.id pci 0x2273
++subdevice.name SH-ARC SoHard ARCnet card
+
+ vendor.id pci 0x10b5
+&device.id pci 0x9050
+&subvendor.id pci 0x10b5
+&subdevice.id pci 0x2431
++subdevice.name Alpermann+Velte PCL PCI D: Timecode Reader Board
+
+ vendor.id pci 0x10b5
+&device.id pci 0x9050
+&subvendor.id pci 0x10b5
+&subdevice.id pci 0x2905
++subdevice.name Alpermann+Velte PCI TS: Time Synchronisation Board
+
+ vendor.id pci 0x10b5
+&device.id pci 0x9050
+&subvendor.id pci 0x10b5
+&subdevice.id pci 0x9050
++subdevice.name MP9050
+
+ vendor.id pci 0x10b5
+&device.id pci 0x9050
+&subvendor.id pci 0x1498
+&subdevice.id pci 0x0362
++subdevice.name TPMC866 8 Channel Serial Card
+
+ vendor.id pci 0x10b5
+&device.id pci 0x9050
+&subvendor.id pci 0x1522
+&subdevice.id pci 0x0001
++subdevice.name RockForce 4 Port V.90 Data/Fax/Voice Modem
+
+ vendor.id pci 0x10b5
+&device.id pci 0x9050
+&subvendor.id pci 0x1522
+&subdevice.id pci 0x0002
++subdevice.name RockForce 2 Port V.90 Data/Fax/Voice Modem
+
+ vendor.id pci 0x10b5
+&device.id pci 0x9050
+&subvendor.id pci 0x1522
+&subdevice.id pci 0x0003
++subdevice.name RockForce 6 Port V.90 Data/Fax/Voice Modem
+
+ vendor.id pci 0x10b5
+&device.id pci 0x9050
+&subvendor.id pci 0x1522
+&subdevice.id pci 0x0004
++subdevice.name RockForce 8 Port V.90 Data/Fax/Voice Modem
+
+ vendor.id pci 0x10b5
+&device.id pci 0x9050
+&subvendor.id pci 0x1522
+&subdevice.id pci 0x0010
++subdevice.name RockForce2000 4 Port V.90 Data/Fax/Voice Modem
+
+ vendor.id pci 0x10b5
+&device.id pci 0x9050
+&subvendor.id pci 0x1522
+&subdevice.id pci 0x0020
++subdevice.name RockForce2000 2 Port V.90 Data/Fax/Voice Modem
+
+ vendor.id pci 0x10b5
+&device.id pci 0x9050
+&subvendor.id pci 0x15ed
+&subdevice.id pci 0x1000
++subdevice.name Macrolink MCCS 8-port Serial
+
+ vendor.id pci 0x10b5
+&device.id pci 0x9050
+&subvendor.id pci 0x15ed
+&subdevice.id pci 0x1001
++subdevice.name Macrolink MCCS 16-port Serial
+
+ vendor.id pci 0x10b5
+&device.id pci 0x9050
+&subvendor.id pci 0x15ed
+&subdevice.id pci 0x1002
++subdevice.name Macrolink MCCS 8-port Serial Hot Swap
+
+ vendor.id pci 0x10b5
+&device.id pci 0x9050
+&subvendor.id pci 0x15ed
+&subdevice.id pci 0x1003
++subdevice.name Macrolink MCCS 16-port Serial Hot Swap
+
+ vendor.id pci 0x10b5
+&device.id pci 0x9050
+&subvendor.id pci 0x5654
+&subdevice.id pci 0x2036
++subdevice.name OpenSwitch 6 Telephony card
+
+ vendor.id pci 0x10b5
+&device.id pci 0x9050
+&subvendor.id pci 0x5654
+&subdevice.id pci 0x3132
++subdevice.name OpenSwitch 12 Telephony card
+
+ vendor.id pci 0x10b5
+&device.id pci 0x9050
+&subvendor.id pci 0x5654
+&subdevice.id pci 0x5634
++subdevice.name OpenLine4 Telephony Card
+
+ vendor.id pci 0x10b5
+&device.id pci 0x9050
+&subvendor.id pci 0xd531
+&subdevice.id pci 0xc002
++subdevice.name PCIntelliCAN 2xSJA1000 CAN bus
+
+ vendor.id pci 0x10b5
+&device.id pci 0x9050
+&subvendor.id pci 0xd84d
+&subdevice.id pci 0x4006
++subdevice.name EX-4006 1P
+
+ vendor.id pci 0x10b5
+&device.id pci 0x9050
+&subvendor.id pci 0xd84d
+&subdevice.id pci 0x4008
++subdevice.name EX-4008 1P EPP/ECP
+
+ vendor.id pci 0x10b5
+&device.id pci 0x9050
+&subvendor.id pci 0xd84d
+&subdevice.id pci 0x4014
++subdevice.name EX-4014 2P
+
+ vendor.id pci 0x10b5
+&device.id pci 0x9050
+&subvendor.id pci 0xd84d
+&subdevice.id pci 0x4018
++subdevice.name EX-4018 3P EPP/ECP
+
+ vendor.id pci 0x10b5
+&device.id pci 0x9050
+&subvendor.id pci 0xd84d
+&subdevice.id pci 0x4025
++subdevice.name EX-4025 1S(16C550) RS-232
+
+ vendor.id pci 0x10b5
+&device.id pci 0x9050
+&subvendor.id pci 0xd84d
+&subdevice.id pci 0x4027
++subdevice.name EX-4027 1S(16C650) RS-232
+
+ vendor.id pci 0x10b5
+&device.id pci 0x9050
+&subvendor.id pci 0xd84d
+&subdevice.id pci 0x4028
++subdevice.name EX-4028 1S(16C850) RS-232
+
+ vendor.id pci 0x10b5
+&device.id pci 0x9050
+&subvendor.id pci 0xd84d
+&subdevice.id pci 0x4036
++subdevice.name EX-4036 2S(16C650) RS-232
+
+ vendor.id pci 0x10b5
+&device.id pci 0x9050
+&subvendor.id pci 0xd84d
+&subdevice.id pci 0x4037
++subdevice.name EX-4037 2S(16C650) RS-232
+
+ vendor.id pci 0x10b5
+&device.id pci 0x9050
+&subvendor.id pci 0xd84d
+&subdevice.id pci 0x4038
++subdevice.name EX-4038 2S(16C850) RS-232
+
+ vendor.id pci 0x10b5
+&device.id pci 0x9050
+&subvendor.id pci 0xd84d
+&subdevice.id pci 0x4052
++subdevice.name EX-4052 1S(16C550) RS-422/485
+
+ vendor.id pci 0x10b5
+&device.id pci 0x9050
+&subvendor.id pci 0xd84d
+&subdevice.id pci 0x4053
++subdevice.name EX-4053 2S(16C550) RS-422/485
+
+ vendor.id pci 0x10b5
+&device.id pci 0x9050
+&subvendor.id pci 0xd84d
+&subdevice.id pci 0x4055
++subdevice.name EX-4055 4S(16C550) RS-232
+
+ vendor.id pci 0x10b5
+&device.id pci 0x9050
+&subvendor.id pci 0xd84d
+&subdevice.id pci 0x4058
++subdevice.name EX-4055 4S(16C650) RS-232
+
+ vendor.id pci 0x10b5
+&device.id pci 0x9050
+&subvendor.id pci 0xd84d
+&subdevice.id pci 0x4065
++subdevice.name EX-4065 8S(16C550) RS-232
+
+ vendor.id pci 0x10b5
+&device.id pci 0x9050
+&subvendor.id pci 0xd84d
+&subdevice.id pci 0x4068
++subdevice.name EX-4068 8S(16C650) RS-232
+
+ vendor.id pci 0x10b5
+&device.id pci 0x9050
+&subvendor.id pci 0xd84d
+&subdevice.id pci 0x4078
++subdevice.name EX-4078 2S(16C552) RS-232+1P
+
+ vendor.id pci 0x10b5
+&device.id pci 0x9054
++device.name PCI <-> IOBus Bridge
+
+ vendor.id pci 0x10b5
+&device.id pci 0x9054
+&subvendor.id pci 0x10b5
+&subdevice.id pci 0x2455
++subdevice.name Wessex Techology PHIL-PCI
+
+ vendor.id pci 0x10b5
+&device.id pci 0x9054
+&subvendor.id pci 0x10b5
+&subdevice.id pci 0x2696
++subdevice.name Innes Corp AM Radcap card
+
+ vendor.id pci 0x10b5
+&device.id pci 0x9054
+&subvendor.id pci 0x10b5
+&subdevice.id pci 0x2717
++subdevice.name Innes Corp Auricon card
+
+ vendor.id pci 0x10b5
+&device.id pci 0x9054
+&subvendor.id pci 0x10b5
+&subdevice.id pci 0x2844
++subdevice.name Innes Corp TVS Encoder card
+
+ vendor.id pci 0x10b5
+&device.id pci 0x9054
+&subvendor.id pci 0x12d9
+&subdevice.id pci 0x0002
++subdevice.name PCI Prosody Card rev 1.5
+
+ vendor.id pci 0x10b5
+&device.id pci 0x9054
+&subvendor.id pci 0x16df
+&subdevice.id pci 0x0011
++subdevice.name PIKA PrimeNet MM PCI
+
+ vendor.id pci 0x10b5
+&device.id pci 0x9054
+&subvendor.id pci 0x16df
+&subdevice.id pci 0x0012
++subdevice.name PIKA PrimeNet MM cPCI 8
+
+ vendor.id pci 0x10b5
+&device.id pci 0x9054
+&subvendor.id pci 0x16df
+&subdevice.id pci 0x0013
++subdevice.name PIKA PrimeNet MM cPCI 8 (without CAS Signaling Option)
+
+ vendor.id pci 0x10b5
+&device.id pci 0x9054
+&subvendor.id pci 0x16df
+&subdevice.id pci 0x0014
++subdevice.name PIKA PrimeNet MM cPCI 4
+
+ vendor.id pci 0x10b5
+&device.id pci 0x9054
+&subvendor.id pci 0x16df
+&subdevice.id pci 0x0015
++subdevice.name PIKA Daytona MM
+
+ vendor.id pci 0x10b5
+&device.id pci 0x9054
+&subvendor.id pci 0x16df
+&subdevice.id pci 0x0016
++subdevice.name PIKA InLine MM
+
+ vendor.id pci 0x10b5
+&device.id pci 0x9056
++device.name Francois
+
+ vendor.id pci 0x10b5
+&device.id pci 0x9056
+&subvendor.id pci 0x10b5
+&subdevice.id pci 0x2979
++subdevice.name CellinkBlade 11 - CPCI board VoATM AAL1
+
+ vendor.id pci 0x10b5
+&device.id pci 0x9060
++device.name 9060
+
+ vendor.id pci 0x10b5
+&device.id pci 0x906d
++device.name 9060SD
+
+ vendor.id pci 0x10b5
+&device.id pci 0x906d
+&subvendor.id pci 0x125c
+&subdevice.id pci 0x0640
++subdevice.name Aries 16000P
+
+ vendor.id pci 0x10b5
+&device.id pci 0x906e
++device.name 9060ES
+
+ vendor.id pci 0x10b5
+&device.id pci 0x9080
++device.name 9080
+
+ vendor.id pci 0x10b5
+&device.id pci 0x9080
+&subvendor.id pci 0x103c
+&subdevice.id pci 0x10eb
++subdevice.name (Agilent) E2777B 83K Series PCI based Optical Communication Interface
+
+ vendor.id pci 0x10b5
+&device.id pci 0x9080
+&subvendor.id pci 0x103c
+&subdevice.id pci 0x10ec
++subdevice.name (Agilent) E6978-66442 PCI CIC
+
+ vendor.id pci 0x10b5
+&device.id pci 0x9080
+&subvendor.id pci 0x10b5
+&subdevice.id pci 0x9080
++subdevice.name 9080 [real subsystem ID not set]
+
+ vendor.id pci 0x10b5
+&device.id pci 0x9080
+&subvendor.id pci 0x129d
+&subdevice.id pci 0x0002
++subdevice.name Aculab PCI Prosidy card
+
+ vendor.id pci 0x10b5
+&device.id pci 0x9080
+&subvendor.id pci 0x12d9
+&subdevice.id pci 0x0002
++subdevice.name PCI Prosody Card
+
+ vendor.id pci 0x10b5
+&device.id pci 0x9080
+&subvendor.id pci 0x12df
+&subdevice.id pci 0x4422
++subdevice.name 4422PCI ["Do-All" Telemetry Data Aquisition System]
+
+ vendor.id pci 0x10b5
+&device.id pci 0xbb04
++device.name B&B 3PCIOSD1A Isolated PCI Serial
+
+ vendor.id pci 0x10b6
++vendor.name Madge Networks
+
+ vendor.id pci 0x10b6
+&device.id pci 0x0001
++device.name Smart 16/4 PCI Ringnode
+
+ vendor.id pci 0x10b6
+&device.id pci 0x0002
++device.name Smart 16/4 PCI Ringnode Mk2
+
+ vendor.id pci 0x10b6
+&device.id pci 0x0002
+&subvendor.id pci 0x10b6
+&subdevice.id pci 0x0002
++subdevice.name Smart 16/4 PCI Ringnode Mk2
+
+ vendor.id pci 0x10b6
+&device.id pci 0x0002
+&subvendor.id pci 0x10b6
+&subdevice.id pci 0x0006
++subdevice.name 16/4 CardBus Adapter
+
+ vendor.id pci 0x10b6
+&device.id pci 0x0003
++device.name Smart 16/4 PCI Ringnode Mk3
+
+ vendor.id pci 0x10b6
+&device.id pci 0x0003
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0xb0fd
++subdevice.name Compaq NC4621 PCI, 4/16, WOL
+
+ vendor.id pci 0x10b6
+&device.id pci 0x0003
+&subvendor.id pci 0x10b6
+&subdevice.id pci 0x0003
++subdevice.name Smart 16/4 PCI Ringnode Mk3
+
+ vendor.id pci 0x10b6
+&device.id pci 0x0003
+&subvendor.id pci 0x10b6
+&subdevice.id pci 0x0007
++subdevice.name Presto PCI Plus Adapter
+
+ vendor.id pci 0x10b6
+&device.id pci 0x0004
++device.name Smart 16/4 PCI Ringnode Mk1
+
+ vendor.id pci 0x10b6
+&device.id pci 0x0006
++device.name 16/4 Cardbus Adapter
+
+ vendor.id pci 0x10b6
+&device.id pci 0x0006
+&subvendor.id pci 0x10b6
+&subdevice.id pci 0x0006
++subdevice.name 16/4 CardBus Adapter
+
+ vendor.id pci 0x10b6
+&device.id pci 0x0007
++device.name Presto PCI Adapter
+
+ vendor.id pci 0x10b6
+&device.id pci 0x0007
+&subvendor.id pci 0x10b6
+&subdevice.id pci 0x0007
++subdevice.name Presto PCI
+
+ vendor.id pci 0x10b6
+&device.id pci 0x0009
++device.name Smart 100/16/4 PCI-HS Ringnode
+
+ vendor.id pci 0x10b6
+&device.id pci 0x0009
+&subvendor.id pci 0x10b6
+&subdevice.id pci 0x0009
++subdevice.name Smart 100/16/4 PCI-HS Ringnode
+
+ vendor.id pci 0x10b6
+&device.id pci 0x000a
++device.name Smart 100/16/4 PCI Ringnode
+
+ vendor.id pci 0x10b6
+&device.id pci 0x000a
+&subvendor.id pci 0x10b6
+&subdevice.id pci 0x000a
++subdevice.name Smart 100/16/4 PCI Ringnode
+
+ vendor.id pci 0x10b6
+&device.id pci 0x000b
++device.name 16/4 CardBus Adapter Mk2
+
+ vendor.id pci 0x10b6
+&device.id pci 0x000b
+&subvendor.id pci 0x10b6
+&subdevice.id pci 0x0008
++subdevice.name 16/4 CardBus Adapter Mk2
+
+ vendor.id pci 0x10b6
+&device.id pci 0x000b
+&subvendor.id pci 0x10b6
+&subdevice.id pci 0x000b
++subdevice.name 16/4 Cardbus Adapter Mk2
+
+ vendor.id pci 0x10b6
+&device.id pci 0x000c
++device.name RapidFire 3140V2 16/4 TR Adapter
+
+ vendor.id pci 0x10b6
+&device.id pci 0x000c
+&subvendor.id pci 0x10b6
+&subdevice.id pci 0x000c
++subdevice.name RapidFire 3140V2 16/4 TR Adapter
+
+ vendor.id pci 0x10b6
+&device.id pci 0x1000
++device.name Collage 25/155 ATM Client Adapter
+
+ vendor.id pci 0x10b6
+&device.id pci 0x1001
++device.name Collage 155 ATM Server Adapter
+
+ vendor.id pci 0x10b7
++vendor.name 3Com Corporation
+
+ vendor.id pci 0x10b7
+&device.id pci 0x0001
++device.name 3c985 1000BaseSX (SX/TX)
+
+ vendor.id pci 0x10b7
+&device.id pci 0x0013
++device.name AR5212 802.11abg NIC (3CRDAG675)
+
+ vendor.id pci 0x10b7
+&device.id pci 0x0013
+&subvendor.id pci 0x10b7
+&subdevice.id pci 0x2031
++subdevice.name 3CRDAG675 11a/b/g Wireless PCI Adapter
+
+ vendor.id pci 0x10b7
+&device.id pci 0x0910
++device.name 3C910-A01
+
+ vendor.id pci 0x10b7
+&device.id pci 0x1006
++device.name MINI PCI type 3B Data Fax Modem
+
+ vendor.id pci 0x10b7
+&device.id pci 0x1007
++device.name Mini PCI 56k Winmodem
+
+ vendor.id pci 0x10b7
+&device.id pci 0x1007
+&subvendor.id pci 0x10b7
+&subdevice.id pci 0x615c
++subdevice.name Mini PCI 56K Modem
+
+ vendor.id pci 0x10b7
+&device.id pci 0x1201
++device.name 3c982-TXM 10/100baseTX Dual Port A [Hydra]
+
+ vendor.id pci 0x10b7
+&device.id pci 0x1202
++device.name 3c982-TXM 10/100baseTX Dual Port B [Hydra]
+
+ vendor.id pci 0x10b7
+&device.id pci 0x1700
++device.name 3c940 10/100/1000Base-T [Marvell]
+
+ vendor.id pci 0x10b7
+&device.id pci 0x1700
+&subvendor.id pci 0x1043
+&subdevice.id pci 0x80eb
++subdevice.name P4P800 Mainboard
+
+ vendor.id pci 0x10b7
+&device.id pci 0x1700
+&subvendor.id pci 0x10b7
+&subdevice.id pci 0x0010
++subdevice.name 3C940 Gigabit LOM Ethernet Adapter
+
+ vendor.id pci 0x10b7
+&device.id pci 0x1700
+&subvendor.id pci 0x10b7
+&subdevice.id pci 0x0020
++subdevice.name 3C941 Gigabit LOM Ethernet Adapter
+
+ vendor.id pci 0x10b7
+&device.id pci 0x1700
+&subvendor.id pci 0x147b
+&subdevice.id pci 0x1407
++subdevice.name KV8-MAX3 motherboard
+
+ vendor.id pci 0x10b7
+&device.id pci 0x3390
++device.name 3c339 TokenLink Velocity
+
+ vendor.id pci 0x10b7
+&device.id pci 0x3590
++device.name 3c359 TokenLink Velocity XL
+
+ vendor.id pci 0x10b7
+&device.id pci 0x3590
+&subvendor.id pci 0x10b7
+&subdevice.id pci 0x3590
++subdevice.name TokenLink Velocity XL Adapter (3C359/359B)
+
+ vendor.id pci 0x10b7
+&device.id pci 0x4500
++device.name 3c450 HomePNA [Tornado]
+
+ vendor.id pci 0x10b7
+&device.id pci 0x5055
++device.name 3c555 Laptop Hurricane
+
+ vendor.id pci 0x10b7
+&device.id pci 0x5057
++device.name 3c575 Megahertz 10/100 LAN CardBus [Boomerang]
+
+ vendor.id pci 0x10b7
+&device.id pci 0x5057
+&subvendor.id pci 0x10b7
+&subdevice.id pci 0x5a57
++subdevice.name 3C575 Megahertz 10/100 LAN Cardbus PC Card
+
+ vendor.id pci 0x10b7
+&device.id pci 0x5157
++device.name 3cCFE575BT Megahertz 10/100 LAN CardBus [Cyclone]
+
+ vendor.id pci 0x10b7
+&device.id pci 0x5157
+&subvendor.id pci 0x10b7
+&subdevice.id pci 0x5b57
++subdevice.name 3C575 Megahertz 10/100 LAN Cardbus PC Card
+
+ vendor.id pci 0x10b7
+&device.id pci 0x5257
++device.name 3cCFE575CT CardBus [Cyclone]
+
+ vendor.id pci 0x10b7
+&device.id pci 0x5257
+&subvendor.id pci 0x10b7
+&subdevice.id pci 0x5c57
++subdevice.name FE575C-3Com 10/100 LAN CardBus-Fast Ethernet
+
+ vendor.id pci 0x10b7
+&device.id pci 0x5900
++device.name 3c590 10BaseT [Vortex]
+
+ vendor.id pci 0x10b7
+&device.id pci 0x5920
++device.name 3c592 EISA 10mbps Demon/Vortex
+
+ vendor.id pci 0x10b7
+&device.id pci 0x5950
++device.name 3c595 100BaseTX [Vortex]
+
+ vendor.id pci 0x10b7
+&device.id pci 0x5951
++device.name 3c595 100BaseT4 [Vortex]
+
+ vendor.id pci 0x10b7
+&device.id pci 0x5952
++device.name 3c595 100Base-MII [Vortex]
+
+ vendor.id pci 0x10b7
+&device.id pci 0x5970
++device.name 3c597 EISA Fast Demon/Vortex
+
+ vendor.id pci 0x10b7
+&device.id pci 0x5b57
++device.name 3c595 Megahertz 10/100 LAN CardBus [Boomerang]
+
+ vendor.id pci 0x10b7
+&device.id pci 0x5b57
+&subvendor.id pci 0x10b7
+&subdevice.id pci 0x5b57
++subdevice.name 3C575 Megahertz 10/100 LAN Cardbus PC Card
+
+ vendor.id pci 0x10b7
+&device.id pci 0x6000
++device.name 3CRSHPW796 [OfficeConnect Wireless CardBus]
+
+ vendor.id pci 0x10b7
+&device.id pci 0x6001
++device.name 3com 3CRWE154G72 [Office Connect Wireless LAN Adapter]
+
+ vendor.id pci 0x10b7
+&device.id pci 0x6055
++device.name 3c556 Hurricane CardBus [Cyclone]
+
+ vendor.id pci 0x10b7
+&device.id pci 0x6056
++device.name 3c556B CardBus [Tornado]
+
+ vendor.id pci 0x10b7
+&device.id pci 0x6056
+&subvendor.id pci 0x10b7
+&subdevice.id pci 0x6556
++subdevice.name 10/100 Mini PCI Ethernet Adapter
+
+ vendor.id pci 0x10b7
+&device.id pci 0x6560
++device.name 3cCFE656 CardBus [Cyclone]
+
+ vendor.id pci 0x10b7
+&device.id pci 0x6560
+&subvendor.id pci 0x10b7
+&subdevice.id pci 0x656a
++subdevice.name 3CCFEM656 10/100 LAN+56K Modem CardBus
+
+ vendor.id pci 0x10b7
+&device.id pci 0x6561
++device.name 3cCFEM656 10/100 LAN+56K Modem CardBus
+
+ vendor.id pci 0x10b7
+&device.id pci 0x6561
+&subvendor.id pci 0x10b7
+&subdevice.id pci 0x656b
++subdevice.name 3CCFEM656 10/100 LAN+56K Modem CardBus
+
+ vendor.id pci 0x10b7
+&device.id pci 0x6562
++device.name 3cCFEM656B 10/100 LAN+Winmodem CardBus [Cyclone]
+
+ vendor.id pci 0x10b7
+&device.id pci 0x6562
+&subvendor.id pci 0x10b7
+&subdevice.id pci 0x656b
++subdevice.name 3CCFEM656B 10/100 LAN+56K Modem CardBus
+
+ vendor.id pci 0x10b7
+&device.id pci 0x6563
++device.name 3cCFEM656B 10/100 LAN+56K Modem CardBus
+
+ vendor.id pci 0x10b7
+&device.id pci 0x6563
+&subvendor.id pci 0x10b7
+&subdevice.id pci 0x656b
++subdevice.name 3CCFEM656 10/100 LAN+56K Modem CardBus
+
+ vendor.id pci 0x10b7
+&device.id pci 0x6564
++device.name 3cXFEM656C 10/100 LAN+Winmodem CardBus [Tornado]
+
+ vendor.id pci 0x10b7
+&device.id pci 0x7646
++device.name 3cSOHO100-TX Hurricane
+
+ vendor.id pci 0x10b7
+&device.id pci 0x7770
++device.name 3CRWE777 PCI(PLX) Wireless Adaptor [Airconnect]
+
+ vendor.id pci 0x10b7
+&device.id pci 0x7940
++device.name 3c803 FDDILink UTP Controller
+
+ vendor.id pci 0x10b7
+&device.id pci 0x7980
++device.name 3c804 FDDILink SAS Controller
+
+ vendor.id pci 0x10b7
+&device.id pci 0x7990
++device.name 3c805 FDDILink DAS Controller
+
+ vendor.id pci 0x10b7
+&device.id pci 0x80eb
++device.name 3c940B 10/100/1000Base-T
+
+ vendor.id pci 0x10b7
+&device.id pci 0x8811
++device.name Token ring
+
+ vendor.id pci 0x10b7
+&device.id pci 0x9000
++device.name 3c900 10BaseT [Boomerang]
+
+ vendor.id pci 0x10b7
+&device.id pci 0x9001
++device.name 3c900 10Mbps Combo [Boomerang]
+
+ vendor.id pci 0x10b7
+&device.id pci 0x9004
++device.name 3c900B-TPO Etherlink XL [Cyclone]
+
+ vendor.id pci 0x10b7
+&device.id pci 0x9004
+&subvendor.id pci 0x10b7
+&subdevice.id pci 0x9004
++subdevice.name 3C900B-TPO Etherlink XL TPO 10Mb
+
+ vendor.id pci 0x10b7
+&device.id pci 0x9005
++device.name 3c900B-Combo Etherlink XL [Cyclone]
+
+ vendor.id pci 0x10b7
+&device.id pci 0x9005
+&subvendor.id pci 0x10b7
+&subdevice.id pci 0x9005
++subdevice.name 3C900B-Combo Etherlink XL Combo
+
+ vendor.id pci 0x10b7
+&device.id pci 0x9006
++device.name 3c900B-TPC Etherlink XL [Cyclone]
+
+ vendor.id pci 0x10b7
+&device.id pci 0x900a
++device.name 3c900B-FL 10base-FL [Cyclone]
+
+ vendor.id pci 0x10b7
+&device.id pci 0x9050
++device.name 3c905 100BaseTX [Boomerang]
+
+ vendor.id pci 0x10b7
+&device.id pci 0x9051
++device.name 3c905 100BaseT4 [Boomerang]
+
+ vendor.id pci 0x10b7
+&device.id pci 0x9055
++device.name 3c905B 100BaseTX [Cyclone]
+
+ vendor.id pci 0x10b7
+&device.id pci 0x9055
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x0080
++subdevice.name 3C905B Fast Etherlink XL 10/100
+
+ vendor.id pci 0x10b7
+&device.id pci 0x9055
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x0081
++subdevice.name 3C905B Fast Etherlink XL 10/100
+
+ vendor.id pci 0x10b7
+&device.id pci 0x9055
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x0082
++subdevice.name 3C905B Fast Etherlink XL 10/100
+
+ vendor.id pci 0x10b7
+&device.id pci 0x9055
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x0083
++subdevice.name 3C905B Fast Etherlink XL 10/100
+
+ vendor.id pci 0x10b7
+&device.id pci 0x9055
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x0084
++subdevice.name 3C905B Fast Etherlink XL 10/100
+
+ vendor.id pci 0x10b7
+&device.id pci 0x9055
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x0085
++subdevice.name 3C905B Fast Etherlink XL 10/100
+
+ vendor.id pci 0x10b7
+&device.id pci 0x9055
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x0086
++subdevice.name 3C905B Fast Etherlink XL 10/100
+
+ vendor.id pci 0x10b7
+&device.id pci 0x9055
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x0087
++subdevice.name 3C905B Fast Etherlink XL 10/100
+
+ vendor.id pci 0x10b7
+&device.id pci 0x9055
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x0088
++subdevice.name 3C905B Fast Etherlink XL 10/100
+
+ vendor.id pci 0x10b7
+&device.id pci 0x9055
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x0089
++subdevice.name 3C905B Fast Etherlink XL 10/100
+
+ vendor.id pci 0x10b7
+&device.id pci 0x9055
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x0090
++subdevice.name 3C905B Fast Etherlink XL 10/100
+
+ vendor.id pci 0x10b7
+&device.id pci 0x9055
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x0091
++subdevice.name 3C905B Fast Etherlink XL 10/100
+
+ vendor.id pci 0x10b7
+&device.id pci 0x9055
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x0092
++subdevice.name 3C905B Fast Etherlink XL 10/100
+
+ vendor.id pci 0x10b7
+&device.id pci 0x9055
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x0093
++subdevice.name 3C905B Fast Etherlink XL 10/100
+
+ vendor.id pci 0x10b7
+&device.id pci 0x9055
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x0094
++subdevice.name 3C905B Fast Etherlink XL 10/100
+
+ vendor.id pci 0x10b7
+&device.id pci 0x9055
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x0095
++subdevice.name 3C905B Fast Etherlink XL 10/100
+
+ vendor.id pci 0x10b7
+&device.id pci 0x9055
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x0096
++subdevice.name 3C905B Fast Etherlink XL 10/100
+
+ vendor.id pci 0x10b7
+&device.id pci 0x9055
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x0097
++subdevice.name 3C905B Fast Etherlink XL 10/100
+
+ vendor.id pci 0x10b7
+&device.id pci 0x9055
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x0098
++subdevice.name 3C905B Fast Etherlink XL 10/100
+
+ vendor.id pci 0x10b7
+&device.id pci 0x9055
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x0099
++subdevice.name 3C905B Fast Etherlink XL 10/100
+
+ vendor.id pci 0x10b7
+&device.id pci 0x9055
+&subvendor.id pci 0x10b7
+&subdevice.id pci 0x9055
++subdevice.name 3C905B Fast Etherlink XL 10/100
+
+ vendor.id pci 0x10b7
+&device.id pci 0x9056
++device.name 3c905B-T4 Fast EtherLink XL [Cyclone]
+
+ vendor.id pci 0x10b7
+&device.id pci 0x9058
++device.name 3c905B Deluxe Etherlink 10/100/BNC [Cyclone]
+
+ vendor.id pci 0x10b7
+&device.id pci 0x905a
++device.name 3c905B-FX Fast Etherlink XL FX 100baseFx [Cyclone]
+
+ vendor.id pci 0x10b7
+&device.id pci 0x9200
++device.name 3c905C-TX/TX-M [Tornado]
+
+ vendor.id pci 0x10b7
+&device.id pci 0x9200
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x0095
++subdevice.name 3C920 Integrated Fast Ethernet Controller
+
+ vendor.id pci 0x10b7
+&device.id pci 0x9200
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x0097
++subdevice.name 3C920 Integrated Fast Ethernet Controller
+
+ vendor.id pci 0x10b7
+&device.id pci 0x9200
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x00fe
++subdevice.name Optiplex GX240
+
+ vendor.id pci 0x10b7
+&device.id pci 0x9200
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x012a
++subdevice.name 3C920 Integrated Fast Ethernet Controller [Latitude C640]
+
+ vendor.id pci 0x10b7
+&device.id pci 0x9200
+&subvendor.id pci 0x10b7
+&subdevice.id pci 0x1000
++subdevice.name 3C905C-TX Fast Etherlink for PC Management NIC
+
+ vendor.id pci 0x10b7
+&device.id pci 0x9200
+&subvendor.id pci 0x10b7
+&subdevice.id pci 0x7000
++subdevice.name 10/100 Mini PCI Ethernet Adapter
+
+ vendor.id pci 0x10b7
+&device.id pci 0x9200
+&subvendor.id pci 0x10f1
+&subdevice.id pci 0x2466
++subdevice.name Tiger MPX S2466 (3C920 Integrated Fast Ethernet Controller)
+
+ vendor.id pci 0x10b7
+&device.id pci 0x9201
++device.name 3C920B-EMB Integrated Fast Ethernet Controller [Tornado]
+
+ vendor.id pci 0x10b7
+&device.id pci 0x9201
+&subvendor.id pci 0x1043
+&subdevice.id pci 0x80ab
++subdevice.name A7N8X Deluxe onboard 3C920B-EMB Integrated Fast Ethernet Controller
+
+ vendor.id pci 0x10b7
+&device.id pci 0x9202
++device.name 3Com 3C920B-EMB-WNM Integrated Fast Ethernet Controller
+
+ vendor.id pci 0x10b7
+&device.id pci 0x9210
++device.name 3C920B-EMB-WNM Integrated Fast Ethernet Controller
+
+ vendor.id pci 0x10b7
+&device.id pci 0x9300
++device.name 3CSOHO100B-TX 910-A01 [tulip]
+
+ vendor.id pci 0x10b7
+&device.id pci 0x9800
++device.name 3c980-TX Fast Etherlink XL Server Adapter [Cyclone]
+
+ vendor.id pci 0x10b7
+&device.id pci 0x9800
+&subvendor.id pci 0x10b7
+&subdevice.id pci 0x9800
++subdevice.name 3c980-TX Fast Etherlink XL Server Adapter
+
+ vendor.id pci 0x10b7
+&device.id pci 0x9805
++device.name 3c980-C 10/100baseTX NIC [Python-T]
+
+ vendor.id pci 0x10b7
+&device.id pci 0x9805
+&subvendor.id pci 0x10b7
+&subdevice.id pci 0x1201
++subdevice.name EtherLink Server 10/100 Dual Port A
+
+ vendor.id pci 0x10b7
+&device.id pci 0x9805
+&subvendor.id pci 0x10b7
+&subdevice.id pci 0x1202
++subdevice.name EtherLink Server 10/100 Dual Port B
+
+ vendor.id pci 0x10b7
+&device.id pci 0x9805
+&subvendor.id pci 0x10b7
+&subdevice.id pci 0x9805
++subdevice.name 3c980 10/100baseTX NIC [Python-T]
+
+ vendor.id pci 0x10b7
+&device.id pci 0x9805
+&subvendor.id pci 0x10f1
+&subdevice.id pci 0x2462
++subdevice.name Thunder K7 S2462
+
+ vendor.id pci 0x10b7
+&device.id pci 0x9900
++device.name 3C990-TX [Typhoon]
+
+ vendor.id pci 0x10b7
+&device.id pci 0x9902
++device.name 3CR990-TX-95 [Typhoon 56-bit]
+
+ vendor.id pci 0x10b7
+&device.id pci 0x9903
++device.name 3CR990-TX-97 [Typhoon 168-bit]
+
+ vendor.id pci 0x10b7
+&device.id pci 0x9904
++device.name 3C990B-TX-M/3C990BSVR [Typhoon2]
+
+ vendor.id pci 0x10b7
+&device.id pci 0x9904
+&subvendor.id pci 0x10b7
+&subdevice.id pci 0x1000
++subdevice.name 3CR990B-TX-M [Typhoon2]
+
+ vendor.id pci 0x10b7
+&device.id pci 0x9904
+&subvendor.id pci 0x10b7
+&subdevice.id pci 0x2000
++subdevice.name 3CR990BSVR [Typhoon2 Server]
+
+ vendor.id pci 0x10b7
+&device.id pci 0x9905
++device.name 3CR990-FX-95/97/95 [Typhon Fiber]
+
+ vendor.id pci 0x10b7
+&device.id pci 0x9905
+&subvendor.id pci 0x10b7
+&subdevice.id pci 0x1101
++subdevice.name 3CR990-FX-95 [Typhoon Fiber 56-bit]
+
+ vendor.id pci 0x10b7
+&device.id pci 0x9905
+&subvendor.id pci 0x10b7
+&subdevice.id pci 0x1102
++subdevice.name 3CR990-FX-97 [Typhoon Fiber 168-bit]
+
+ vendor.id pci 0x10b7
+&device.id pci 0x9905
+&subvendor.id pci 0x10b7
+&subdevice.id pci 0x2101
++subdevice.name 3CR990-FX-95 Server [Typhoon Fiber 56-bit]
+
+ vendor.id pci 0x10b7
+&device.id pci 0x9905
+&subvendor.id pci 0x10b7
+&subdevice.id pci 0x2102
++subdevice.name 3CR990-FX-97 Server [Typhoon Fiber 168-bit]
+
+ vendor.id pci 0x10b7
+&device.id pci 0x9908
++device.name 3CR990SVR95 [Typhoon Server 56-bit]
+
+ vendor.id pci 0x10b7
+&device.id pci 0x9909
++device.name 3CR990SVR97 [Typhoon Server 168-bit]
+
+ vendor.id pci 0x10b7
+&device.id pci 0x990a
++device.name 3C990SVR [Typhoon Server]
+
+ vendor.id pci 0x10b7
+&device.id pci 0x990b
++device.name 3C990SVR [Typhoon Server]
+
+ vendor.id pci 0x10b8
++vendor.name Standard Microsystems Corp [SMC]
+
+ vendor.id pci 0x10b8
+&device.id pci 0x0005
++device.name 83c170 EPIC/100 Fast Ethernet Adapter
+
+ vendor.id pci 0x10b8
+&device.id pci 0x0005
+&subvendor.id pci 0x1055
+&subdevice.id pci 0xe000
++subdevice.name LANEPIC 10/100 [EVB171Q-PCI]
+
+ vendor.id pci 0x10b8
+&device.id pci 0x0005
+&subvendor.id pci 0x1055
+&subdevice.id pci 0xe002
++subdevice.name LANEPIC 10/100 [EVB171G-PCI]
+
+ vendor.id pci 0x10b8
+&device.id pci 0x0005
+&subvendor.id pci 0x10b8
+&subdevice.id pci 0xa011
++subdevice.name EtherPower II 10/100
+
+ vendor.id pci 0x10b8
+&device.id pci 0x0005
+&subvendor.id pci 0x10b8
+&subdevice.id pci 0xa014
++subdevice.name EtherPower II 10/100
+
+ vendor.id pci 0x10b8
+&device.id pci 0x0005
+&subvendor.id pci 0x10b8
+&subdevice.id pci 0xa015
++subdevice.name EtherPower II 10/100
+
+ vendor.id pci 0x10b8
+&device.id pci 0x0005
+&subvendor.id pci 0x10b8
+&subdevice.id pci 0xa016
++subdevice.name EtherPower II 10/100
+
+ vendor.id pci 0x10b8
+&device.id pci 0x0005
+&subvendor.id pci 0x10b8
+&subdevice.id pci 0xa017
++subdevice.name EtherPower II 10/100
+
+ vendor.id pci 0x10b8
+&device.id pci 0x0006
++device.name 83c175 EPIC/100 Fast Ethernet Adapter
+
+ vendor.id pci 0x10b8
+&device.id pci 0x0006
+&subvendor.id pci 0x1055
+&subdevice.id pci 0xe100
++subdevice.name LANEPIC Cardbus Fast Ethernet Adapter
+
+ vendor.id pci 0x10b8
+&device.id pci 0x0006
+&subvendor.id pci 0x1055
+&subdevice.id pci 0xe102
++subdevice.name LANEPIC Cardbus Fast Ethernet Adapter
+
+ vendor.id pci 0x10b8
+&device.id pci 0x0006
+&subvendor.id pci 0x1055
+&subdevice.id pci 0xe300
++subdevice.name LANEPIC Cardbus Fast Ethernet Adapter
+
+ vendor.id pci 0x10b8
+&device.id pci 0x0006
+&subvendor.id pci 0x1055
+&subdevice.id pci 0xe302
++subdevice.name LANEPIC Cardbus Fast Ethernet Adapter
+
+ vendor.id pci 0x10b8
+&device.id pci 0x0006
+&subvendor.id pci 0x10b8
+&subdevice.id pci 0xa012
++subdevice.name LANEPIC Cardbus Fast Ethernet Adapter
+
+ vendor.id pci 0x10b8
+&device.id pci 0x0006
+&subvendor.id pci 0x13a2
+&subdevice.id pci 0x8002
++subdevice.name LANEPIC Cardbus Fast Ethernet Adapter
+
+ vendor.id pci 0x10b8
+&device.id pci 0x0006
+&subvendor.id pci 0x13a2
+&subdevice.id pci 0x8006
++subdevice.name LANEPIC Cardbus Fast Ethernet Adapter
+
+ vendor.id pci 0x10b8
+&device.id pci 0x1000
++device.name FDC 37c665
+
+ vendor.id pci 0x10b8
+&device.id pci 0x1001
++device.name FDC 37C922
+
+ vendor.id pci 0x10b8
+&device.id pci 0x2802
++device.name SMC2802W [EZ Connect g]
+
+ vendor.id pci 0x10b8
+&device.id pci 0xa011
++device.name 83C170QF
+
+ vendor.id pci 0x10b8
+&device.id pci 0xb106
++device.name SMC34C90
+
+ vendor.id pci 0x10b9
++vendor.name ALi Corporation
+
+ vendor.id pci 0x10b9
+&device.id pci 0x0101
++device.name CMI8338/C3DX PCI Audio Device
+
+ vendor.id pci 0x10b9
+&device.id pci 0x0111
++device.name C-Media CMI8738/C3DX Audio Device (OEM)
+
+ vendor.id pci 0x10b9
+&device.id pci 0x0111
+&subvendor.id pci 0x10b9
+&subdevice.id pci 0x0111
++subdevice.name C-Media CMI8738/C3DX Audio Device (OEM)
+
+ vendor.id pci 0x10b9
+&device.id pci 0x0780
++device.name Multi-IO Card
+
+ vendor.id pci 0x10b9
+&device.id pci 0x0782
++device.name Multi-IO Card
+
+ vendor.id pci 0x10b9
+&device.id pci 0x1435
++device.name M1435
+
+ vendor.id pci 0x10b9
+&device.id pci 0x1445
++device.name M1445
+
+ vendor.id pci 0x10b9
+&device.id pci 0x1449
++device.name M1449
+
+ vendor.id pci 0x10b9
+&device.id pci 0x1451
++device.name M1451
+
+ vendor.id pci 0x10b9
+&device.id pci 0x1461
++device.name M1461
+
+ vendor.id pci 0x10b9
+&device.id pci 0x1489
++device.name M1489
+
+ vendor.id pci 0x10b9
+&device.id pci 0x1511
++device.name M1511 [Aladdin]
+
+ vendor.id pci 0x10b9
+&device.id pci 0x1512
++device.name M1512 [Aladdin]
+
+ vendor.id pci 0x10b9
+&device.id pci 0x1513
++device.name M1513 [Aladdin]
+
+ vendor.id pci 0x10b9
+&device.id pci 0x1521
++device.name M1521 [Aladdin III]
+
+ vendor.id pci 0x10b9
+&device.id pci 0x1521
+&subvendor.id pci 0x10b9
+&subdevice.id pci 0x1521
++subdevice.name ALI M1521 Aladdin III CPU Bridge
+
+ vendor.id pci 0x10b9
+&device.id pci 0x1523
++device.name M1523
+
+ vendor.id pci 0x10b9
+&device.id pci 0x1523
+&subvendor.id pci 0x10b9
+&subdevice.id pci 0x1523
++subdevice.name ALI M1523 ISA Bridge
+
+ vendor.id pci 0x10b9
+&device.id pci 0x1531
++device.name M1531 [Aladdin IV]
+
+ vendor.id pci 0x10b9
+&device.id pci 0x1533
++device.name M1533 PCI to ISA Bridge [Aladdin IV]
+
+ vendor.id pci 0x10b9
+&device.id pci 0x1533
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x053b
++subdevice.name ThinkPad R40e (2684-HVG) PCI to ISA Bridge
+
+ vendor.id pci 0x10b9
+&device.id pci 0x1533
+&subvendor.id pci 0x10b9
+&subdevice.id pci 0x1533
++subdevice.name ALI M1533 Aladdin IV ISA Bridge
+
+ vendor.id pci 0x10b9
+&device.id pci 0x1541
++device.name M1541
+
+ vendor.id pci 0x10b9
+&device.id pci 0x1541
+&subvendor.id pci 0x10b9
+&subdevice.id pci 0x1541
++subdevice.name ALI M1541 Aladdin V/V+ AGP System Controller
+
+ vendor.id pci 0x10b9
+&device.id pci 0x1543
++device.name M1543
+
+ vendor.id pci 0x10b9
+&device.id pci 0x1563
++device.name M1563 HyperTransport South Bridge
+
+ vendor.id pci 0x10b9
+&device.id pci 0x1621
++device.name M1621
+
+ vendor.id pci 0x10b9
+&device.id pci 0x1631
++device.name ALI M1631 PCI North Bridge Aladdin Pro III
+
+ vendor.id pci 0x10b9
+&device.id pci 0x1632
++device.name M1632M Northbridge+Trident
+
+ vendor.id pci 0x10b9
+&device.id pci 0x1641
++device.name ALI M1641 PCI North Bridge Aladdin Pro IV
+
+ vendor.id pci 0x10b9
+&device.id pci 0x1644
++device.name M1644/M1644T Northbridge+Trident
+
+ vendor.id pci 0x10b9
+&device.id pci 0x1646
++device.name M1646 Northbridge+Trident
+
+ vendor.id pci 0x10b9
+&device.id pci 0x1647
++device.name M1647 Northbridge [MAGiK 1 / MobileMAGiK 1]
+
+ vendor.id pci 0x10b9
+&device.id pci 0x1651
++device.name M1651/M1651T Northbridge [Aladdin-Pro 5/5M,Aladdin-Pro 5T/5TM]
+
+ vendor.id pci 0x10b9
+&device.id pci 0x1671
++device.name M1671 Super P4 Northbridge [AGP4X,PCI and SDR/DDR]
+
+ vendor.id pci 0x10b9
+&device.id pci 0x1672
++device.name M1672 Northbridge [CyberALADDiN-P4]
+
+ vendor.id pci 0x10b9
+&device.id pci 0x1681
++device.name M1681 P4 Northbridge [AGP8X,HyperTransport and SDR/DDR]
+
+ vendor.id pci 0x10b9
+&device.id pci 0x1687
++device.name M1687 K8 Northbridge [AGP8X and HyperTransport]
+
+ vendor.id pci 0x10b9
+&device.id pci 0x1689
++device.name M1689 K8 Northbridge [Super K8 Single Chip]
+
+ vendor.id pci 0x10b9
+&device.id pci 0x3141
++device.name M3141
+
+ vendor.id pci 0x10b9
+&device.id pci 0x3143
++device.name M3143
+
+ vendor.id pci 0x10b9
+&device.id pci 0x3145
++device.name M3145
+
+ vendor.id pci 0x10b9
+&device.id pci 0x3147
++device.name M3147
+
+ vendor.id pci 0x10b9
+&device.id pci 0x3149
++device.name M3149
+
+ vendor.id pci 0x10b9
+&device.id pci 0x3151
++device.name M3151
+
+ vendor.id pci 0x10b9
+&device.id pci 0x3307
++device.name M3307
+
+ vendor.id pci 0x10b9
+&device.id pci 0x3309
++device.name M3309
+
+ vendor.id pci 0x10b9
+&device.id pci 0x3323
++device.name M3325 Video/Audio Decoder
+
+ vendor.id pci 0x10b9
+&device.id pci 0x5212
++device.name M4803
+
+ vendor.id pci 0x10b9
+&device.id pci 0x5215
++device.name MS4803
+
+ vendor.id pci 0x10b9
+&device.id pci 0x5217
++device.name M5217H
+
+ vendor.id pci 0x10b9
+&device.id pci 0x5219
++device.name M5219
+
+ vendor.id pci 0x10b9
+&device.id pci 0x5225
++device.name M5225
+
+ vendor.id pci 0x10b9
+&device.id pci 0x5229
++device.name M5229 IDE
+
+ vendor.id pci 0x10b9
+&device.id pci 0x5229
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x050f
++subdevice.name ThinkPad R30
+
+ vendor.id pci 0x10b9
+&device.id pci 0x5229
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x053d
++subdevice.name ThinkPad R40e (2684-HVG) builtin IDE
+
+ vendor.id pci 0x10b9
+&device.id pci 0x5229
+&subvendor.id pci 0x103c
+&subdevice.id pci 0x0024
++subdevice.name Pavilion ze4400 builtin IDE
+
+ vendor.id pci 0x10b9
+&device.id pci 0x5229
+&subvendor.id pci 0x1043
+&subdevice.id pci 0x8053
++subdevice.name A7A266 Motherboard IDE
+
+ vendor.id pci 0x10b9
+&device.id pci 0x5235
++device.name M5225
+
+ vendor.id pci 0x10b9
+&device.id pci 0x5237
++device.name USB 1.1 Controller
+
+ vendor.id pci 0x10b9
+&device.id pci 0x5237
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x0540
++subdevice.name ThinkPad R40e (2684-HVG) builtin USB
+
+ vendor.id pci 0x10b9
+&device.id pci 0x5237
+&subvendor.id pci 0x103c
+&subdevice.id pci 0x0024
++subdevice.name Pavilion ze4400 builtin USB
+
+ vendor.id pci 0x10b9
+&device.id pci 0x5239
++device.name USB 2.0 Controller
+
+ vendor.id pci 0x10b9
+&device.id pci 0x5243
++device.name M1541 PCI to AGP Controller
+
+ vendor.id pci 0x10b9
+&device.id pci 0x5246
++device.name AGP8X Controller
+
+ vendor.id pci 0x10b9
+&device.id pci 0x5247
++device.name PCI to AGP Controller
+
+ vendor.id pci 0x10b9
+&device.id pci 0x5249
++device.name M5249 HTT to PCI Bridge
+
+ vendor.id pci 0x10b9
+&device.id pci 0x5251
++device.name M5251 P1394 OHCI 1.0 Controller
+
+ vendor.id pci 0x10b9
+&device.id pci 0x5253
++device.name M5253 P1394 OHCI 1.1 Controller
+
+ vendor.id pci 0x10b9
+&device.id pci 0x5261
++device.name M5261 Ethernet Controller
+
+ vendor.id pci 0x10b9
+&device.id pci 0x5263
++device.name M5263 Ethernet Controller
+
+ vendor.id pci 0x10b9
+&device.id pci 0x5281
++device.name ALi M5281 Serial ATA / RAID Host Controller
+
+ vendor.id pci 0x10b9
+&device.id pci 0x5450
++device.name Lucent Technologies Soft Modem AMR
+
+ vendor.id pci 0x10b9
+&device.id pci 0x5451
++device.name M5451 PCI AC-Link Controller Audio Device
+
+ vendor.id pci 0x10b9
+&device.id pci 0x5451
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x0506
++subdevice.name ThinkPad R30
+
+ vendor.id pci 0x10b9
+&device.id pci 0x5451
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x053e
++subdevice.name ThinkPad R40e (2684-HVG) builtin Audio
+
+ vendor.id pci 0x10b9
+&device.id pci 0x5451
+&subvendor.id pci 0x103c
+&subdevice.id pci 0x0024
++subdevice.name Pavilion ze4400 builtin Audio
+
+ vendor.id pci 0x10b9
+&device.id pci 0x5451
+&subvendor.id pci 0x10b9
+&subdevice.id pci 0x5451
++subdevice.name HP Compaq nc4010 (DY885AA#ABN)
+
+ vendor.id pci 0x10b9
+&device.id pci 0x5453
++device.name M5453 PCI AC-Link Controller Modem Device
+
+ vendor.id pci 0x10b9
+&device.id pci 0x5455
++device.name M5455 PCI AC-Link Controller Audio Device
+
+ vendor.id pci 0x10b9
+&device.id pci 0x5457
++device.name M5457 AC'97 Modem Controller
+
+ vendor.id pci 0x10b9
+&device.id pci 0x5457
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x0535
++subdevice.name ThinkPad R40e (2684-HVG) builtin modem
+
+ vendor.id pci 0x10b9
+&device.id pci 0x5457
+&subvendor.id pci 0x103c
+&subdevice.id pci 0x0024
++subdevice.name Pavilion ze4400 builtin Modem Device
+
+ vendor.id pci 0x10b9
+&device.id pci 0x5459
++device.name SmartLink SmartPCI561 56K Modem
+
+ vendor.id pci 0x10b9
+&device.id pci 0x545a
++device.name SmartLink SmartPCI563 56K Modem
+
+ vendor.id pci 0x10b9
+&device.id pci 0x5471
++device.name M5471 Memory Stick Controller
+
+ vendor.id pci 0x10b9
+&device.id pci 0x5473
++device.name M5473 SD-MMC Controller
+
+ vendor.id pci 0x10b9
+&device.id pci 0x7101
++device.name M7101 Power Management Controller [PMU]
+
+ vendor.id pci 0x10b9
+&device.id pci 0x7101
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x0510
++subdevice.name ThinkPad R30
+
+ vendor.id pci 0x10b9
+&device.id pci 0x7101
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x053c
++subdevice.name ThinkPad R40e (2684-HVG) Power Management Controller
+
+ vendor.id pci 0x10b9
+&device.id pci 0x7101
+&subvendor.id pci 0x103c
+&subdevice.id pci 0x0024
++subdevice.name Pavilion ze4400
+
+ vendor.id pci 0x10ba
++vendor.name Mitsubishi Electric Corp.
+
+ vendor.id pci 0x10ba
+&device.id pci 0x0301
++device.name AccelGraphics AccelECLIPSE
+
+ vendor.id pci 0x10ba
+&device.id pci 0x0304
++device.name AccelGALAXY A2100 [OEM Evans & Sutherland]
+
+ vendor.id pci 0x10ba
+&device.id pci 0x0308
++device.name Tornado 3000 [OEM Evans & Sutherland]
+
+ vendor.id pci 0x10ba
+&device.id pci 0x1002
++device.name VG500 [VolumePro Volume Rendering Accelerator]
+
+ vendor.id pci 0x10bb
++vendor.name Dapha Electronics Corporation
+
+ vendor.id pci 0x10bc
++vendor.name Advanced Logic Research
+
+ vendor.id pci 0x10bd
++vendor.name Surecom Technology
+
+ vendor.id pci 0x10bd
+&device.id pci 0x0e34
++device.name NE-34
+
+ vendor.id pci 0x10be
++vendor.name Tseng Labs International Co.
+
+ vendor.id pci 0x10bf
++vendor.name Most Inc
+
+ vendor.id pci 0x10c0
++vendor.name Boca Research Inc.
+
+ vendor.id pci 0x10c1
++vendor.name ICM Co., Ltd.
+
+ vendor.id pci 0x10c2
++vendor.name Auspex Systems Inc.
+
+ vendor.id pci 0x10c3
++vendor.name Samsung Semiconductors, Inc.
+
+ vendor.id pci 0x10c3
+&device.id pci 0x1100
++device.name Smartether100 SC1100 LAN Adapter (i82557B)
+
+ vendor.id pci 0x10c4
++vendor.name Award Software International Inc.
+
+ vendor.id pci 0x10c5
++vendor.name Xerox Corporation
+
+ vendor.id pci 0x10c6
++vendor.name Rambus Inc.
+
+ vendor.id pci 0x10c7
++vendor.name Media Vision
+
+ vendor.id pci 0x10c8
++vendor.name Neomagic Corporation
+
+ vendor.id pci 0x10c8
+&device.id pci 0x0001
++device.name NM2070 [MagicGraph 128]
+
+ vendor.id pci 0x10c8
+&device.id pci 0x0002
++device.name NM2090 [MagicGraph 128V]
+
+ vendor.id pci 0x10c8
+&device.id pci 0x0003
++device.name NM2093 [MagicGraph 128ZV]
+
+ vendor.id pci 0x10c8
+&device.id pci 0x0004
++device.name NM2160 [MagicGraph 128XD]
+
+ vendor.id pci 0x10c8
+&device.id pci 0x0004
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x00ba
++subdevice.name MagicGraph 128XD
+
+ vendor.id pci 0x10c8
+&device.id pci 0x0004
+&subvendor.id pci 0x1025
+&subdevice.id pci 0x1007
++subdevice.name MagicGraph 128XD
+
+ vendor.id pci 0x10c8
+&device.id pci 0x0004
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x0074
++subdevice.name MagicGraph 128XD
+
+ vendor.id pci 0x10c8
+&device.id pci 0x0004
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x0075
++subdevice.name MagicGraph 128XD
+
+ vendor.id pci 0x10c8
+&device.id pci 0x0004
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x007d
++subdevice.name MagicGraph 128XD
+
+ vendor.id pci 0x10c8
+&device.id pci 0x0004
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x007e
++subdevice.name MagicGraph 128XD
+
+ vendor.id pci 0x10c8
+&device.id pci 0x0004
+&subvendor.id pci 0x1033
+&subdevice.id pci 0x802f
++subdevice.name MagicGraph 128XD
+
+ vendor.id pci 0x10c8
+&device.id pci 0x0004
+&subvendor.id pci 0x104d
+&subdevice.id pci 0x801b
++subdevice.name MagicGraph 128XD
+
+ vendor.id pci 0x10c8
+&device.id pci 0x0004
+&subvendor.id pci 0x104d
+&subdevice.id pci 0x802f
++subdevice.name MagicGraph 128XD
+
+ vendor.id pci 0x10c8
+&device.id pci 0x0004
+&subvendor.id pci 0x104d
+&subdevice.id pci 0x830b
++subdevice.name MagicGraph 128XD
+
+ vendor.id pci 0x10c8
+&device.id pci 0x0004
+&subvendor.id pci 0x10ba
+&subdevice.id pci 0x0e00
++subdevice.name MagicGraph 128XD
+
+ vendor.id pci 0x10c8
+&device.id pci 0x0004
+&subvendor.id pci 0x10c8
+&subdevice.id pci 0x0004
++subdevice.name MagicGraph 128XD
+
+ vendor.id pci 0x10c8
+&device.id pci 0x0004
+&subvendor.id pci 0x10cf
+&subdevice.id pci 0x1029
++subdevice.name MagicGraph 128XD
+
+ vendor.id pci 0x10c8
+&device.id pci 0x0004
+&subvendor.id pci 0x10f7
+&subdevice.id pci 0x8308
++subdevice.name MagicGraph 128XD
+
+ vendor.id pci 0x10c8
+&device.id pci 0x0004
+&subvendor.id pci 0x10f7
+&subdevice.id pci 0x8309
++subdevice.name MagicGraph 128XD
+
+ vendor.id pci 0x10c8
+&device.id pci 0x0004
+&subvendor.id pci 0x10f7
+&subdevice.id pci 0x830b
++subdevice.name MagicGraph 128XD
+
+ vendor.id pci 0x10c8
+&device.id pci 0x0004
+&subvendor.id pci 0x10f7
+&subdevice.id pci 0x830d
++subdevice.name MagicGraph 128XD
+
+ vendor.id pci 0x10c8
+&device.id pci 0x0004
+&subvendor.id pci 0x10f7
+&subdevice.id pci 0x8312
++subdevice.name MagicGraph 128XD
+
+ vendor.id pci 0x10c8
+&device.id pci 0x0005
++device.name NM2200 [MagicGraph 256AV]
+
+ vendor.id pci 0x10c8
+&device.id pci 0x0005
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x00dd
++subdevice.name ThinkPad 570
+
+ vendor.id pci 0x10c8
+&device.id pci 0x0005
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x0088
++subdevice.name Latitude CPi A
+
+ vendor.id pci 0x10c8
+&device.id pci 0x0006
++device.name NM2360 [MagicMedia 256ZX]
+
+ vendor.id pci 0x10c8
+&device.id pci 0x0016
++device.name NM2380 [MagicMedia 256XL+]
+
+ vendor.id pci 0x10c8
+&device.id pci 0x0016
+&subvendor.id pci 0x10c8
+&subdevice.id pci 0x0016
++subdevice.name MagicMedia 256XL+
+
+ vendor.id pci 0x10c8
+&device.id pci 0x0025
++device.name NM2230 [MagicGraph 256AV+]
+
+ vendor.id pci 0x10c8
+&device.id pci 0x0083
++device.name NM2093 [MagicGraph 128ZV+]
+
+ vendor.id pci 0x10c8
+&device.id pci 0x8005
++device.name NM2200 [MagicMedia 256AV Audio]
+
+ vendor.id pci 0x10c8
+&device.id pci 0x8005
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0xb0d1
++subdevice.name MagicMedia 256AV Audio Device on Discovery
+
+ vendor.id pci 0x10c8
+&device.id pci 0x8005
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0xb126
++subdevice.name MagicMedia 256AV Audio Device on Durango
+
+ vendor.id pci 0x10c8
+&device.id pci 0x8005
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x00dd
++subdevice.name MagicMedia 256AV Audio Device on BlackTip Thinkpad
+
+ vendor.id pci 0x10c8
+&device.id pci 0x8005
+&subvendor.id pci 0x1025
+&subdevice.id pci 0x1003
++subdevice.name MagicMedia 256AV Audio Device on TravelMate 720
+
+ vendor.id pci 0x10c8
+&device.id pci 0x8005
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x0088
++subdevice.name Latitude CPi A
+
+ vendor.id pci 0x10c8
+&device.id pci 0x8005
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x008f
++subdevice.name MagicMedia 256AV Audio Device on Colorado Inspiron
+
+ vendor.id pci 0x10c8
+&device.id pci 0x8005
+&subvendor.id pci 0x103c
+&subdevice.id pci 0x0007
++subdevice.name MagicMedia 256AV Audio Device on Voyager II
+
+ vendor.id pci 0x10c8
+&device.id pci 0x8005
+&subvendor.id pci 0x103c
+&subdevice.id pci 0x0008
++subdevice.name MagicMedia 256AV Audio Device on Voyager III
+
+ vendor.id pci 0x10c8
+&device.id pci 0x8005
+&subvendor.id pci 0x103c
+&subdevice.id pci 0x000d
++subdevice.name MagicMedia 256AV Audio Device on Omnibook 900
+
+ vendor.id pci 0x10c8
+&device.id pci 0x8005
+&subvendor.id pci 0x10c8
+&subdevice.id pci 0x8005
++subdevice.name MagicMedia 256AV Audio Device on FireAnt
+
+ vendor.id pci 0x10c8
+&device.id pci 0x8005
+&subvendor.id pci 0x110a
+&subdevice.id pci 0x8005
++subdevice.name MagicMedia 256AV Audio Device
+
+ vendor.id pci 0x10c8
+&device.id pci 0x8005
+&subvendor.id pci 0x14c0
+&subdevice.id pci 0x0004
++subdevice.name MagicMedia 256AV Audio Device
+
+ vendor.id pci 0x10c8
+&device.id pci 0x8006
++device.name NM2360 [MagicMedia 256ZX Audio]
+
+ vendor.id pci 0x10c8
+&device.id pci 0x8016
++device.name NM2380 [MagicMedia 256XL+ Audio]
+
+ vendor.id pci 0x10c9
++vendor.name Dataexpert Corporation
+
+ vendor.id pci 0x10ca
++vendor.name Fujitsu Microelectr., Inc.
+
+ vendor.id pci 0x10cb
++vendor.name Omron Corporation
+
+ vendor.id pci 0x10cc
++vendor.name Mai Logic Incorporated
+
+ vendor.id pci 0x10cc
+&device.id pci 0x0660
++device.name Articia S Host Bridge
+
+ vendor.id pci 0x10cc
+&device.id pci 0x0661
++device.name Articia S PCI Bridge
+
+ vendor.id pci 0x10cd
++vendor.name Advanced System Products, Inc
+
+ vendor.id pci 0x10cd
+&device.id pci 0x1100
++device.name ASC1100
+
+ vendor.id pci 0x10cd
+&device.id pci 0x1200
++device.name ASC1200 [(abp940) Fast SCSI-II]
+
+ vendor.id pci 0x10cd
+&device.id pci 0x1300
++device.name ABP940-U / ABP960-U
+
+ vendor.id pci 0x10cd
+&device.id pci 0x1300
+&subvendor.id pci 0x10cd
+&subdevice.id pci 0x1310
++subdevice.name ASC1300 SCSI Adapter
+
+ vendor.id pci 0x10cd
+&device.id pci 0x2300
++device.name ABP940-UW
+
+ vendor.id pci 0x10cd
+&device.id pci 0x2500
++device.name ABP940-U2W
+
+ vendor.id pci 0x10ce
++vendor.name Radius
+
+ vendor.id pci 0x10cf
++vendor.name Fujitsu Limited.
+
+ vendor.id pci 0x10cf
+&device.id pci 0x2001
++device.name mb86605
+
+ vendor.id pci 0x10d1
++vendor.name FuturePlus Systems Corp.
+
+ vendor.id pci 0x10d2
++vendor.name Molex Incorporated
+
+ vendor.id pci 0x10d3
++vendor.name Jabil Circuit Inc
+
+ vendor.id pci 0x10d4
++vendor.name Hualon Microelectronics
+
+ vendor.id pci 0x10d5
++vendor.name Autologic Inc.
+
+ vendor.id pci 0x10d6
++vendor.name Cetia
+
+ vendor.id pci 0x10d7
++vendor.name BCM Advanced Research
+
+ vendor.id pci 0x10d8
++vendor.name Advanced Peripherals Labs
+
+ vendor.id pci 0x10d9
++vendor.name Macronix, Inc. [MXIC]
+
+ vendor.id pci 0x10d9
+&device.id pci 0x0512
++device.name MX98713
+
+ vendor.id pci 0x10d9
+&device.id pci 0x0531
++device.name MX987x5
+
+ vendor.id pci 0x10d9
+&device.id pci 0x0531
+&subvendor.id pci 0x1186
+&subdevice.id pci 0x1200
++subdevice.name DFE-540TX ProFAST 10/100 Adapter
+
+ vendor.id pci 0x10d9
+&device.id pci 0x8625
++device.name MX86250
+
+ vendor.id pci 0x10d9
+&device.id pci 0x8888
++device.name MX86200
+
+ vendor.id pci 0x10da
++vendor.name Compaq IPG-Austin
+
+ vendor.id pci 0x10da
+&device.id pci 0x0508
++device.name TC4048 Token Ring 4/16
+
+ vendor.id pci 0x10da
+&device.id pci 0x3390
++device.name Tl3c3x9
+
+ vendor.id pci 0x10db
++vendor.name Rohm LSI Systems, Inc.
+
+ vendor.id pci 0x10dc
++vendor.name CERN/ECP/EDU
+
+ vendor.id pci 0x10dc
+&device.id pci 0x0001
++device.name STAR/RD24 SCI-PCI (PMC)
+
+ vendor.id pci 0x10dc
+&device.id pci 0x0002
++device.name TAR/RD24 SCI-PCI (PMC)
+
+ vendor.id pci 0x10dc
+&device.id pci 0x0021
++device.name HIPPI destination
+
+ vendor.id pci 0x10dc
+&device.id pci 0x0022
++device.name HIPPI source
+
+ vendor.id pci 0x10dc
+&device.id pci 0x10dc
++device.name ATT2C15-3 FPGA
+
+ vendor.id pci 0x10dd
++vendor.name Evans & Sutherland
+
+ vendor.id pci 0x10de
++vendor.name nVidia Corporation
+
+ vendor.id pci 0x10de
+&device.id pci 0x0008
++device.name NV1 [EDGE 3D]
+
+ vendor.id pci 0x10de
+&device.id pci 0x0009
++device.name NV1 [EDGE 3D]
+
+ vendor.id pci 0x10de
+&device.id pci 0x0010
++device.name NV2 [Mutara V08]
+
+ vendor.id pci 0x10de
+&device.id pci 0x0020
++device.name NV4 [RIVA TNT]
+
+ vendor.id pci 0x10de
+&device.id pci 0x0020
+&subvendor.id pci 0x1043
+&subdevice.id pci 0x0200
++subdevice.name V3400 TNT
+
+ vendor.id pci 0x10de
+&device.id pci 0x0020
+&subvendor.id pci 0x1048
+&subdevice.id pci 0x0c18
++subdevice.name Erazor II SGRAM
+
+ vendor.id pci 0x10de
+&device.id pci 0x0020
+&subvendor.id pci 0x1048
+&subdevice.id pci 0x0c1b
++subdevice.name Erazor II
+
+ vendor.id pci 0x10de
+&device.id pci 0x0020
+&subvendor.id pci 0x1092
+&subdevice.id pci 0x0550
++subdevice.name Viper V550
+
+ vendor.id pci 0x10de
+&device.id pci 0x0020
+&subvendor.id pci 0x1092
+&subdevice.id pci 0x0552
++subdevice.name Viper V550
+
+ vendor.id pci 0x10de
+&device.id pci 0x0020
+&subvendor.id pci 0x1092
+&subdevice.id pci 0x4804
++subdevice.name Viper V550
+
+ vendor.id pci 0x10de
+&device.id pci 0x0020
+&subvendor.id pci 0x1092
+&subdevice.id pci 0x4808
++subdevice.name Viper V550
+
+ vendor.id pci 0x10de
+&device.id pci 0x0020
+&subvendor.id pci 0x1092
+&subdevice.id pci 0x4810
++subdevice.name Viper V550
+
+ vendor.id pci 0x10de
+&device.id pci 0x0020
+&subvendor.id pci 0x1092
+&subdevice.id pci 0x4812
++subdevice.name Viper V550
+
+ vendor.id pci 0x10de
+&device.id pci 0x0020
+&subvendor.id pci 0x1092
+&subdevice.id pci 0x4815
++subdevice.name Viper V550
+
+ vendor.id pci 0x10de
+&device.id pci 0x0020
+&subvendor.id pci 0x1092
+&subdevice.id pci 0x4820
++subdevice.name Viper V550 with TV out
+
+ vendor.id pci 0x10de
+&device.id pci 0x0020
+&subvendor.id pci 0x1092
+&subdevice.id pci 0x4822
++subdevice.name Viper V550
+
+ vendor.id pci 0x10de
+&device.id pci 0x0020
+&subvendor.id pci 0x1092
+&subdevice.id pci 0x4904
++subdevice.name Viper V550
+
+ vendor.id pci 0x10de
+&device.id pci 0x0020
+&subvendor.id pci 0x1092
+&subdevice.id pci 0x4914
++subdevice.name Viper V550
+
+ vendor.id pci 0x10de
+&device.id pci 0x0020
+&subvendor.id pci 0x1092
+&subdevice.id pci 0x8225
++subdevice.name Viper V550
+
+ vendor.id pci 0x10de
+&device.id pci 0x0020
+&subvendor.id pci 0x10b4
+&subdevice.id pci 0x273d
++subdevice.name Velocity 4400
+
+ vendor.id pci 0x10de
+&device.id pci 0x0020
+&subvendor.id pci 0x10b4
+&subdevice.id pci 0x273e
++subdevice.name Velocity 4400
+
+ vendor.id pci 0x10de
+&device.id pci 0x0020
+&subvendor.id pci 0x10b4
+&subdevice.id pci 0x2740
++subdevice.name Velocity 4400
+
+ vendor.id pci 0x10de
+&device.id pci 0x0020
+&subvendor.id pci 0x10de
+&subdevice.id pci 0x0020
++subdevice.name Riva TNT
+
+ vendor.id pci 0x10de
+&device.id pci 0x0020
+&subvendor.id pci 0x1102
+&subdevice.id pci 0x1015
++subdevice.name Graphics Blaster CT6710
+
+ vendor.id pci 0x10de
+&device.id pci 0x0020
+&subvendor.id pci 0x1102
+&subdevice.id pci 0x1016
++subdevice.name Graphics Blaster RIVA TNT
+
+ vendor.id pci 0x10de
+&device.id pci 0x0028
++device.name NV5 [RIVA TNT2/TNT2 Pro]
+
+ vendor.id pci 0x10de
+&device.id pci 0x0028
+&subvendor.id pci 0x1043
+&subdevice.id pci 0x0200
++subdevice.name AGP-V3800 SGRAM
+
+ vendor.id pci 0x10de
+&device.id pci 0x0028
+&subvendor.id pci 0x1043
+&subdevice.id pci 0x0201
++subdevice.name AGP-V3800 SDRAM
+
+ vendor.id pci 0x10de
+&device.id pci 0x0028
+&subvendor.id pci 0x1043
+&subdevice.id pci 0x0205
++subdevice.name PCI-V3800
+
+ vendor.id pci 0x10de
+&device.id pci 0x0028
+&subvendor.id pci 0x1043
+&subdevice.id pci 0x4000
++subdevice.name AGP-V3800PRO
+
+ vendor.id pci 0x10de
+&device.id pci 0x0028
+&subvendor.id pci 0x1048
+&subdevice.id pci 0x0c21
++subdevice.name Synergy II
+
+ vendor.id pci 0x10de
+&device.id pci 0x0028
+&subvendor.id pci 0x1048
+&subdevice.id pci 0x0c31
++subdevice.name Erazor III
+
+ vendor.id pci 0x10de
+&device.id pci 0x0028
+&subvendor.id pci 0x107d
+&subdevice.id pci 0x2134
++subdevice.name WinFast 3D S320 II + TV-Out
+
+ vendor.id pci 0x10de
+&device.id pci 0x0028
+&subvendor.id pci 0x1092
+&subdevice.id pci 0x4804
++subdevice.name Viper V770
+
+ vendor.id pci 0x10de
+&device.id pci 0x0028
+&subvendor.id pci 0x1092
+&subdevice.id pci 0x4a00
++subdevice.name Viper V770
+
+ vendor.id pci 0x10de
+&device.id pci 0x0028
+&subvendor.id pci 0x1092
+&subdevice.id pci 0x4a02
++subdevice.name Viper V770 Ultra
+
+ vendor.id pci 0x10de
+&device.id pci 0x0028
+&subvendor.id pci 0x1092
+&subdevice.id pci 0x5a00
++subdevice.name RIVA TNT2/TNT2 Pro
+
+ vendor.id pci 0x10de
+&device.id pci 0x0028
+&subvendor.id pci 0x1092
+&subdevice.id pci 0x6a02
++subdevice.name Viper V770 Ultra
+
+ vendor.id pci 0x10de
+&device.id pci 0x0028
+&subvendor.id pci 0x1092
+&subdevice.id pci 0x7a02
++subdevice.name Viper V770 Ultra
+
+ vendor.id pci 0x10de
+&device.id pci 0x0028
+&subvendor.id pci 0x10de
+&subdevice.id pci 0x0005
++subdevice.name RIVA TNT2 Pro
+
+ vendor.id pci 0x10de
+&device.id pci 0x0028
+&subvendor.id pci 0x10de
+&subdevice.id pci 0x000f
++subdevice.name Compaq NVIDIA TNT2 Pro
+
+ vendor.id pci 0x10de
+&device.id pci 0x0028
+&subvendor.id pci 0x1102
+&subdevice.id pci 0x1020
++subdevice.name 3D Blaster RIVA TNT2
+
+ vendor.id pci 0x10de
+&device.id pci 0x0028
+&subvendor.id pci 0x1102
+&subdevice.id pci 0x1026
++subdevice.name 3D Blaster RIVA TNT2 Digital
+
+ vendor.id pci 0x10de
+&device.id pci 0x0028
+&subvendor.id pci 0x14af
+&subdevice.id pci 0x5810
++subdevice.name Maxi Gamer Xentor
+
+ vendor.id pci 0x10de
+&device.id pci 0x0029
++device.name NV5 [RIVA TNT2 Ultra]
+
+ vendor.id pci 0x10de
+&device.id pci 0x0029
+&subvendor.id pci 0x1043
+&subdevice.id pci 0x0200
++subdevice.name AGP-V3800 Deluxe
+
+ vendor.id pci 0x10de
+&device.id pci 0x0029
+&subvendor.id pci 0x1043
+&subdevice.id pci 0x0201
++subdevice.name AGP-V3800 Ultra SDRAM
+
+ vendor.id pci 0x10de
+&device.id pci 0x0029
+&subvendor.id pci 0x1043
+&subdevice.id pci 0x0205
++subdevice.name PCI-V3800 Ultra
+
+ vendor.id pci 0x10de
+&device.id pci 0x0029
+&subvendor.id pci 0x1102
+&subdevice.id pci 0x1021
++subdevice.name 3D Blaster RIVA TNT2 Ultra
+
+ vendor.id pci 0x10de
+&device.id pci 0x0029
+&subvendor.id pci 0x1102
+&subdevice.id pci 0x1029
++subdevice.name 3D Blaster RIVA TNT2 Ultra
+
+ vendor.id pci 0x10de
+&device.id pci 0x0029
+&subvendor.id pci 0x1102
+&subdevice.id pci 0x102f
++subdevice.name 3D Blaster RIVA TNT2 Ultra
+
+ vendor.id pci 0x10de
+&device.id pci 0x0029
+&subvendor.id pci 0x14af
+&subdevice.id pci 0x5820
++subdevice.name Maxi Gamer Xentor 32
+
+ vendor.id pci 0x10de
+&device.id pci 0x002a
++device.name NV5 [Riva TnT2]
+
+ vendor.id pci 0x10de
+&device.id pci 0x002b
++device.name NV5 [Riva TnT2]
+
+ vendor.id pci 0x10de
+&device.id pci 0x002c
++device.name NV6 [Vanta/Vanta LT]
+
+ vendor.id pci 0x10de
+&device.id pci 0x002c
+&subvendor.id pci 0x1043
+&subdevice.id pci 0x0200
++subdevice.name AGP-V3800 Combat SDRAM
+
+ vendor.id pci 0x10de
+&device.id pci 0x002c
+&subvendor.id pci 0x1043
+&subdevice.id pci 0x0201
++subdevice.name AGP-V3800 Combat
+
+ vendor.id pci 0x10de
+&device.id pci 0x002c
+&subvendor.id pci 0x1092
+&subdevice.id pci 0x6820
++subdevice.name Viper V730
+
+ vendor.id pci 0x10de
+&device.id pci 0x002c
+&subvendor.id pci 0x1102
+&subdevice.id pci 0x1031
++subdevice.name CT6938 VANTA 8MB
+
+ vendor.id pci 0x10de
+&device.id pci 0x002c
+&subvendor.id pci 0x1102
+&subdevice.id pci 0x1034
++subdevice.name CT6894 VANTA 16MB
+
+ vendor.id pci 0x10de
+&device.id pci 0x002c
+&subvendor.id pci 0x14af
+&subdevice.id pci 0x5008
++subdevice.name Maxi Gamer Phoenix 2
+
+ vendor.id pci 0x10de
+&device.id pci 0x002d
++device.name NV5M64 [RIVA TNT2 Model 64/Model 64 Pro]
+
+ vendor.id pci 0x10de
+&device.id pci 0x002d
+&subvendor.id pci 0x1043
+&subdevice.id pci 0x0200
++subdevice.name AGP-V3800M
+
+ vendor.id pci 0x10de
+&device.id pci 0x002d
+&subvendor.id pci 0x1043
+&subdevice.id pci 0x0201
++subdevice.name AGP-V3800M
+
+ vendor.id pci 0x10de
+&device.id pci 0x002d
+&subvendor.id pci 0x1048
+&subdevice.id pci 0x0c3a
++subdevice.name Erazor III LT
+
+ vendor.id pci 0x10de
+&device.id pci 0x002d
+&subvendor.id pci 0x10de
+&subdevice.id pci 0x001e
++subdevice.name M64 AGP4x
+
+ vendor.id pci 0x10de
+&device.id pci 0x002d
+&subvendor.id pci 0x1102
+&subdevice.id pci 0x1023
++subdevice.name CT6892 RIVA TNT2 Value
+
+ vendor.id pci 0x10de
+&device.id pci 0x002d
+&subvendor.id pci 0x1102
+&subdevice.id pci 0x1024
++subdevice.name CT6932 RIVA TNT2 Value 32Mb
+
+ vendor.id pci 0x10de
+&device.id pci 0x002d
+&subvendor.id pci 0x1102
+&subdevice.id pci 0x102c
++subdevice.name CT6931 RIVA TNT2 Value [Jumper]
+
+ vendor.id pci 0x10de
+&device.id pci 0x002d
+&subvendor.id pci 0x1462
+&subdevice.id pci 0x8808
++subdevice.name MSI-8808
+
+ vendor.id pci 0x10de
+&device.id pci 0x002d
+&subvendor.id pci 0x1554
+&subdevice.id pci 0x1041
++subdevice.name Pixelview RIVA TNT2 M64
+
+ vendor.id pci 0x10de
+&device.id pci 0x002e
++device.name NV6 [Vanta]
+
+ vendor.id pci 0x10de
+&device.id pci 0x002f
++device.name NV6 [Vanta]
+
+ vendor.id pci 0x10de
+&device.id pci 0x0034
++device.name MCP04 SMBus
+
+ vendor.id pci 0x10de
+&device.id pci 0x0035
++device.name MCP04 IDE
+
+ vendor.id pci 0x10de
+&device.id pci 0x0036
++device.name MCP04 Serial ATA Controller
+
+ vendor.id pci 0x10de
+&device.id pci 0x0037
++device.name MCP04 Ethernet Controller
+
+ vendor.id pci 0x10de
+&device.id pci 0x0038
++device.name MCP04 Ethernet Controller
+
+ vendor.id pci 0x10de
+&device.id pci 0x003a
++device.name MCP04 AC'97 Audio Controller
+
+ vendor.id pci 0x10de
+&device.id pci 0x003b
++device.name MCP04 USB Controller
+
+ vendor.id pci 0x10de
+&device.id pci 0x003c
++device.name MCP04 USB Controller
+
+ vendor.id pci 0x10de
+&device.id pci 0x003d
++device.name MCP04 PCI Bridge
+
+ vendor.id pci 0x10de
+&device.id pci 0x003e
++device.name MCP04 Serial ATA Controller
+
+ vendor.id pci 0x10de
+&device.id pci 0x0040
++device.name nv40 [GeForce 6800 Ultra]
+
+ vendor.id pci 0x10de
+&device.id pci 0x0041
++device.name NV40 [GeForce 6800]
+
+ vendor.id pci 0x10de
+&device.id pci 0x0042
++device.name NV40.2
+
+ vendor.id pci 0x10de
+&device.id pci 0x0043
++device.name NV40.3
+
+ vendor.id pci 0x10de
+&device.id pci 0x0045
++device.name NV40 [GeForce 6800 GT]
+
+ vendor.id pci 0x10de
+&device.id pci 0x0049
++device.name NV40GL
+
+ vendor.id pci 0x10de
+&device.id pci 0x004e
++device.name NV40GL [Quadro FX 4000]
+
+ vendor.id pci 0x10de
+&device.id pci 0x0052
++device.name CK804 SMBus
+
+ vendor.id pci 0x10de
+&device.id pci 0x0053
++device.name CK804 IDE
+
+ vendor.id pci 0x10de
+&device.id pci 0x0054
++device.name CK804 Serial ATA Controller
+
+ vendor.id pci 0x10de
+&device.id pci 0x0055
++device.name CK804 Serial ATA Controller
+
+ vendor.id pci 0x10de
+&device.id pci 0x0056
++device.name CK804 Ethernet Controller
+
+ vendor.id pci 0x10de
+&device.id pci 0x0057
++device.name CK804 Ethernet Controller
+
+ vendor.id pci 0x10de
+&device.id pci 0x0059
++device.name CK804 AC'97 Audio Controller
+
+ vendor.id pci 0x10de
+&device.id pci 0x005a
++device.name CK804 USB Controller
+
+ vendor.id pci 0x10de
+&device.id pci 0x005b
++device.name CK804 USB Controller
+
+ vendor.id pci 0x10de
+&device.id pci 0x005c
++device.name CK804 PCI Bridge
+
+ vendor.id pci 0x10de
+&device.id pci 0x005d
++device.name CK804 PCIE Bridge
+
+ vendor.id pci 0x10de
+&device.id pci 0x005e
++device.name CK804 Memory Controller
+
+ vendor.id pci 0x10de
+&device.id pci 0x0060
++device.name nForce2 ISA Bridge
+
+ vendor.id pci 0x10de
+&device.id pci 0x0060
+&subvendor.id pci 0x1043
+&subdevice.id pci 0x80ad
++subdevice.name A7N8X Mainboard
+
+ vendor.id pci 0x10de
+&device.id pci 0x0064
++device.name nForce2 SMBus (MCP)
+
+ vendor.id pci 0x10de
+&device.id pci 0x0065
++device.name nForce2 IDE
+
+ vendor.id pci 0x10de
+&device.id pci 0x0066
++device.name nForce2 Ethernet Controller
+
+ vendor.id pci 0x10de
+&device.id pci 0x0066
+&subvendor.id pci 0x1043
+&subdevice.id pci 0x80a7
++subdevice.name A7N8X Mainboard onboard nForce2 Ethernet
+
+ vendor.id pci 0x10de
+&device.id pci 0x0067
++device.name nForce2 USB Controller
+
+ vendor.id pci 0x10de
+&device.id pci 0x0067
+&subvendor.id pci 0x1043
+&subdevice.id pci 0x0c11
++subdevice.name A7N8X Mainboard
+
+ vendor.id pci 0x10de
+&device.id pci 0x0068
++device.name nForce2 USB Controller
+
+ vendor.id pci 0x10de
+&device.id pci 0x0068
+&subvendor.id pci 0x1043
+&subdevice.id pci 0x0c11
++subdevice.name A7N8X Mainboard
+
+ vendor.id pci 0x10de
+&device.id pci 0x006a
++device.name nForce2 AC97 Audio Controler (MCP)
+
+ vendor.id pci 0x10de
+&device.id pci 0x006b
++device.name nForce MultiMedia audio [Via VT82C686B]
+
+ vendor.id pci 0x10de
+&device.id pci 0x006b
+&subvendor.id pci 0x10de
+&subdevice.id pci 0x006b
++subdevice.name nForce2 MCP Audio Processing Unit
+
+ vendor.id pci 0x10de
+&device.id pci 0x006c
++device.name nForce2 External PCI Bridge
+
+ vendor.id pci 0x10de
+&device.id pci 0x006d
++device.name nForce2 PCI Bridge
+
+ vendor.id pci 0x10de
+&device.id pci 0x006e
++device.name nForce2 FireWire (IEEE 1394) Controller
+
+ vendor.id pci 0x10de
+&device.id pci 0x0084
++device.name MCP2A SMBus
+
+ vendor.id pci 0x10de
+&device.id pci 0x0085
++device.name MCP2A IDE
+
+ vendor.id pci 0x10de
+&device.id pci 0x0086
++device.name MCP2A Ethernet Controller
+
+ vendor.id pci 0x10de
+&device.id pci 0x0087
++device.name MCP2A USB Controller
+
+ vendor.id pci 0x10de
+&device.id pci 0x0088
++device.name MCP2A USB Controller
+
+ vendor.id pci 0x10de
+&device.id pci 0x008a
++device.name MCP2S AC'97 Audio Controller
+
+ vendor.id pci 0x10de
+&device.id pci 0x008b
++device.name MCP2A PCI Bridge
+
+ vendor.id pci 0x10de
+&device.id pci 0x008c
++device.name MCP2A Ethernet Controller
+
+ vendor.id pci 0x10de
+&device.id pci 0x008e
++device.name nForce2 Serial ATA Controller
+
+ vendor.id pci 0x10de
+&device.id pci 0x00a0
++device.name NV5 [Aladdin TNT2]
+
+ vendor.id pci 0x10de
+&device.id pci 0x00a0
+&subvendor.id pci 0x14af
+&subdevice.id pci 0x5810
++subdevice.name Maxi Gamer Xentor
+
+ vendor.id pci 0x10de
+&device.id pci 0x00c0
++device.name NV41.0
+
+ vendor.id pci 0x10de
+&device.id pci 0x00c1
++device.name NV41.1
+
+ vendor.id pci 0x10de
+&device.id pci 0x00c2
++device.name NV41.2
+
+ vendor.id pci 0x10de
+&device.id pci 0x00c8
++device.name NV41.8
+
+ vendor.id pci 0x10de
+&device.id pci 0x00ce
++device.name NV41GL
+
+ vendor.id pci 0x10de
+&device.id pci 0x00d0
++device.name nForce3 LPC Bridge
+
+ vendor.id pci 0x10de
+&device.id pci 0x00d1
++device.name nForce3 Host Bridge
+
+ vendor.id pci 0x10de
+&device.id pci 0x00d2
++device.name nForce3 AGP Bridge
+
+ vendor.id pci 0x10de
+&device.id pci 0x00d3
++device.name CK804 Memory Controller
+
+ vendor.id pci 0x10de
+&device.id pci 0x00d4
++device.name nForce3 SMBus
+
+ vendor.id pci 0x10de
+&device.id pci 0x00d5
++device.name nForce3 IDE
+
+ vendor.id pci 0x10de
+&device.id pci 0x00d6
++device.name nForce3 Ethernet
+
+ vendor.id pci 0x10de
+&device.id pci 0x00d7
++device.name nForce3 USB 1.1
+
+ vendor.id pci 0x10de
+&device.id pci 0x00d8
++device.name nForce3 USB 2.0
+
+ vendor.id pci 0x10de
+&device.id pci 0x00da
++device.name nForce3 Audio
+
+ vendor.id pci 0x10de
+&device.id pci 0x00dd
++device.name nForce3 PCI Bridge
+
+ vendor.id pci 0x10de
+&device.id pci 0x00df
++device.name CK8S Ethernet Controller
+
+ vendor.id pci 0x10de
+&device.id pci 0x00e1
++device.name nForce3 250Gb Host Bridge
+
+ vendor.id pci 0x10de
+&device.id pci 0x00e2
++device.name nForce3 250Gb AGP Host to PCI Bridge
+
+ vendor.id pci 0x10de
+&device.id pci 0x00e3
++device.name CK8S Serial ATA Controller (v2.5)
+
+ vendor.id pci 0x10de
+&device.id pci 0x00e4
++device.name nForce 250Gb PCI System Management
+
+ vendor.id pci 0x10de
+&device.id pci 0x00e5
++device.name CK8S Parallel ATA Controller (v2.5)
+
+ vendor.id pci 0x10de
+&device.id pci 0x00e6
++device.name CK8S Ethernet Controller
+
+ vendor.id pci 0x10de
+&device.id pci 0x00e7
++device.name CK8S USB Controller
+
+ vendor.id pci 0x10de
+&device.id pci 0x00e8
++device.name CK8S USB Controller
+
+ vendor.id pci 0x10de
+&device.id pci 0x00ea
++device.name nForce3 250Gb AC'97 Audio Controller
+
+ vendor.id pci 0x10de
+&device.id pci 0x00ed
++device.name nForce3 250Gb PCI-to-PCI Bridge
+
+ vendor.id pci 0x10de
+&device.id pci 0x00ee
++device.name CK8S Serial ATA Controller (v2.5)
+
+ vendor.id pci 0x10de
+&device.id pci 0x00f0
++device.name NV40 [GeForce 6800/GeForce 6800 Ultra]
+
+ vendor.id pci 0x10de
+&device.id pci 0x00f1
++device.name NV43 [GeForce 6600/GeForce 6600 GT]
+
+ vendor.id pci 0x10de
+&device.id pci 0x00f2
++device.name NV43 [GeForce 6600 GT]
+
+ vendor.id pci 0x10de
+&device.id pci 0x00f8
++device.name NV45GL [Quadro FX 3400]
+
+ vendor.id pci 0x10de
+&device.id pci 0x00f9
++device.name NV40 [GeForce 6800 Ultra]
+
+ vendor.id pci 0x10de
+&device.id pci 0x00fa
++device.name NV36 [GeForce PCX 5750]
+
+ vendor.id pci 0x10de
+&device.id pci 0x00fb
++device.name NV35 [GeForce PCX 5900]
+
+ vendor.id pci 0x10de
+&device.id pci 0x00fc
++device.name NV37GL [Quadro FX 330/GeForce PCX 5300]
+
+ vendor.id pci 0x10de
+&device.id pci 0x00fd
++device.name NV37GL [Quadro FX 330]
+
+ vendor.id pci 0x10de
+&device.id pci 0x00fe
++device.name NV38GL [Quadro FX 1300]
+
+ vendor.id pci 0x10de
+&device.id pci 0x00ff
++device.name NV18 [GeForce PCX 4300]
+
+ vendor.id pci 0x10de
+&device.id pci 0x0100
++device.name NV10 [GeForce 256 SDR]
+
+ vendor.id pci 0x10de
+&device.id pci 0x0100
+&subvendor.id pci 0x1043
+&subdevice.id pci 0x0200
++subdevice.name AGP-V6600 SGRAM
+
+ vendor.id pci 0x10de
+&device.id pci 0x0100
+&subvendor.id pci 0x1043
+&subdevice.id pci 0x0201
++subdevice.name AGP-V6600 SDRAM
+
+ vendor.id pci 0x10de
+&device.id pci 0x0100
+&subvendor.id pci 0x1043
+&subdevice.id pci 0x4008
++subdevice.name AGP-V6600 SGRAM
+
+ vendor.id pci 0x10de
+&device.id pci 0x0100
+&subvendor.id pci 0x1043
+&subdevice.id pci 0x4009
++subdevice.name AGP-V6600 SDRAM
+
+ vendor.id pci 0x10de
+&device.id pci 0x0100
+&subvendor.id pci 0x1102
+&subdevice.id pci 0x102d
++subdevice.name CT6941 GeForce 256
+
+ vendor.id pci 0x10de
+&device.id pci 0x0100
+&subvendor.id pci 0x14af
+&subdevice.id pci 0x5022
++subdevice.name 3D Prophet SE
+
+ vendor.id pci 0x10de
+&device.id pci 0x0101
++device.name NV10DDR [GeForce 256 DDR]
+
+ vendor.id pci 0x10de
+&device.id pci 0x0101
+&subvendor.id pci 0x1043
+&subdevice.id pci 0x0202
++subdevice.name AGP-V6800 DDR
+
+ vendor.id pci 0x10de
+&device.id pci 0x0101
+&subvendor.id pci 0x1043
+&subdevice.id pci 0x400a
++subdevice.name AGP-V6800 DDR SGRAM
+
+ vendor.id pci 0x10de
+&device.id pci 0x0101
+&subvendor.id pci 0x1043
+&subdevice.id pci 0x400b
++subdevice.name AGP-V6800 DDR SDRAM
+
+ vendor.id pci 0x10de
+&device.id pci 0x0101
+&subvendor.id pci 0x107d
+&subdevice.id pci 0x2822
++subdevice.name WinFast GeForce 256
+
+ vendor.id pci 0x10de
+&device.id pci 0x0101
+&subvendor.id pci 0x1102
+&subdevice.id pci 0x102e
++subdevice.name CT6971 GeForce 256 DDR
+
+ vendor.id pci 0x10de
+&device.id pci 0x0101
+&subvendor.id pci 0x14af
+&subdevice.id pci 0x5021
++subdevice.name 3D Prophet DDR-DVI
+
+ vendor.id pci 0x10de
+&device.id pci 0x0103
++device.name NV10GL [Quadro]
+
+ vendor.id pci 0x10de
+&device.id pci 0x0110
++device.name NV11 [GeForce2 MX/MX 400]
+
+ vendor.id pci 0x10de
+&device.id pci 0x0110
+&subvendor.id pci 0x1043
+&subdevice.id pci 0x4015
++subdevice.name AGP-V7100 Pro
+
+ vendor.id pci 0x10de
+&device.id pci 0x0110
+&subvendor.id pci 0x1043
+&subdevice.id pci 0x4031
++subdevice.name V7100 Pro with TV output
+
+ vendor.id pci 0x10de
+&device.id pci 0x0110
+&subvendor.id pci 0x10de
+&subdevice.id pci 0x0091
++subdevice.name Dell OEM GeForce 2 MX 400
+
+ vendor.id pci 0x10de
+&device.id pci 0x0110
+&subvendor.id pci 0x1462
+&subdevice.id pci 0x8817
++subdevice.name MSI GeForce2 MX400 Pro32S [MS-8817]
+
+ vendor.id pci 0x10de
+&device.id pci 0x0110
+&subvendor.id pci 0x14af
+&subdevice.id pci 0x7102
++subdevice.name 3D Prophet II MX
+
+ vendor.id pci 0x10de
+&device.id pci 0x0110
+&subvendor.id pci 0x14af
+&subdevice.id pci 0x7103
++subdevice.name 3D Prophet II MX Dual-Display
+
+ vendor.id pci 0x10de
+&device.id pci 0x0111
++device.name NV11DDR [GeForce2 MX 100 DDR/200 DDR]
+
+ vendor.id pci 0x10de
+&device.id pci 0x0112
++device.name NV11 [GeForce2 Go]
+
+ vendor.id pci 0x10de
+&device.id pci 0x0113
++device.name NV11GL [Quadro2 MXR/EX]
+
+ vendor.id pci 0x10de
+&device.id pci 0x0150
++device.name NV15 [GeForce2 GTS/Pro]
+
+ vendor.id pci 0x10de
+&device.id pci 0x0150
+&subvendor.id pci 0x1043
+&subdevice.id pci 0x4016
++subdevice.name V7700 AGP Video Card
+
+ vendor.id pci 0x10de
+&device.id pci 0x0150
+&subvendor.id pci 0x107d
+&subdevice.id pci 0x2840
++subdevice.name WinFast GeForce2 GTS with TV output
+
+ vendor.id pci 0x10de
+&device.id pci 0x0150
+&subvendor.id pci 0x107d
+&subdevice.id pci 0x2842
++subdevice.name WinFast GeForce 2 Pro
+
+ vendor.id pci 0x10de
+&device.id pci 0x0150
+&subvendor.id pci 0x1462
+&subdevice.id pci 0x8831
++subdevice.name Creative GeForce2 Pro
+
+ vendor.id pci 0x10de
+&device.id pci 0x0151
++device.name NV15DDR [GeForce2 Ti]
+
+ vendor.id pci 0x10de
+&device.id pci 0x0151
+&subvendor.id pci 0x1043
+&subdevice.id pci 0x405f
++subdevice.name V7700Ti
+
+ vendor.id pci 0x10de
+&device.id pci 0x0151
+&subvendor.id pci 0x1462
+&subdevice.id pci 0x5506
++subdevice.name Creative 3D Blaster Geforce2 Titanium
+
+ vendor.id pci 0x10de
+&device.id pci 0x0152
++device.name NV15BR [GeForce2 Ultra, Bladerunner]
+
+ vendor.id pci 0x10de
+&device.id pci 0x0152
+&subvendor.id pci 0x1048
+&subdevice.id pci 0x0c56
++subdevice.name GLADIAC Ultra
+
+ vendor.id pci 0x10de
+&device.id pci 0x0153
++device.name NV15GL [Quadro2 Pro]
+
+ vendor.id pci 0x10de
+&device.id pci 0x0170
++device.name NV17 [GeForce4 MX 460]
+
+ vendor.id pci 0x10de
+&device.id pci 0x0171
++device.name NV17 [GeForce4 MX 440]
+
+ vendor.id pci 0x10de
+&device.id pci 0x0171
+&subvendor.id pci 0x10b0
+&subdevice.id pci 0x0002
++subdevice.name Gainward Pro/600 TV
+
+ vendor.id pci 0x10de
+&device.id pci 0x0171
+&subvendor.id pci 0x1462
+&subdevice.id pci 0x8661
++subdevice.name G4MX440-VTP
+
+ vendor.id pci 0x10de
+&device.id pci 0x0171
+&subvendor.id pci 0x1462
+&subdevice.id pci 0x8730
++subdevice.name MX440SES-T (MS-8873)
+
+ vendor.id pci 0x10de
+&device.id pci 0x0171
+&subvendor.id pci 0x147b
+&subdevice.id pci 0x8f00
++subdevice.name Abit Siluro GeForce4MX440
+
+ vendor.id pci 0x10de
+&device.id pci 0x0172
++device.name NV17 [GeForce4 MX 420]
+
+ vendor.id pci 0x10de
+&device.id pci 0x0173
++device.name NV17 [GeForce4 MX 440-SE]
+
+ vendor.id pci 0x10de
+&device.id pci 0x0174
++device.name NV17 [GeForce4 440 Go]
+
+ vendor.id pci 0x10de
+&device.id pci 0x0175
++device.name NV17 [GeForce4 420 Go]
+
+ vendor.id pci 0x10de
+&device.id pci 0x0176
++device.name NV17 [GeForce4 420 Go 32M]
+
+ vendor.id pci 0x10de
+&device.id pci 0x0176
+&subvendor.id pci 0x4c53
+&subdevice.id pci 0x1090
++subdevice.name Cx9 / Vx9 mainboard
+
+ vendor.id pci 0x10de
+&device.id pci 0x0177
++device.name NV17 [GeForce4 460 Go]
+
+ vendor.id pci 0x10de
+&device.id pci 0x0178
++device.name NV17GL [Quadro4 550 XGL]
+
+ vendor.id pci 0x10de
+&device.id pci 0x0179
++device.name NV17 [GeForce4 440 Go 64M]
+
+ vendor.id pci 0x10de
+&device.id pci 0x0179
+&subvendor.id pci 0x10de
+&subdevice.id pci 0x0179
++subdevice.name GeForce4 MX (Mac)
+
+ vendor.id pci 0x10de
+&device.id pci 0x017a
++device.name NV17GL [Quadro4 200/400 NVS]
+
+ vendor.id pci 0x10de
+&device.id pci 0x017b
++device.name NV17GL [Quadro4 550 XGL]
+
+ vendor.id pci 0x10de
+&device.id pci 0x017c
++device.name NV17GL [Quadro4 550 GoGL]
+
+ vendor.id pci 0x10de
+&device.id pci 0x017d
++device.name NV17 [GeForce4 410 Go 16M]
+
+ vendor.id pci 0x10de
+&device.id pci 0x0181
++device.name NV18 [GeForce4 MX 440 AGP 8x]
+
+ vendor.id pci 0x10de
+&device.id pci 0x0181
+&subvendor.id pci 0x1043
+&subdevice.id pci 0x806f
++subdevice.name V9180 Magic
+
+ vendor.id pci 0x10de
+&device.id pci 0x0181
+&subvendor.id pci 0x1462
+&subdevice.id pci 0x8880
++subdevice.name MS-StarForce GeForce4 MX 440 with AGP8X
+
+ vendor.id pci 0x10de
+&device.id pci 0x0181
+&subvendor.id pci 0x1462
+&subdevice.id pci 0x8900
++subdevice.name MS-8890 GeForce 4 MX440 AGP8X
+
+ vendor.id pci 0x10de
+&device.id pci 0x0181
+&subvendor.id pci 0x1462
+&subdevice.id pci 0x9350
++subdevice.name MSI Geforce4 MX T8X with AGP8X
+
+ vendor.id pci 0x10de
+&device.id pci 0x0181
+&subvendor.id pci 0x147b
+&subdevice.id pci 0x8f0d
++subdevice.name Siluro GF4 MX-8X
+
+ vendor.id pci 0x10de
+&device.id pci 0x0182
++device.name NV18 [GeForce4 MX 440SE AGP 8x]
+
+ vendor.id pci 0x10de
+&device.id pci 0x0183
++device.name NV18 [GeForce4 MX 420 AGP 8x]
+
+ vendor.id pci 0x10de
+&device.id pci 0x0185
++device.name NV18 [GeForce4 MX 4000 AGP 8x]
+
+ vendor.id pci 0x10de
+&device.id pci 0x0186
++device.name NV18M [GeForce4 448 Go]
+
+ vendor.id pci 0x10de
+&device.id pci 0x0187
++device.name NV18M [GeForce4 488 Go]
+
+ vendor.id pci 0x10de
+&device.id pci 0x0188
++device.name NV18GL [Quadro4 580 XGL]
+
+ vendor.id pci 0x10de
+&device.id pci 0x018a
++device.name NV18GL [Quadro4 NVS AGP 8x]
+
+ vendor.id pci 0x10de
+&device.id pci 0x018b
++device.name NV18GL [Quadro4 380 XGL]
+
+ vendor.id pci 0x10de
+&device.id pci 0x018d
++device.name NV18M [GeForce4 448 Go]
+
+ vendor.id pci 0x10de
+&device.id pci 0x01a0
++device.name NVCrush11 [GeForce2 MX Integrated Graphics]
+
+ vendor.id pci 0x10de
+&device.id pci 0x01a4
++device.name nForce CPU bridge
+
+ vendor.id pci 0x10de
+&device.id pci 0x01ab
++device.name nForce 420 Memory Controller (DDR)
+
+ vendor.id pci 0x10de
+&device.id pci 0x01ac
++device.name nForce 220/420 Memory Controller
+
+ vendor.id pci 0x10de
+&device.id pci 0x01ad
++device.name nForce 220/420 Memory Controller
+
+ vendor.id pci 0x10de
+&device.id pci 0x01b0
++device.name nForce Audio
+
+ vendor.id pci 0x10de
+&device.id pci 0x01b1
++device.name nForce Audio
+
+ vendor.id pci 0x10de
+&device.id pci 0x01b2
++device.name nForce ISA Bridge
+
+ vendor.id pci 0x10de
+&device.id pci 0x01b4
++device.name nForce PCI System Management
+
+ vendor.id pci 0x10de
+&device.id pci 0x01b7
++device.name nForce AGP to PCI Bridge
+
+ vendor.id pci 0x10de
+&device.id pci 0x01b8
++device.name nForce PCI-to-PCI bridge
+
+ vendor.id pci 0x10de
+&device.id pci 0x01bc
++device.name nForce IDE
+
+ vendor.id pci 0x10de
+&device.id pci 0x01c1
++device.name nForce AC'97 Modem Controller
+
+ vendor.id pci 0x10de
+&device.id pci 0x01c2
++device.name nForce USB Controller
+
+ vendor.id pci 0x10de
+&device.id pci 0x01c3
++device.name nForce Ethernet Controller
+
+ vendor.id pci 0x10de
+&device.id pci 0x01e0
++device.name nForce2 AGP (different version?)
+
+ vendor.id pci 0x10de
+&device.id pci 0x01e8
++device.name nForce2 AGP
+
+ vendor.id pci 0x10de
+&device.id pci 0x01ea
++device.name nForce2 Memory Controller 0
+
+ vendor.id pci 0x10de
+&device.id pci 0x01eb
++device.name nForce2 Memory Controller 1
+
+ vendor.id pci 0x10de
+&device.id pci 0x01ec
++device.name nForce2 Memory Controller 2
+
+ vendor.id pci 0x10de
+&device.id pci 0x01ed
++device.name nForce2 Memory Controller 3
+
+ vendor.id pci 0x10de
+&device.id pci 0x01ee
++device.name nForce2 Memory Controller 4
+
+ vendor.id pci 0x10de
+&device.id pci 0x01ef
++device.name nForce2 Memory Controller 5
+
+ vendor.id pci 0x10de
+&device.id pci 0x01f0
++device.name NV18 [GeForce4 MX - nForce GPU]
+
+ vendor.id pci 0x10de
+&device.id pci 0x0200
++device.name NV20 [GeForce3]
+
+ vendor.id pci 0x10de
+&device.id pci 0x0200
+&subvendor.id pci 0x1043
+&subdevice.id pci 0x402f
++subdevice.name AGP-V8200 DDR
+
+ vendor.id pci 0x10de
+&device.id pci 0x0201
++device.name NV20 [GeForce3 Ti 200]
+
+ vendor.id pci 0x10de
+&device.id pci 0x0202
++device.name NV20 [GeForce3 Ti 500]
+
+ vendor.id pci 0x10de
+&device.id pci 0x0202
+&subvendor.id pci 0x1043
+&subdevice.id pci 0x405b
++subdevice.name V8200 T5
+
+ vendor.id pci 0x10de
+&device.id pci 0x0202
+&subvendor.id pci 0x1545
+&subdevice.id pci 0x002f
++subdevice.name Xtasy 6964
+
+ vendor.id pci 0x10de
+&device.id pci 0x0203
++device.name NV20DCC [Quadro DCC]
+
+ vendor.id pci 0x10de
+&device.id pci 0x0250
++device.name NV25 [GeForce4 Ti 4600]
+
+ vendor.id pci 0x10de
+&device.id pci 0x0251
++device.name NV25 [GeForce4 Ti 4400]
+
+ vendor.id pci 0x10de
+&device.id pci 0x0251
+&subvendor.id pci 0x1043
+&subdevice.id pci 0x8023
++subdevice.name v8440 GeForce 4 Ti4400
+
+ vendor.id pci 0x10de
+&device.id pci 0x0252
++device.name NV25 [GeForce4 Ti]
+
+ vendor.id pci 0x10de
+&device.id pci 0x0253
++device.name NV25 [GeForce4 Ti 4200]
+
+ vendor.id pci 0x10de
+&device.id pci 0x0253
+&subvendor.id pci 0x107d
+&subdevice.id pci 0x2896
++subdevice.name WinFast A250 LE TD (Dual VGA/TV-out/DVI)
+
+ vendor.id pci 0x10de
+&device.id pci 0x0253
+&subvendor.id pci 0x147b
+&subdevice.id pci 0x8f09
++subdevice.name Siluro (Dual VGA/TV-out/DVI)
+
+ vendor.id pci 0x10de
+&device.id pci 0x0258
++device.name NV25GL [Quadro4 900 XGL]
+
+ vendor.id pci 0x10de
+&device.id pci 0x0259
++device.name NV25GL [Quadro4 750 XGL]
+
+ vendor.id pci 0x10de
+&device.id pci 0x025b
++device.name NV25GL [Quadro4 700 XGL]
+
+ vendor.id pci 0x10de
+&device.id pci 0x0280
++device.name NV28 [GeForce4 Ti 4800]
+
+ vendor.id pci 0x10de
+&device.id pci 0x0281
++device.name NV28 [GeForce4 Ti 4200 AGP 8x]
+
+ vendor.id pci 0x10de
+&device.id pci 0x0282
++device.name NV28 [GeForce4 Ti 4800 SE]
+
+ vendor.id pci 0x10de
+&device.id pci 0x0286
++device.name NV28 [GeForce4 Ti 4200 Go AGP 8x]
+
+ vendor.id pci 0x10de
+&device.id pci 0x0288
++device.name NV28GL [Quadro4 980 XGL]
+
+ vendor.id pci 0x10de
+&device.id pci 0x0289
++device.name NV28GL [Quadro4 780 XGL]
+
+ vendor.id pci 0x10de
+&device.id pci 0x028c
++device.name NV28GLM [Quadro4 700 GoGL]
+
+ vendor.id pci 0x10de
+&device.id pci 0x0300
++device.name NV30 [GeForce FX]
+
+ vendor.id pci 0x10de
+&device.id pci 0x0301
++device.name NV30 [GeForce FX 5800 Ultra]
+
+ vendor.id pci 0x10de
+&device.id pci 0x0302
++device.name NV30 [GeForce FX 5800]
+
+ vendor.id pci 0x10de
+&device.id pci 0x0308
++device.name NV30GL [Quadro FX 2000]
+
+ vendor.id pci 0x10de
+&device.id pci 0x0309
++device.name NV30GL [Quadro FX 1000]
+
+ vendor.id pci 0x10de
+&device.id pci 0x0311
++device.name NV31 [GeForce FX 5600 Ultra]
+
+ vendor.id pci 0x10de
+&device.id pci 0x0312
++device.name NV31 [GeForce FX 5600]
+
+ vendor.id pci 0x10de
+&device.id pci 0x0313
++device.name NV31
+
+ vendor.id pci 0x10de
+&device.id pci 0x0314
++device.name NV31 [GeForce FX 5600XT]
+
+ vendor.id pci 0x10de
+&device.id pci 0x0314
+&subvendor.id pci 0x1043
+&subdevice.id pci 0x814a
++subdevice.name V9560XT/TD
+
+ vendor.id pci 0x10de
+&device.id pci 0x0316
++device.name NV31
+
+ vendor.id pci 0x10de
+&device.id pci 0x0317
++device.name NV31
+
+ vendor.id pci 0x10de
+&device.id pci 0x031a
++device.name NV31M [GeForce FX Go 5600]
+
+ vendor.id pci 0x10de
+&device.id pci 0x031b
++device.name NV31M [GeForce FX Go5650]
+
+ vendor.id pci 0x10de
+&device.id pci 0x031c
++device.name NVIDIA Quadro FX 700 Go
+
+ vendor.id pci 0x10de
+&device.id pci 0x031d
++device.name NV31
+
+ vendor.id pci 0x10de
+&device.id pci 0x031e
++device.name NV31
+
+ vendor.id pci 0x10de
+&device.id pci 0x031f
++device.name NV31
+
+ vendor.id pci 0x10de
+&device.id pci 0x0320
++device.name NV34 [GeForce FX 5200]
+
+ vendor.id pci 0x10de
+&device.id pci 0x0321
++device.name NV34 [GeForce FX 5200 Ultra]
+
+ vendor.id pci 0x10de
+&device.id pci 0x0322
++device.name NV34 [GeForce FX 5200]
+
+ vendor.id pci 0x10de
+&device.id pci 0x0322
+&subvendor.id pci 0x1462
+&subdevice.id pci 0x9171
++subdevice.name MS-8917 (FX5200-T128)
+
+ vendor.id pci 0x10de
+&device.id pci 0x0323
++device.name NV34 [GeForce FX 5200LE]
+
+ vendor.id pci 0x10de
+&device.id pci 0x0324
++device.name NV34M [GeForce FX Go 5200]
+
+ vendor.id pci 0x10de
+&device.id pci 0x0324
+&subvendor.id pci 0x1071
+&subdevice.id pci 0x8160
++subdevice.name MIM2000
+
+ vendor.id pci 0x10de
+&device.id pci 0x0325
++device.name NV34M [GeForce FX Go5250]
+
+ vendor.id pci 0x10de
+&device.id pci 0x0326
++device.name NV34 [GeForce FX 5500]
+
+ vendor.id pci 0x10de
+&device.id pci 0x0327
++device.name NV34 [GeForce FX 5100]
+
+ vendor.id pci 0x10de
+&device.id pci 0x0328
++device.name NV34M [GeForce FX Go 5200]
+
+ vendor.id pci 0x10de
+&device.id pci 0x0329
++device.name NV34M [GeForce FX Go5200]
+
+ vendor.id pci 0x10de
+&device.id pci 0x032a
++device.name NV34GL [Quadro NVS 280 PCI]
+
+ vendor.id pci 0x10de
+&device.id pci 0x032b
++device.name NV34GL [Quadro FX 500/600 PCI]
+
+ vendor.id pci 0x10de
+&device.id pci 0x032c
++device.name NV34GLM [GeForce FX Go 5300]
+
+ vendor.id pci 0x10de
+&device.id pci 0x032d
++device.name NV34 [GeForce FX Go5100]
+
+ vendor.id pci 0x10de
+&device.id pci 0x032f
++device.name NV34
+
+ vendor.id pci 0x10de
+&device.id pci 0x0330
++device.name NV35 [GeForce FX 5900 Ultra]
+
+ vendor.id pci 0x10de
+&device.id pci 0x0331
++device.name NV35 [GeForce FX 5900]
+
+ vendor.id pci 0x10de
+&device.id pci 0x0331
+&subvendor.id pci 0x1043
+&subdevice.id pci 0x8145
++subdevice.name V9950GE
+
+ vendor.id pci 0x10de
+&device.id pci 0x0332
++device.name NV35 [GeForce FX 5900XT]
+
+ vendor.id pci 0x10de
+&device.id pci 0x0333
++device.name NV38 [GeForce FX 5950 Ultra]
+
+ vendor.id pci 0x10de
+&device.id pci 0x0334
++device.name NV35 [GeForce FX 5900ZT]
+
+ vendor.id pci 0x10de
+&device.id pci 0x0338
++device.name NV35GL [Quadro FX 3000]
+
+ vendor.id pci 0x10de
+&device.id pci 0x033f
++device.name NV35GL [Quadro FX 700]
+
+ vendor.id pci 0x10de
+&device.id pci 0x0341
++device.name NV36.1 [GeForce FX 5700 Ultra]
+
+ vendor.id pci 0x10de
+&device.id pci 0x0342
++device.name NV36.2 [GeForce FX 5700]
+
+ vendor.id pci 0x10de
+&device.id pci 0x0343
++device.name NV36 [GeForce FX 5700LE]
+
+ vendor.id pci 0x10de
+&device.id pci 0x0344
++device.name NV36.4 [GeForce FX 5700VE]
+
+ vendor.id pci 0x10de
+&device.id pci 0x0345
++device.name NV36.5
+
+ vendor.id pci 0x10de
+&device.id pci 0x0347
++device.name NV36 [GeForce FX Go5700]
+
+ vendor.id pci 0x10de
+&device.id pci 0x0348
++device.name NV36 [GeForce FX Go5700]
+
+ vendor.id pci 0x10de
+&device.id pci 0x0349
++device.name NV36
+
+ vendor.id pci 0x10de
+&device.id pci 0x034b
++device.name NV36
+
+ vendor.id pci 0x10de
+&device.id pci 0x034c
++device.name NV36 [Quadro FX Go1000]
+
+ vendor.id pci 0x10de
+&device.id pci 0x034e
++device.name NV36GL [Quadro FX 1100]
+
+ vendor.id pci 0x10de
+&device.id pci 0x034f
++device.name NV36GL
+
+ vendor.id pci 0x10df
++vendor.name Emulex Corporation
+
+ vendor.id pci 0x10df
+&device.id pci 0x1ae5
++device.name LP6000 Fibre Channel Host Adapter
+
+ vendor.id pci 0x10df
+&device.id pci 0x1ae6
++device.name LP 8000 Fibre Channel Host Adapter Alternate ID (JX1:2-3, JX2:1-2)
+
+ vendor.id pci 0x10df
+&device.id pci 0x1ae7
++device.name LP 8000 Fibre Channel Host Adapter Alternate ID (JX1:2-3, JX2:2-3)
+
+ vendor.id pci 0x10df
+&device.id pci 0xf015
++device.name LP1150e
+
+ vendor.id pci 0x10df
+&device.id pci 0xf085
++device.name LP850 Fibre Channel Adapter
+
+ vendor.id pci 0x10df
+&device.id pci 0xf095
++device.name LP952 Fibre Channel Adapter
+
+ vendor.id pci 0x10df
+&device.id pci 0xf098
++device.name LP982 Fibre Channel Adapter
+
+ vendor.id pci 0x10df
+&device.id pci 0xf0a1
++device.name LightPulse Fibre Channel Adapter
+
+ vendor.id pci 0x10df
+&device.id pci 0xf0a5
++device.name LP1050
+
+ vendor.id pci 0x10df
+&device.id pci 0xf0d5
++device.name LP1150
+
+ vendor.id pci 0x10df
+&device.id pci 0xf100
++device.name LP11000e
+
+ vendor.id pci 0x10df
+&device.id pci 0xf700
++device.name LP7000 Fibre Channel Host Adapter
+
+ vendor.id pci 0x10df
+&device.id pci 0xf701
++device.name LP 7000EFibre Channel Host Adapter Alternate ID (JX1:2-3, JX2:1-2)
+
+ vendor.id pci 0x10df
+&device.id pci 0xf800
++device.name LP8000 Fibre Channel Host Adapter
+
+ vendor.id pci 0x10df
+&device.id pci 0xf801
++device.name LP 8000 Fibre Channel Host Adapter Alternate ID (JX1:2-3, JX2:1-2)
+
+ vendor.id pci 0x10df
+&device.id pci 0xf900
++device.name LP9000 Fibre Channel Host Adapter
+
+ vendor.id pci 0x10df
+&device.id pci 0xf901
++device.name LP 9000 Fibre Channel Host Adapter Alternate ID (JX1:2-3, JX2:1-2)
+
+ vendor.id pci 0x10df
+&device.id pci 0xf980
++device.name LP9802 Fibre Channel Adapter
+
+ vendor.id pci 0x10df
+&device.id pci 0xf981
++device.name LP 9802 Fibre Channel Host Adapter Alternate ID
+
+ vendor.id pci 0x10df
+&device.id pci 0xf982
++device.name LP 9802 Fibre Channel Host Adapter Alternate ID
+
+ vendor.id pci 0x10df
+&device.id pci 0xfa00
++device.name LP10000 Fibre Channel Host Adapter
+
+ vendor.id pci 0x10df
+&device.id pci 0xfa01
++device.name LP101
+
+ vendor.id pci 0x10df
+&device.id pci 0xfb00
++device.name LightPulse Fibre Channel Adapter
+
+ vendor.id pci 0x10df
+&device.id pci 0xfd00
++device.name LP11000
+
+ vendor.id pci 0x10e0
++vendor.name Integrated Micro Solutions Inc.
+
+ vendor.id pci 0x10e0
+&device.id pci 0x5026
++device.name IMS5026/27/28
+
+ vendor.id pci 0x10e0
+&device.id pci 0x5027
++device.name IMS5027
+
+ vendor.id pci 0x10e0
+&device.id pci 0x5028
++device.name IMS5028
+
+ vendor.id pci 0x10e0
+&device.id pci 0x8849
++device.name IMS8849
+
+ vendor.id pci 0x10e0
+&device.id pci 0x8853
++device.name IMS8853
+
+ vendor.id pci 0x10e0
+&device.id pci 0x9128
++device.name IMS9128 [Twin turbo 128]
+
+ vendor.id pci 0x10e1
++vendor.name Tekram Technology Co.,Ltd.
+
+ vendor.id pci 0x10e1
+&device.id pci 0x0391
++device.name TRM-S1040
+
+ vendor.id pci 0x10e1
+&device.id pci 0x0391
+&subvendor.id pci 0x10e1
+&subdevice.id pci 0x0391
++subdevice.name DC-315U SCSI-3 Host Adapter
+
+ vendor.id pci 0x10e1
+&device.id pci 0x690c
++device.name DC-690c
+
+ vendor.id pci 0x10e1
+&device.id pci 0xdc29
++device.name DC-290
+
+ vendor.id pci 0x10e2
++vendor.name Aptix Corporation
+
+ vendor.id pci 0x10e3
++vendor.name Tundra Semiconductor Corp.
+
+ vendor.id pci 0x10e3
+&device.id pci 0x0000
++device.name CA91C042 [Universe]
+
+ vendor.id pci 0x10e3
+&device.id pci 0x0860
++device.name CA91C860 [QSpan]
+
+ vendor.id pci 0x10e3
+&device.id pci 0x0862
++device.name CA91C862A [QSpan-II]
+
+ vendor.id pci 0x10e3
+&device.id pci 0x8260
++device.name CA91L8200B [Dual PCI PowerSpan II]
+
+ vendor.id pci 0x10e3
+&device.id pci 0x8261
++device.name CA91L8260B [Single PCI PowerSpan II]
+
+ vendor.id pci 0x10e4
++vendor.name Tandem Computers
+
+ vendor.id pci 0x10e5
++vendor.name Micro Industries Corporation
+
+ vendor.id pci 0x10e6
++vendor.name Gainbery Computer Products Inc.
+
+ vendor.id pci 0x10e7
++vendor.name Vadem
+
+ vendor.id pci 0x10e8
++vendor.name Applied Micro Circuits Corp.
+
+ vendor.id pci 0x10e8
+&device.id pci 0x1072
++device.name INES GPIB-PCI (AMCC5920 based)
+
+ vendor.id pci 0x10e8
+&device.id pci 0x2011
++device.name Q-Motion Video Capture/Edit board
+
+ vendor.id pci 0x10e8
+&device.id pci 0x4750
++device.name S5930 [Matchmaker]
+
+ vendor.id pci 0x10e8
+&device.id pci 0x5920
++device.name S5920
+
+ vendor.id pci 0x10e8
+&device.id pci 0x8043
++device.name LANai4.x [Myrinet LANai interface chip]
+
+ vendor.id pci 0x10e8
+&device.id pci 0x8062
++device.name S5933_PARASTATION
+
+ vendor.id pci 0x10e8
+&device.id pci 0x807d
++device.name S5933 [Matchmaker]
+
+ vendor.id pci 0x10e8
+&device.id pci 0x8088
++device.name Kongsberg Spacetec Format Synchronizer
+
+ vendor.id pci 0x10e8
+&device.id pci 0x8089
++device.name Kongsberg Spacetec Serial Output Board
+
+ vendor.id pci 0x10e8
+&device.id pci 0x809c
++device.name S5933_HEPC3
+
+ vendor.id pci 0x10e8
+&device.id pci 0x80d7
++device.name PCI-9112
+
+ vendor.id pci 0x10e8
+&device.id pci 0x80d9
++device.name PCI-9118
+
+ vendor.id pci 0x10e8
+&device.id pci 0x80da
++device.name PCI-9812
+
+ vendor.id pci 0x10e8
+&device.id pci 0x811a
++device.name PCI-IEEE1355-DS-DE Interface
+
+ vendor.id pci 0x10e8
+&device.id pci 0x814c
++device.name Fastcom ESCC-PCI (Commtech, Inc.)
+
+ vendor.id pci 0x10e8
+&device.id pci 0x8170
++device.name S5933 [Matchmaker] (Chipset Development Tool)
+
+ vendor.id pci 0x10e8
+&device.id pci 0x81e6
++device.name Multimedia video controller
+
+ vendor.id pci 0x10e8
+&device.id pci 0x8291
++device.name Fastcom 232/8-PCI (Commtech, Inc.)
+
+ vendor.id pci 0x10e8
+&device.id pci 0x82c4
++device.name Fastcom 422/4-PCI (Commtech, Inc.)
+
+ vendor.id pci 0x10e8
+&device.id pci 0x82c5
++device.name Fastcom 422/2-PCI (Commtech, Inc.)
+
+ vendor.id pci 0x10e8
+&device.id pci 0x82c6
++device.name Fastcom IG422/1-PCI (Commtech, Inc.)
+
+ vendor.id pci 0x10e8
+&device.id pci 0x82c7
++device.name Fastcom IG232/2-PCI (Commtech, Inc.)
+
+ vendor.id pci 0x10e8
+&device.id pci 0x82ca
++device.name Fastcom 232/4-PCI (Commtech, Inc.)
+
+ vendor.id pci 0x10e8
+&device.id pci 0x82db
++device.name AJA HDNTV HD SDI Framestore
+
+ vendor.id pci 0x10e8
+&device.id pci 0x82e2
++device.name Fastcom DIO24H-PCI (Commtech, Inc.)
+
+ vendor.id pci 0x10e8
+&device.id pci 0x8851
++device.name S5933 on Innes Corp FM Radio Capture card
+
+ vendor.id pci 0x10e9
++vendor.name Alps Electric Co., Ltd.
+
+ vendor.id pci 0x10ea
++vendor.name Intergraphics Systems
+
+ vendor.id pci 0x10ea
+&device.id pci 0x1680
++device.name IGA-1680
+
+ vendor.id pci 0x10ea
+&device.id pci 0x1682
++device.name IGA-1682
+
+ vendor.id pci 0x10ea
+&device.id pci 0x1683
++device.name IGA-1683
+
+ vendor.id pci 0x10ea
+&device.id pci 0x2000
++device.name CyberPro 2000
+
+ vendor.id pci 0x10ea
+&device.id pci 0x2010
++device.name CyberPro 2000A
+
+ vendor.id pci 0x10ea
+&device.id pci 0x5000
++device.name CyberPro 5000
+
+ vendor.id pci 0x10ea
+&device.id pci 0x5050
++device.name CyberPro 5050
+
+ vendor.id pci 0x10ea
+&device.id pci 0x5202
++device.name CyberPro 5202
+
+ vendor.id pci 0x10ea
+&device.id pci 0x5252
++device.name CyberPro5252
+
+ vendor.id pci 0x10eb
++vendor.name Artists Graphics
+
+ vendor.id pci 0x10eb
+&device.id pci 0x0101
++device.name 3GA
+
+ vendor.id pci 0x10eb
+&device.id pci 0x8111
++device.name Twist3 Frame Grabber
+
+ vendor.id pci 0x10ec
++vendor.name Realtek Semiconductor Co., Ltd.
+
+ vendor.id pci 0x10ec
+&device.id pci 0x8029
++device.name RTL-8029(AS)
+
+ vendor.id pci 0x10ec
+&device.id pci 0x8029
+&subvendor.id pci 0x10b8
+&subdevice.id pci 0x2011
++subdevice.name EZ-Card (SMC1208)
+
+ vendor.id pci 0x10ec
+&device.id pci 0x8029
+&subvendor.id pci 0x10ec
+&subdevice.id pci 0x8029
++subdevice.name RTL-8029(AS)
+
+ vendor.id pci 0x10ec
+&device.id pci 0x8029
+&subvendor.id pci 0x1113
+&subdevice.id pci 0x1208
++subdevice.name EN1208
+
+ vendor.id pci 0x10ec
+&device.id pci 0x8029
+&subvendor.id pci 0x1186
+&subdevice.id pci 0x0300
++subdevice.name DE-528
+
+ vendor.id pci 0x10ec
+&device.id pci 0x8029
+&subvendor.id pci 0x1259
+&subdevice.id pci 0x2400
++subdevice.name AT-2400
+
+ vendor.id pci 0x10ec
+&device.id pci 0x8129
++device.name RTL-8129
+
+ vendor.id pci 0x10ec
+&device.id pci 0x8129
+&subvendor.id pci 0x10ec
+&subdevice.id pci 0x8129
++subdevice.name RT8129 Fast Ethernet Adapter
+
+ vendor.id pci 0x10ec
+&device.id pci 0x8138
++device.name RT8139 (B/C) Cardbus Fast Ethernet Adapter
+
+ vendor.id pci 0x10ec
+&device.id pci 0x8138
+&subvendor.id pci 0x10ec
+&subdevice.id pci 0x8138
++subdevice.name RT8139 (B/C) Fast Ethernet Adapter
+
+ vendor.id pci 0x10ec
+&device.id pci 0x8139
++device.name RTL-8139/8139C/8139C+
+
+ vendor.id pci 0x10ec
+&device.id pci 0x8139
+&subvendor.id pci 0x0357
+&subdevice.id pci 0x000a
++subdevice.name TTP-Monitoring Card V2.0
+
+ vendor.id pci 0x10ec
+&device.id pci 0x8139
+&subvendor.id pci 0x1025
+&subdevice.id pci 0x005a
++subdevice.name TravelMate 290
+
+ vendor.id pci 0x10ec
+&device.id pci 0x8139
+&subvendor.id pci 0x1025
+&subdevice.id pci 0x8920
++subdevice.name ALN-325
+
+ vendor.id pci 0x10ec
+&device.id pci 0x8139
+&subvendor.id pci 0x1025
+&subdevice.id pci 0x8921
++subdevice.name ALN-325
+
+ vendor.id pci 0x10ec
+&device.id pci 0x8139
+&subvendor.id pci 0x1071
+&subdevice.id pci 0x8160
++subdevice.name MIM2000
+
+ vendor.id pci 0x10ec
+&device.id pci 0x8139
+&subvendor.id pci 0x10bd
+&subdevice.id pci 0x0320
++subdevice.name EP-320X-R
+
+ vendor.id pci 0x10ec
+&device.id pci 0x8139
+&subvendor.id pci 0x10ec
+&subdevice.id pci 0x8139
++subdevice.name RT8139
+
+ vendor.id pci 0x10ec
+&device.id pci 0x8139
+&subvendor.id pci 0x1113
+&subdevice.id pci 0xec01
++subdevice.name FNC-0107TX
+
+ vendor.id pci 0x10ec
+&device.id pci 0x8139
+&subvendor.id pci 0x1186
+&subdevice.id pci 0x1300
++subdevice.name DFE-538TX
+
+ vendor.id pci 0x10ec
+&device.id pci 0x8139
+&subvendor.id pci 0x1186
+&subdevice.id pci 0x1320
++subdevice.name SN5200
+
+ vendor.id pci 0x10ec
+&device.id pci 0x8139
+&subvendor.id pci 0x1186
+&subdevice.id pci 0x8139
++subdevice.name DRN-32TX
+
+ vendor.id pci 0x10ec
+&device.id pci 0x8139
+&subvendor.id pci 0x11f6
+&subdevice.id pci 0x8139
++subdevice.name FN22-3(A) LinxPRO Ethernet Adapter
+
+ vendor.id pci 0x10ec
+&device.id pci 0x8139
+&subvendor.id pci 0x1259
+&subdevice.id pci 0x2500
++subdevice.name AT-2500TX
+
+ vendor.id pci 0x10ec
+&device.id pci 0x8139
+&subvendor.id pci 0x1259
+&subdevice.id pci 0x2503
++subdevice.name AT-2500TX/ACPI
+
+ vendor.id pci 0x10ec
+&device.id pci 0x8139
+&subvendor.id pci 0x1429
+&subdevice.id pci 0xd010
++subdevice.name ND010
+
+ vendor.id pci 0x10ec
+&device.id pci 0x8139
+&subvendor.id pci 0x1432
+&subdevice.id pci 0x9130
++subdevice.name EN-9130TX
+
+ vendor.id pci 0x10ec
+&device.id pci 0x8139
+&subvendor.id pci 0x1436
+&subdevice.id pci 0x8139
++subdevice.name RT8139
+
+ vendor.id pci 0x10ec
+&device.id pci 0x8139
+&subvendor.id pci 0x1458
+&subdevice.id pci 0xe000
++subdevice.name GA-7VM400M/7VT600 Motherboard
+
+ vendor.id pci 0x10ec
+&device.id pci 0x8139
+&subvendor.id pci 0x146c
+&subdevice.id pci 0x1439
++subdevice.name FE-1439TX
+
+ vendor.id pci 0x10ec
+&device.id pci 0x8139
+&subvendor.id pci 0x1489
+&subdevice.id pci 0x6001
++subdevice.name GF100TXRII
+
+ vendor.id pci 0x10ec
+&device.id pci 0x8139
+&subvendor.id pci 0x1489
+&subdevice.id pci 0x6002
++subdevice.name GF100TXRA
+
+ vendor.id pci 0x10ec
+&device.id pci 0x8139
+&subvendor.id pci 0x149c
+&subdevice.id pci 0x139a
++subdevice.name LFE-8139ATX
+
+ vendor.id pci 0x10ec
+&device.id pci 0x8139
+&subvendor.id pci 0x149c
+&subdevice.id pci 0x8139
++subdevice.name LFE-8139TX
+
+ vendor.id pci 0x10ec
+&device.id pci 0x8139
+&subvendor.id pci 0x14cb
+&subdevice.id pci 0x0200
++subdevice.name LNR-100 Family 10/100 Base-TX Ethernet
+
+ vendor.id pci 0x10ec
+&device.id pci 0x8139
+&subvendor.id pci 0x1799
+&subdevice.id pci 0x5000
++subdevice.name F5D5000 PCI Card/Desktop Network PCI Card
+
+ vendor.id pci 0x10ec
+&device.id pci 0x8139
+&subvendor.id pci 0x2646
+&subdevice.id pci 0x0001
++subdevice.name EtheRx
+
+ vendor.id pci 0x10ec
+&device.id pci 0x8139
+&subvendor.id pci 0x8e2e
+&subdevice.id pci 0x7000
++subdevice.name KF-230TX
+
+ vendor.id pci 0x10ec
+&device.id pci 0x8139
+&subvendor.id pci 0x8e2e
+&subdevice.id pci 0x7100
++subdevice.name KF-230TX/2
+
+ vendor.id pci 0x10ec
+&device.id pci 0x8139
+&subvendor.id pci 0xa0a0
+&subdevice.id pci 0x0007
++subdevice.name ALN-325C
+
+ vendor.id pci 0x10ec
+&device.id pci 0x8169
++device.name RTL-8169 Gigabit Ethernet
+
+ vendor.id pci 0x10ec
+&device.id pci 0x8169
+&subvendor.id pci 0x1259
+&subdevice.id pci 0xc107
++subdevice.name CG-LAPCIGT
+
+ vendor.id pci 0x10ec
+&device.id pci 0x8169
+&subvendor.id pci 0x1371
+&subdevice.id pci 0x434e
++subdevice.name ProG-2000L
+
+ vendor.id pci 0x10ec
+&device.id pci 0x8169
+&subvendor.id pci 0x1458
+&subdevice.id pci 0xe000
++subdevice.name GA-K8VT800 Pro Motherboard
+
+ vendor.id pci 0x10ec
+&device.id pci 0x8169
+&subvendor.id pci 0x1462
+&subdevice.id pci 0x702c
++subdevice.name K8T NEO 2 motherboard
+
+ vendor.id pci 0x10ec
+&device.id pci 0x8180
++device.name RTL8180L 802.11b MAC
+
+ vendor.id pci 0x10ec
+&device.id pci 0x8197
++device.name SmartLAN56 56K Modem
+
+ vendor.id pci 0x10ed
++vendor.name Ascii Corporation
+
+ vendor.id pci 0x10ed
+&device.id pci 0x7310
++device.name V7310
+
+ vendor.id pci 0x10ee
++vendor.name Xilinx Corporation
+
+ vendor.id pci 0x10ee
+&device.id pci 0x3fc0
++device.name RME Digi96
+
+ vendor.id pci 0x10ee
+&device.id pci 0x3fc1
++device.name RME Digi96/8
+
+ vendor.id pci 0x10ee
+&device.id pci 0x3fc2
++device.name RME Digi96/8 Pro
+
+ vendor.id pci 0x10ee
+&device.id pci 0x3fc3
++device.name RME Digi96/8 Pad
+
+ vendor.id pci 0x10ee
+&device.id pci 0x3fc4
++device.name RME Digi9652 (Hammerfall)
+
+ vendor.id pci 0x10ee
+&device.id pci 0x3fc5
++device.name RME Hammerfall DSP
+
+ vendor.id pci 0x10ee
+&device.id pci 0x3fc6
++device.name RME Hammerfall DSP MADI
+
+ vendor.id pci 0x10ee
+&device.id pci 0x8381
++device.name Ellips Santos Frame Grabber
+
+ vendor.id pci 0x10ef
++vendor.name Racore Computer Products, Inc.
+
+ vendor.id pci 0x10ef
+&device.id pci 0x8154
++device.name M815x Token Ring Adapter
+
+ vendor.id pci 0x10f0
++vendor.name Peritek Corporation
+
+ vendor.id pci 0x10f1
++vendor.name Tyan Computer
+
+ vendor.id pci 0x10f2
++vendor.name Achme Computer, Inc.
+
+ vendor.id pci 0x10f3
++vendor.name Alaris, Inc.
+
+ vendor.id pci 0x10f4
++vendor.name S-MOS Systems, Inc.
+
+ vendor.id pci 0x10f5
++vendor.name NKK Corporation
+
+ vendor.id pci 0x10f5
+&device.id pci 0xa001
++device.name NDR4000 [NR4600 Bridge]
+
+ vendor.id pci 0x10f6
++vendor.name Creative Electronic Systems SA
+
+ vendor.id pci 0x10f7
++vendor.name Matsushita Electric Industrial Co., Ltd.
+
+ vendor.id pci 0x10f8
++vendor.name Altos India Ltd
+
+ vendor.id pci 0x10f9
++vendor.name PC Direct
+
+ vendor.id pci 0x10fa
++vendor.name Truevision
+
+ vendor.id pci 0x10fa
+&device.id pci 0x000c
++device.name TARGA 1000
+
+ vendor.id pci 0x10fb
++vendor.name Thesys Gesellschaft fuer Mikroelektronik mbH
+
+ vendor.id pci 0x10fb
+&device.id pci 0x186f
++device.name TH 6255
+
+ vendor.id pci 0x10fc
++vendor.name I-O Data Device, Inc.
+
+ vendor.id pci 0x10fc
+&device.id pci 0x0003
++device.name Cardbus IDE Controller
+
+ vendor.id pci 0x10fc
+&device.id pci 0x0005
++device.name Cardbus SCSI CBSC II
+
+ vendor.id pci 0x10fd
++vendor.name Soyo Computer, Inc
+
+ vendor.id pci 0x10fe
++vendor.name Fast Multimedia AG
+
+ vendor.id pci 0x10ff
++vendor.name NCube
+
+ vendor.id pci 0x1100
++vendor.name Jazz Multimedia
+
+ vendor.id pci 0x1101
++vendor.name Initio Corporation
+
+ vendor.id pci 0x1101
+&device.id pci 0x1060
++device.name INI-A100U2W
+
+ vendor.id pci 0x1101
+&device.id pci 0x9100
++device.name INI-9100/9100W
+
+ vendor.id pci 0x1101
+&device.id pci 0x9400
++device.name INI-940
+
+ vendor.id pci 0x1101
+&device.id pci 0x9401
++device.name INI-950
+
+ vendor.id pci 0x1101
+&device.id pci 0x9500
++device.name 360P
+
+ vendor.id pci 0x1101
+&device.id pci 0x9502
++device.name Initio INI-9100UW Ultra Wide SCSI Controller INIC-950P chip
+
+ vendor.id pci 0x1102
++vendor.name Creative Labs
+
+ vendor.id pci 0x1102
+&device.id pci 0x0002
++device.name SB Live! EMU10k1
+
+ vendor.id pci 0x1102
+&device.id pci 0x0002
+&subvendor.id pci 0x1102
+&subdevice.id pci 0x0020
++subdevice.name CT4850 SBLive! Value
+
+ vendor.id pci 0x1102
+&device.id pci 0x0002
+&subvendor.id pci 0x1102
+&subdevice.id pci 0x0021
++subdevice.name CT4620 SBLive!
+
+ vendor.id pci 0x1102
+&device.id pci 0x0002
+&subvendor.id pci 0x1102
+&subdevice.id pci 0x002f
++subdevice.name SBLive! mainboard implementation
+
+ vendor.id pci 0x1102
+&device.id pci 0x0002
+&subvendor.id pci 0x1102
+&subdevice.id pci 0x4001
++subdevice.name E-mu APS
+
+ vendor.id pci 0x1102
+&device.id pci 0x0002
+&subvendor.id pci 0x1102
+&subdevice.id pci 0x8022
++subdevice.name CT4780 SBLive! Value
+
+ vendor.id pci 0x1102
+&device.id pci 0x0002
+&subvendor.id pci 0x1102
+&subdevice.id pci 0x8023
++subdevice.name CT4790 SoundBlaster PCI512
+
+ vendor.id pci 0x1102
+&device.id pci 0x0002
+&subvendor.id pci 0x1102
+&subdevice.id pci 0x8024
++subdevice.name CT4760 SBLive!
+
+ vendor.id pci 0x1102
+&device.id pci 0x0002
+&subvendor.id pci 0x1102
+&subdevice.id pci 0x8025
++subdevice.name SBLive! Mainboard Implementation
+
+ vendor.id pci 0x1102
+&device.id pci 0x0002
+&subvendor.id pci 0x1102
+&subdevice.id pci 0x8026
++subdevice.name CT4830 SBLive! Value
+
+ vendor.id pci 0x1102
+&device.id pci 0x0002
+&subvendor.id pci 0x1102
+&subdevice.id pci 0x8027
++subdevice.name CT4832 SBLive! Value
+
+ vendor.id pci 0x1102
+&device.id pci 0x0002
+&subvendor.id pci 0x1102
+&subdevice.id pci 0x8028
++subdevice.name CT4760 SBLive! OEM version
+
+ vendor.id pci 0x1102
+&device.id pci 0x0002
+&subvendor.id pci 0x1102
+&subdevice.id pci 0x8031
++subdevice.name CT4831 SBLive! Value
+
+ vendor.id pci 0x1102
+&device.id pci 0x0002
+&subvendor.id pci 0x1102
+&subdevice.id pci 0x8040
++subdevice.name CT4760 SBLive!
+
+ vendor.id pci 0x1102
+&device.id pci 0x0002
+&subvendor.id pci 0x1102
+&subdevice.id pci 0x8051
++subdevice.name CT4850 SBLive! Value
+
+ vendor.id pci 0x1102
+&device.id pci 0x0002
+&subvendor.id pci 0x1102
+&subdevice.id pci 0x8061
++subdevice.name SBLive! Player 5.1
+
+ vendor.id pci 0x1102
+&device.id pci 0x0002
+&subvendor.id pci 0x1102
+&subdevice.id pci 0x8064
++subdevice.name SB Live! 5.1 Model SB0100
+
+ vendor.id pci 0x1102
+&device.id pci 0x0002
+&subvendor.id pci 0x1102
+&subdevice.id pci 0x8065
++subdevice.name SBLive! 5.1 Digital Model SB0220
+
+ vendor.id pci 0x1102
+&device.id pci 0x0002
+&subvendor.id pci 0x1102
+&subdevice.id pci 0x8067
++subdevice.name SBLive! 5.1 eMicro 28028
+
+ vendor.id pci 0x1102
+&device.id pci 0x0004
++device.name SB Audigy
+
+ vendor.id pci 0x1102
+&device.id pci 0x0004
+&subvendor.id pci 0x1102
+&subdevice.id pci 0x0051
++subdevice.name SB0090 Audigy Player
+
+ vendor.id pci 0x1102
+&device.id pci 0x0004
+&subvendor.id pci 0x1102
+&subdevice.id pci 0x0053
++subdevice.name SB0090 Audigy Player/OEM
+
+ vendor.id pci 0x1102
+&device.id pci 0x0004
+&subvendor.id pci 0x1102
+&subdevice.id pci 0x0058
++subdevice.name SB0090 Audigy Player/OEM
+
+ vendor.id pci 0x1102
+&device.id pci 0x0004
+&subvendor.id pci 0x1102
+&subdevice.id pci 0x2002
++subdevice.name SB Audigy 2 ZS (SB0350)
+
+ vendor.id pci 0x1102
+&device.id pci 0x0006
++device.name [SB Live! Value] EMU10k1X
+
+ vendor.id pci 0x1102
+&device.id pci 0x0007
++device.name SB Audigy LS
+
+ vendor.id pci 0x1102
+&device.id pci 0x0007
+&subvendor.id pci 0x1102
+&subdevice.id pci 0x1001
++subdevice.name SB0310 Audigy LS
+
+ vendor.id pci 0x1102
+&device.id pci 0x0007
+&subvendor.id pci 0x1102
+&subdevice.id pci 0x1002
++subdevice.name SB0312 Audigy LS
+
+ vendor.id pci 0x1102
+&device.id pci 0x0008
++device.name SB0400 Audigy2 Value
+
+ vendor.id pci 0x1102
+&device.id pci 0x4001
++device.name SB Audigy FireWire Port
+
+ vendor.id pci 0x1102
+&device.id pci 0x4001
+&subvendor.id pci 0x1102
+&subdevice.id pci 0x0010
++subdevice.name SB Audigy FireWire Port
+
+ vendor.id pci 0x1102
+&device.id pci 0x7002
++device.name SB Live! MIDI/Game Port
+
+ vendor.id pci 0x1102
+&device.id pci 0x7002
+&subvendor.id pci 0x1102
+&subdevice.id pci 0x0020
++subdevice.name Gameport Joystick
+
+ vendor.id pci 0x1102
+&device.id pci 0x7003
++device.name SB Audigy MIDI/Game port
+
+ vendor.id pci 0x1102
+&device.id pci 0x7003
+&subvendor.id pci 0x1102
+&subdevice.id pci 0x0040
++subdevice.name SB Audigy MIDI/Game Port
+
+ vendor.id pci 0x1102
+&device.id pci 0x7004
++device.name [SB Live! Value] Input device controller
+
+ vendor.id pci 0x1102
+&device.id pci 0x7005
++device.name SB Audigy LS MIDI/Game port
+
+ vendor.id pci 0x1102
+&device.id pci 0x7005
+&subvendor.id pci 0x1102
+&subdevice.id pci 0x1001
++subdevice.name SB0310 Audigy LS MIDI/Game port
+
+ vendor.id pci 0x1102
+&device.id pci 0x7005
+&subvendor.id pci 0x1102
+&subdevice.id pci 0x1002
++subdevice.name SB0312 Audigy LS MIDI/Game port
+
+ vendor.id pci 0x1102
+&device.id pci 0x8064
++device.name SB0100 [SBLive! 5.1 OEM]
+
+ vendor.id pci 0x1102
+&device.id pci 0x8938
++device.name Ectiva EV1938
+
+ vendor.id pci 0x1103
++vendor.name Triones Technologies, Inc.
+
+ vendor.id pci 0x1103
+&device.id pci 0x0003
++device.name HPT343
+
+ vendor.id pci 0x1103
+&device.id pci 0x0004
++device.name HPT366/368/370/370A/372
+
+ vendor.id pci 0x1103
+&device.id pci 0x0004
+&subvendor.id pci 0x1103
+&subdevice.id pci 0x0001
++subdevice.name HPT370A
+
+ vendor.id pci 0x1103
+&device.id pci 0x0004
+&subvendor.id pci 0x1103
+&subdevice.id pci 0x0003
++subdevice.name HPT343 / HPT345 / HPT363 UDMA33
+
+ vendor.id pci 0x1103
+&device.id pci 0x0004
+&subvendor.id pci 0x1103
+&subdevice.id pci 0x0004
++subdevice.name HPT366 UDMA66 (r1) / HPT368 UDMA66 (r2) / HPT370 UDMA100 (r3) / HPT370 UDMA100 RAID (r4)
+
+ vendor.id pci 0x1103
+&device.id pci 0x0004
+&subvendor.id pci 0x1103
+&subdevice.id pci 0x0005
++subdevice.name HPT370 UDMA100
+
+ vendor.id pci 0x1103
+&device.id pci 0x0004
+&subvendor.id pci 0x1103
+&subdevice.id pci 0x0006
++subdevice.name HPT302
+
+ vendor.id pci 0x1103
+&device.id pci 0x0004
+&subvendor.id pci 0x1103
+&subdevice.id pci 0x0007
++subdevice.name HPT371 UDMA133
+
+ vendor.id pci 0x1103
+&device.id pci 0x0004
+&subvendor.id pci 0x1103
+&subdevice.id pci 0x0008
++subdevice.name HPT374 UDMA/ATA133 RAID Controller
+
+ vendor.id pci 0x1103
+&device.id pci 0x0005
++device.name HPT372A
+
+ vendor.id pci 0x1103
+&device.id pci 0x0006
++device.name HPT302
+
+ vendor.id pci 0x1103
+&device.id pci 0x0007
++device.name HPT371
+
+ vendor.id pci 0x1103
+&device.id pci 0x0008
++device.name HPT374
+
+ vendor.id pci 0x1103
+&device.id pci 0x0009
++device.name HPT372N
+
+ vendor.id pci 0x1104
++vendor.name RasterOps Corp.
+
+ vendor.id pci 0x1105
++vendor.name Sigma Designs, Inc.
+
+ vendor.id pci 0x1105
+&device.id pci 0x1105
++device.name REALmagic Xcard MPEG 1/2/3/4 DVD Decoder
+
+ vendor.id pci 0x1105
+&device.id pci 0x8300
++device.name REALmagic Hollywood Plus DVD Decoder
+
+ vendor.id pci 0x1105
+&device.id pci 0x8400
++device.name EM840x REALmagic DVD/MPEG-2 Audio/Video Decoder
+
+ vendor.id pci 0x1105
+&device.id pci 0x8401
++device.name EM8401 REALmagic DVD/MPEG-2 A/V Decoder
+
+ vendor.id pci 0x1105
+&device.id pci 0x8470
++device.name EM8470 REALmagic DVD/MPEG-4 A/V Decoder
+
+ vendor.id pci 0x1105
+&device.id pci 0x8471
++device.name EM8471 REALmagic DVD/MPEG-4 A/V Decoder
+
+ vendor.id pci 0x1105
+&device.id pci 0x8475
++device.name EM8475 REALmagic DVD/MPEG-4 A/V Decoder
+
+ vendor.id pci 0x1105
+&device.id pci 0x8476
++device.name EM8476 REALmagic DVD/MPEG-4 A/V Decoder
+
+ vendor.id pci 0x1105
+&device.id pci 0x8485
++device.name EM8485 REALmagic DVD/MPEG-4 A/V Decoder
+
+ vendor.id pci 0x1105
+&device.id pci 0x8486
++device.name EM8486 REALmagic DVD/MPEG-4 A/V Decoder
+
+ vendor.id pci 0x1106
++vendor.name VIA Technologies, Inc.
+
+ vendor.id pci 0x1106
+&device.id pci 0x0102
++device.name Embedded VIA Ethernet Controller
+
+ vendor.id pci 0x1106
+&device.id pci 0x0130
++device.name VT6305 1394.A Controller
+
+ vendor.id pci 0x1106
+&device.id pci 0x0305
++device.name VT8363/8365 [KT133/KM133]
+
+ vendor.id pci 0x1106
+&device.id pci 0x0305
+&subvendor.id pci 0x1043
+&subdevice.id pci 0x8033
++subdevice.name A7V Mainboard
+
+ vendor.id pci 0x1106
+&device.id pci 0x0305
+&subvendor.id pci 0x1043
+&subdevice.id pci 0x803e
++subdevice.name A7V-E Mainboard
+
+ vendor.id pci 0x1106
+&device.id pci 0x0305
+&subvendor.id pci 0x1043
+&subdevice.id pci 0x8042
++subdevice.name A7V133/A7V133-C Mainboard
+
+ vendor.id pci 0x1106
+&device.id pci 0x0305
+&subvendor.id pci 0x147b
+&subdevice.id pci 0xa401
++subdevice.name KT7/KT7-RAID/KT7A/KT7A-RAID Mainboard
+
+ vendor.id pci 0x1106
+&device.id pci 0x0391
++device.name VT8371 [KX133]
+
+ vendor.id pci 0x1106
+&device.id pci 0x0501
++device.name VT8501 [Apollo MVP4]
+
+ vendor.id pci 0x1106
+&device.id pci 0x0505
++device.name VT82C505
+
+ vendor.id pci 0x1106
+&device.id pci 0x0561
++device.name VT82C576MV
+
+ vendor.id pci 0x1106
+&device.id pci 0x0571
++device.name VT82C586A/B/VT82C686/A/B/VT823x/A/C PIPC Bus Master IDE
+
+ vendor.id pci 0x1106
+&device.id pci 0x0571
+&subvendor.id pci 0x1019
+&subdevice.id pci 0x0985
++subdevice.name P6VXA Motherboard
+
+ vendor.id pci 0x1106
+&device.id pci 0x0571
+&subvendor.id pci 0x1019
+&subdevice.id pci 0x0a81
++subdevice.name L7VTA v1.0 Motherboard (KT400-8235)
+
+ vendor.id pci 0x1106
+&device.id pci 0x0571
+&subvendor.id pci 0x1043
+&subdevice.id pci 0x8052
++subdevice.name VT8233A Bus Master ATA100/66/33 IDE
+
+ vendor.id pci 0x1106
+&device.id pci 0x0571
+&subvendor.id pci 0x1043
+&subdevice.id pci 0x808c
++subdevice.name A7V8X motherboard
+
+ vendor.id pci 0x1106
+&device.id pci 0x0571
+&subvendor.id pci 0x1043
+&subdevice.id pci 0x80a1
++subdevice.name A7V8X-X motherboard rev. 1.01
+
+ vendor.id pci 0x1106
+&device.id pci 0x0571
+&subvendor.id pci 0x1043
+&subdevice.id pci 0x80ed
++subdevice.name A7V600 motherboard
+
+ vendor.id pci 0x1106
+&device.id pci 0x0571
+&subvendor.id pci 0x1106
+&subdevice.id pci 0x0571
++subdevice.name VT82C586/B/VT82C686/A/B/VT8233/A/C/VT8235 PIPC Bus Master IDE
+
+ vendor.id pci 0x1106
+&device.id pci 0x0571
+&subvendor.id pci 0x1179
+&subdevice.id pci 0x0001
++subdevice.name Magnia Z310
+
+ vendor.id pci 0x1106
+&device.id pci 0x0571
+&subvendor.id pci 0x1297
+&subdevice.id pci 0xf641
++subdevice.name FX41 motherboard
+
+ vendor.id pci 0x1106
+&device.id pci 0x0571
+&subvendor.id pci 0x1458
+&subdevice.id pci 0x5002
++subdevice.name GA-7VAX Mainboard
+
+ vendor.id pci 0x1106
+&device.id pci 0x0571
+&subvendor.id pci 0x1462
+&subdevice.id pci 0x7020
++subdevice.name K8T NEO 2 motherboard
+
+ vendor.id pci 0x1106
+&device.id pci 0x0571
+&subvendor.id pci 0x147b
+&subdevice.id pci 0x1407
++subdevice.name KV8-MAX3 motherboard
+
+ vendor.id pci 0x1106
+&device.id pci 0x0571
+&subvendor.id pci 0x1849
+&subdevice.id pci 0x0571
++subdevice.name K7VT2 motherboard
+
+ vendor.id pci 0x1106
+&device.id pci 0x0576
++device.name VT82C576 3V [Apollo Master]
+
+ vendor.id pci 0x1106
+&device.id pci 0x0585
++device.name VT82C585VP [Apollo VP1/VPX]
+
+ vendor.id pci 0x1106
+&device.id pci 0x0586
++device.name VT82C586/A/B PCI-to-ISA [Apollo VP]
+
+ vendor.id pci 0x1106
+&device.id pci 0x0586
+&subvendor.id pci 0x1106
+&subdevice.id pci 0x0000
++subdevice.name MVP3 ISA Bridge
+
+ vendor.id pci 0x1106
+&device.id pci 0x0595
++device.name VT82C595 [Apollo VP2]
+
+ vendor.id pci 0x1106
+&device.id pci 0x0596
++device.name VT82C596 ISA [Mobile South]
+
+ vendor.id pci 0x1106
+&device.id pci 0x0596
+&subvendor.id pci 0x1106
+&subdevice.id pci 0x0000
++subdevice.name VT82C596/A/B PCI to ISA Bridge
+
+ vendor.id pci 0x1106
+&device.id pci 0x0596
+&subvendor.id pci 0x1458
+&subdevice.id pci 0x0596
++subdevice.name VT82C596/A/B PCI to ISA Bridge
+
+ vendor.id pci 0x1106
+&device.id pci 0x0597
++device.name VT82C597 [Apollo VP3]
+
+ vendor.id pci 0x1106
+&device.id pci 0x0598
++device.name VT82C598 [Apollo MVP3]
+
+ vendor.id pci 0x1106
+&device.id pci 0x0601
++device.name VT8601 [Apollo ProMedia]
+
+ vendor.id pci 0x1106
+&device.id pci 0x0605
++device.name VT8605 [ProSavage PM133]
+
+ vendor.id pci 0x1106
+&device.id pci 0x0605
+&subvendor.id pci 0x1043
+&subdevice.id pci 0x802c
++subdevice.name CUV4X mainboard
+
+ vendor.id pci 0x1106
+&device.id pci 0x0680
++device.name VT82C680 [Apollo P6]
+
+ vendor.id pci 0x1106
+&device.id pci 0x0686
++device.name VT82C686 [Apollo Super South]
+
+ vendor.id pci 0x1106
+&device.id pci 0x0686
+&subvendor.id pci 0x1019
+&subdevice.id pci 0x0985
++subdevice.name P6VXA Motherboard
+
+ vendor.id pci 0x1106
+&device.id pci 0x0686
+&subvendor.id pci 0x1043
+&subdevice.id pci 0x802c
++subdevice.name CUV4X mainboard
+
+ vendor.id pci 0x1106
+&device.id pci 0x0686
+&subvendor.id pci 0x1043
+&subdevice.id pci 0x8033
++subdevice.name A7V Mainboard
+
+ vendor.id pci 0x1106
+&device.id pci 0x0686
+&subvendor.id pci 0x1043
+&subdevice.id pci 0x803e
++subdevice.name A7V-E Mainboard
+
+ vendor.id pci 0x1106
+&device.id pci 0x0686
+&subvendor.id pci 0x1043
+&subdevice.id pci 0x8040
++subdevice.name A7M266 Mainboard
+
+ vendor.id pci 0x1106
+&device.id pci 0x0686
+&subvendor.id pci 0x1043
+&subdevice.id pci 0x8042
++subdevice.name A7V133/A7V133-C Mainboard
+
+ vendor.id pci 0x1106
+&device.id pci 0x0686
+&subvendor.id pci 0x1106
+&subdevice.id pci 0x0000
++subdevice.name VT82C686/A PCI to ISA Bridge
+
+ vendor.id pci 0x1106
+&device.id pci 0x0686
+&subvendor.id pci 0x1106
+&subdevice.id pci 0x0686
++subdevice.name VT82C686/A PCI to ISA Bridge
+
+ vendor.id pci 0x1106
+&device.id pci 0x0686
+&subvendor.id pci 0x1179
+&subdevice.id pci 0x0001
++subdevice.name Magnia Z310
+
+ vendor.id pci 0x1106
+&device.id pci 0x0686
+&subvendor.id pci 0x147b
+&subdevice.id pci 0xa702
++subdevice.name KG7-Lite Mainboard
+
+ vendor.id pci 0x1106
+&device.id pci 0x0691
++device.name VT82C693A/694x [Apollo PRO133x]
+
+ vendor.id pci 0x1106
+&device.id pci 0x0691
+&subvendor.id pci 0x1019
+&subdevice.id pci 0x0985
++subdevice.name P6VXA Motherboard
+
+ vendor.id pci 0x1106
+&device.id pci 0x0691
+&subvendor.id pci 0x1179
+&subdevice.id pci 0x0001
++subdevice.name Magnia Z310
+
+ vendor.id pci 0x1106
+&device.id pci 0x0691
+&subvendor.id pci 0x1458
+&subdevice.id pci 0x0691
++subdevice.name VT82C691 Apollo Pro System Controller
+
+ vendor.id pci 0x1106
+&device.id pci 0x0693
++device.name VT82C693 [Apollo Pro Plus]
+
+ vendor.id pci 0x1106
+&device.id pci 0x0698
++device.name VT82C693A [Apollo Pro133 AGP]
+
+ vendor.id pci 0x1106
+&device.id pci 0x0926
++device.name VT82C926 [Amazon]
+
+ vendor.id pci 0x1106
+&device.id pci 0x1000
++device.name VT82C570MV
+
+ vendor.id pci 0x1106
+&device.id pci 0x1106
++device.name VT82C570MV
+
+ vendor.id pci 0x1106
+&device.id pci 0x1571
++device.name VT82C576M/VT82C586
+
+ vendor.id pci 0x1106
+&device.id pci 0x1595
++device.name VT82C595/97 [Apollo VP2/97]
+
+ vendor.id pci 0x1106
+&device.id pci 0x3022
++device.name CLE266
+
+ vendor.id pci 0x1106
+&device.id pci 0x3038
++device.name VT82xxxxx UHCI USB 1.1 Controller
+
+ vendor.id pci 0x1106
+&device.id pci 0x3038
+&subvendor.id pci 0x0925
+&subdevice.id pci 0x1234
++subdevice.name USB Controller
+
+ vendor.id pci 0x1106
+&device.id pci 0x3038
+&subvendor.id pci 0x1019
+&subdevice.id pci 0x0985
++subdevice.name P6VXA Motherboard
+
+ vendor.id pci 0x1106
+&device.id pci 0x3038
+&subvendor.id pci 0x1019
+&subdevice.id pci 0x0a81
++subdevice.name L7VTA v1.0 Motherboard (KT400-8235)
+
+ vendor.id pci 0x1106
+&device.id pci 0x3038
+&subvendor.id pci 0x1043
+&subdevice.id pci 0x808c
++subdevice.name VT6202 USB2.0 4 port controller
+
+ vendor.id pci 0x1106
+&device.id pci 0x3038
+&subvendor.id pci 0x1043
+&subdevice.id pci 0x80a1
++subdevice.name A7V8X-X motherboard
+
+ vendor.id pci 0x1106
+&device.id pci 0x3038
+&subvendor.id pci 0x1043
+&subdevice.id pci 0x80ed
++subdevice.name A7V600 motherboard
+
+ vendor.id pci 0x1106
+&device.id pci 0x3038
+&subvendor.id pci 0x1179
+&subdevice.id pci 0x0001
++subdevice.name Magnia Z310
+
+ vendor.id pci 0x1106
+&device.id pci 0x3038
+&subvendor.id pci 0x1458
+&subdevice.id pci 0x5004
++subdevice.name GA-7VAX Mainboard
+
+ vendor.id pci 0x1106
+&device.id pci 0x3038
+&subvendor.id pci 0x1462
+&subdevice.id pci 0x7020
++subdevice.name K8T NEO 2 motherboard
+
+ vendor.id pci 0x1106
+&device.id pci 0x3038
+&subvendor.id pci 0x147b
+&subdevice.id pci 0x1407
++subdevice.name KV8-MAX3 motherboard
+
+ vendor.id pci 0x1106
+&device.id pci 0x3040
++device.name VT82C586B ACPI
+
+ vendor.id pci 0x1106
+&device.id pci 0x3043
++device.name VT86C100A [Rhine]
+
+ vendor.id pci 0x1106
+&device.id pci 0x3043
+&subvendor.id pci 0x10bd
+&subdevice.id pci 0x0000
++subdevice.name VT86C100A Fast Ethernet Adapter
+
+ vendor.id pci 0x1106
+&device.id pci 0x3043
+&subvendor.id pci 0x1106
+&subdevice.id pci 0x0100
++subdevice.name VT86C100A Fast Ethernet Adapter
+
+ vendor.id pci 0x1106
+&device.id pci 0x3043
+&subvendor.id pci 0x1186
+&subdevice.id pci 0x1400
++subdevice.name DFE-530TX rev A
+
+ vendor.id pci 0x1106
+&device.id pci 0x3044
++device.name IEEE 1394 Host Controller
+
+ vendor.id pci 0x1106
+&device.id pci 0x3044
+&subvendor.id pci 0x1025
+&subdevice.id pci 0x005a
++subdevice.name TravelMate 290
+
+ vendor.id pci 0x1106
+&device.id pci 0x3044
+&subvendor.id pci 0x1458
+&subdevice.id pci 0x1000
++subdevice.name GA-7VT600-1394 Motherboard
+
+ vendor.id pci 0x1106
+&device.id pci 0x3044
+&subvendor.id pci 0x1462
+&subdevice.id pci 0x702d
++subdevice.name K8T NEO 2 motherboard
+
+ vendor.id pci 0x1106
+&device.id pci 0x3050
++device.name VT82C596 Power Management
+
+ vendor.id pci 0x1106
+&device.id pci 0x3051
++device.name VT82C596 Power Management
+
+ vendor.id pci 0x1106
+&device.id pci 0x3053
++device.name VT6105M [Rhine-III]
+
+ vendor.id pci 0x1106
+&device.id pci 0x3057
++device.name VT82C686 [Apollo Super ACPI]
+
+ vendor.id pci 0x1106
+&device.id pci 0x3057
+&subvendor.id pci 0x1019
+&subdevice.id pci 0x0985
++subdevice.name P6VXA Motherboard
+
+ vendor.id pci 0x1106
+&device.id pci 0x3057
+&subvendor.id pci 0x1043
+&subdevice.id pci 0x8033
++subdevice.name A7V Mainboard
+
+ vendor.id pci 0x1106
+&device.id pci 0x3057
+&subvendor.id pci 0x1043
+&subdevice.id pci 0x803e
++subdevice.name A7V-E Mainboard
+
+ vendor.id pci 0x1106
+&device.id pci 0x3057
+&subvendor.id pci 0x1043
+&subdevice.id pci 0x8040
++subdevice.name A7M266 Mainboard
+
+ vendor.id pci 0x1106
+&device.id pci 0x3057
+&subvendor.id pci 0x1043
+&subdevice.id pci 0x8042
++subdevice.name A7V133/A7V133-C Mainboard
+
+ vendor.id pci 0x1106
+&device.id pci 0x3057
+&subvendor.id pci 0x1179
+&subdevice.id pci 0x0001
++subdevice.name Magnia Z310
+
+ vendor.id pci 0x1106
+&device.id pci 0x3058
++device.name VT82C686 AC97 Audio Controller
+
+ vendor.id pci 0x1106
+&device.id pci 0x3058
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0x0097
++subdevice.name SoundMax Digital Integrated Audio
+
+ vendor.id pci 0x1106
+&device.id pci 0x3058
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0xb194
++subdevice.name Soundmax integrated digital audio
+
+ vendor.id pci 0x1106
+&device.id pci 0x3058
+&subvendor.id pci 0x1019
+&subdevice.id pci 0x0985
++subdevice.name P6VXA Motherboard
+
+ vendor.id pci 0x1106
+&device.id pci 0x3058
+&subvendor.id pci 0x1043
+&subdevice.id pci 0x1106
++subdevice.name A7V133/A7V133-C Mainboard
+
+ vendor.id pci 0x1106
+&device.id pci 0x3058
+&subvendor.id pci 0x1106
+&subdevice.id pci 0x4511
++subdevice.name Onboard Audio on EP7KXA
+
+ vendor.id pci 0x1106
+&device.id pci 0x3058
+&subvendor.id pci 0x1458
+&subdevice.id pci 0x7600
++subdevice.name Onboard Audio
+
+ vendor.id pci 0x1106
+&device.id pci 0x3058
+&subvendor.id pci 0x1462
+&subdevice.id pci 0x3091
++subdevice.name MS-6309 Onboard Audio
+
+ vendor.id pci 0x1106
+&device.id pci 0x3058
+&subvendor.id pci 0x1462
+&subdevice.id pci 0x3300
++subdevice.name MS-6330 Onboard Audio
+
+ vendor.id pci 0x1106
+&device.id pci 0x3058
+&subvendor.id pci 0x15dd
+&subdevice.id pci 0x7609
++subdevice.name Onboard Audio
+
+ vendor.id pci 0x1106
+&device.id pci 0x3059
++device.name VT8233/A/8235/8237 AC97 Audio Controller
+
+ vendor.id pci 0x1106
+&device.id pci 0x3059
+&subvendor.id pci 0x1019
+&subdevice.id pci 0x0a81
++subdevice.name L7VTA v1.0 Motherboard (KT400-8235)
+
+ vendor.id pci 0x1106
+&device.id pci 0x3059
+&subvendor.id pci 0x1043
+&subdevice.id pci 0x8095
++subdevice.name A7V8X Motherboard (Realtek ALC650 codec)
+
+ vendor.id pci 0x1106
+&device.id pci 0x3059
+&subvendor.id pci 0x1043
+&subdevice.id pci 0x80a1
++subdevice.name A7V8X-X Motherboard
+
+ vendor.id pci 0x1106
+&device.id pci 0x3059
+&subvendor.id pci 0x1043
+&subdevice.id pci 0x80b0
++subdevice.name A7V600 motherboard (ADI AD1980 codec [SoundMAX])
+
+ vendor.id pci 0x1106
+&device.id pci 0x3059
+&subvendor.id pci 0x1106
+&subdevice.id pci 0x3059
++subdevice.name L7VMM2 Motherboard
+
+ vendor.id pci 0x1106
+&device.id pci 0x3059
+&subvendor.id pci 0x1106
+&subdevice.id pci 0x4161
++subdevice.name K7VT2 motherboard
+
+ vendor.id pci 0x1106
+&device.id pci 0x3059
+&subvendor.id pci 0x1297
+&subdevice.id pci 0xc160
++subdevice.name FX41 motherboard (Realtek ALC650 codec)
+
+ vendor.id pci 0x1106
+&device.id pci 0x3059
+&subvendor.id pci 0x1458
+&subdevice.id pci 0xa002
++subdevice.name GA-7VAX Onboard Audio (Realtek ALC650)
+
+ vendor.id pci 0x1106
+&device.id pci 0x3059
+&subvendor.id pci 0x1462
+&subdevice.id pci 0x0080
++subdevice.name K8T NEO 2 motherboard
+
+ vendor.id pci 0x1106
+&device.id pci 0x3059
+&subvendor.id pci 0x1462
+&subdevice.id pci 0x3800
++subdevice.name KT266 onboard audio
+
+ vendor.id pci 0x1106
+&device.id pci 0x3059
+&subvendor.id pci 0x147b
+&subdevice.id pci 0x1407
++subdevice.name KV8-MAX3 motherboard
+
+ vendor.id pci 0x1106
+&device.id pci 0x3065
++device.name VT6102 [Rhine-II]
+
+ vendor.id pci 0x1106
+&device.id pci 0x3065
+&subvendor.id pci 0x1043
+&subdevice.id pci 0x80a1
++subdevice.name A7V8X-X Motherboard
+
+ vendor.id pci 0x1106
+&device.id pci 0x3065
+&subvendor.id pci 0x1106
+&subdevice.id pci 0x0102
++subdevice.name VT6102 [Rhine II] Embeded Ethernet Controller on VT8235
+
+ vendor.id pci 0x1106
+&device.id pci 0x3065
+&subvendor.id pci 0x1186
+&subdevice.id pci 0x1400
++subdevice.name DFE-530TX rev A
+
+ vendor.id pci 0x1106
+&device.id pci 0x3065
+&subvendor.id pci 0x1186
+&subdevice.id pci 0x1401
++subdevice.name DFE-530TX rev B
+
+ vendor.id pci 0x1106
+&device.id pci 0x3065
+&subvendor.id pci 0x13b9
+&subdevice.id pci 0x1421
++subdevice.name LD-10/100AL PCI Fast Ethernet Adapter (rev.B)
+
+ vendor.id pci 0x1106
+&device.id pci 0x3068
++device.name AC'97 Modem Controller
+
+ vendor.id pci 0x1106
+&device.id pci 0x3068
+&subvendor.id pci 0x1462
+&subdevice.id pci 0x309e
++subdevice.name MS-6309 Saturn Motherboard
+
+ vendor.id pci 0x1106
+&device.id pci 0x3074
++device.name VT8233 PCI to ISA Bridge
+
+ vendor.id pci 0x1106
+&device.id pci 0x3074
+&subvendor.id pci 0x1043
+&subdevice.id pci 0x8052
++subdevice.name VT8233A
+
+ vendor.id pci 0x1106
+&device.id pci 0x3091
++device.name VT8633 [Apollo Pro266]
+
+ vendor.id pci 0x1106
+&device.id pci 0x3099
++device.name VT8366/A/7 [Apollo KT266/A/333]
+
+ vendor.id pci 0x1106
+&device.id pci 0x3099
+&subvendor.id pci 0x1043
+&subdevice.id pci 0x8064
++subdevice.name A7V266-E Mainboard
+
+ vendor.id pci 0x1106
+&device.id pci 0x3099
+&subvendor.id pci 0x1043
+&subdevice.id pci 0x807f
++subdevice.name A7V333 Mainboard
+
+ vendor.id pci 0x1106
+&device.id pci 0x3099
+&subvendor.id pci 0x1849
+&subdevice.id pci 0x3099
++subdevice.name K7VT2 motherboard
+
+ vendor.id pci 0x1106
+&device.id pci 0x3101
++device.name VT8653 Host Bridge
+
+ vendor.id pci 0x1106
+&device.id pci 0x3102
++device.name VT8662 Host Bridge
+
+ vendor.id pci 0x1106
+&device.id pci 0x3103
++device.name VT8615 Host Bridge
+
+ vendor.id pci 0x1106
+&device.id pci 0x3104
++device.name USB 2.0
+
+ vendor.id pci 0x1106
+&device.id pci 0x3104
+&subvendor.id pci 0x1019
+&subdevice.id pci 0x0a81
++subdevice.name L7VTA v1.0 Motherboard (KT400-8235)
+
+ vendor.id pci 0x1106
+&device.id pci 0x3104
+&subvendor.id pci 0x1043
+&subdevice.id pci 0x808c
++subdevice.name A7V8X motherboard
+
+ vendor.id pci 0x1106
+&device.id pci 0x3104
+&subvendor.id pci 0x1043
+&subdevice.id pci 0x80a1
++subdevice.name A7V8X-X motherboard rev 1.01
+
+ vendor.id pci 0x1106
+&device.id pci 0x3104
+&subvendor.id pci 0x1043
+&subdevice.id pci 0x80ed
++subdevice.name A7V600 motherboard
+
+ vendor.id pci 0x1106
+&device.id pci 0x3104
+&subvendor.id pci 0x1297
+&subdevice.id pci 0xf641
++subdevice.name FX41 motherboard
+
+ vendor.id pci 0x1106
+&device.id pci 0x3104
+&subvendor.id pci 0x1458
+&subdevice.id pci 0x5004
++subdevice.name GA-7VAX Mainboard
+
+ vendor.id pci 0x1106
+&device.id pci 0x3104
+&subvendor.id pci 0x1462
+&subdevice.id pci 0x7020
++subdevice.name K8T NEO 2 motherboard
+
+ vendor.id pci 0x1106
+&device.id pci 0x3104
+&subvendor.id pci 0x147b
+&subdevice.id pci 0x1407
++subdevice.name KV8-MAX3 motherboard
+
+ vendor.id pci 0x1106
+&device.id pci 0x3106
++device.name VT6105 [Rhine-III]
+
+ vendor.id pci 0x1106
+&device.id pci 0x3106
+&subvendor.id pci 0x1186
+&subdevice.id pci 0x1403
++subdevice.name DFE-530TX rev C
+
+ vendor.id pci 0x1106
+&device.id pci 0x3108
++device.name S3 Unichrome Pro VGA Adapter
+
+ vendor.id pci 0x1106
+&device.id pci 0x3109
++device.name VT8233C PCI to ISA Bridge
+
+ vendor.id pci 0x1106
+&device.id pci 0x3112
++device.name VT8361 [KLE133] Host Bridge
+
+ vendor.id pci 0x1106
+&device.id pci 0x3116
++device.name VT8375 [KM266/KL266] Host Bridge
+
+ vendor.id pci 0x1106
+&device.id pci 0x3116
+&subvendor.id pci 0x1297
+&subdevice.id pci 0xf641
++subdevice.name FX41 motherboard
+
+ vendor.id pci 0x1106
+&device.id pci 0x3118
++device.name S3 Unichrome Pro VGA Adapter
+
+ vendor.id pci 0x1106
+&device.id pci 0x3119
++device.name VT6120/VT6121/VT6122 Gigabit Ethernet Adapter
+
+ vendor.id pci 0x1106
+&device.id pci 0x3122
++device.name VT8623 [Apollo CLE266] integrated CastleRock graphics
+
+ vendor.id pci 0x1106
+&device.id pci 0x3123
++device.name VT8623 [Apollo CLE266]
+
+ vendor.id pci 0x1106
+&device.id pci 0x3128
++device.name VT8753 [P4X266 AGP]
+
+ vendor.id pci 0x1106
+&device.id pci 0x3133
++device.name VT3133 Host Bridge
+
+ vendor.id pci 0x1106
+&device.id pci 0x3147
++device.name VT8233A ISA Bridge
+
+ vendor.id pci 0x1106
+&device.id pci 0x3148
++device.name P4M266 Host Bridge
+
+ vendor.id pci 0x1106
+&device.id pci 0x3149
++device.name VIA VT6420 SATA RAID Controller
+
+ vendor.id pci 0x1106
+&device.id pci 0x3149
+&subvendor.id pci 0x1043
+&subdevice.id pci 0x80ed
++subdevice.name A7V600 motherboard
+
+ vendor.id pci 0x1106
+&device.id pci 0x3149
+&subvendor.id pci 0x1458
+&subdevice.id pci 0xb003
++subdevice.name GA-7VM400AM(F) Motherboard
+
+ vendor.id pci 0x1106
+&device.id pci 0x3149
+&subvendor.id pci 0x1462
+&subdevice.id pci 0x7020
++subdevice.name K8T Neo 2 Motherboard
+
+ vendor.id pci 0x1106
+&device.id pci 0x3156
++device.name P/KN266 Host Bridge
+
+ vendor.id pci 0x1106
+&device.id pci 0x3164
++device.name VT6410 ATA133 RAID controller
+
+ vendor.id pci 0x1106
+&device.id pci 0x3168
++device.name VT8374 P4X400 Host Controller/AGP Bridge
+
+ vendor.id pci 0x1106
+&device.id pci 0x3177
++device.name VT8235 ISA Bridge
+
+ vendor.id pci 0x1106
+&device.id pci 0x3177
+&subvendor.id pci 0x1019
+&subdevice.id pci 0x0a81
++subdevice.name L7VTA v1.0 Motherboard (KT400-8235)
+
+ vendor.id pci 0x1106
+&device.id pci 0x3177
+&subvendor.id pci 0x1043
+&subdevice.id pci 0x808c
++subdevice.name A7V8X motherboard
+
+ vendor.id pci 0x1106
+&device.id pci 0x3177
+&subvendor.id pci 0x1043
+&subdevice.id pci 0x80a1
++subdevice.name A7V8X-X motherboard
+
+ vendor.id pci 0x1106
+&device.id pci 0x3177
+&subvendor.id pci 0x1297
+&subdevice.id pci 0xf641
++subdevice.name FX41 motherboard
+
+ vendor.id pci 0x1106
+&device.id pci 0x3177
+&subvendor.id pci 0x1458
+&subdevice.id pci 0x5001
++subdevice.name GA-7VAX Mainboard
+
+ vendor.id pci 0x1106
+&device.id pci 0x3177
+&subvendor.id pci 0x1849
+&subdevice.id pci 0x3177
++subdevice.name K7VT2 motherboard
+
+ vendor.id pci 0x1106
+&device.id pci 0x3188
++device.name VT8385 [K8T800 AGP] Host Bridge
+
+ vendor.id pci 0x1106
+&device.id pci 0x3188
+&subvendor.id pci 0x147b
+&subdevice.id pci 0x1407
++subdevice.name KV8-MAX3 motherboard
+
+ vendor.id pci 0x1106
+&device.id pci 0x3189
++device.name VT8377 [KT400/KT600 AGP] Host Bridge
+
+ vendor.id pci 0x1106
+&device.id pci 0x3189
+&subvendor.id pci 0x1043
+&subdevice.id pci 0x807f
++subdevice.name A7V8X motherboard
+
+ vendor.id pci 0x1106
+&device.id pci 0x3189
+&subvendor.id pci 0x1458
+&subdevice.id pci 0x5000
++subdevice.name GA-7VAX Mainboard
+
+ vendor.id pci 0x1106
+&device.id pci 0x3204
++device.name K8M800
+
+ vendor.id pci 0x1106
+&device.id pci 0x3205
++device.name VT8378 [KM400/A] Chipset Host Bridge
+
+ vendor.id pci 0x1106
+&device.id pci 0x3205
+&subvendor.id pci 0x1458
+&subdevice.id pci 0x5000
++subdevice.name GA-7VM400M Motherboard
+
+ vendor.id pci 0x1106
+&device.id pci 0x3227
++device.name VT8237 ISA bridge [KT600/K8T800 South]
+
+ vendor.id pci 0x1106
+&device.id pci 0x3227
+&subvendor.id pci 0x1043
+&subdevice.id pci 0x80ed
++subdevice.name A7V600 motherboard
+
+ vendor.id pci 0x1106
+&device.id pci 0x3227
+&subvendor.id pci 0x1106
+&subdevice.id pci 0x3227
++subdevice.name DFI KT600-AL Motherboard
+
+ vendor.id pci 0x1106
+&device.id pci 0x3227
+&subvendor.id pci 0x1458
+&subdevice.id pci 0x5001
++subdevice.name GA-7VT600 Motherboard
+
+ vendor.id pci 0x1106
+&device.id pci 0x3227
+&subvendor.id pci 0x147b
+&subdevice.id pci 0x1407
++subdevice.name KV8-MAX3 motherboard
+
+ vendor.id pci 0x1106
+&device.id pci 0x4149
++device.name VIA VT6420 (ATA133) Controller
+
+ vendor.id pci 0x1106
+&device.id pci 0x5030
++device.name VT82C596 ACPI [Apollo PRO]
+
+ vendor.id pci 0x1106
+&device.id pci 0x6100
++device.name VT85C100A [Rhine II]
+
+ vendor.id pci 0x1106
+&device.id pci 0x7204
++device.name K8M800
+
+ vendor.id pci 0x1106
+&device.id pci 0x7205
++device.name VT8378 [S3 UniChrome] Integrated Video
+
+ vendor.id pci 0x1106
+&device.id pci 0x7205
+&subvendor.id pci 0x1458
+&subdevice.id pci 0xd000
++subdevice.name Gigabyte GA-7VM400(A)M(F) Motherboard
+
+ vendor.id pci 0x1106
+&device.id pci 0x8231
++device.name VT8231 [PCI-to-ISA Bridge]
+
+ vendor.id pci 0x1106
+&device.id pci 0x8235
++device.name VT8235 ACPI
+
+ vendor.id pci 0x1106
+&device.id pci 0x8305
++device.name VT8363/8365 [KT133/KM133 AGP]
+
+ vendor.id pci 0x1106
+&device.id pci 0x8391
++device.name VT8371 [KX133 AGP]
+
+ vendor.id pci 0x1106
+&device.id pci 0x8501
++device.name VT8501 [Apollo MVP4 AGP]
+
+ vendor.id pci 0x1106
+&device.id pci 0x8596
++device.name VT82C596 [Apollo PRO AGP]
+
+ vendor.id pci 0x1106
+&device.id pci 0x8597
++device.name VT82C597 [Apollo VP3 AGP]
+
+ vendor.id pci 0x1106
+&device.id pci 0x8598
++device.name VT82C598/694x [Apollo MVP3/Pro133x AGP]
+
+ vendor.id pci 0x1106
+&device.id pci 0x8598
+&subvendor.id pci 0x1019
+&subdevice.id pci 0x0985
++subdevice.name P6VXA Motherboard
+
+ vendor.id pci 0x1106
+&device.id pci 0x8601
++device.name VT8601 [Apollo ProMedia AGP]
+
+ vendor.id pci 0x1106
+&device.id pci 0x8605
++device.name VT8605 [PM133 AGP]
+
+ vendor.id pci 0x1106
+&device.id pci 0x8691
++device.name VT82C691 [Apollo Pro]
+
+ vendor.id pci 0x1106
+&device.id pci 0x8693
++device.name VT82C693 [Apollo Pro Plus] PCI Bridge
+
+ vendor.id pci 0x1106
+&device.id pci 0xb091
++device.name VT8633 [Apollo Pro266 AGP]
+
+ vendor.id pci 0x1106
+&device.id pci 0xb099
++device.name VT8366/A/7 [Apollo KT266/A/333 AGP]
+
+ vendor.id pci 0x1106
+&device.id pci 0xb101
++device.name VT8653 AGP Bridge
+
+ vendor.id pci 0x1106
+&device.id pci 0xb102
++device.name VT8362 AGP Bridge
+
+ vendor.id pci 0x1106
+&device.id pci 0xb103
++device.name VT8615 AGP Bridge
+
+ vendor.id pci 0x1106
+&device.id pci 0xb112
++device.name VT8361 [KLE133] AGP Bridge
+
+ vendor.id pci 0x1106
+&device.id pci 0xb168
++device.name VT8235 PCI Bridge
+
+ vendor.id pci 0x1106
+&device.id pci 0xb188
++device.name VT8237 PCI bridge [K8T800 South]
+
+ vendor.id pci 0x1106
+&device.id pci 0xb188
+&subvendor.id pci 0x147b
+&subdevice.id pci 0x1407
++subdevice.name KV8-MAX3 motherboard
+
+ vendor.id pci 0x1106
+&device.id pci 0xb198
++device.name VT8237 PCI Bridge
+
+ vendor.id pci 0x1106
+&device.id pci 0xd104
++device.name VT8237 Integrated Fast Ethernet Controller
+
+ vendor.id pci 0x1107
++vendor.name Stratus Computers
+
+ vendor.id pci 0x1107
+&device.id pci 0x0576
++device.name VIA VT82C570MV [Apollo] (Wrong vendor ID!)
+
+ vendor.id pci 0x1108
++vendor.name Proteon, Inc.
+
+ vendor.id pci 0x1108
+&device.id pci 0x0100
++device.name p1690plus_AA
+
+ vendor.id pci 0x1108
+&device.id pci 0x0101
++device.name p1690plus_AB
+
+ vendor.id pci 0x1108
+&device.id pci 0x0105
++device.name P1690Plus
+
+ vendor.id pci 0x1108
+&device.id pci 0x0108
++device.name P1690Plus
+
+ vendor.id pci 0x1108
+&device.id pci 0x0138
++device.name P1690Plus
+
+ vendor.id pci 0x1108
+&device.id pci 0x0139
++device.name P1690Plus
+
+ vendor.id pci 0x1108
+&device.id pci 0x013c
++device.name P1690Plus
+
+ vendor.id pci 0x1108
+&device.id pci 0x013d
++device.name P1690Plus
+
+ vendor.id pci 0x1109
++vendor.name Cogent Data Technologies, Inc.
+
+ vendor.id pci 0x1109
+&device.id pci 0x1400
++device.name EM110TX [EX110TX]
+
+ vendor.id pci 0x110a
++vendor.name Siemens Nixdorf AG
+
+ vendor.id pci 0x110a
+&device.id pci 0x0002
++device.name Pirahna 2-port
+
+ vendor.id pci 0x110a
+&device.id pci 0x0005
++device.name Tulip controller, power management, switch extender
+
+ vendor.id pci 0x110a
+&device.id pci 0x0006
++device.name FSC PINC (I/O-APIC)
+
+ vendor.id pci 0x110a
+&device.id pci 0x0015
++device.name FSC Multiprocessor Interrupt Controller
+
+ vendor.id pci 0x110a
+&device.id pci 0x001d
++device.name FSC Copernicus Management Controller
+
+ vendor.id pci 0x110a
+&device.id pci 0x007b
++device.name FSC Remote Service Controller, mailbox device
+
+ vendor.id pci 0x110a
+&device.id pci 0x007c
++device.name FSC Remote Service Controller, shared memory device
+
+ vendor.id pci 0x110a
+&device.id pci 0x007d
++device.name FSC Remote Service Controller, SMIC device
+
+ vendor.id pci 0x110a
+&device.id pci 0x2102
++device.name DSCC4 PEB/PEF 20534 DMA Supported Serial Communication Controller with 4 Channels
+
+ vendor.id pci 0x110a
+&device.id pci 0x2104
++device.name Eicon Diva 2.02 compatible passive ISDN card
+
+ vendor.id pci 0x110a
+&device.id pci 0x3142
++device.name SIMATIC NET CP 5613A1 (Profibus Adapter)
+
+ vendor.id pci 0x110a
+&device.id pci 0x4021
++device.name SIMATIC NET CP 5512 (Profibus and MPI Cardbus Adapter)
+
+ vendor.id pci 0x110a
+&device.id pci 0x4029
++device.name SIMATIC NET CP 5613A2 (Profibus Adapter)
+
+ vendor.id pci 0x110a
+&device.id pci 0x4942
++device.name FPGA I-Bus Tracer for MBD
+
+ vendor.id pci 0x110a
+&device.id pci 0x6120
++device.name SZB6120
+
+ vendor.id pci 0x110b
++vendor.name Chromatic Research Inc.
+
+ vendor.id pci 0x110b
+&device.id pci 0x0001
++device.name Mpact Media Processor
+
+ vendor.id pci 0x110b
+&device.id pci 0x0004
++device.name Mpact 2
+
+ vendor.id pci 0x110c
++vendor.name Mini-Max Technology, Inc.
+
+ vendor.id pci 0x110d
++vendor.name Znyx Advanced Systems
+
+ vendor.id pci 0x110e
++vendor.name CPU Technology
+
+ vendor.id pci 0x110f
++vendor.name Ross Technology
+
+ vendor.id pci 0x1110
++vendor.name Powerhouse Systems
+
+ vendor.id pci 0x1110
+&device.id pci 0x6037
++device.name Firepower Powerized SMP I/O ASIC
+
+ vendor.id pci 0x1110
+&device.id pci 0x6073
++device.name Firepower Powerized SMP I/O ASIC
+
+ vendor.id pci 0x1111
++vendor.name Santa Cruz Operation
+
+ vendor.id pci 0x1112
++vendor.name Osicom Technologies Inc
+
+ vendor.id pci 0x1112
+&device.id pci 0x2200
++device.name FDDI Adapter
+
+ vendor.id pci 0x1112
+&device.id pci 0x2300
++device.name Fast Ethernet Adapter
+
+ vendor.id pci 0x1112
+&device.id pci 0x2340
++device.name 4 Port Fast Ethernet Adapter
+
+ vendor.id pci 0x1112
+&device.id pci 0x2400
++device.name ATM Adapter
+
+ vendor.id pci 0x1113
++vendor.name Accton Technology Corporation
+
+ vendor.id pci 0x1113
+&device.id pci 0x1211
++device.name SMC2-1211TX
+
+ vendor.id pci 0x1113
+&device.id pci 0x1211
+&subvendor.id pci 0x103c
+&subdevice.id pci 0x1207
++subdevice.name EN-1207D Fast Ethernet Adapter
+
+ vendor.id pci 0x1113
+&device.id pci 0x1211
+&subvendor.id pci 0x1113
+&subdevice.id pci 0x1211
++subdevice.name EN-1207D Fast Ethernet Adapter
+
+ vendor.id pci 0x1113
+&device.id pci 0x1216
++device.name EN-1216 Ethernet Adapter
+
+ vendor.id pci 0x1113
+&device.id pci 0x1216
+&subvendor.id pci 0x1113
+&subdevice.id pci 0x2242
++subdevice.name EN2242 10/100 Ethernet Mini-PCI Card
+
+ vendor.id pci 0x1113
+&device.id pci 0x1216
+&subvendor.id pci 0x111a
+&subdevice.id pci 0x1020
++subdevice.name SpeedStream 1020 PCI 10/100 Ethernet Adaptor [EN-1207F-TX ?]
+
+ vendor.id pci 0x1113
+&device.id pci 0x1217
++device.name EN-1217 Ethernet Adapter
+
+ vendor.id pci 0x1113
+&device.id pci 0x5105
++device.name 10Mbps Network card
+
+ vendor.id pci 0x1113
+&device.id pci 0x9211
++device.name EN-1207D Fast Ethernet Adapter
+
+ vendor.id pci 0x1113
+&device.id pci 0x9211
+&subvendor.id pci 0x1113
+&subdevice.id pci 0x9211
++subdevice.name EN-1207D Fast Ethernet Adapter
+
+ vendor.id pci 0x1113
+&device.id pci 0x9511
++device.name 21x4x DEC-Tulip compatible Fast Ethernet
+
+ vendor.id pci 0x1113
+&device.id pci 0xd301
++device.name CPWNA100 (Philips wireless PCMCIA)
+
+ vendor.id pci 0x1113
+&device.id pci 0xec02
++device.name SMC 1244TX v3
+
+ vendor.id pci 0x1114
++vendor.name Atmel Corporation
+
+ vendor.id pci 0x1114
+&device.id pci 0x0506
++device.name 802.11b Wireless Network Adaptor (at76c506)
+
+ vendor.id pci 0x1115
++vendor.name 3D Labs
+
+ vendor.id pci 0x1116
++vendor.name Data Translation
+
+ vendor.id pci 0x1116
+&device.id pci 0x0022
++device.name DT3001
+
+ vendor.id pci 0x1116
+&device.id pci 0x0023
++device.name DT3002
+
+ vendor.id pci 0x1116
+&device.id pci 0x0024
++device.name DT3003
+
+ vendor.id pci 0x1116
+&device.id pci 0x0025
++device.name DT3004
+
+ vendor.id pci 0x1116
+&device.id pci 0x0026
++device.name DT3005
+
+ vendor.id pci 0x1116
+&device.id pci 0x0027
++device.name DT3001-PGL
+
+ vendor.id pci 0x1116
+&device.id pci 0x0028
++device.name DT3003-PGL
+
+ vendor.id pci 0x1117
++vendor.name Datacube, Inc
+
+ vendor.id pci 0x1117
+&device.id pci 0x9500
++device.name Max-1C SVGA card
+
+ vendor.id pci 0x1117
+&device.id pci 0x9501
++device.name Max-1C image processing
+
+ vendor.id pci 0x1118
++vendor.name Berg Electronics
+
+ vendor.id pci 0x1119
++vendor.name ICP Vortex Computersysteme GmbH
+
+ vendor.id pci 0x1119
+&device.id pci 0x0000
++device.name GDT 6000/6020/6050
+
+ vendor.id pci 0x1119
+&device.id pci 0x0001
++device.name GDT 6000B/6010
+
+ vendor.id pci 0x1119
+&device.id pci 0x0002
++device.name GDT 6110/6510
+
+ vendor.id pci 0x1119
+&device.id pci 0x0003
++device.name GDT 6120/6520
+
+ vendor.id pci 0x1119
+&device.id pci 0x0004
++device.name GDT 6530
+
+ vendor.id pci 0x1119
+&device.id pci 0x0005
++device.name GDT 6550
+
+ vendor.id pci 0x1119
+&device.id pci 0x0006
++device.name GDT 6117/6517
+
+ vendor.id pci 0x1119
+&device.id pci 0x0007
++device.name GDT 6127/6527
+
+ vendor.id pci 0x1119
+&device.id pci 0x0008
++device.name GDT 6537
+
+ vendor.id pci 0x1119
+&device.id pci 0x0009
++device.name GDT 6557/6557-ECC
+
+ vendor.id pci 0x1119
+&device.id pci 0x000a
++device.name GDT 6115/6515
+
+ vendor.id pci 0x1119
+&device.id pci 0x000b
++device.name GDT 6125/6525
+
+ vendor.id pci 0x1119
+&device.id pci 0x000c
++device.name GDT 6535
+
+ vendor.id pci 0x1119
+&device.id pci 0x000d
++device.name GDT 6555
+
+ vendor.id pci 0x1119
+&device.id pci 0x0010
++device.name GDT 6115/6515
+
+ vendor.id pci 0x1119
+&device.id pci 0x0011
++device.name GDT 6125/6525
+
+ vendor.id pci 0x1119
+&device.id pci 0x0012
++device.name GDT 6535
+
+ vendor.id pci 0x1119
+&device.id pci 0x0013
++device.name GDT 6555/6555-ECC
+
+ vendor.id pci 0x1119
+&device.id pci 0x0100
++device.name GDT 6117RP/6517RP
+
+ vendor.id pci 0x1119
+&device.id pci 0x0101
++device.name GDT 6127RP/6527RP
+
+ vendor.id pci 0x1119
+&device.id pci 0x0102
++device.name GDT 6537RP
+
+ vendor.id pci 0x1119
+&device.id pci 0x0103
++device.name GDT 6557RP
+
+ vendor.id pci 0x1119
+&device.id pci 0x0104
++device.name GDT 6111RP/6511RP
+
+ vendor.id pci 0x1119
+&device.id pci 0x0105
++device.name GDT 6121RP/6521RP
+
+ vendor.id pci 0x1119
+&device.id pci 0x0110
++device.name GDT 6117RD/6517RD
+
+ vendor.id pci 0x1119
+&device.id pci 0x0111
++device.name GDT 6127RD/6527RD
+
+ vendor.id pci 0x1119
+&device.id pci 0x0112
++device.name GDT 6537RD
+
+ vendor.id pci 0x1119
+&device.id pci 0x0113
++device.name GDT 6557RD
+
+ vendor.id pci 0x1119
+&device.id pci 0x0114
++device.name GDT 6111RD/6511RD
+
+ vendor.id pci 0x1119
+&device.id pci 0x0115
++device.name GDT 6121RD/6521RD
+
+ vendor.id pci 0x1119
+&device.id pci 0x0118
++device.name GDT 6118RD/6518RD/6618RD
+
+ vendor.id pci 0x1119
+&device.id pci 0x0119
++device.name GDT 6128RD/6528RD/6628RD
+
+ vendor.id pci 0x1119
+&device.id pci 0x011a
++device.name GDT 6538RD/6638RD
+
+ vendor.id pci 0x1119
+&device.id pci 0x011b
++device.name GDT 6558RD/6658RD
+
+ vendor.id pci 0x1119
+&device.id pci 0x0120
++device.name GDT 6117RP2/6517RP2
+
+ vendor.id pci 0x1119
+&device.id pci 0x0121
++device.name GDT 6127RP2/6527RP2
+
+ vendor.id pci 0x1119
+&device.id pci 0x0122
++device.name GDT 6537RP2
+
+ vendor.id pci 0x1119
+&device.id pci 0x0123
++device.name GDT 6557RP2
+
+ vendor.id pci 0x1119
+&device.id pci 0x0124
++device.name GDT 6111RP2/6511RP2
+
+ vendor.id pci 0x1119
+&device.id pci 0x0125
++device.name GDT 6121RP2/6521RP2
+
+ vendor.id pci 0x1119
+&device.id pci 0x0136
++device.name GDT 6113RS/6513RS
+
+ vendor.id pci 0x1119
+&device.id pci 0x0137
++device.name GDT 6123RS/6523RS
+
+ vendor.id pci 0x1119
+&device.id pci 0x0138
++device.name GDT 6118RS/6518RS/6618RS
+
+ vendor.id pci 0x1119
+&device.id pci 0x0139
++device.name GDT 6128RS/6528RS/6628RS
+
+ vendor.id pci 0x1119
+&device.id pci 0x013a
++device.name GDT 6538RS/6638RS
+
+ vendor.id pci 0x1119
+&device.id pci 0x013b
++device.name GDT 6558RS/6658RS
+
+ vendor.id pci 0x1119
+&device.id pci 0x013c
++device.name GDT 6533RS/6633RS
+
+ vendor.id pci 0x1119
+&device.id pci 0x013d
++device.name GDT 6543RS/6643RS
+
+ vendor.id pci 0x1119
+&device.id pci 0x013e
++device.name GDT 6553RS/6653RS
+
+ vendor.id pci 0x1119
+&device.id pci 0x013f
++device.name GDT 6563RS/6663RS
+
+ vendor.id pci 0x1119
+&device.id pci 0x0166
++device.name GDT 7113RN/7513RN/7613RN
+
+ vendor.id pci 0x1119
+&device.id pci 0x0167
++device.name GDT 7123RN/7523RN/7623RN
+
+ vendor.id pci 0x1119
+&device.id pci 0x0168
++device.name GDT 7118RN/7518RN/7518RN
+
+ vendor.id pci 0x1119
+&device.id pci 0x0169
++device.name GDT 7128RN/7528RN/7628RN
+
+ vendor.id pci 0x1119
+&device.id pci 0x016a
++device.name GDT 7538RN/7638RN
+
+ vendor.id pci 0x1119
+&device.id pci 0x016b
++device.name GDT 7558RN/7658RN
+
+ vendor.id pci 0x1119
+&device.id pci 0x016c
++device.name GDT 7533RN/7633RN
+
+ vendor.id pci 0x1119
+&device.id pci 0x016d
++device.name GDT 7543RN/7643RN
+
+ vendor.id pci 0x1119
+&device.id pci 0x016e
++device.name GDT 7553RN/7653RN
+
+ vendor.id pci 0x1119
+&device.id pci 0x016f
++device.name GDT 7563RN/7663RN
+
+ vendor.id pci 0x1119
+&device.id pci 0x01d6
++device.name GDT 4x13RZ
+
+ vendor.id pci 0x1119
+&device.id pci 0x01d7
++device.name GDT 4x23RZ
+
+ vendor.id pci 0x1119
+&device.id pci 0x01f6
++device.name GDT 8x13RZ
+
+ vendor.id pci 0x1119
+&device.id pci 0x01f7
++device.name GDT 8x23RZ
+
+ vendor.id pci 0x1119
+&device.id pci 0x01fc
++device.name GDT 8x33RZ
+
+ vendor.id pci 0x1119
+&device.id pci 0x01fd
++device.name GDT 8x43RZ
+
+ vendor.id pci 0x1119
+&device.id pci 0x01fe
++device.name GDT 8x53RZ
+
+ vendor.id pci 0x1119
+&device.id pci 0x01ff
++device.name GDT 8x63RZ
+
+ vendor.id pci 0x1119
+&device.id pci 0x0210
++device.name GDT 6519RD/6619RD
+
+ vendor.id pci 0x1119
+&device.id pci 0x0211
++device.name GDT 6529RD/6629RD
+
+ vendor.id pci 0x1119
+&device.id pci 0x0260
++device.name GDT 7519RN/7619RN
+
+ vendor.id pci 0x1119
+&device.id pci 0x0261
++device.name GDT 7529RN/7629RN
+
+ vendor.id pci 0x1119
+&device.id pci 0x02ff
++device.name GDT MAXRP
+
+ vendor.id pci 0x1119
+&device.id pci 0x0300
++device.name GDT NEWRX
+
+ vendor.id pci 0x111a
++vendor.name Efficient Networks, Inc
+
+ vendor.id pci 0x111a
+&device.id pci 0x0000
++device.name 155P-MF1 (FPGA)
+
+ vendor.id pci 0x111a
+&device.id pci 0x0002
++device.name 155P-MF1 (ASIC)
+
+ vendor.id pci 0x111a
+&device.id pci 0x0003
++device.name ENI-25P ATM
+
+ vendor.id pci 0x111a
+&device.id pci 0x0003
+&subvendor.id pci 0x111a
+&subdevice.id pci 0x0000
++subdevice.name ENI-25p Miniport ATM Adapter
+
+ vendor.id pci 0x111a
+&device.id pci 0x0005
++device.name SpeedStream (LANAI)
+
+ vendor.id pci 0x111a
+&device.id pci 0x0005
+&subvendor.id pci 0x111a
+&subdevice.id pci 0x0001
++subdevice.name ENI-3010 ATM
+
+ vendor.id pci 0x111a
+&device.id pci 0x0005
+&subvendor.id pci 0x111a
+&subdevice.id pci 0x0009
++subdevice.name ENI-3060 ADSL (VPI=0)
+
+ vendor.id pci 0x111a
+&device.id pci 0x0005
+&subvendor.id pci 0x111a
+&subdevice.id pci 0x0101
++subdevice.name ENI-3010 ATM
+
+ vendor.id pci 0x111a
+&device.id pci 0x0005
+&subvendor.id pci 0x111a
+&subdevice.id pci 0x0109
++subdevice.name ENI-3060CO ADSL (VPI=0)
+
+ vendor.id pci 0x111a
+&device.id pci 0x0005
+&subvendor.id pci 0x111a
+&subdevice.id pci 0x0809
++subdevice.name ENI-3060 ADSL (VPI=0 or 8)
+
+ vendor.id pci 0x111a
+&device.id pci 0x0005
+&subvendor.id pci 0x111a
+&subdevice.id pci 0x0909
++subdevice.name ENI-3060CO ADSL (VPI=0 or 8)
+
+ vendor.id pci 0x111a
+&device.id pci 0x0005
+&subvendor.id pci 0x111a
+&subdevice.id pci 0x0a09
++subdevice.name ENI-3060 ADSL (VPI=<0..15>)
+
+ vendor.id pci 0x111a
+&device.id pci 0x0007
++device.name SpeedStream ADSL
+
+ vendor.id pci 0x111a
+&device.id pci 0x0007
+&subvendor.id pci 0x111a
+&subdevice.id pci 0x1001
++subdevice.name ENI-3061 ADSL [ASIC]
+
+ vendor.id pci 0x111a
+&device.id pci 0x1203
++device.name SpeedStream 1023 Wireless PCI Adapter
+
+ vendor.id pci 0x111b
++vendor.name Teledyne Electronic Systems
+
+ vendor.id pci 0x111c
++vendor.name Tricord Systems Inc.
+
+ vendor.id pci 0x111c
+&device.id pci 0x0001
++device.name Powerbis Bridge
+
+ vendor.id pci 0x111d
++vendor.name Integrated Device Technology, Inc.
+
+ vendor.id pci 0x111d
+&device.id pci 0x0001
++device.name IDT77201/77211 155Mbps ATM SAR Controller [NICStAR]
+
+ vendor.id pci 0x111d
+&device.id pci 0x0003
++device.name IDT77222/77252 155Mbps ATM MICRO ABR SAR Controller
+
+ vendor.id pci 0x111d
+&device.id pci 0x0004
++device.name IDT77V252 155Mbps ATM MICRO ABR SAR Controller
+
+ vendor.id pci 0x111d
+&device.id pci 0x0005
++device.name IDT77V222 155Mbps ATM MICRO ABR SAR Controller
+
+ vendor.id pci 0x111e
++vendor.name Eldec
+
+ vendor.id pci 0x111f
++vendor.name Precision Digital Images
+
+ vendor.id pci 0x111f
+&device.id pci 0x4a47
++device.name Precision MX Video engine interface
+
+ vendor.id pci 0x111f
+&device.id pci 0x5243
++device.name Frame capture bus interface
+
+ vendor.id pci 0x1120
++vendor.name EMC Corporation
+
+ vendor.id pci 0x1121
++vendor.name Zilog
+
+ vendor.id pci 0x1122
++vendor.name Multi-tech Systems, Inc.
+
+ vendor.id pci 0x1123
++vendor.name Excellent Design, Inc.
+
+ vendor.id pci 0x1124
++vendor.name Leutron Vision AG
+
+ vendor.id pci 0x1125
++vendor.name Eurocore
+
+ vendor.id pci 0x1126
++vendor.name Vigra
+
+ vendor.id pci 0x1127
++vendor.name FORE Systems Inc
+
+ vendor.id pci 0x1127
+&device.id pci 0x0200
++device.name ForeRunner PCA-200 ATM
+
+ vendor.id pci 0x1127
+&device.id pci 0x0210
++device.name PCA-200PC
+
+ vendor.id pci 0x1127
+&device.id pci 0x0250
++device.name ATM
+
+ vendor.id pci 0x1127
+&device.id pci 0x0300
++device.name ForeRunner PCA-200EPC ATM
+
+ vendor.id pci 0x1127
+&device.id pci 0x0310
++device.name ATM
+
+ vendor.id pci 0x1127
+&device.id pci 0x0400
++device.name ForeRunnerHE ATM Adapter
+
+ vendor.id pci 0x1127
+&device.id pci 0x0400
+&subvendor.id pci 0x1127
+&subdevice.id pci 0x0400
++subdevice.name ForeRunnerHE ATM
+
+ vendor.id pci 0x1129
++vendor.name Firmworks
+
+ vendor.id pci 0x112a
++vendor.name Hermes Electronics Company, Ltd.
+
+ vendor.id pci 0x112b
++vendor.name Linotype - Hell AG
+
+ vendor.id pci 0x112c
++vendor.name Zenith Data Systems
+
+ vendor.id pci 0x112d
++vendor.name Ravicad
+
+ vendor.id pci 0x112e
++vendor.name Infomedia Microelectronics Inc.
+
+ vendor.id pci 0x112f
++vendor.name Imaging Technology Inc
+
+ vendor.id pci 0x112f
+&device.id pci 0x0000
++device.name MVC IC-PCI
+
+ vendor.id pci 0x112f
+&device.id pci 0x0001
++device.name MVC IM-PCI Video frame grabber/processor
+
+ vendor.id pci 0x1130
++vendor.name Computervision
+
+ vendor.id pci 0x1131
++vendor.name Philips Semiconductors
+
+ vendor.id pci 0x1131
+&device.id pci 0x1561
++device.name USB 1.1 Host Controller
+
+ vendor.id pci 0x1131
+&device.id pci 0x1562
++device.name USB 2.0 Host Controller
+
+ vendor.id pci 0x1131
+&device.id pci 0x3400
++device.name SmartPCI56(UCB1500) 56K Modem
+
+ vendor.id pci 0x1131
+&device.id pci 0x5400
++device.name TriMedia TM1000/1100
+
+ vendor.id pci 0x1131
+&device.id pci 0x5402
++device.name TriMedia TM-1300
+
+ vendor.id pci 0x1131
+&device.id pci 0x7130
++device.name SAA7130 Video Broadcast Decoder
+
+ vendor.id pci 0x1131
+&device.id pci 0x7130
+&subvendor.id pci 0x5168
+&subdevice.id pci 0x0138
++subdevice.name LiveView FlyVideo 2000
+
+ vendor.id pci 0x1131
+&device.id pci 0x7133
++device.name SAA713X Audio+video broadcast decoder
+
+ vendor.id pci 0x1131
+&device.id pci 0x7133
+&subvendor.id pci 0x5168
+&subdevice.id pci 0x0138
++subdevice.name LifeView FlyVideo 3000
+
+ vendor.id pci 0x1131
+&device.id pci 0x7133
+&subvendor.id pci 0x5168
+&subdevice.id pci 0x0212
++subdevice.name LifeView FlyTV Platinum mini
+
+ vendor.id pci 0x1131
+&device.id pci 0x7134
++device.name SAA7134
+
+ vendor.id pci 0x1131
+&device.id pci 0x7135
++device.name SAA7135 Audio+video broadcast decoder
+
+ vendor.id pci 0x1131
+&device.id pci 0x7145
++device.name SAA7145
+
+ vendor.id pci 0x1131
+&device.id pci 0x7146
++device.name SAA7146
+
+ vendor.id pci 0x1131
+&device.id pci 0x7146
+&subvendor.id pci 0x110a
+&subdevice.id pci 0x0000
++subdevice.name Fujitsu/Siemens DVB-C card rev1.5
+
+ vendor.id pci 0x1131
+&device.id pci 0x7146
+&subvendor.id pci 0x110a
+&subdevice.id pci 0xffff
++subdevice.name Fujitsu/Siemens DVB-C card rev1.5
+
+ vendor.id pci 0x1131
+&device.id pci 0x7146
+&subvendor.id pci 0x1131
+&subdevice.id pci 0x4f56
++subdevice.name KNC1 DVB-S Budget
+
+ vendor.id pci 0x1131
+&device.id pci 0x7146
+&subvendor.id pci 0x1131
+&subdevice.id pci 0x4f61
++subdevice.name Fujitsu-Siemens Activy DVB-S Budget
+
+ vendor.id pci 0x1131
+&device.id pci 0x7146
+&subvendor.id pci 0x114b
+&subdevice.id pci 0x2003
++subdevice.name DVRaptor Video Edit/Capture Card
+
+ vendor.id pci 0x1131
+&device.id pci 0x7146
+&subvendor.id pci 0x11bd
+&subdevice.id pci 0x0006
++subdevice.name DV500 Overlay
+
+ vendor.id pci 0x1131
+&device.id pci 0x7146
+&subvendor.id pci 0x11bd
+&subdevice.id pci 0x000a
++subdevice.name DV500 Overlay
+
+ vendor.id pci 0x1131
+&device.id pci 0x7146
+&subvendor.id pci 0x13c2
+&subdevice.id pci 0x0000
++subdevice.name Siemens/Technotrend/Hauppauge DVB card rev1.3 or rev1.5
+
+ vendor.id pci 0x1131
+&device.id pci 0x7146
+&subvendor.id pci 0x13c2
+&subdevice.id pci 0x0001
++subdevice.name Technotrend/Hauppauge DVB card rev1.3 or rev1.6
+
+ vendor.id pci 0x1131
+&device.id pci 0x7146
+&subvendor.id pci 0x13c2
+&subdevice.id pci 0x0002
++subdevice.name Technotrend/Hauppauge DVB card rev2.1
+
+ vendor.id pci 0x1131
+&device.id pci 0x7146
+&subvendor.id pci 0x13c2
+&subdevice.id pci 0x0003
++subdevice.name Technotrend/Hauppauge DVB card rev2.1
+
+ vendor.id pci 0x1131
+&device.id pci 0x7146
+&subvendor.id pci 0x13c2
+&subdevice.id pci 0x0004
++subdevice.name Technotrend/Hauppauge DVB card rev2.1
+
+ vendor.id pci 0x1131
+&device.id pci 0x7146
+&subvendor.id pci 0x13c2
+&subdevice.id pci 0x0006
++subdevice.name Technotrend/Hauppauge DVB card rev1.3 or rev1.6
+
+ vendor.id pci 0x1131
+&device.id pci 0x7146
+&subvendor.id pci 0x13c2
+&subdevice.id pci 0x0008
++subdevice.name Technotrend/Hauppauge DVB-T
+
+ vendor.id pci 0x1131
+&device.id pci 0x7146
+&subvendor.id pci 0x13c2
+&subdevice.id pci 0x000a
++subdevice.name Octal/Technotrend DVB-C for iTV
+
+ vendor.id pci 0x1131
+&device.id pci 0x7146
+&subvendor.id pci 0x13c2
+&subdevice.id pci 0x1003
++subdevice.name Technotrend-Budget / Hauppauge WinTV-NOVA-S DVB card
+
+ vendor.id pci 0x1131
+&device.id pci 0x7146
+&subvendor.id pci 0x13c2
+&subdevice.id pci 0x1004
++subdevice.name Technotrend-Budget / Hauppauge WinTV-NOVA-C DVB card
+
+ vendor.id pci 0x1131
+&device.id pci 0x7146
+&subvendor.id pci 0x13c2
+&subdevice.id pci 0x1005
++subdevice.name Technotrend-Budget / Hauppauge WinTV-NOVA-T DVB card
+
+ vendor.id pci 0x1131
+&device.id pci 0x7146
+&subvendor.id pci 0x13c2
+&subdevice.id pci 0x100c
++subdevice.name Technotrend-Budget / Hauppauge WinTV-NOVA-CI DVB card
+
+ vendor.id pci 0x1131
+&device.id pci 0x7146
+&subvendor.id pci 0x13c2
+&subdevice.id pci 0x100f
++subdevice.name Technotrend-Budget / Hauppauge WinTV-NOVA-CI DVB card
+
+ vendor.id pci 0x1131
+&device.id pci 0x7146
+&subvendor.id pci 0x13c2
+&subdevice.id pci 0x1011
++subdevice.name Technotrend-Budget / Hauppauge WinTV-NOVA-T DVB card
+
+ vendor.id pci 0x1131
+&device.id pci 0x7146
+&subvendor.id pci 0x13c2
+&subdevice.id pci 0x1013
++subdevice.name SATELCO Multimedia DVB
+
+ vendor.id pci 0x1131
+&device.id pci 0x7146
+&subvendor.id pci 0x13c2
+&subdevice.id pci 0x1102
++subdevice.name Technotrend/Hauppauge DVB card rev2.1
+
+ vendor.id pci 0x1132
++vendor.name Mitel Corp.
+
+ vendor.id pci 0x1133
++vendor.name Eicon Networks Corporation
+
+ vendor.id pci 0x1133
+&device.id pci 0x7901
++device.name EiconCard S90
+
+ vendor.id pci 0x1133
+&device.id pci 0x7902
++device.name EiconCard S90
+
+ vendor.id pci 0x1133
+&device.id pci 0x7911
++device.name EiconCard S91
+
+ vendor.id pci 0x1133
+&device.id pci 0x7912
++device.name EiconCard S91
+
+ vendor.id pci 0x1133
+&device.id pci 0x7941
++device.name EiconCard S94
+
+ vendor.id pci 0x1133
+&device.id pci 0x7942
++device.name EiconCard S94
+
+ vendor.id pci 0x1133
+&device.id pci 0x7943
++device.name EiconCard S94
+
+ vendor.id pci 0x1133
+&device.id pci 0x7944
++device.name EiconCard S94
+
+ vendor.id pci 0x1133
+&device.id pci 0xb921
++device.name EiconCard P92
+
+ vendor.id pci 0x1133
+&device.id pci 0xb922
++device.name EiconCard P92
+
+ vendor.id pci 0x1133
+&device.id pci 0xb923
++device.name EiconCard P92
+
+ vendor.id pci 0x1133
+&device.id pci 0xe001
++device.name Diva Pro 2.0 S/T
+
+ vendor.id pci 0x1133
+&device.id pci 0xe002
++device.name Diva 2.0 S/T PCI
+
+ vendor.id pci 0x1133
+&device.id pci 0xe003
++device.name Diva Pro 2.0 U
+
+ vendor.id pci 0x1133
+&device.id pci 0xe004
++device.name Diva 2.0 U PCI
+
+ vendor.id pci 0x1133
+&device.id pci 0xe005
++device.name Diva 2.01 S/T PCI
+
+ vendor.id pci 0x1133
+&device.id pci 0xe006
++device.name Diva CT S/T PCI
+
+ vendor.id pci 0x1133
+&device.id pci 0xe007
++device.name Diva CT U PCI
+
+ vendor.id pci 0x1133
+&device.id pci 0xe008
++device.name Diva CT Lite S/T PCI
+
+ vendor.id pci 0x1133
+&device.id pci 0xe009
++device.name Diva CT Lite U PCI
+
+ vendor.id pci 0x1133
+&device.id pci 0xe00a
++device.name Diva ISDN+V.90 PCI
+
+ vendor.id pci 0x1133
+&device.id pci 0xe00b
++device.name Diva 2.02 PCI S/T
+
+ vendor.id pci 0x1133
+&device.id pci 0xe00c
++device.name Diva 2.02 PCI U
+
+ vendor.id pci 0x1133
+&device.id pci 0xe00d
++device.name Diva ISDN Pro 3.0 PCI
+
+ vendor.id pci 0x1133
+&device.id pci 0xe00e
++device.name Diva ISDN+CT S/T PCI Rev 2
+
+ vendor.id pci 0x1133
+&device.id pci 0xe010
++device.name Diva Server BRI-2M PCI
+
+ vendor.id pci 0x1133
+&device.id pci 0xe010
+&subvendor.id pci 0x110a
+&subdevice.id pci 0x0021
++subdevice.name Fujitsu Siemens ISDN S0
+
+ vendor.id pci 0x1133
+&device.id pci 0xe010
+&subvendor.id pci 0x8001
+&subdevice.id pci 0x0014
++subdevice.name Diva Server BRI-2M PCI Cornet NQ
+
+ vendor.id pci 0x1133
+&device.id pci 0xe011
++device.name Diva Server BRI S/T Rev 2
+
+ vendor.id pci 0x1133
+&device.id pci 0xe012
++device.name Diva Server 4BRI-8M PCI
+
+ vendor.id pci 0x1133
+&device.id pci 0xe012
+&subvendor.id pci 0x8001
+&subdevice.id pci 0x0014
++subdevice.name Diva Server 4BRI-8M PCI Cornet NQ
+
+ vendor.id pci 0x1133
+&device.id pci 0xe013
++device.name Diva Server 4BRI Rev 2
+
+ vendor.id pci 0x1133
+&device.id pci 0xe013
+&subvendor.id pci 0x1133
+&subdevice.id pci 0x1300
++subdevice.name Diva Server V-4BRI-8
+
+ vendor.id pci 0x1133
+&device.id pci 0xe013
+&subvendor.id pci 0x1133
+&subdevice.id pci 0xe013
++subdevice.name Diva Server 4BRI-8M 2.0 PCI
+
+ vendor.id pci 0x1133
+&device.id pci 0xe013
+&subvendor.id pci 0x8001
+&subdevice.id pci 0x0014
++subdevice.name Diva Server 4BRI-8M 2.0 PCI Cornet NQ
+
+ vendor.id pci 0x1133
+&device.id pci 0xe014
++device.name Diva Server PRI-30M PCI
+
+ vendor.id pci 0x1133
+&device.id pci 0xe014
+&subvendor.id pci 0x0008
+&subdevice.id pci 0x0100
++subdevice.name Diva Server PRI-30M PCI
+
+ vendor.id pci 0x1133
+&device.id pci 0xe014
+&subvendor.id pci 0x8001
+&subdevice.id pci 0x0014
++subdevice.name Diva Server PRI-30M PCI Cornet NQ
+
+ vendor.id pci 0x1133
+&device.id pci 0xe015
++device.name DIVA Server PRI Rev 2
+
+ vendor.id pci 0x1133
+&device.id pci 0xe015
+&subvendor.id pci 0x1133
+&subdevice.id pci 0xe015
++subdevice.name Diva Server PRI 2.0 PCI
+
+ vendor.id pci 0x1133
+&device.id pci 0xe015
+&subvendor.id pci 0x8001
+&subdevice.id pci 0x0014
++subdevice.name Diva Server PRI 2.0 PCI Cornet NQ
+
+ vendor.id pci 0x1133
+&device.id pci 0xe016
++device.name Diva Server Voice 4BRI PCI
+
+ vendor.id pci 0x1133
+&device.id pci 0xe016
+&subvendor.id pci 0x8001
+&subdevice.id pci 0x0014
++subdevice.name Diva Server PRI Cornet NQ
+
+ vendor.id pci 0x1133
+&device.id pci 0xe017
++device.name Diva Server Voice 4BRI Rev 2
+
+ vendor.id pci 0x1133
+&device.id pci 0xe017
+&subvendor.id pci 0x1133
+&subdevice.id pci 0xe017
++subdevice.name Diva Server Voice 4BRI-8M 2.0 PCI
+
+ vendor.id pci 0x1133
+&device.id pci 0xe017
+&subvendor.id pci 0x8001
+&subdevice.id pci 0x0014
++subdevice.name Diva Server Voice 4BRI-8M 2.0 PCI Cornet NQ
+
+ vendor.id pci 0x1133
+&device.id pci 0xe018
++device.name Diva Server BRI-2M 2.0 PCI
+
+ vendor.id pci 0x1133
+&device.id pci 0xe018
+&subvendor.id pci 0x1133
+&subdevice.id pci 0x1800
++subdevice.name Diva Server V-BRI-2
+
+ vendor.id pci 0x1133
+&device.id pci 0xe018
+&subvendor.id pci 0x1133
+&subdevice.id pci 0xe018
++subdevice.name Diva Server BRI-2M 2.0 PCI
+
+ vendor.id pci 0x1133
+&device.id pci 0xe018
+&subvendor.id pci 0x8001
+&subdevice.id pci 0x0014
++subdevice.name Diva Server BRI-2M 2.0 PCI Cornet NQ
+
+ vendor.id pci 0x1133
+&device.id pci 0xe019
++device.name Diva Server Voice PRI Rev 2
+
+ vendor.id pci 0x1133
+&device.id pci 0xe019
+&subvendor.id pci 0x1133
+&subdevice.id pci 0xe019
++subdevice.name Diva Server Voice PRI 2.0 PCI
+
+ vendor.id pci 0x1133
+&device.id pci 0xe019
+&subvendor.id pci 0x8001
+&subdevice.id pci 0x0014
++subdevice.name Diva Server Voice PRI 2.0 PCI Cornet NQ
+
+ vendor.id pci 0x1133
+&device.id pci 0xe01a
++device.name Diva Server 2FX
+
+ vendor.id pci 0x1133
+&device.id pci 0xe01b
++device.name Diva Server Voice BRI-2M 2.0 PCI
+
+ vendor.id pci 0x1133
+&device.id pci 0xe01b
+&subvendor.id pci 0x1133
+&subdevice.id pci 0xe01b
++subdevice.name Diva Server Voice BRI-2M 2.0 PCI
+
+ vendor.id pci 0x1133
+&device.id pci 0xe01b
+&subvendor.id pci 0x8001
+&subdevice.id pci 0x0014
++subdevice.name Diva Server Voice BRI-2M 2.0 PCI Cornet NQ
+
+ vendor.id pci 0x1133
+&device.id pci 0xe01c
++device.name Diva Server PRI Rev 3
+
+ vendor.id pci 0x1133
+&device.id pci 0xe01c
+&subvendor.id pci 0x1133
+&subdevice.id pci 0x1c01
++subdevice.name Diva Server PRI/E1/T1-8
+
+ vendor.id pci 0x1133
+&device.id pci 0xe01c
+&subvendor.id pci 0x1133
+&subdevice.id pci 0x1c02
++subdevice.name Diva Server PRI/T1-24
+
+ vendor.id pci 0x1133
+&device.id pci 0xe01c
+&subvendor.id pci 0x1133
+&subdevice.id pci 0x1c03
++subdevice.name Diva Server PRI/E1-30
+
+ vendor.id pci 0x1133
+&device.id pci 0xe01c
+&subvendor.id pci 0x1133
+&subdevice.id pci 0x1c04
++subdevice.name Diva Server PRI/E1/T1
+
+ vendor.id pci 0x1133
+&device.id pci 0xe01c
+&subvendor.id pci 0x1133
+&subdevice.id pci 0x1c05
++subdevice.name Diva Server V-PRI/T1-24
+
+ vendor.id pci 0x1133
+&device.id pci 0xe01c
+&subvendor.id pci 0x1133
+&subdevice.id pci 0x1c06
++subdevice.name Diva Server V-PRI/E1-30
+
+ vendor.id pci 0x1133
+&device.id pci 0xe01c
+&subvendor.id pci 0x1133
+&subdevice.id pci 0x1c07
++subdevice.name Diva Server PRI/E1/T1-8 Cornet NQ
+
+ vendor.id pci 0x1133
+&device.id pci 0xe01c
+&subvendor.id pci 0x1133
+&subdevice.id pci 0x1c08
++subdevice.name Diva Server PRI/T1-24 Cornet NQ
+
+ vendor.id pci 0x1133
+&device.id pci 0xe01c
+&subvendor.id pci 0x1133
+&subdevice.id pci 0x1c09
++subdevice.name Diva Server PRI/E1-30 Cornet NQ
+
+ vendor.id pci 0x1133
+&device.id pci 0xe01c
+&subvendor.id pci 0x1133
+&subdevice.id pci 0x1c0a
++subdevice.name Diva Server PRI/E1/T1 Cornet NQ
+
+ vendor.id pci 0x1133
+&device.id pci 0xe01c
+&subvendor.id pci 0x1133
+&subdevice.id pci 0x1c0b
++subdevice.name Diva Server V-PRI/T1-24 Cornet NQ
+
+ vendor.id pci 0x1133
+&device.id pci 0xe01c
+&subvendor.id pci 0x1133
+&subdevice.id pci 0x1c0c
++subdevice.name Diva Server V-PRI/E1-30 Cornet NQ
+
+ vendor.id pci 0x1133
+&device.id pci 0xe01e
++device.name Diva Server 2PRI
+
+ vendor.id pci 0x1133
+&device.id pci 0xe01e
+&subvendor.id pci 0x1133
+&subdevice.id pci 0x1e00
++subdevice.name Diva Server V-2PRI/E1-60
+
+ vendor.id pci 0x1133
+&device.id pci 0xe01e
+&subvendor.id pci 0x1133
+&subdevice.id pci 0x1e01
++subdevice.name Diva Server V-2PRI/T1-48
+
+ vendor.id pci 0x1133
+&device.id pci 0xe01e
+&subvendor.id pci 0x1133
+&subdevice.id pci 0x1e02
++subdevice.name Diva Server 2PRI/E1-60
+
+ vendor.id pci 0x1133
+&device.id pci 0xe01e
+&subvendor.id pci 0x1133
+&subdevice.id pci 0x1e03
++subdevice.name Diva Server 2PRI/T1-48
+
+ vendor.id pci 0x1133
+&device.id pci 0xe020
++device.name Diva Server 4PRI
+
+ vendor.id pci 0x1133
+&device.id pci 0xe020
+&subvendor.id pci 0x1133
+&subdevice.id pci 0x2000
++subdevice.name Diva Server V-4PRI/E1-120
+
+ vendor.id pci 0x1133
+&device.id pci 0xe020
+&subvendor.id pci 0x1133
+&subdevice.id pci 0x2001
++subdevice.name Diva Server V-4PRI/T1-96
+
+ vendor.id pci 0x1133
+&device.id pci 0xe020
+&subvendor.id pci 0x1133
+&subdevice.id pci 0x2002
++subdevice.name Diva Server 4PRI/E1-120
+
+ vendor.id pci 0x1133
+&device.id pci 0xe020
+&subvendor.id pci 0x1133
+&subdevice.id pci 0x2003
++subdevice.name Diva Server 4PRI/T1-96
+
+ vendor.id pci 0x1133
+&device.id pci 0xe024
++device.name Diva Server Analog-4P
+
+ vendor.id pci 0x1133
+&device.id pci 0xe024
+&subvendor.id pci 0x1133
+&subdevice.id pci 0x2400
++subdevice.name Diva Server V-Analog-4P
+
+ vendor.id pci 0x1133
+&device.id pci 0xe024
+&subvendor.id pci 0x1133
+&subdevice.id pci 0xe024
++subdevice.name Diva Server Analog-4P
+
+ vendor.id pci 0x1133
+&device.id pci 0xe028
++device.name Diva Server Analog-8P
+
+ vendor.id pci 0x1133
+&device.id pci 0xe028
+&subvendor.id pci 0x1133
+&subdevice.id pci 0x2800
++subdevice.name Diva Server V-Analog-8P
+
+ vendor.id pci 0x1133
+&device.id pci 0xe028
+&subvendor.id pci 0x1133
+&subdevice.id pci 0xe028
++subdevice.name Diva Server Analog-8P
+
+ vendor.id pci 0x1134
++vendor.name Mercury Computer Systems
+
+ vendor.id pci 0x1134
+&device.id pci 0x0001
++device.name Raceway Bridge
+
+ vendor.id pci 0x1134
+&device.id pci 0x0002
++device.name Dual PCI to RapidIO Bridge
+
+ vendor.id pci 0x1135
++vendor.name Fuji Xerox Co Ltd
+
+ vendor.id pci 0x1135
+&device.id pci 0x0001
++device.name Printer controller
+
+ vendor.id pci 0x1136
++vendor.name Momentum Data Systems
+
+ vendor.id pci 0x1137
++vendor.name Cisco Systems Inc
+
+ vendor.id pci 0x1138
++vendor.name Ziatech Corporation
+
+ vendor.id pci 0x1138
+&device.id pci 0x8905
++device.name 8905 [STD 32 Bridge]
+
+ vendor.id pci 0x1139
++vendor.name Dynamic Pictures, Inc
+
+ vendor.id pci 0x1139
+&device.id pci 0x0001
++device.name VGA Compatable 3D Graphics
+
+ vendor.id pci 0x113a
++vendor.name FWB Inc
+
+ vendor.id pci 0x113b
++vendor.name Network Computing Devices
+
+ vendor.id pci 0x113c
++vendor.name Cyclone Microsystems, Inc.
+
+ vendor.id pci 0x113c
+&device.id pci 0x0000
++device.name PCI-9060 i960 Bridge
+
+ vendor.id pci 0x113c
+&device.id pci 0x0001
++device.name PCI-SDK [PCI i960 Evaluation Platform]
+
+ vendor.id pci 0x113c
+&device.id pci 0x0911
++device.name PCI-911 [i960Jx-based Intelligent I/O Controller]
+
+ vendor.id pci 0x113c
+&device.id pci 0x0912
++device.name PCI-912 [i960CF-based Intelligent I/O Controller]
+
+ vendor.id pci 0x113c
+&device.id pci 0x0913
++device.name PCI-913
+
+ vendor.id pci 0x113c
+&device.id pci 0x0914
++device.name PCI-914 [I/O Controller w/ secondary PCI bus]
+
+ vendor.id pci 0x113d
++vendor.name Leading Edge Products Inc
+
+ vendor.id pci 0x113e
++vendor.name Sanyo Electric Co - Computer Engineering Dept
+
+ vendor.id pci 0x113f
++vendor.name Equinox Systems, Inc.
+
+ vendor.id pci 0x113f
+&device.id pci 0x0808
++device.name SST-64P Adapter
+
+ vendor.id pci 0x113f
+&device.id pci 0x1010
++device.name SST-128P Adapter
+
+ vendor.id pci 0x113f
+&device.id pci 0x80c0
++device.name SST-16P DB Adapter
+
+ vendor.id pci 0x113f
+&device.id pci 0x80c4
++device.name SST-16P RJ Adapter
+
+ vendor.id pci 0x113f
+&device.id pci 0x80c8
++device.name SST-16P Adapter
+
+ vendor.id pci 0x113f
+&device.id pci 0x8888
++device.name SST-4P Adapter
+
+ vendor.id pci 0x113f
+&device.id pci 0x9090
++device.name SST-8P Adapter
+
+ vendor.id pci 0x1140
++vendor.name Intervoice Inc
+
+ vendor.id pci 0x1141
++vendor.name Crest Microsystem Inc
+
+ vendor.id pci 0x1142
++vendor.name Alliance Semiconductor Corporation
+
+ vendor.id pci 0x1142
+&device.id pci 0x3210
++device.name AP6410
+
+ vendor.id pci 0x1142
+&device.id pci 0x6422
++device.name ProVideo 6422
+
+ vendor.id pci 0x1142
+&device.id pci 0x6424
++device.name ProVideo 6424
+
+ vendor.id pci 0x1142
+&device.id pci 0x6425
++device.name ProMotion AT25
+
+ vendor.id pci 0x1142
+&device.id pci 0x643d
++device.name ProMotion AT3D
+
+ vendor.id pci 0x1143
++vendor.name NetPower, Inc
+
+ vendor.id pci 0x1144
++vendor.name Cincinnati Milacron
+
+ vendor.id pci 0x1144
+&device.id pci 0x0001
++device.name Noservo controller
+
+ vendor.id pci 0x1145
++vendor.name Workbit Corporation
+
+ vendor.id pci 0x1145
+&device.id pci 0x8007
++device.name NinjaSCSI-32 Workbit
+
+ vendor.id pci 0x1145
+&device.id pci 0xf007
++device.name NinjaSCSI-32 KME
+
+ vendor.id pci 0x1145
+&device.id pci 0xf010
++device.name NinjaSCSI-32 Workbit
+
+ vendor.id pci 0x1145
+&device.id pci 0xf012
++device.name NinjaSCSI-32 Logitec
+
+ vendor.id pci 0x1145
+&device.id pci 0xf013
++device.name NinjaSCSI-32 Logitec
+
+ vendor.id pci 0x1145
+&device.id pci 0xf015
++device.name NinjaSCSI-32 Melco
+
+ vendor.id pci 0x1146
++vendor.name Force Computers
+
+ vendor.id pci 0x1147
++vendor.name Interface Corp
+
+ vendor.id pci 0x1148
++vendor.name SysKonnect
+
+ vendor.id pci 0x1148
+&device.id pci 0x4000
++device.name FDDI Adapter
+
+ vendor.id pci 0x1148
+&device.id pci 0x4000
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0xb03b
++subdevice.name Netelligent 100 FDDI DAS Fibre SC
+
+ vendor.id pci 0x1148
+&device.id pci 0x4000
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0xb03c
++subdevice.name Netelligent 100 FDDI SAS Fibre SC
+
+ vendor.id pci 0x1148
+&device.id pci 0x4000
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0xb03d
++subdevice.name Netelligent 100 FDDI DAS UTP
+
+ vendor.id pci 0x1148
+&device.id pci 0x4000
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0xb03e
++subdevice.name Netelligent 100 FDDI SAS UTP
+
+ vendor.id pci 0x1148
+&device.id pci 0x4000
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0xb03f
++subdevice.name Netelligent 100 FDDI SAS Fibre MIC
+
+ vendor.id pci 0x1148
+&device.id pci 0x4000
+&subvendor.id pci 0x1148
+&subdevice.id pci 0x5521
++subdevice.name FDDI SK-5521 (SK-NET FDDI-UP)
+
+ vendor.id pci 0x1148
+&device.id pci 0x4000
+&subvendor.id pci 0x1148
+&subdevice.id pci 0x5522
++subdevice.name FDDI SK-5522 (SK-NET FDDI-UP DAS)
+
+ vendor.id pci 0x1148
+&device.id pci 0x4000
+&subvendor.id pci 0x1148
+&subdevice.id pci 0x5541
++subdevice.name FDDI SK-5541 (SK-NET FDDI-FP)
+
+ vendor.id pci 0x1148
+&device.id pci 0x4000
+&subvendor.id pci 0x1148
+&subdevice.id pci 0x5543
++subdevice.name FDDI SK-5543 (SK-NET FDDI-LP)
+
+ vendor.id pci 0x1148
+&device.id pci 0x4000
+&subvendor.id pci 0x1148
+&subdevice.id pci 0x5544
++subdevice.name FDDI SK-5544 (SK-NET FDDI-LP DAS)
+
+ vendor.id pci 0x1148
+&device.id pci 0x4000
+&subvendor.id pci 0x1148
+&subdevice.id pci 0x5821
++subdevice.name FDDI SK-5821 (SK-NET FDDI-UP64)
+
+ vendor.id pci 0x1148
+&device.id pci 0x4000
+&subvendor.id pci 0x1148
+&subdevice.id pci 0x5822
++subdevice.name FDDI SK-5822 (SK-NET FDDI-UP64 DAS)
+
+ vendor.id pci 0x1148
+&device.id pci 0x4000
+&subvendor.id pci 0x1148
+&subdevice.id pci 0x5841
++subdevice.name FDDI SK-5841 (SK-NET FDDI-FP64)
+
+ vendor.id pci 0x1148
+&device.id pci 0x4000
+&subvendor.id pci 0x1148
+&subdevice.id pci 0x5843
++subdevice.name FDDI SK-5843 (SK-NET FDDI-LP64)
+
+ vendor.id pci 0x1148
+&device.id pci 0x4000
+&subvendor.id pci 0x1148
+&subdevice.id pci 0x5844
++subdevice.name FDDI SK-5844 (SK-NET FDDI-LP64 DAS)
+
+ vendor.id pci 0x1148
+&device.id pci 0x4200
++device.name Token Ring adapter
+
+ vendor.id pci 0x1148
+&device.id pci 0x4300
++device.name SK-98xx Gigabit Ethernet Server Adapter
+
+ vendor.id pci 0x1148
+&device.id pci 0x4300
+&subvendor.id pci 0x1148
+&subdevice.id pci 0x9821
++subdevice.name SK-9821 Gigabit Ethernet Server Adapter (SK-NET GE-T)
+
+ vendor.id pci 0x1148
+&device.id pci 0x4300
+&subvendor.id pci 0x1148
+&subdevice.id pci 0x9822
++subdevice.name SK-9822 Gigabit Ethernet Server Adapter (SK-NET GE-T dual link)
+
+ vendor.id pci 0x1148
+&device.id pci 0x4300
+&subvendor.id pci 0x1148
+&subdevice.id pci 0x9841
++subdevice.name SK-9841 Gigabit Ethernet Server Adapter (SK-NET GE-LX)
+
+ vendor.id pci 0x1148
+&device.id pci 0x4300
+&subvendor.id pci 0x1148
+&subdevice.id pci 0x9842
++subdevice.name SK-9842 Gigabit Ethernet Server Adapter (SK-NET GE-LX dual link)
+
+ vendor.id pci 0x1148
+&device.id pci 0x4300
+&subvendor.id pci 0x1148
+&subdevice.id pci 0x9843
++subdevice.name SK-9843 Gigabit Ethernet Server Adapter (SK-NET GE-SX)
+
+ vendor.id pci 0x1148
+&device.id pci 0x4300
+&subvendor.id pci 0x1148
+&subdevice.id pci 0x9844
++subdevice.name SK-9844 Gigabit Ethernet Server Adapter (SK-NET GE-SX dual link)
+
+ vendor.id pci 0x1148
+&device.id pci 0x4300
+&subvendor.id pci 0x1148
+&subdevice.id pci 0x9861
++subdevice.name SK-9861 Gigabit Ethernet Server Adapter (SK-NET GE-SX Volition)
+
+ vendor.id pci 0x1148
+&device.id pci 0x4300
+&subvendor.id pci 0x1148
+&subdevice.id pci 0x9862
++subdevice.name SK-9862 Gigabit Ethernet Server Adapter (SK-NET GE-SX Volition dual link)
+
+ vendor.id pci 0x1148
+&device.id pci 0x4300
+&subvendor.id pci 0x1148
+&subdevice.id pci 0x9871
++subdevice.name SK-9871 Gigabit Ethernet Server Adapter (SK-NET GE-ZX)
+
+ vendor.id pci 0x1148
+&device.id pci 0x4300
+&subvendor.id pci 0x1148
+&subdevice.id pci 0x9872
++subdevice.name SK-9872 Gigabit Ethernet Server Adapter (SK-NET GE-ZX dual link)
+
+ vendor.id pci 0x1148
+&device.id pci 0x4300
+&subvendor.id pci 0x1259
+&subdevice.id pci 0x2970
++subdevice.name AT-2970SX Gigabit Ethernet Adapter
+
+ vendor.id pci 0x1148
+&device.id pci 0x4300
+&subvendor.id pci 0x1259
+&subdevice.id pci 0x2971
++subdevice.name AT-2970LX Gigabit Ethernet Adapter
+
+ vendor.id pci 0x1148
+&device.id pci 0x4300
+&subvendor.id pci 0x1259
+&subdevice.id pci 0x2972
++subdevice.name AT-2970TX Gigabit Ethernet Adapter
+
+ vendor.id pci 0x1148
+&device.id pci 0x4300
+&subvendor.id pci 0x1259
+&subdevice.id pci 0x2973
++subdevice.name AT-2971SX Gigabit Ethernet Adapter
+
+ vendor.id pci 0x1148
+&device.id pci 0x4300
+&subvendor.id pci 0x1259
+&subdevice.id pci 0x2974
++subdevice.name AT-2971T Gigabit Ethernet Adapter
+
+ vendor.id pci 0x1148
+&device.id pci 0x4300
+&subvendor.id pci 0x1259
+&subdevice.id pci 0x2975
++subdevice.name AT-2970SX/2SC Gigabit Ethernet Adapter
+
+ vendor.id pci 0x1148
+&device.id pci 0x4300
+&subvendor.id pci 0x1259
+&subdevice.id pci 0x2976
++subdevice.name AT-2970LX/2SC Gigabit Ethernet Adapter
+
+ vendor.id pci 0x1148
+&device.id pci 0x4300
+&subvendor.id pci 0x1259
+&subdevice.id pci 0x2977
++subdevice.name AT-2970TX/2TX Gigabit Ethernet Adapter
+
+ vendor.id pci 0x1148
+&device.id pci 0x4320
++device.name SK-98xx V2.0 Gigabit Ethernet Adapter
+
+ vendor.id pci 0x1148
+&device.id pci 0x4320
+&subvendor.id pci 0x1148
+&subdevice.id pci 0x0121
++subdevice.name Marvell RDK-8001 Adapter
+
+ vendor.id pci 0x1148
+&device.id pci 0x4320
+&subvendor.id pci 0x1148
+&subdevice.id pci 0x0221
++subdevice.name Marvell RDK-8002 Adapter
+
+ vendor.id pci 0x1148
+&device.id pci 0x4320
+&subvendor.id pci 0x1148
+&subdevice.id pci 0x0321
++subdevice.name Marvell RDK-8003 Adapter
+
+ vendor.id pci 0x1148
+&device.id pci 0x4320
+&subvendor.id pci 0x1148
+&subdevice.id pci 0x0421
++subdevice.name Marvell RDK-8004 Adapter
+
+ vendor.id pci 0x1148
+&device.id pci 0x4320
+&subvendor.id pci 0x1148
+&subdevice.id pci 0x0621
++subdevice.name Marvell RDK-8006 Adapter
+
+ vendor.id pci 0x1148
+&device.id pci 0x4320
+&subvendor.id pci 0x1148
+&subdevice.id pci 0x0721
++subdevice.name Marvell RDK-8007 Adapter
+
+ vendor.id pci 0x1148
+&device.id pci 0x4320
+&subvendor.id pci 0x1148
+&subdevice.id pci 0x0821
++subdevice.name Marvell RDK-8008 Adapter
+
+ vendor.id pci 0x1148
+&device.id pci 0x4320
+&subvendor.id pci 0x1148
+&subdevice.id pci 0x0921
++subdevice.name Marvell RDK-8009 Adapter
+
+ vendor.id pci 0x1148
+&device.id pci 0x4320
+&subvendor.id pci 0x1148
+&subdevice.id pci 0x1121
++subdevice.name Marvell RDK-8011 Adapter
+
+ vendor.id pci 0x1148
+&device.id pci 0x4320
+&subvendor.id pci 0x1148
+&subdevice.id pci 0x1221
++subdevice.name Marvell RDK-8012 Adapter
+
+ vendor.id pci 0x1148
+&device.id pci 0x4320
+&subvendor.id pci 0x1148
+&subdevice.id pci 0x3221
++subdevice.name SK-9521 V2.0 10/100/1000Base-T Adapter
+
+ vendor.id pci 0x1148
+&device.id pci 0x4320
+&subvendor.id pci 0x1148
+&subdevice.id pci 0x5021
++subdevice.name SK-9821 V2.0 Gigabit Ethernet 10/100/1000Base-T Adapter
+
+ vendor.id pci 0x1148
+&device.id pci 0x4320
+&subvendor.id pci 0x1148
+&subdevice.id pci 0x5041
++subdevice.name SK-9841 V2.0 Gigabit Ethernet 1000Base-LX Adapter
+
+ vendor.id pci 0x1148
+&device.id pci 0x4320
+&subvendor.id pci 0x1148
+&subdevice.id pci 0x5043
++subdevice.name SK-9843 V2.0 Gigabit Ethernet 1000Base-SX Adapter
+
+ vendor.id pci 0x1148
+&device.id pci 0x4320
+&subvendor.id pci 0x1148
+&subdevice.id pci 0x5051
++subdevice.name SK-9851 V2.0 Gigabit Ethernet 1000Base-SX Adapter
+
+ vendor.id pci 0x1148
+&device.id pci 0x4320
+&subvendor.id pci 0x1148
+&subdevice.id pci 0x5061
++subdevice.name SK-9861 V2.0 Gigabit Ethernet 1000Base-SX Adapter
+
+ vendor.id pci 0x1148
+&device.id pci 0x4320
+&subvendor.id pci 0x1148
+&subdevice.id pci 0x5071
++subdevice.name SK-9871 V2.0 Gigabit Ethernet 1000Base-ZX Adapter
+
+ vendor.id pci 0x1148
+&device.id pci 0x4320
+&subvendor.id pci 0x1148
+&subdevice.id pci 0x9521
++subdevice.name SK-9521 10/100/1000Base-T Adapter
+
+ vendor.id pci 0x1148
+&device.id pci 0x4400
++device.name SK-9Dxx Gigabit Ethernet Adapter
+
+ vendor.id pci 0x1148
+&device.id pci 0x4500
++device.name SK-9Mxx Gigabit Ethernet Adapter
+
+ vendor.id pci 0x1148
+&device.id pci 0x9e00
++device.name SK-9Exx 10/100/1000Base-T Adapter
+
+ vendor.id pci 0x1148
+&device.id pci 0x9e00
+&subvendor.id pci 0x1148
+&subdevice.id pci 0x2100
++subdevice.name SK-9E21 Server Adapter
+
+ vendor.id pci 0x1148
+&device.id pci 0x9e00
+&subvendor.id pci 0x1148
+&subdevice.id pci 0x21d0
++subdevice.name SK-9E21D 10/100/1000Base-T Adapter
+
+ vendor.id pci 0x1148
+&device.id pci 0x9e00
+&subvendor.id pci 0x1148
+&subdevice.id pci 0x2200
++subdevice.name SK-9E22 Server Adapter
+
+ vendor.id pci 0x1148
+&device.id pci 0x9e00
+&subvendor.id pci 0x1148
+&subdevice.id pci 0x8100
++subdevice.name SK-9E81 Server Adapter
+
+ vendor.id pci 0x1148
+&device.id pci 0x9e00
+&subvendor.id pci 0x1148
+&subdevice.id pci 0x8200
++subdevice.name SK-9E82 Server Adapter
+
+ vendor.id pci 0x1148
+&device.id pci 0x9e00
+&subvendor.id pci 0x1148
+&subdevice.id pci 0x9100
++subdevice.name SK-9E91 Server Adapter
+
+ vendor.id pci 0x1148
+&device.id pci 0x9e00
+&subvendor.id pci 0x1148
+&subdevice.id pci 0x9200
++subdevice.name SK-9E92 Server Adapter
+
+ vendor.id pci 0x1149
++vendor.name Win System Corporation
+
+ vendor.id pci 0x114a
++vendor.name VMIC
+
+ vendor.id pci 0x114a
+&device.id pci 0x5579
++device.name VMIPCI-5579 (Reflective Memory Card)
+
+ vendor.id pci 0x114a
+&device.id pci 0x5587
++device.name VMIPCI-5587 (Reflective Memory Card)
+
+ vendor.id pci 0x114a
+&device.id pci 0x6504
++device.name VMIC PCI 7755 FPGA
+
+ vendor.id pci 0x114a
+&device.id pci 0x7587
++device.name VMIVME-7587
+
+ vendor.id pci 0x114b
++vendor.name Canopus Co., Ltd
+
+ vendor.id pci 0x114c
++vendor.name Annabooks
+
+ vendor.id pci 0x114d
++vendor.name IC Corporation
+
+ vendor.id pci 0x114e
++vendor.name Nikon Systems Inc
+
+ vendor.id pci 0x114f
++vendor.name Digi International
+
+ vendor.id pci 0x114f
+&device.id pci 0x0002
++device.name AccelePort EPC
+
+ vendor.id pci 0x114f
+&device.id pci 0x0003
++device.name RightSwitch SE-6
+
+ vendor.id pci 0x114f
+&device.id pci 0x0004
++device.name AccelePort Xem
+
+ vendor.id pci 0x114f
+&device.id pci 0x0005
++device.name AccelePort Xr
+
+ vendor.id pci 0x114f
+&device.id pci 0x0006
++device.name AccelePort Xr,C/X
+
+ vendor.id pci 0x114f
+&device.id pci 0x0009
++device.name AccelePort Xr/J
+
+ vendor.id pci 0x114f
+&device.id pci 0x000a
++device.name AccelePort EPC/J
+
+ vendor.id pci 0x114f
+&device.id pci 0x000c
++device.name DataFirePRIme T1 (1-port)
+
+ vendor.id pci 0x114f
+&device.id pci 0x000d
++device.name SyncPort 2-Port (x.25/FR)
+
+ vendor.id pci 0x114f
+&device.id pci 0x0011
++device.name AccelePort 8r EIA-232 (IBM)
+
+ vendor.id pci 0x114f
+&device.id pci 0x0012
++device.name AccelePort 8r EIA-422
+
+ vendor.id pci 0x114f
+&device.id pci 0x0013
++device.name AccelePort Xr
+
+ vendor.id pci 0x114f
+&device.id pci 0x0014
++device.name AccelePort 8r EIA-422
+
+ vendor.id pci 0x114f
+&device.id pci 0x0015
++device.name AccelePort Xem
+
+ vendor.id pci 0x114f
+&device.id pci 0x0016
++device.name AccelePort EPC/X
+
+ vendor.id pci 0x114f
+&device.id pci 0x0017
++device.name AccelePort C/X
+
+ vendor.id pci 0x114f
+&device.id pci 0x001a
++device.name DataFirePRIme E1 (1-port)
+
+ vendor.id pci 0x114f
+&device.id pci 0x001b
++device.name AccelePort C/X (IBM)
+
+ vendor.id pci 0x114f
+&device.id pci 0x001d
++device.name DataFire RAS T1/E1/PRI
+
+ vendor.id pci 0x114f
+&device.id pci 0x001d
+&subvendor.id pci 0x114f
+&subdevice.id pci 0x0050
++subdevice.name DataFire RAS E1 Adapter
+
+ vendor.id pci 0x114f
+&device.id pci 0x001d
+&subvendor.id pci 0x114f
+&subdevice.id pci 0x0051
++subdevice.name DataFire RAS Dual E1 Adapter
+
+ vendor.id pci 0x114f
+&device.id pci 0x001d
+&subvendor.id pci 0x114f
+&subdevice.id pci 0x0052
++subdevice.name DataFire RAS T1 Adapter
+
+ vendor.id pci 0x114f
+&device.id pci 0x001d
+&subvendor.id pci 0x114f
+&subdevice.id pci 0x0053
++subdevice.name DataFire RAS Dual T1 Adapter
+
+ vendor.id pci 0x114f
+&device.id pci 0x0023
++device.name AccelePort RAS
+
+ vendor.id pci 0x114f
+&device.id pci 0x0024
++device.name DataFire RAS B4 ST/U
+
+ vendor.id pci 0x114f
+&device.id pci 0x0024
+&subvendor.id pci 0x114f
+&subdevice.id pci 0x0030
++subdevice.name DataFire RAS BRI U Adapter
+
+ vendor.id pci 0x114f
+&device.id pci 0x0024
+&subvendor.id pci 0x114f
+&subdevice.id pci 0x0031
++subdevice.name DataFire RAS BRI S/T Adapter
+
+ vendor.id pci 0x114f
+&device.id pci 0x0026
++device.name AccelePort 4r 920
+
+ vendor.id pci 0x114f
+&device.id pci 0x0027
++device.name AccelePort Xr 920
+
+ vendor.id pci 0x114f
+&device.id pci 0x0028
++device.name ClassicBoard 4
+
+ vendor.id pci 0x114f
+&device.id pci 0x0029
++device.name ClassicBoard 8
+
+ vendor.id pci 0x114f
+&device.id pci 0x0034
++device.name AccelePort 2r 920
+
+ vendor.id pci 0x114f
+&device.id pci 0x0035
++device.name DataFire DSP T1/E1/PRI cPCI
+
+ vendor.id pci 0x114f
+&device.id pci 0x0040
++device.name AccelePort Xp
+
+ vendor.id pci 0x114f
+&device.id pci 0x0042
++device.name AccelePort 2p
+
+ vendor.id pci 0x114f
+&device.id pci 0x0043
++device.name AccelePort 4p
+
+ vendor.id pci 0x114f
+&device.id pci 0x0044
++device.name AccelePort 8p
+
+ vendor.id pci 0x114f
+&device.id pci 0x0045
++device.name AccelePort 16p
+
+ vendor.id pci 0x114f
+&device.id pci 0x004e
++device.name AccelePort 32p
+
+ vendor.id pci 0x114f
+&device.id pci 0x0070
++device.name Datafire Micro V IOM2 (Europe)
+
+ vendor.id pci 0x114f
+&device.id pci 0x0071
++device.name Datafire Micro V (Europe)
+
+ vendor.id pci 0x114f
+&device.id pci 0x0072
++device.name Datafire Micro V IOM2 (North America)
+
+ vendor.id pci 0x114f
+&device.id pci 0x0073
++device.name Datafire Micro V (North America)
+
+ vendor.id pci 0x114f
+&device.id pci 0x00b0
++device.name Digi Neo 4
+
+ vendor.id pci 0x114f
+&device.id pci 0x00b1
++device.name Digi Neo 8
+
+ vendor.id pci 0x114f
+&device.id pci 0x00c8
++device.name Digi Neo 2 DB9
+
+ vendor.id pci 0x114f
+&device.id pci 0x00c9
++device.name Digi Neo 2 DB9 PRI
+
+ vendor.id pci 0x114f
+&device.id pci 0x00ca
++device.name Digi Neo 2 RJ45
+
+ vendor.id pci 0x114f
+&device.id pci 0x00cb
++device.name Digi Neo 2 RJ45 PRI
+
+ vendor.id pci 0x114f
+&device.id pci 0x00d0
++device.name ClassicBoard 4 422
+
+ vendor.id pci 0x114f
+&device.id pci 0x00d1
++device.name ClassicBoard 8 422
+
+ vendor.id pci 0x114f
+&device.id pci 0x6001
++device.name Avanstar
+
+ vendor.id pci 0x1150
++vendor.name Thinking Machines Corp
+
+ vendor.id pci 0x1151
++vendor.name JAE Electronics Inc.
+
+ vendor.id pci 0x1152
++vendor.name Megatek
+
+ vendor.id pci 0x1153
++vendor.name Land Win Electronic Corp
+
+ vendor.id pci 0x1154
++vendor.name Melco Inc
+
+ vendor.id pci 0x1155
++vendor.name Pine Technology Ltd
+
+ vendor.id pci 0x1156
++vendor.name Periscope Engineering
+
+ vendor.id pci 0x1157
++vendor.name Avsys Corporation
+
+ vendor.id pci 0x1158
++vendor.name Voarx R & D Inc
+
+ vendor.id pci 0x1158
+&device.id pci 0x3011
++device.name Tokenet/vg 1001/10m anylan
+
+ vendor.id pci 0x1158
+&device.id pci 0x9050
++device.name Lanfleet/Truevalue
+
+ vendor.id pci 0x1158
+&device.id pci 0x9051
++device.name Lanfleet/Truevalue
+
+ vendor.id pci 0x1159
++vendor.name Mutech Corp
+
+ vendor.id pci 0x1159
+&device.id pci 0x0001
++device.name MV-1000
+
+ vendor.id pci 0x115a
++vendor.name Harlequin Ltd
+
+ vendor.id pci 0x115b
++vendor.name Parallax Graphics
+
+ vendor.id pci 0x115c
++vendor.name Photron Ltd.
+
+ vendor.id pci 0x115d
++vendor.name Xircom
+
+ vendor.id pci 0x115d
+&device.id pci 0x0003
++device.name Cardbus Ethernet 10/100
+
+ vendor.id pci 0x115d
+&device.id pci 0x0003
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x0181
++subdevice.name 10/100 EtherJet Cardbus Adapter
+
+ vendor.id pci 0x115d
+&device.id pci 0x0003
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x1181
++subdevice.name 10/100 EtherJet Cardbus Adapter
+
+ vendor.id pci 0x115d
+&device.id pci 0x0003
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x8181
++subdevice.name 10/100 EtherJet Cardbus Adapter
+
+ vendor.id pci 0x115d
+&device.id pci 0x0003
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x9181
++subdevice.name 10/100 EtherJet Cardbus Adapter
+
+ vendor.id pci 0x115d
+&device.id pci 0x0003
+&subvendor.id pci 0x115d
+&subdevice.id pci 0x0181
++subdevice.name Cardbus Ethernet 10/100
+
+ vendor.id pci 0x115d
+&device.id pci 0x0003
+&subvendor.id pci 0x115d
+&subdevice.id pci 0x1181
++subdevice.name Cardbus Ethernet 10/100
+
+ vendor.id pci 0x115d
+&device.id pci 0x0003
+&subvendor.id pci 0x1179
+&subdevice.id pci 0x0181
++subdevice.name Cardbus Ethernet 10/100
+
+ vendor.id pci 0x115d
+&device.id pci 0x0003
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x8181
++subdevice.name EtherExpress PRO/100 Mobile CardBus 32 Adapter
+
+ vendor.id pci 0x115d
+&device.id pci 0x0003
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x9181
++subdevice.name EtherExpress PRO/100 Mobile CardBus 32 Adapter
+
+ vendor.id pci 0x115d
+&device.id pci 0x0005
++device.name Cardbus Ethernet 10/100
+
+ vendor.id pci 0x115d
+&device.id pci 0x0005
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x0182
++subdevice.name 10/100 EtherJet Cardbus Adapter
+
+ vendor.id pci 0x115d
+&device.id pci 0x0005
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x1182
++subdevice.name 10/100 EtherJet Cardbus Adapter
+
+ vendor.id pci 0x115d
+&device.id pci 0x0005
+&subvendor.id pci 0x115d
+&subdevice.id pci 0x0182
++subdevice.name Cardbus Ethernet 10/100
+
+ vendor.id pci 0x115d
+&device.id pci 0x0005
+&subvendor.id pci 0x115d
+&subdevice.id pci 0x1182
++subdevice.name Cardbus Ethernet 10/100
+
+ vendor.id pci 0x115d
+&device.id pci 0x0007
++device.name Cardbus Ethernet 10/100
+
+ vendor.id pci 0x115d
+&device.id pci 0x0007
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x0182
++subdevice.name 10/100 EtherJet Cardbus Adapter
+
+ vendor.id pci 0x115d
+&device.id pci 0x0007
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x1182
++subdevice.name 10/100 EtherJet Cardbus Adapter
+
+ vendor.id pci 0x115d
+&device.id pci 0x0007
+&subvendor.id pci 0x115d
+&subdevice.id pci 0x0182
++subdevice.name Cardbus Ethernet 10/100
+
+ vendor.id pci 0x115d
+&device.id pci 0x0007
+&subvendor.id pci 0x115d
+&subdevice.id pci 0x1182
++subdevice.name Cardbus Ethernet 10/100
+
+ vendor.id pci 0x115d
+&device.id pci 0x000b
++device.name Cardbus Ethernet 10/100
+
+ vendor.id pci 0x115d
+&device.id pci 0x000b
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x0183
++subdevice.name 10/100 EtherJet Cardbus Adapter
+
+ vendor.id pci 0x115d
+&device.id pci 0x000b
+&subvendor.id pci 0x115d
+&subdevice.id pci 0x0183
++subdevice.name Cardbus Ethernet 10/100
+
+ vendor.id pci 0x115d
+&device.id pci 0x000c
++device.name Mini-PCI V.90 56k Modem
+
+ vendor.id pci 0x115d
+&device.id pci 0x000f
++device.name Cardbus Ethernet 10/100
+
+ vendor.id pci 0x115d
+&device.id pci 0x000f
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x0183
++subdevice.name 10/100 EtherJet Cardbus Adapter
+
+ vendor.id pci 0x115d
+&device.id pci 0x000f
+&subvendor.id pci 0x115d
+&subdevice.id pci 0x0183
++subdevice.name Cardbus Ethernet 10/100
+
+ vendor.id pci 0x115d
+&device.id pci 0x00d4
++device.name Mini-PCI K56Flex Modem
+
+ vendor.id pci 0x115d
+&device.id pci 0x0101
++device.name Cardbus 56k modem
+
+ vendor.id pci 0x115d
+&device.id pci 0x0101
+&subvendor.id pci 0x115d
+&subdevice.id pci 0x1081
++subdevice.name Cardbus 56k Modem
+
+ vendor.id pci 0x115d
+&device.id pci 0x0103
++device.name Cardbus Ethernet + 56k Modem
+
+ vendor.id pci 0x115d
+&device.id pci 0x0103
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x9181
++subdevice.name Cardbus 56k Modem
+
+ vendor.id pci 0x115d
+&device.id pci 0x0103
+&subvendor.id pci 0x1115
+&subdevice.id pci 0x1181
++subdevice.name Cardbus Ethernet 100 + 56k Modem
+
+ vendor.id pci 0x115d
+&device.id pci 0x0103
+&subvendor.id pci 0x115d
+&subdevice.id pci 0x1181
++subdevice.name CBEM56G-100 Ethernet + 56k Modem
+
+ vendor.id pci 0x115d
+&device.id pci 0x0103
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x9181
++subdevice.name PRO/100 LAN + Modem56 CardBus
+
+ vendor.id pci 0x115e
++vendor.name Peer Protocols Inc
+
+ vendor.id pci 0x115f
++vendor.name Maxtor Corporation
+
+ vendor.id pci 0x1160
++vendor.name Megasoft Inc
+
+ vendor.id pci 0x1161
++vendor.name PFU Limited
+
+ vendor.id pci 0x1162
++vendor.name OA Laboratory Co Ltd
+
+ vendor.id pci 0x1163
++vendor.name Rendition
+
+ vendor.id pci 0x1163
+&device.id pci 0x0001
++device.name Verite 1000
+
+ vendor.id pci 0x1163
+&device.id pci 0x2000
++device.name Verite V2000/V2100/V2200
+
+ vendor.id pci 0x1163
+&device.id pci 0x2000
+&subvendor.id pci 0x1092
+&subdevice.id pci 0x2000
++subdevice.name Stealth II S220
+
+ vendor.id pci 0x1164
++vendor.name Advanced Peripherals Technologies
+
+ vendor.id pci 0x1165
++vendor.name Imagraph Corporation
+
+ vendor.id pci 0x1165
+&device.id pci 0x0001
++device.name Motion TPEG Recorder/Player with audio
+
+ vendor.id pci 0x1166
++vendor.name ServerWorks
+
+ vendor.id pci 0x1166
+&device.id pci 0x0000
++device.name CMIC-LE
+
+ vendor.id pci 0x1166
+&device.id pci 0x0005
++device.name CNB20-LE Host Bridge
+
+ vendor.id pci 0x1166
+&device.id pci 0x0006
++device.name CNB20HE Host Bridge
+
+ vendor.id pci 0x1166
+&device.id pci 0x0007
++device.name CNB20-LE Host Bridge
+
+ vendor.id pci 0x1166
+&device.id pci 0x0008
++device.name CNB20HE Host Bridge
+
+ vendor.id pci 0x1166
+&device.id pci 0x0009
++device.name CNB20LE Host Bridge
+
+ vendor.id pci 0x1166
+&device.id pci 0x0010
++device.name CIOB30
+
+ vendor.id pci 0x1166
+&device.id pci 0x0011
++device.name CMIC-HE
+
+ vendor.id pci 0x1166
+&device.id pci 0x0012
++device.name CMIC-WS Host Bridge (GC-LE chipset)
+
+ vendor.id pci 0x1166
+&device.id pci 0x0013
++device.name CNB20-HE Host Bridge
+
+ vendor.id pci 0x1166
+&device.id pci 0x0014
++device.name CMIC-LE Host Bridge (GC-LE chipset)
+
+ vendor.id pci 0x1166
+&device.id pci 0x0015
++device.name CMIC-GC Host Bridge
+
+ vendor.id pci 0x1166
+&device.id pci 0x0016
++device.name CMIC-GC Host Bridge
+
+ vendor.id pci 0x1166
+&device.id pci 0x0017
++device.name GCNB-LE Host Bridge
+
+ vendor.id pci 0x1166
+&device.id pci 0x0101
++device.name CIOB-X2 PCI-X I/O Bridge
+
+ vendor.id pci 0x1166
+&device.id pci 0x0110
++device.name CIOB-E I/O Bridge with Gigabit Ethernet
+
+ vendor.id pci 0x1166
+&device.id pci 0x0200
++device.name OSB4 South Bridge
+
+ vendor.id pci 0x1166
+&device.id pci 0x0201
++device.name CSB5 South Bridge
+
+ vendor.id pci 0x1166
+&device.id pci 0x0201
+&subvendor.id pci 0x4c53
+&subdevice.id pci 0x1080
++subdevice.name CT8 mainboard
+
+ vendor.id pci 0x1166
+&device.id pci 0x0203
++device.name CSB6 South Bridge
+
+ vendor.id pci 0x1166
+&device.id pci 0x0211
++device.name OSB4 IDE Controller
+
+ vendor.id pci 0x1166
+&device.id pci 0x0212
++device.name CSB5 IDE Controller
+
+ vendor.id pci 0x1166
+&device.id pci 0x0212
+&subvendor.id pci 0x4c53
+&subdevice.id pci 0x1080
++subdevice.name CT8 mainboard
+
+ vendor.id pci 0x1166
+&device.id pci 0x0213
++device.name CSB6 RAID/IDE Controller
+
+ vendor.id pci 0x1166
+&device.id pci 0x0217
++device.name CSB6 IDE Controller
+
+ vendor.id pci 0x1166
+&device.id pci 0x0220
++device.name OSB4/CSB5 OHCI USB Controller
+
+ vendor.id pci 0x1166
+&device.id pci 0x0220
+&subvendor.id pci 0x4c53
+&subdevice.id pci 0x1080
++subdevice.name CT8 mainboard
+
+ vendor.id pci 0x1166
+&device.id pci 0x0221
++device.name CSB6 OHCI USB Controller
+
+ vendor.id pci 0x1166
+&device.id pci 0x0225
++device.name CSB5 LPC bridge
+
+ vendor.id pci 0x1166
+&device.id pci 0x0225
+&subvendor.id pci 0x4c53
+&subdevice.id pci 0x1080
++subdevice.name CT8 mainboard
+
+ vendor.id pci 0x1166
+&device.id pci 0x0227
++device.name GCLE-2 Host Bridge
+
+ vendor.id pci 0x1166
+&device.id pci 0x0230
++device.name CSB5 LPC bridge
+
+ vendor.id pci 0x1166
+&device.id pci 0x0230
+&subvendor.id pci 0x4c53
+&subdevice.id pci 0x1080
++subdevice.name CT8 mainboard
+
+ vendor.id pci 0x1166
+&device.id pci 0x0240
++device.name K2 SATA
+
+ vendor.id pci 0x1167
++vendor.name Mutoh Industries Inc
+
+ vendor.id pci 0x1168
++vendor.name Thine Electronics Inc
+
+ vendor.id pci 0x1169
++vendor.name Centre for Development of Advanced Computing
+
+ vendor.id pci 0x116a
++vendor.name Polaris Communications
+
+ vendor.id pci 0x116a
+&device.id pci 0x6100
++device.name Bus/Tag Channel
+
+ vendor.id pci 0x116a
+&device.id pci 0x6800
++device.name Escon Channel
+
+ vendor.id pci 0x116a
+&device.id pci 0x7100
++device.name Bus/Tag Channel
+
+ vendor.id pci 0x116a
+&device.id pci 0x7800
++device.name Escon Channel
+
+ vendor.id pci 0x116b
++vendor.name Connectware Inc
+
+ vendor.id pci 0x116c
++vendor.name Intelligent Resources Integrated Systems
+
+ vendor.id pci 0x116d
++vendor.name Martin-Marietta
+
+ vendor.id pci 0x116e
++vendor.name Electronics for Imaging
+
+ vendor.id pci 0x116f
++vendor.name Workstation Technology
+
+ vendor.id pci 0x1170
++vendor.name Inventec Corporation
+
+ vendor.id pci 0x1171
++vendor.name Loughborough Sound Images Plc
+
+ vendor.id pci 0x1172
++vendor.name Altera Corporation
+
+ vendor.id pci 0x1173
++vendor.name Adobe Systems, Inc
+
+ vendor.id pci 0x1174
++vendor.name Bridgeport Machines
+
+ vendor.id pci 0x1175
++vendor.name Mitron Computer Inc.
+
+ vendor.id pci 0x1176
++vendor.name SBE Incorporated
+
+ vendor.id pci 0x1177
++vendor.name Silicon Engineering
+
+ vendor.id pci 0x1178
++vendor.name Alfa, Inc.
+
+ vendor.id pci 0x1178
+&device.id pci 0xafa1
++device.name Fast Ethernet Adapter
+
+ vendor.id pci 0x1179
++vendor.name Toshiba America Info Systems
+
+ vendor.id pci 0x1179
+&device.id pci 0x0103
++device.name EX-IDE Type-B
+
+ vendor.id pci 0x1179
+&device.id pci 0x0404
++device.name DVD Decoder card
+
+ vendor.id pci 0x1179
+&device.id pci 0x0406
++device.name Tecra Video Capture device
+
+ vendor.id pci 0x1179
+&device.id pci 0x0407
++device.name DVD Decoder card (Version 2)
+
+ vendor.id pci 0x1179
+&device.id pci 0x0601
++device.name 601
+
+ vendor.id pci 0x1179
+&device.id pci 0x0603
++device.name ToPIC95 PCI to CardBus Bridge for Notebooks
+
+ vendor.id pci 0x1179
+&device.id pci 0x060a
++device.name ToPIC95
+
+ vendor.id pci 0x1179
+&device.id pci 0x060f
++device.name ToPIC97
+
+ vendor.id pci 0x1179
+&device.id pci 0x0617
++device.name ToPIC100 PCI to Cardbus Bridge with ZV Support
+
+ vendor.id pci 0x1179
+&device.id pci 0x0618
++device.name CPU to PCI and PCI to ISA bridge
+
+ vendor.id pci 0x1179
+&device.id pci 0x0701
++device.name FIR Port
+
+ vendor.id pci 0x1179
+&device.id pci 0x0804
++device.name TC6371AF SmartMedia Controller
+
+ vendor.id pci 0x1179
+&device.id pci 0x0805
++device.name SD TypA Controller
+
+ vendor.id pci 0x1179
+&device.id pci 0x0d01
++device.name FIR Port Type-DO
+
+ vendor.id pci 0x1179
+&device.id pci 0x0d01
+&subvendor.id pci 0x1179
+&subdevice.id pci 0x0001
++subdevice.name FIR Port Type-DO
+
+ vendor.id pci 0x117a
++vendor.name A-Trend Technology
+
+ vendor.id pci 0x117b
++vendor.name L G Electronics, Inc.
+
+ vendor.id pci 0x117c
++vendor.name Atto Technology
+
+ vendor.id pci 0x117d
++vendor.name Becton & Dickinson
+
+ vendor.id pci 0x117e
++vendor.name T/R Systems
+
+ vendor.id pci 0x117f
++vendor.name Integrated Circuit Systems
+
+ vendor.id pci 0x1180
++vendor.name Ricoh Co Ltd
+
+ vendor.id pci 0x1180
+&device.id pci 0x0465
++device.name RL5c465
+
+ vendor.id pci 0x1180
+&device.id pci 0x0466
++device.name RL5c466
+
+ vendor.id pci 0x1180
+&device.id pci 0x0475
++device.name RL5c475
+
+ vendor.id pci 0x1180
+&device.id pci 0x0475
+&subvendor.id pci 0x144d
+&subdevice.id pci 0xc006
++subdevice.name vpr Matrix 170B4 CardBus bridge
+
+ vendor.id pci 0x1180
+&device.id pci 0x0476
++device.name RL5c476 II
+
+ vendor.id pci 0x1180
+&device.id pci 0x0476
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x0185
++subdevice.name ThinkPad A/T/X Series
+
+ vendor.id pci 0x1180
+&device.id pci 0x0476
+&subvendor.id pci 0x104d
+&subdevice.id pci 0x80df
++subdevice.name Vaio PCG-FX403
+
+ vendor.id pci 0x1180
+&device.id pci 0x0476
+&subvendor.id pci 0x104d
+&subdevice.id pci 0x80e7
++subdevice.name VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP
+
+ vendor.id pci 0x1180
+&device.id pci 0x0476
+&subvendor.id pci 0x14ef
+&subdevice.id pci 0x0220
++subdevice.name PCD-RP-220S
+
+ vendor.id pci 0x1180
+&device.id pci 0x0477
++device.name RL5c477
+
+ vendor.id pci 0x1180
+&device.id pci 0x0478
++device.name RL5c478
+
+ vendor.id pci 0x1180
+&device.id pci 0x0478
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x0184
++subdevice.name ThinkPad A30p (2653-64G)
+
+ vendor.id pci 0x1180
+&device.id pci 0x0522
++device.name R5C522 IEEE 1394 Controller
+
+ vendor.id pci 0x1180
+&device.id pci 0x0522
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x01cf
++subdevice.name ThinkPad A30p (2653-64G)
+
+ vendor.id pci 0x1180
+&device.id pci 0x0551
++device.name R5C551 IEEE 1394 Controller
+
+ vendor.id pci 0x1180
+&device.id pci 0x0551
+&subvendor.id pci 0x144d
+&subdevice.id pci 0xc006
++subdevice.name vpr Matrix 170B4
+
+ vendor.id pci 0x1180
+&device.id pci 0x0552
++device.name R5C552 IEEE 1394 Controller
+
+ vendor.id pci 0x1180
+&device.id pci 0x0552
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x0511
++subdevice.name ThinkPad A/T/X Series
+
+ vendor.id pci 0x1181
++vendor.name Telmatics International
+
+ vendor.id pci 0x1183
++vendor.name Fujikura Ltd
+
+ vendor.id pci 0x1184
++vendor.name Forks Inc
+
+ vendor.id pci 0x1185
++vendor.name Dataworld International Ltd
+
+ vendor.id pci 0x1186
++vendor.name D-Link System Inc
+
+ vendor.id pci 0x1186
+&device.id pci 0x0100
++device.name DC21041
+
+ vendor.id pci 0x1186
+&device.id pci 0x1002
++device.name DL10050 Sundance Ethernet
+
+ vendor.id pci 0x1186
+&device.id pci 0x1002
+&subvendor.id pci 0x1186
+&subdevice.id pci 0x1002
++subdevice.name DFE-550TX
+
+ vendor.id pci 0x1186
+&device.id pci 0x1002
+&subvendor.id pci 0x1186
+&subdevice.id pci 0x1012
++subdevice.name DFE-580TX
+
+ vendor.id pci 0x1186
+&device.id pci 0x1025
++device.name AirPlus Xtreme G DWL-G650 Adapter
+
+ vendor.id pci 0x1186
+&device.id pci 0x1026
++device.name AirXpert DWL-AG650 Wireless Cardbus Adapter
+
+ vendor.id pci 0x1186
+&device.id pci 0x1043
++device.name AirXpert DWL-AG650 Wireless Cardbus Adapter
+
+ vendor.id pci 0x1186
+&device.id pci 0x1300
++device.name RTL8139 Ethernet
+
+ vendor.id pci 0x1186
+&device.id pci 0x1300
+&subvendor.id pci 0x1186
+&subdevice.id pci 0x1300
++subdevice.name DFE-538TX 10/100 Ethernet Adapter
+
+ vendor.id pci 0x1186
+&device.id pci 0x1300
+&subvendor.id pci 0x1186
+&subdevice.id pci 0x1301
++subdevice.name DFE-530TX+ 10/100 Ethernet Adapter
+
+ vendor.id pci 0x1186
+&device.id pci 0x1340
++device.name DFE-690TXD CardBus PC Card
+
+ vendor.id pci 0x1186
+&device.id pci 0x1541
++device.name DFE-680TXD CardBus PC Card
+
+ vendor.id pci 0x1186
+&device.id pci 0x1561
++device.name DRP-32TXD Cardbus PC Card
+
+ vendor.id pci 0x1186
+&device.id pci 0x2027
++device.name AirPlus Xtreme G DWL-G520 Adapter
+
+ vendor.id pci 0x1186
+&device.id pci 0x3203
++device.name AirPlus Xtreme G DWL-G520 Adapter
+
+ vendor.id pci 0x1186
+&device.id pci 0x3300
++device.name DWL-510 2.4GHz Wireless PCI Adapter
+
+ vendor.id pci 0x1186
+&device.id pci 0x3a03
++device.name AirPro DWL-A650 Wireless Cardbus Adapter(rev.B)
+
+ vendor.id pci 0x1186
+&device.id pci 0x3a04
++device.name AirPro DWL-AB650 Multimode Wireless Cardbus Adapter
+
+ vendor.id pci 0x1186
+&device.id pci 0x3a05
++device.name AirPro DWL-AB520 Multimode Wireless PCI Adapter
+
+ vendor.id pci 0x1186
+&device.id pci 0x3a07
++device.name AirXpert DWL-AG650 Wireless Cardbus Adapter
+
+ vendor.id pci 0x1186
+&device.id pci 0x3a08
++device.name AirXpert DWL-AG520 Wireless PCI Adapter
+
+ vendor.id pci 0x1186
+&device.id pci 0x3a10
++device.name AirXpert DWL-AG650 Wireless Cardbus Adapter(rev.B)
+
+ vendor.id pci 0x1186
+&device.id pci 0x3a11
++device.name AirXpert DWL-AG520 Wireless PCI Adapter(rev.B)
+
+ vendor.id pci 0x1186
+&device.id pci 0x3a12
++device.name AirPlus DWL-G650 Wireless Cardbus Adapter(rev.C)
+
+ vendor.id pci 0x1186
+&device.id pci 0x3a13
++device.name AirPlus DWL-G520 Wireless PCI Adapter(rev.B)
+
+ vendor.id pci 0x1186
+&device.id pci 0x3a14
++device.name AirPremier DWL-AG530 Wireless PCI Adapter
+
+ vendor.id pci 0x1186
+&device.id pci 0x3a63
++device.name AirXpert DWL-AG660 Wireless Cardbus Adapter
+
+ vendor.id pci 0x1186
+&device.id pci 0x3b05
++device.name DWL-G650+ CardBus PC Card
+
+ vendor.id pci 0x1186
+&device.id pci 0x4000
++device.name DL2000-based Gigabit Ethernet
+
+ vendor.id pci 0x1186
+&device.id pci 0x4c00
++device.name Gigabit Ethernet Adapter
+
+ vendor.id pci 0x1186
+&device.id pci 0x4c00
+&subvendor.id pci 0x1186
+&subdevice.id pci 0x4c00
++subdevice.name DGE-530T Gigabit Ethernet Adapter
+
+ vendor.id pci 0x1186
+&device.id pci 0x8400
++device.name D-Link DWL-650+ CardBus PC Card
+
+ vendor.id pci 0x1187
++vendor.name Advanced Technology Laboratories, Inc.
+
+ vendor.id pci 0x1188
++vendor.name Shima Seiki Manufacturing Ltd.
+
+ vendor.id pci 0x1189
++vendor.name Matsushita Electronics Co Ltd
+
+ vendor.id pci 0x118a
++vendor.name Hilevel Technology
+
+ vendor.id pci 0x118b
++vendor.name Hypertec Pty Limited
+
+ vendor.id pci 0x118c
++vendor.name Corollary, Inc
+
+ vendor.id pci 0x118c
+&device.id pci 0x0014
++device.name PCIB [C-bus II to PCI bus host bridge chip]
+
+ vendor.id pci 0x118c
+&device.id pci 0x1117
++device.name Intel 8-way XEON Profusion Chipset [Cache Coherency Filter]
+
+ vendor.id pci 0x118d
++vendor.name BitFlow Inc
+
+ vendor.id pci 0x118d
+&device.id pci 0x0001
++device.name Raptor-PCI framegrabber
+
+ vendor.id pci 0x118d
+&device.id pci 0x0012
++device.name Model 12 Road Runner Frame Grabber
+
+ vendor.id pci 0x118d
+&device.id pci 0x0014
++device.name Model 14 Road Runner Frame Grabber
+
+ vendor.id pci 0x118d
+&device.id pci 0x0024
++device.name Model 24 Road Runner Frame Grabber
+
+ vendor.id pci 0x118d
+&device.id pci 0x0044
++device.name Model 44 Road Runner Frame Grabber
+
+ vendor.id pci 0x118d
+&device.id pci 0x0112
++device.name Model 12 Road Runner Frame Grabber
+
+ vendor.id pci 0x118d
+&device.id pci 0x0114
++device.name Model 14 Road Runner Frame Grabber
+
+ vendor.id pci 0x118d
+&device.id pci 0x0124
++device.name Model 24 Road Runner Frame Grabber
+
+ vendor.id pci 0x118d
+&device.id pci 0x0144
++device.name Model 44 Road Runner Frame Grabber
+
+ vendor.id pci 0x118d
+&device.id pci 0x0212
++device.name Model 12 Road Runner Frame Grabber
+
+ vendor.id pci 0x118d
+&device.id pci 0x0214
++device.name Model 14 Road Runner Frame Grabber
+
+ vendor.id pci 0x118d
+&device.id pci 0x0224
++device.name Model 24 Road Runner Frame Grabber
+
+ vendor.id pci 0x118d
+&device.id pci 0x0244
++device.name Model 44 Road Runner Frame Grabber
+
+ vendor.id pci 0x118d
+&device.id pci 0x0312
++device.name Model 12 Road Runner Frame Grabber
+
+ vendor.id pci 0x118d
+&device.id pci 0x0314
++device.name Model 14 Road Runner Frame Grabber
+
+ vendor.id pci 0x118d
+&device.id pci 0x0324
++device.name Model 24 Road Runner Frame Grabber
+
+ vendor.id pci 0x118d
+&device.id pci 0x0344
++device.name Model 44 Road Runner Frame Grabber
+
+ vendor.id pci 0x118e
++vendor.name Hermstedt GmbH
+
+ vendor.id pci 0x118f
++vendor.name Green Logic
+
+ vendor.id pci 0x1190
++vendor.name Tripace
+
+ vendor.id pci 0x1190
+&device.id pci 0xc731
++device.name TP-910/920/940 PCI Ultra(Wide) SCSI Adapter
+
+ vendor.id pci 0x1191
++vendor.name Artop Electronic Corp
+
+ vendor.id pci 0x1191
+&device.id pci 0x0003
++device.name SCSI Cache Host Adapter
+
+ vendor.id pci 0x1191
+&device.id pci 0x0004
++device.name ATP8400
+
+ vendor.id pci 0x1191
+&device.id pci 0x0005
++device.name ATP850UF
+
+ vendor.id pci 0x1191
+&device.id pci 0x0006
++device.name ATP860 NO-BIOS
+
+ vendor.id pci 0x1191
+&device.id pci 0x0007
++device.name ATP860
+
+ vendor.id pci 0x1191
+&device.id pci 0x0008
++device.name ATP865 NO-ROM
+
+ vendor.id pci 0x1191
+&device.id pci 0x0009
++device.name ATP865
+
+ vendor.id pci 0x1191
+&device.id pci 0x8002
++device.name AEC6710 SCSI-2 Host Adapter
+
+ vendor.id pci 0x1191
+&device.id pci 0x8010
++device.name AEC6712UW SCSI
+
+ vendor.id pci 0x1191
+&device.id pci 0x8020
++device.name AEC6712U SCSI
+
+ vendor.id pci 0x1191
+&device.id pci 0x8030
++device.name AEC6712S SCSI
+
+ vendor.id pci 0x1191
+&device.id pci 0x8040
++device.name AEC6712D SCSI
+
+ vendor.id pci 0x1191
+&device.id pci 0x8050
++device.name AEC6712SUW SCSI
+
+ vendor.id pci 0x1192
++vendor.name Densan Company Ltd
+
+ vendor.id pci 0x1193
++vendor.name Zeitnet Inc.
+
+ vendor.id pci 0x1193
+&device.id pci 0x0001
++device.name 1221
+
+ vendor.id pci 0x1193
+&device.id pci 0x0002
++device.name 1225
+
+ vendor.id pci 0x1194
++vendor.name Toucan Technology
+
+ vendor.id pci 0x1195
++vendor.name Ratoc System Inc
+
+ vendor.id pci 0x1196
++vendor.name Hytec Electronics Ltd
+
+ vendor.id pci 0x1197
++vendor.name Gage Applied Sciences, Inc.
+
+ vendor.id pci 0x1197
+&device.id pci 0x010c
++device.name CompuScope 82G 8bit 2GS/s Analog Input Card
+
+ vendor.id pci 0x1198
++vendor.name Lambda Systems Inc
+
+ vendor.id pci 0x1199
++vendor.name Attachmate Corporation
+
+ vendor.id pci 0x119a
++vendor.name Mind Share, Inc.
+
+ vendor.id pci 0x119b
++vendor.name Omega Micro Inc.
+
+ vendor.id pci 0x119b
+&device.id pci 0x1221
++device.name 82C092G
+
+ vendor.id pci 0x119c
++vendor.name Information Technology Inst.
+
+ vendor.id pci 0x119d
++vendor.name Bug, Inc. Sapporo Japan
+
+ vendor.id pci 0x119e
++vendor.name Fujitsu Microelectronics Ltd.
+
+ vendor.id pci 0x119e
+&device.id pci 0x0001
++device.name FireStream 155
+
+ vendor.id pci 0x119e
+&device.id pci 0x0003
++device.name FireStream 50
+
+ vendor.id pci 0x119f
++vendor.name Bull HN Information Systems
+
+ vendor.id pci 0x11a0
++vendor.name Convex Computer Corporation
+
+ vendor.id pci 0x11a1
++vendor.name Hamamatsu Photonics K.K.
+
+ vendor.id pci 0x11a2
++vendor.name Sierra Research and Technology
+
+ vendor.id pci 0x11a3
++vendor.name Deuretzbacher GmbH & Co. Eng. KG
+
+ vendor.id pci 0x11a4
++vendor.name Barco Graphics NV
+
+ vendor.id pci 0x11a5
++vendor.name Microunity Systems Eng. Inc
+
+ vendor.id pci 0x11a6
++vendor.name Pure Data Ltd.
+
+ vendor.id pci 0x11a7
++vendor.name Power Computing Corp.
+
+ vendor.id pci 0x11a8
++vendor.name Systech Corp.
+
+ vendor.id pci 0x11a9
++vendor.name InnoSys Inc.
+
+ vendor.id pci 0x11a9
+&device.id pci 0x4240
++device.name AMCC S933Q Intelligent Serial Card
+
+ vendor.id pci 0x11aa
++vendor.name Actel
+
+ vendor.id pci 0x11ab
++vendor.name Marvell Technology Group Ltd.
+
+ vendor.id pci 0x11ab
+&device.id pci 0x0146
++device.name GT-64010/64010A System Controller
+
+ vendor.id pci 0x11ab
+&device.id pci 0x138f
++device.name W8300 802.11 Adapter (rev 07)
+
+ vendor.id pci 0x11ab
+&device.id pci 0x1fa6
++device.name Marvell W8300 802.11 Adapter
+
+ vendor.id pci 0x11ab
+&device.id pci 0x4320
++device.name Gigabit Ethernet Controller
+
+ vendor.id pci 0x11ab
+&device.id pci 0x4320
+&subvendor.id pci 0x1019
+&subdevice.id pci 0x0f38
++subdevice.name Marvell 88E8001 Gigabit Ethernet Controller (ECS)
+
+ vendor.id pci 0x11ab
+&device.id pci 0x4320
+&subvendor.id pci 0x1019
+&subdevice.id pci 0x8001
++subdevice.name Marvell 88E8001 Gigabit Ethernet Controller (ECS)
+
+ vendor.id pci 0x11ab
+&device.id pci 0x4320
+&subvendor.id pci 0x1043
+&subdevice.id pci 0x173c
++subdevice.name Marvell 88E8001 Gigabit Ethernet Controller (Asus)
+
+ vendor.id pci 0x11ab
+&device.id pci 0x4320
+&subvendor.id pci 0x1043
+&subdevice.id pci 0x811a
++subdevice.name Marvell 88E8001 Gigabit Ethernet Controller (Asus)
+
+ vendor.id pci 0x11ab
+&device.id pci 0x4320
+&subvendor.id pci 0x105b
+&subdevice.id pci 0x0c19
++subdevice.name Marvell 88E8001 Gigabit Ethernet Controller (Foxconn)
+
+ vendor.id pci 0x11ab
+&device.id pci 0x4320
+&subvendor.id pci 0x10b8
+&subdevice.id pci 0xb452
++subdevice.name SMC EZ Card 1000 (SMC9452TXV.2)
+
+ vendor.id pci 0x11ab
+&device.id pci 0x4320
+&subvendor.id pci 0x11ab
+&subdevice.id pci 0x0121
++subdevice.name Marvell RDK-8001
+
+ vendor.id pci 0x11ab
+&device.id pci 0x4320
+&subvendor.id pci 0x11ab
+&subdevice.id pci 0x0321
++subdevice.name Marvell RDK-8003
+
+ vendor.id pci 0x11ab
+&device.id pci 0x4320
+&subvendor.id pci 0x11ab
+&subdevice.id pci 0x1021
++subdevice.name Marvell RDK-8010
+
+ vendor.id pci 0x11ab
+&device.id pci 0x4320
+&subvendor.id pci 0x11ab
+&subdevice.id pci 0x5021
++subdevice.name Marvell Yukon Gigabit Ethernet 10/100/1000Base-T Controller (64 bit)
+
+ vendor.id pci 0x11ab
+&device.id pci 0x4320
+&subvendor.id pci 0x11ab
+&subdevice.id pci 0x9521
++subdevice.name Marvell Yukon Gigabit Ethernet 10/100/1000Base-T Controller (32 bit)
+
+ vendor.id pci 0x11ab
+&device.id pci 0x4320
+&subvendor.id pci 0x1458
+&subdevice.id pci 0xe000
++subdevice.name Marvell 88E8001 Gigabit Ethernet Controller (Gigabyte)
+
+ vendor.id pci 0x11ab
+&device.id pci 0x4320
+&subvendor.id pci 0x147b
+&subdevice.id pci 0x1406
++subdevice.name Marvell 88E8001 Gigabit Ethernet Controller (Abit)
+
+ vendor.id pci 0x11ab
+&device.id pci 0x4320
+&subvendor.id pci 0x15d4
+&subdevice.id pci 0x0047
++subdevice.name Marvell 88E8001 Gigabit Ethernet Controller (Iwill)
+
+ vendor.id pci 0x11ab
+&device.id pci 0x4320
+&subvendor.id pci 0x1695
+&subdevice.id pci 0x9025
++subdevice.name Marvell 88E8001 Gigabit Ethernet Controller (Epox)
+
+ vendor.id pci 0x11ab
+&device.id pci 0x4320
+&subvendor.id pci 0x17f2
+&subdevice.id pci 0x1c03
++subdevice.name Marvell 88E8001 Gigabit Ethernet Controller (Albatron)
+
+ vendor.id pci 0x11ab
+&device.id pci 0x4320
+&subvendor.id pci 0x270f
+&subdevice.id pci 0x2803
++subdevice.name Marvell 88E8001 Gigabit Ethernet Controller (Chaintech)
+
+ vendor.id pci 0x11ab
+&device.id pci 0x4350
++device.name Fast Ethernet Controller
+
+ vendor.id pci 0x11ab
+&device.id pci 0x4350
+&subvendor.id pci 0x1179
+&subdevice.id pci 0x0001
++subdevice.name Marvell 88E8035 Fast Ethernet Controller (Toshiba)
+
+ vendor.id pci 0x11ab
+&device.id pci 0x4350
+&subvendor.id pci 0x11ab
+&subdevice.id pci 0x3521
++subdevice.name Marvell RDK-8035
+
+ vendor.id pci 0x11ab
+&device.id pci 0x4350
+&subvendor.id pci 0x1854
+&subdevice.id pci 0x000d
++subdevice.name Marvell 88E8035 Fast Ethernet Controller (LGE)
+
+ vendor.id pci 0x11ab
+&device.id pci 0x4350
+&subvendor.id pci 0x1854
+&subdevice.id pci 0x000e
++subdevice.name Marvell 88E8035 Fast Ethernet Controller (LGE)
+
+ vendor.id pci 0x11ab
+&device.id pci 0x4350
+&subvendor.id pci 0x1854
+&subdevice.id pci 0x000f
++subdevice.name Marvell 88E8035 Fast Ethernet Controller (LGE)
+
+ vendor.id pci 0x11ab
+&device.id pci 0x4350
+&subvendor.id pci 0x1854
+&subdevice.id pci 0x0011
++subdevice.name Marvell 88E8035 Fast Ethernet Controller (LGE)
+
+ vendor.id pci 0x11ab
+&device.id pci 0x4350
+&subvendor.id pci 0x1854
+&subdevice.id pci 0x0012
++subdevice.name Marvell 88E8035 Fast Ethernet Controller (LGE)
+
+ vendor.id pci 0x11ab
+&device.id pci 0x4350
+&subvendor.id pci 0x1854
+&subdevice.id pci 0x0016
++subdevice.name Marvell 88E8035 Fast Ethernet Controller (LGE)
+
+ vendor.id pci 0x11ab
+&device.id pci 0x4350
+&subvendor.id pci 0x1854
+&subdevice.id pci 0x0017
++subdevice.name Marvell 88E8035 Fast Ethernet Controller (LGE)
+
+ vendor.id pci 0x11ab
+&device.id pci 0x4350
+&subvendor.id pci 0x1854
+&subdevice.id pci 0x0018
++subdevice.name Marvell 88E8035 Fast Ethernet Controller (LGE)
+
+ vendor.id pci 0x11ab
+&device.id pci 0x4350
+&subvendor.id pci 0x1854
+&subdevice.id pci 0x0019
++subdevice.name Marvell 88E8035 Fast Ethernet Controller (LGE)
+
+ vendor.id pci 0x11ab
+&device.id pci 0x4350
+&subvendor.id pci 0x1854
+&subdevice.id pci 0x001c
++subdevice.name Marvell 88E8035 Fast Ethernet Controller (LGE)
+
+ vendor.id pci 0x11ab
+&device.id pci 0x4350
+&subvendor.id pci 0x1854
+&subdevice.id pci 0x001e
++subdevice.name Marvell 88E8035 Fast Ethernet Controller (LGE)
+
+ vendor.id pci 0x11ab
+&device.id pci 0x4350
+&subvendor.id pci 0x1854
+&subdevice.id pci 0x0020
++subdevice.name Marvell 88E8035 Fast Ethernet Controller (LGE)
+
+ vendor.id pci 0x11ab
+&device.id pci 0x4351
++device.name Fast Ethernet Controller
+
+ vendor.id pci 0x11ab
+&device.id pci 0x4351
+&subvendor.id pci 0x107b
+&subdevice.id pci 0x4009
++subdevice.name Marvell 88E8036 Fast Ethernet Controller (Wistron)
+
+ vendor.id pci 0x11ab
+&device.id pci 0x4351
+&subvendor.id pci 0x10f7
+&subdevice.id pci 0x8338
++subdevice.name Marvell 88E8036 Fast Ethernet Controller (Panasonic)
+
+ vendor.id pci 0x11ab
+&device.id pci 0x4351
+&subvendor.id pci 0x1179
+&subdevice.id pci 0x0001
++subdevice.name Marvell 88E8036 Fast Ethernet Controller (Toshiba)
+
+ vendor.id pci 0x11ab
+&device.id pci 0x4351
+&subvendor.id pci 0x1179
+&subdevice.id pci 0xff00
++subdevice.name Marvell 88E8036 Fast Ethernet Controller (Compal)
+
+ vendor.id pci 0x11ab
+&device.id pci 0x4351
+&subvendor.id pci 0x1179
+&subdevice.id pci 0xff10
++subdevice.name Marvell 88E8036 Fast Ethernet Controller (Inventec)
+
+ vendor.id pci 0x11ab
+&device.id pci 0x4351
+&subvendor.id pci 0x11ab
+&subdevice.id pci 0x3621
++subdevice.name Marvell RDK-8036
+
+ vendor.id pci 0x11ab
+&device.id pci 0x4351
+&subvendor.id pci 0x13d1
+&subdevice.id pci 0xac12
++subdevice.name Abocom EFE3K - 10/100 Ethernet Expresscard
+
+ vendor.id pci 0x11ab
+&device.id pci 0x4351
+&subvendor.id pci 0x161f
+&subdevice.id pci 0x203d
++subdevice.name Marvell 88E8036 Fast Ethernet Controller (Arima)
+
+ vendor.id pci 0x11ab
+&device.id pci 0x4351
+&subvendor.id pci 0x1854
+&subdevice.id pci 0x000d
++subdevice.name Marvell 88E8036 Fast Ethernet Controller (LGE)
+
+ vendor.id pci 0x11ab
+&device.id pci 0x4351
+&subvendor.id pci 0x1854
+&subdevice.id pci 0x000e
++subdevice.name Marvell 88E8036 Fast Ethernet Controller (LGE)
+
+ vendor.id pci 0x11ab
+&device.id pci 0x4351
+&subvendor.id pci 0x1854
+&subdevice.id pci 0x000f
++subdevice.name Marvell 88E8036 Fast Ethernet Controller (LGE)
+
+ vendor.id pci 0x11ab
+&device.id pci 0x4351
+&subvendor.id pci 0x1854
+&subdevice.id pci 0x0011
++subdevice.name Marvell 88E8036 Fast Ethernet Controller (LGE)
+
+ vendor.id pci 0x11ab
+&device.id pci 0x4351
+&subvendor.id pci 0x1854
+&subdevice.id pci 0x0012
++subdevice.name Marvell 88E8036 Fast Ethernet Controller (LGE)
+
+ vendor.id pci 0x11ab
+&device.id pci 0x4351
+&subvendor.id pci 0x1854
+&subdevice.id pci 0x0016
++subdevice.name Marvell 88E8036 Fast Ethernet Controller (LGE)
+
+ vendor.id pci 0x11ab
+&device.id pci 0x4351
+&subvendor.id pci 0x1854
+&subdevice.id pci 0x0017
++subdevice.name Marvell 88E8036 Fast Ethernet Controller (LGE)
+
+ vendor.id pci 0x11ab
+&device.id pci 0x4351
+&subvendor.id pci 0x1854
+&subdevice.id pci 0x0018
++subdevice.name Marvell 88E8036 Fast Ethernet Controller (LGE)
+
+ vendor.id pci 0x11ab
+&device.id pci 0x4351
+&subvendor.id pci 0x1854
+&subdevice.id pci 0x0019
++subdevice.name Marvell 88E8036 Fast Ethernet Controller (LGE)
+
+ vendor.id pci 0x11ab
+&device.id pci 0x4351
+&subvendor.id pci 0x1854
+&subdevice.id pci 0x001c
++subdevice.name Marvell 88E8036 Fast Ethernet Controller (LGE)
+
+ vendor.id pci 0x11ab
+&device.id pci 0x4351
+&subvendor.id pci 0x1854
+&subdevice.id pci 0x001e
++subdevice.name Marvell 88E8036 Fast Ethernet Controller (LGE)
+
+ vendor.id pci 0x11ab
+&device.id pci 0x4351
+&subvendor.id pci 0x1854
+&subdevice.id pci 0x0020
++subdevice.name Marvell 88E8036 Fast Ethernet Controller (LGE)
+
+ vendor.id pci 0x11ab
+&device.id pci 0x4360
++device.name Gigabit Ethernet Controller
+
+ vendor.id pci 0x11ab
+&device.id pci 0x4360
+&subvendor.id pci 0x1043
+&subdevice.id pci 0x8134
++subdevice.name Marvell 88E8052 Gigabit Ethernet Controller (Asus)
+
+ vendor.id pci 0x11ab
+&device.id pci 0x4360
+&subvendor.id pci 0x107b
+&subdevice.id pci 0x4009
++subdevice.name Marvell 88E8052 Gigabit Ethernet Controller (Wistron)
+
+ vendor.id pci 0x11ab
+&device.id pci 0x4360
+&subvendor.id pci 0x11ab
+&subdevice.id pci 0x5221
++subdevice.name Marvell RDK-8052
+
+ vendor.id pci 0x11ab
+&device.id pci 0x4360
+&subvendor.id pci 0x1458
+&subdevice.id pci 0xe000
++subdevice.name Marvell 88E8052 Gigabit Ethernet Controller (Gigabyte)
+
+ vendor.id pci 0x11ab
+&device.id pci 0x4360
+&subvendor.id pci 0x1462
+&subdevice.id pci 0x052c
++subdevice.name Marvell 88E8052 Gigabit Ethernet Controller (MSI)
+
+ vendor.id pci 0x11ab
+&device.id pci 0x4360
+&subvendor.id pci 0x1849
+&subdevice.id pci 0x8052
++subdevice.name Marvell 88E8052 Gigabit Ethernet Controller (ASRock)
+
+ vendor.id pci 0x11ab
+&device.id pci 0x4360
+&subvendor.id pci 0x1940
+&subdevice.id pci 0xe000
++subdevice.name Marvell 88E8052 Gigabit Ethernet Controller (Gigabyte)
+
+ vendor.id pci 0x11ab
+&device.id pci 0x4360
+&subvendor.id pci 0xa0a0
+&subdevice.id pci 0x0509
++subdevice.name Marvell 88E8052 Gigabit Ethernet Controller (Aopen)
+
+ vendor.id pci 0x11ab
+&device.id pci 0x4361
++device.name Gigabit Ethernet Controller
+
+ vendor.id pci 0x11ab
+&device.id pci 0x4361
+&subvendor.id pci 0x107b
+&subdevice.id pci 0x3015
++subdevice.name Marvell 88E8050 Gigabit Ethernet Controller (Gateway)
+
+ vendor.id pci 0x11ab
+&device.id pci 0x4361
+&subvendor.id pci 0x11ab
+&subdevice.id pci 0x5021
++subdevice.name Marvell 88E8050 Gigabit Ethernet Controller (Intel)
+
+ vendor.id pci 0x11ab
+&device.id pci 0x4361
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x3063
++subdevice.name D925XCVLK mainboard
+
+ vendor.id pci 0x11ab
+&device.id pci 0x4362
++device.name Gigabit Ethernet Controller
+
+ vendor.id pci 0x11ab
+&device.id pci 0x4362
+&subvendor.id pci 0x103c
+&subdevice.id pci 0x2a0d
++subdevice.name Marvell 88E8053 Gigabit Ethernet Controller (Asus)
+
+ vendor.id pci 0x11ab
+&device.id pci 0x4362
+&subvendor.id pci 0x1043
+&subdevice.id pci 0x8142
++subdevice.name Marvell 88E8053 Gigabit Ethernet Controller (Asus)
+
+ vendor.id pci 0x11ab
+&device.id pci 0x4362
+&subvendor.id pci 0x109f
+&subdevice.id pci 0x3197
++subdevice.name Marvell 88E8053 Gigabit Ethernet Controller (Trigem)
+
+ vendor.id pci 0x11ab
+&device.id pci 0x4362
+&subvendor.id pci 0x10f7
+&subdevice.id pci 0x8338
++subdevice.name Marvell 88E8053 Gigabit Ethernet Controller (Panasonic)
+
+ vendor.id pci 0x11ab
+&device.id pci 0x4362
+&subvendor.id pci 0x10fd
+&subdevice.id pci 0xa430
++subdevice.name Marvell 88E8053 Gigabit Ethernet Controller (SOYO)
+
+ vendor.id pci 0x11ab
+&device.id pci 0x4362
+&subvendor.id pci 0x1179
+&subdevice.id pci 0x0001
++subdevice.name Marvell 88E8053 Gigabit Ethernet Controller (Toshiba)
+
+ vendor.id pci 0x11ab
+&device.id pci 0x4362
+&subvendor.id pci 0x1179
+&subdevice.id pci 0xff00
++subdevice.name Marvell 88E8053 Gigabit Ethernet Controller (Compal)
+
+ vendor.id pci 0x11ab
+&device.id pci 0x4362
+&subvendor.id pci 0x1179
+&subdevice.id pci 0xff10
++subdevice.name Marvell 88E8053 Gigabit Ethernet Controller (Inventec)
+
+ vendor.id pci 0x11ab
+&device.id pci 0x4362
+&subvendor.id pci 0x11ab
+&subdevice.id pci 0x5321
++subdevice.name Marvell RDK-8053
+
+ vendor.id pci 0x11ab
+&device.id pci 0x4362
+&subvendor.id pci 0x1297
+&subdevice.id pci 0xc240
++subdevice.name Marvell 88E8053 Gigabit Ethernet Controller (Shuttle)
+
+ vendor.id pci 0x11ab
+&device.id pci 0x4362
+&subvendor.id pci 0x1297
+&subdevice.id pci 0xc241
++subdevice.name Marvell 88E8053 Gigabit Ethernet Controller (Shuttle)
+
+ vendor.id pci 0x11ab
+&device.id pci 0x4362
+&subvendor.id pci 0x1297
+&subdevice.id pci 0xc242
++subdevice.name Marvell 88E8053 Gigabit Ethernet Controller (Shuttle)
+
+ vendor.id pci 0x11ab
+&device.id pci 0x4362
+&subvendor.id pci 0x1297
+&subdevice.id pci 0xc243
++subdevice.name Marvell 88E8053 Gigabit Ethernet Controller (Shuttle)
+
+ vendor.id pci 0x11ab
+&device.id pci 0x4362
+&subvendor.id pci 0x1297
+&subdevice.id pci 0xc244
++subdevice.name Marvell 88E8053 Gigabit Ethernet Controller (Shuttle)
+
+ vendor.id pci 0x11ab
+&device.id pci 0x4362
+&subvendor.id pci 0x13d1
+&subdevice.id pci 0xac11
++subdevice.name Abocom EGE5K - Giga Ethernet Expresscard
+
+ vendor.id pci 0x11ab
+&device.id pci 0x4362
+&subvendor.id pci 0x1458
+&subdevice.id pci 0xe000
++subdevice.name Marvell 88E8053 Gigabit Ethernet Controller (Gigabyte)
+
+ vendor.id pci 0x11ab
+&device.id pci 0x4362
+&subvendor.id pci 0x1462
+&subdevice.id pci 0x058c
++subdevice.name Marvell 88E8053 Gigabit Ethernet Controller (MSI)
+
+ vendor.id pci 0x11ab
+&device.id pci 0x4362
+&subvendor.id pci 0x14c0
+&subdevice.id pci 0x0012
++subdevice.name Marvell 88E8053 Gigabit Ethernet Controller (Compal)
+
+ vendor.id pci 0x11ab
+&device.id pci 0x4362
+&subvendor.id pci 0x1558
+&subdevice.id pci 0x04a0
++subdevice.name Marvell 88E8053 Gigabit Ethernet Controller (Clevo)
+
+ vendor.id pci 0x11ab
+&device.id pci 0x4362
+&subvendor.id pci 0x15bd
+&subdevice.id pci 0x1003
++subdevice.name Marvell 88E8053 Gigabit Ethernet Controller (DFI)
+
+ vendor.id pci 0x11ab
+&device.id pci 0x4362
+&subvendor.id pci 0x161f
+&subdevice.id pci 0x203c
++subdevice.name Marvell 88E8053 Gigabit Ethernet Controller (Arima)
+
+ vendor.id pci 0x11ab
+&device.id pci 0x4362
+&subvendor.id pci 0x161f
+&subdevice.id pci 0x203d
++subdevice.name Marvell 88E8053 Gigabit Ethernet Controller (Arima)
+
+ vendor.id pci 0x11ab
+&device.id pci 0x4362
+&subvendor.id pci 0x1695
+&subdevice.id pci 0x9029
++subdevice.name Marvell 88E8053 Gigabit Ethernet Controller (Epox)
+
+ vendor.id pci 0x11ab
+&device.id pci 0x4362
+&subvendor.id pci 0x17f2
+&subdevice.id pci 0x2c08
++subdevice.name Marvell 88E8053 Gigabit Ethernet Controller (Albatron)
+
+ vendor.id pci 0x11ab
+&device.id pci 0x4362
+&subvendor.id pci 0x17ff
+&subdevice.id pci 0x0585
++subdevice.name Marvell 88E8053 Gigabit Ethernet Controller (Quanta)
+
+ vendor.id pci 0x11ab
+&device.id pci 0x4362
+&subvendor.id pci 0x1849
+&subdevice.id pci 0x8053
++subdevice.name Marvell 88E8053 Gigabit Ethernet Controller (ASRock)
+
+ vendor.id pci 0x11ab
+&device.id pci 0x4362
+&subvendor.id pci 0x1854
+&subdevice.id pci 0x000b
++subdevice.name Marvell 88E8053 Gigabit Ethernet Controller (LGE)
+
+ vendor.id pci 0x11ab
+&device.id pci 0x4362
+&subvendor.id pci 0x1854
+&subdevice.id pci 0x000c
++subdevice.name Marvell 88E8053 Gigabit Ethernet Controller (LGE)
+
+ vendor.id pci 0x11ab
+&device.id pci 0x4362
+&subvendor.id pci 0x1854
+&subdevice.id pci 0x0010
++subdevice.name Marvell 88E8053 Gigabit Ethernet Controller (LGE)
+
+ vendor.id pci 0x11ab
+&device.id pci 0x4362
+&subvendor.id pci 0x1854
+&subdevice.id pci 0x0013
++subdevice.name Marvell 88E8053 Gigabit Ethernet Controller (LGE)
+
+ vendor.id pci 0x11ab
+&device.id pci 0x4362
+&subvendor.id pci 0x1854
+&subdevice.id pci 0x0014
++subdevice.name Marvell 88E8053 Gigabit Ethernet Controller (LGE)
+
+ vendor.id pci 0x11ab
+&device.id pci 0x4362
+&subvendor.id pci 0x1854
+&subdevice.id pci 0x0015
++subdevice.name Marvell 88E8053 Gigabit Ethernet Controller (LGE)
+
+ vendor.id pci 0x11ab
+&device.id pci 0x4362
+&subvendor.id pci 0x1854
+&subdevice.id pci 0x001a
++subdevice.name Marvell 88E8053 Gigabit Ethernet Controller (LGE)
+
+ vendor.id pci 0x11ab
+&device.id pci 0x4362
+&subvendor.id pci 0x1854
+&subdevice.id pci 0x001b
++subdevice.name Marvell 88E8053 Gigabit Ethernet Controller (LGE)
+
+ vendor.id pci 0x11ab
+&device.id pci 0x4362
+&subvendor.id pci 0x1854
+&subdevice.id pci 0x001d
++subdevice.name Marvell 88E8053 Gigabit Ethernet Controller (LGE)
+
+ vendor.id pci 0x11ab
+&device.id pci 0x4362
+&subvendor.id pci 0x1854
+&subdevice.id pci 0x001f
++subdevice.name Marvell 88E8053 Gigabit Ethernet Controller (LGE)
+
+ vendor.id pci 0x11ab
+&device.id pci 0x4362
+&subvendor.id pci 0x1854
+&subdevice.id pci 0x0021
++subdevice.name Marvell 88E8053 Gigabit Ethernet Controller (LGE)
+
+ vendor.id pci 0x11ab
+&device.id pci 0x4362
+&subvendor.id pci 0x1854
+&subdevice.id pci 0x0022
++subdevice.name Marvell 88E8053 Gigabit Ethernet Controller (LGE)
+
+ vendor.id pci 0x11ab
+&device.id pci 0x4362
+&subvendor.id pci 0x1940
+&subdevice.id pci 0xe000
++subdevice.name Marvell 88E8053 Gigabit Ethernet Controller (Gigabyte)
+
+ vendor.id pci 0x11ab
+&device.id pci 0x4362
+&subvendor.id pci 0x270f
+&subdevice.id pci 0x2801
++subdevice.name Marvell 88E8053 Gigabit Ethernet Controller (Chaintech)
+
+ vendor.id pci 0x11ab
+&device.id pci 0x4362
+&subvendor.id pci 0xa0a0
+&subdevice.id pci 0x0506
++subdevice.name Marvell 88E8053 Gigabit Ethernet Controller (Aopen)
+
+ vendor.id pci 0x11ab
+&device.id pci 0x4611
++device.name GT-64115 System Controller
+
+ vendor.id pci 0x11ab
+&device.id pci 0x4620
++device.name GT-64120/64120A/64121A System Controller
+
+ vendor.id pci 0x11ab
+&device.id pci 0x4801
++device.name GT-48001
+
+ vendor.id pci 0x11ab
+&device.id pci 0x5040
++device.name MV88SX5040 4-port SATA I PCI-X Controller
+
+ vendor.id pci 0x11ab
+&device.id pci 0x5041
++device.name MV88SX5041 4-port SATA I PCI-X Controller
+
+ vendor.id pci 0x11ab
+&device.id pci 0x5080
++device.name MV88SX5080 8-port SATA I PCI-X Controller
+
+ vendor.id pci 0x11ab
+&device.id pci 0x5081
++device.name MV88SX5081 8-port SATA I PCI-X Controller
+
+ vendor.id pci 0x11ab
+&device.id pci 0x6041
++device.name MV88SX6041 4-port SATA II PCI-X Controller
+
+ vendor.id pci 0x11ab
+&device.id pci 0x6081
++device.name MV88SX6081 8-port SATA II PCI-X Controller
+
+ vendor.id pci 0x11ab
+&device.id pci 0x6460
++device.name MV64360/64361/64362 System Controller
+
+ vendor.id pci 0x11ab
+&device.id pci 0xf003
++device.name GT-64010 Primary Image Piranha Image Generator
+
+ vendor.id pci 0x11ac
++vendor.name Canon Information Systems Research Aust.
+
+ vendor.id pci 0x11ad
++vendor.name Lite-On Communications Inc
+
+ vendor.id pci 0x11ad
+&device.id pci 0x0002
++device.name LNE100TX
+
+ vendor.id pci 0x11ad
+&device.id pci 0x0002
+&subvendor.id pci 0x11ad
+&subdevice.id pci 0x0002
++subdevice.name LNE100TX
+
+ vendor.id pci 0x11ad
+&device.id pci 0x0002
+&subvendor.id pci 0x11ad
+&subdevice.id pci 0x0003
++subdevice.name LNE100TX
+
+ vendor.id pci 0x11ad
+&device.id pci 0x0002
+&subvendor.id pci 0x11ad
+&subdevice.id pci 0xf003
++subdevice.name LNE100TX
+
+ vendor.id pci 0x11ad
+&device.id pci 0x0002
+&subvendor.id pci 0x11ad
+&subdevice.id pci 0xffff
++subdevice.name LNE100TX
+
+ vendor.id pci 0x11ad
+&device.id pci 0x0002
+&subvendor.id pci 0x1385
+&subdevice.id pci 0xf004
++subdevice.name FA310TX
+
+ vendor.id pci 0x11ad
+&device.id pci 0xc115
++device.name LNE100TX [Linksys EtherFast 10/100]
+
+ vendor.id pci 0x11ad
+&device.id pci 0xc115
+&subvendor.id pci 0x11ad
+&subdevice.id pci 0xc001
++subdevice.name LNE100TX [ver 2.0]
+
+ vendor.id pci 0x11ae
++vendor.name Aztech System Ltd
+
+ vendor.id pci 0x11af
++vendor.name Avid Technology Inc.
+
+ vendor.id pci 0x11af
+&device.id pci 0x0001
++device.name [Cinema]
+
+ vendor.id pci 0x11b0
++vendor.name V3 Semiconductor Inc.
+
+ vendor.id pci 0x11b0
+&device.id pci 0x0002
++device.name V300PSC
+
+ vendor.id pci 0x11b0
+&device.id pci 0x0292
++device.name V292PBC [Am29030/40 Bridge]
+
+ vendor.id pci 0x11b0
+&device.id pci 0x0960
++device.name V96xPBC
+
+ vendor.id pci 0x11b0
+&device.id pci 0xc960
++device.name V96DPC
+
+ vendor.id pci 0x11b1
++vendor.name Apricot Computers
+
+ vendor.id pci 0x11b2
++vendor.name Eastman Kodak
+
+ vendor.id pci 0x11b3
++vendor.name Barr Systems Inc.
+
+ vendor.id pci 0x11b4
++vendor.name Leitch Technology International
+
+ vendor.id pci 0x11b5
++vendor.name Radstone Technology Plc
+
+ vendor.id pci 0x11b6
++vendor.name United Video Corp
+
+ vendor.id pci 0x11b7
++vendor.name Motorola
+
+ vendor.id pci 0x11b8
++vendor.name XPoint Technologies, Inc
+
+ vendor.id pci 0x11b8
+&device.id pci 0x0001
++device.name Quad PeerMaster
+
+ vendor.id pci 0x11b9
++vendor.name Pathlight Technology Inc.
+
+ vendor.id pci 0x11b9
+&device.id pci 0xc0ed
++device.name SSA Controller
+
+ vendor.id pci 0x11ba
++vendor.name Videotron Corp
+
+ vendor.id pci 0x11bb
++vendor.name Pyramid Technology
+
+ vendor.id pci 0x11bc
++vendor.name Network Peripherals Inc
+
+ vendor.id pci 0x11bc
+&device.id pci 0x0001
++device.name NP-PCI
+
+ vendor.id pci 0x11bd
++vendor.name Pinnacle Systems Inc.
+
+ vendor.id pci 0x11be
++vendor.name International Microcircuits Inc
+
+ vendor.id pci 0x11bf
++vendor.name Astrodesign, Inc.
+
+ vendor.id pci 0x11c0
++vendor.name Hewlett Packard
+
+ vendor.id pci 0x11c1
++vendor.name Agere Systems (former Lucent Microelectronics)
+
+ vendor.id pci 0x11c1
+&device.id pci 0x0440
++device.name 56k WinModem
+
+ vendor.id pci 0x11c1
+&device.id pci 0x0440
+&subvendor.id pci 0x1033
+&subdevice.id pci 0x8015
++subdevice.name LT WinModem 56k Data+Fax+Voice+Dsvd
+
+ vendor.id pci 0x11c1
+&device.id pci 0x0440
+&subvendor.id pci 0x1033
+&subdevice.id pci 0x8047
++subdevice.name LT WinModem 56k Data+Fax+Voice+Dsvd
+
+ vendor.id pci 0x11c1
+&device.id pci 0x0440
+&subvendor.id pci 0x1033
+&subdevice.id pci 0x804f
++subdevice.name LT WinModem 56k Data+Fax+Voice+Dsvd
+
+ vendor.id pci 0x11c1
+&device.id pci 0x0440
+&subvendor.id pci 0x10cf
+&subdevice.id pci 0x102c
++subdevice.name LB LT Modem V.90 56k
+
+ vendor.id pci 0x11c1
+&device.id pci 0x0440
+&subvendor.id pci 0x10cf
+&subdevice.id pci 0x104a
++subdevice.name BIBLO LT Modem 56k
+
+ vendor.id pci 0x11c1
+&device.id pci 0x0440
+&subvendor.id pci 0x10cf
+&subdevice.id pci 0x105f
++subdevice.name LB2 LT Modem V.90 56k
+
+ vendor.id pci 0x11c1
+&device.id pci 0x0440
+&subvendor.id pci 0x1179
+&subdevice.id pci 0x0001
++subdevice.name Internal V.90 Modem
+
+ vendor.id pci 0x11c1
+&device.id pci 0x0440
+&subvendor.id pci 0x11c1
+&subdevice.id pci 0x0440
++subdevice.name LT WinModem 56k Data+Fax+Voice+Dsvd
+
+ vendor.id pci 0x11c1
+&device.id pci 0x0440
+&subvendor.id pci 0x122d
+&subdevice.id pci 0x4101
++subdevice.name MDP7800-U Modem
+
+ vendor.id pci 0x11c1
+&device.id pci 0x0440
+&subvendor.id pci 0x122d
+&subdevice.id pci 0x4102
++subdevice.name MDP7800SP-U Modem
+
+ vendor.id pci 0x11c1
+&device.id pci 0x0440
+&subvendor.id pci 0x13e0
+&subdevice.id pci 0x0040
++subdevice.name LT WinModem 56k Data+Fax+Voice+Dsvd
+
+ vendor.id pci 0x11c1
+&device.id pci 0x0440
+&subvendor.id pci 0x13e0
+&subdevice.id pci 0x0440
++subdevice.name LT WinModem 56k Data+Fax+Voice+Dsvd
+
+ vendor.id pci 0x11c1
+&device.id pci 0x0440
+&subvendor.id pci 0x13e0
+&subdevice.id pci 0x0441
++subdevice.name LT WinModem 56k Data+Fax+Voice+Dsvd
+
+ vendor.id pci 0x11c1
+&device.id pci 0x0440
+&subvendor.id pci 0x13e0
+&subdevice.id pci 0x0450
++subdevice.name LT WinModem 56k Data+Fax+Voice+Dsvd
+
+ vendor.id pci 0x11c1
+&device.id pci 0x0440
+&subvendor.id pci 0x13e0
+&subdevice.id pci 0xf100
++subdevice.name LT WinModem 56k Data+Fax+Voice+Dsvd
+
+ vendor.id pci 0x11c1
+&device.id pci 0x0440
+&subvendor.id pci 0x13e0
+&subdevice.id pci 0xf101
++subdevice.name LT WinModem 56k Data+Fax+Voice+Dsvd
+
+ vendor.id pci 0x11c1
+&device.id pci 0x0440
+&subvendor.id pci 0x144d
+&subdevice.id pci 0x2101
++subdevice.name LT56PV Modem
+
+ vendor.id pci 0x11c1
+&device.id pci 0x0440
+&subvendor.id pci 0x149f
+&subdevice.id pci 0x0440
++subdevice.name LT WinModem 56k Data+Fax+Voice+Dsvd
+
+ vendor.id pci 0x11c1
+&device.id pci 0x0441
++device.name 56k WinModem
+
+ vendor.id pci 0x11c1
+&device.id pci 0x0441
+&subvendor.id pci 0x1033
+&subdevice.id pci 0x804d
++subdevice.name LT WinModem 56k Data+Fax
+
+ vendor.id pci 0x11c1
+&device.id pci 0x0441
+&subvendor.id pci 0x1033
+&subdevice.id pci 0x8065
++subdevice.name LT WinModem 56k Data+Fax
+
+ vendor.id pci 0x11c1
+&device.id pci 0x0441
+&subvendor.id pci 0x1092
+&subdevice.id pci 0x0440
++subdevice.name Supra 56i
+
+ vendor.id pci 0x11c1
+&device.id pci 0x0441
+&subvendor.id pci 0x1179
+&subdevice.id pci 0x0001
++subdevice.name Internal V.90 Modem
+
+ vendor.id pci 0x11c1
+&device.id pci 0x0441
+&subvendor.id pci 0x11c1
+&subdevice.id pci 0x0440
++subdevice.name LT WinModem 56k Data+Fax
+
+ vendor.id pci 0x11c1
+&device.id pci 0x0441
+&subvendor.id pci 0x11c1
+&subdevice.id pci 0x0441
++subdevice.name LT WinModem 56k Data+Fax
+
+ vendor.id pci 0x11c1
+&device.id pci 0x0441
+&subvendor.id pci 0x122d
+&subdevice.id pci 0x4100
++subdevice.name MDP7800-U Modem
+
+ vendor.id pci 0x11c1
+&device.id pci 0x0441
+&subvendor.id pci 0x13e0
+&subdevice.id pci 0x0040
++subdevice.name LT WinModem 56k Data+Fax
+
+ vendor.id pci 0x11c1
+&device.id pci 0x0441
+&subvendor.id pci 0x13e0
+&subdevice.id pci 0x0100
++subdevice.name LT WinModem 56k Data+Fax
+
+ vendor.id pci 0x11c1
+&device.id pci 0x0441
+&subvendor.id pci 0x13e0
+&subdevice.id pci 0x0410
++subdevice.name LT WinModem 56k Data+Fax
+
+ vendor.id pci 0x11c1
+&device.id pci 0x0441
+&subvendor.id pci 0x13e0
+&subdevice.id pci 0x0420
++subdevice.name TelePath Internet 56k WinModem
+
+ vendor.id pci 0x11c1
+&device.id pci 0x0441
+&subvendor.id pci 0x13e0
+&subdevice.id pci 0x0440
++subdevice.name LT WinModem 56k Data+Fax
+
+ vendor.id pci 0x11c1
+&device.id pci 0x0441
+&subvendor.id pci 0x13e0
+&subdevice.id pci 0x0443
++subdevice.name LT WinModem 56k Data+Fax
+
+ vendor.id pci 0x11c1
+&device.id pci 0x0441
+&subvendor.id pci 0x13e0
+&subdevice.id pci 0xf102
++subdevice.name LT WinModem 56k Data+Fax
+
+ vendor.id pci 0x11c1
+&device.id pci 0x0441
+&subvendor.id pci 0x1416
+&subdevice.id pci 0x9804
++subdevice.name CommWave 56k Modem
+
+ vendor.id pci 0x11c1
+&device.id pci 0x0441
+&subvendor.id pci 0x141d
+&subdevice.id pci 0x0440
++subdevice.name LT WinModem 56k Data+Fax
+
+ vendor.id pci 0x11c1
+&device.id pci 0x0441
+&subvendor.id pci 0x144f
+&subdevice.id pci 0x0441
++subdevice.name Lucent 56k V.90 DF Modem
+
+ vendor.id pci 0x11c1
+&device.id pci 0x0441
+&subvendor.id pci 0x144f
+&subdevice.id pci 0x0449
++subdevice.name Lucent 56k V.90 DF Modem
+
+ vendor.id pci 0x11c1
+&device.id pci 0x0441
+&subvendor.id pci 0x144f
+&subdevice.id pci 0x110d
++subdevice.name Lucent Win Modem
+
+ vendor.id pci 0x11c1
+&device.id pci 0x0441
+&subvendor.id pci 0x1468
+&subdevice.id pci 0x0441
++subdevice.name Presario 56k V.90 DF Modem
+
+ vendor.id pci 0x11c1
+&device.id pci 0x0441
+&subvendor.id pci 0x1668
+&subdevice.id pci 0x0440
++subdevice.name Lucent Win Modem
+
+ vendor.id pci 0x11c1
+&device.id pci 0x0442
++device.name 56k WinModem
+
+ vendor.id pci 0x11c1
+&device.id pci 0x0442
+&subvendor.id pci 0x11c1
+&subdevice.id pci 0x0440
++subdevice.name LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd
+
+ vendor.id pci 0x11c1
+&device.id pci 0x0442
+&subvendor.id pci 0x11c1
+&subdevice.id pci 0x0442
++subdevice.name LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd
+
+ vendor.id pci 0x11c1
+&device.id pci 0x0442
+&subvendor.id pci 0x13e0
+&subdevice.id pci 0x0412
++subdevice.name LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd
+
+ vendor.id pci 0x11c1
+&device.id pci 0x0442
+&subvendor.id pci 0x13e0
+&subdevice.id pci 0x0442
++subdevice.name LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd
+
+ vendor.id pci 0x11c1
+&device.id pci 0x0442
+&subvendor.id pci 0x13fc
+&subdevice.id pci 0x2471
++subdevice.name LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd
+
+ vendor.id pci 0x11c1
+&device.id pci 0x0442
+&subvendor.id pci 0x144d
+&subdevice.id pci 0x2104
++subdevice.name LT56PT Modem
+
+ vendor.id pci 0x11c1
+&device.id pci 0x0442
+&subvendor.id pci 0x144f
+&subdevice.id pci 0x1104
++subdevice.name LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd
+
+ vendor.id pci 0x11c1
+&device.id pci 0x0442
+&subvendor.id pci 0x149f
+&subdevice.id pci 0x0440
++subdevice.name LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd
+
+ vendor.id pci 0x11c1
+&device.id pci 0x0442
+&subvendor.id pci 0x1668
+&subdevice.id pci 0x0440
++subdevice.name LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd
+
+ vendor.id pci 0x11c1
+&device.id pci 0x0443
++device.name LT WinModem
+
+ vendor.id pci 0x11c1
+&device.id pci 0x0444
++device.name LT WinModem
+
+ vendor.id pci 0x11c1
+&device.id pci 0x0445
++device.name LT WinModem
+
+ vendor.id pci 0x11c1
+&device.id pci 0x0445
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x2203
++subdevice.name PRO/100+ MiniPCI (probably an Ambit U98.003.C.00 combo card)
+
+ vendor.id pci 0x11c1
+&device.id pci 0x0445
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x2204
++subdevice.name PRO/100+ MiniPCI on Armada E500
+
+ vendor.id pci 0x11c1
+&device.id pci 0x0446
++device.name LT WinModem
+
+ vendor.id pci 0x11c1
+&device.id pci 0x0447
++device.name LT WinModem
+
+ vendor.id pci 0x11c1
+&device.id pci 0x0448
++device.name WinModem 56k
+
+ vendor.id pci 0x11c1
+&device.id pci 0x0448
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x0131
++subdevice.name Lucent Win Modem
+
+ vendor.id pci 0x11c1
+&device.id pci 0x0448
+&subvendor.id pci 0x1033
+&subdevice.id pci 0x8066
++subdevice.name LT WinModem 56k Data+Fax+Voice+Dsvd
+
+ vendor.id pci 0x11c1
+&device.id pci 0x0448
+&subvendor.id pci 0x13e0
+&subdevice.id pci 0x0030
++subdevice.name 56k Voice Modem
+
+ vendor.id pci 0x11c1
+&device.id pci 0x0448
+&subvendor.id pci 0x13e0
+&subdevice.id pci 0x0040
++subdevice.name LT WinModem 56k Data+Fax+Voice+Dsvd
+
+ vendor.id pci 0x11c1
+&device.id pci 0x0448
+&subvendor.id pci 0x1668
+&subdevice.id pci 0x2400
++subdevice.name LT WinModem 56k (MiniPCI Ethernet+Modem)
+
+ vendor.id pci 0x11c1
+&device.id pci 0x0449
++device.name WinModem 56k
+
+ vendor.id pci 0x11c1
+&device.id pci 0x0449
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0xb14d
++subdevice.name 56k V.90 Modem
+
+ vendor.id pci 0x11c1
+&device.id pci 0x0449
+&subvendor.id pci 0x13e0
+&subdevice.id pci 0x0020
++subdevice.name LT WinModem 56k Data+Fax
+
+ vendor.id pci 0x11c1
+&device.id pci 0x0449
+&subvendor.id pci 0x13e0
+&subdevice.id pci 0x0041
++subdevice.name TelePath Internet 56k WinModem
+
+ vendor.id pci 0x11c1
+&device.id pci 0x0449
+&subvendor.id pci 0x1436
+&subdevice.id pci 0x0440
++subdevice.name Lucent Win Modem
+
+ vendor.id pci 0x11c1
+&device.id pci 0x0449
+&subvendor.id pci 0x144f
+&subdevice.id pci 0x0449
++subdevice.name Lucent 56k V.90 DFi Modem
+
+ vendor.id pci 0x11c1
+&device.id pci 0x0449
+&subvendor.id pci 0x1468
+&subdevice.id pci 0x0410
++subdevice.name IBM ThinkPad T23 (2647-4MG)
+
+ vendor.id pci 0x11c1
+&device.id pci 0x0449
+&subvendor.id pci 0x1468
+&subdevice.id pci 0x0440
++subdevice.name Lucent Win Modem
+
+ vendor.id pci 0x11c1
+&device.id pci 0x0449
+&subvendor.id pci 0x1468
+&subdevice.id pci 0x0449
++subdevice.name Presario 56k V.90 DFi Modem
+
+ vendor.id pci 0x11c1
+&device.id pci 0x044a
++device.name F-1156IV WinModem (V90, 56KFlex)
+
+ vendor.id pci 0x11c1
+&device.id pci 0x044a
+&subvendor.id pci 0x10cf
+&subdevice.id pci 0x1072
++subdevice.name LB Global LT Modem
+
+ vendor.id pci 0x11c1
+&device.id pci 0x044a
+&subvendor.id pci 0x13e0
+&subdevice.id pci 0x0012
++subdevice.name LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd
+
+ vendor.id pci 0x11c1
+&device.id pci 0x044a
+&subvendor.id pci 0x13e0
+&subdevice.id pci 0x0042
++subdevice.name LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd
+
+ vendor.id pci 0x11c1
+&device.id pci 0x044a
+&subvendor.id pci 0x144f
+&subdevice.id pci 0x1005
++subdevice.name LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd
+
+ vendor.id pci 0x11c1
+&device.id pci 0x044b
++device.name LT WinModem
+
+ vendor.id pci 0x11c1
+&device.id pci 0x044c
++device.name LT WinModem
+
+ vendor.id pci 0x11c1
+&device.id pci 0x044d
++device.name LT WinModem
+
+ vendor.id pci 0x11c1
+&device.id pci 0x044e
++device.name LT WinModem
+
+ vendor.id pci 0x11c1
+&device.id pci 0x044f
++device.name V90 WildWire Modem
+
+ vendor.id pci 0x11c1
+&device.id pci 0x0450
++device.name LT WinModem
+
+ vendor.id pci 0x11c1
+&device.id pci 0x0450
+&subvendor.id pci 0x1033
+&subdevice.id pci 0x80a8
++subdevice.name Versa Note Vxi
+
+ vendor.id pci 0x11c1
+&device.id pci 0x0450
+&subvendor.id pci 0x144f
+&subdevice.id pci 0x4005
++subdevice.name Magnia SG20
+
+ vendor.id pci 0x11c1
+&device.id pci 0x0451
++device.name LT WinModem
+
+ vendor.id pci 0x11c1
+&device.id pci 0x0452
++device.name LT WinModem
+
+ vendor.id pci 0x11c1
+&device.id pci 0x0453
++device.name LT WinModem
+
+ vendor.id pci 0x11c1
+&device.id pci 0x0454
++device.name LT WinModem
+
+ vendor.id pci 0x11c1
+&device.id pci 0x0455
++device.name LT WinModem
+
+ vendor.id pci 0x11c1
+&device.id pci 0x0456
++device.name LT WinModem
+
+ vendor.id pci 0x11c1
+&device.id pci 0x0457
++device.name LT WinModem
+
+ vendor.id pci 0x11c1
+&device.id pci 0x0458
++device.name LT WinModem
+
+ vendor.id pci 0x11c1
+&device.id pci 0x0459
++device.name LT WinModem
+
+ vendor.id pci 0x11c1
+&device.id pci 0x045a
++device.name LT WinModem
+
+ vendor.id pci 0x11c1
+&device.id pci 0x045c
++device.name LT WinModem
+
+ vendor.id pci 0x11c1
+&device.id pci 0x0461
++device.name V90 WildWire Modem
+
+ vendor.id pci 0x11c1
+&device.id pci 0x0462
++device.name V90 WildWire Modem
+
+ vendor.id pci 0x11c1
+&device.id pci 0x0480
++device.name Venus Modem (V90, 56KFlex)
+
+ vendor.id pci 0x11c1
+&device.id pci 0x048c
++device.name V.92 56K WinModem
+
+ vendor.id pci 0x11c1
+&device.id pci 0x048f
++device.name V.92 56k WinModem
+
+ vendor.id pci 0x11c1
+&device.id pci 0x5801
++device.name USB
+
+ vendor.id pci 0x11c1
+&device.id pci 0x5802
++device.name USS-312 USB Controller
+
+ vendor.id pci 0x11c1
+&device.id pci 0x5803
++device.name USS-344S USB Controller
+
+ vendor.id pci 0x11c1
+&device.id pci 0x5811
++device.name FW323
+
+ vendor.id pci 0x11c1
+&device.id pci 0x5811
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x524c
++subdevice.name D865PERL mainboard
+
+ vendor.id pci 0x11c1
+&device.id pci 0x5811
+&subvendor.id pci 0xdead
+&subdevice.id pci 0x0800
++subdevice.name FireWire Host Bus Adapter
+
+ vendor.id pci 0x11c1
+&device.id pci 0xab10
++device.name WL60010 Wireless LAN MAC
+
+ vendor.id pci 0x11c1
+&device.id pci 0xab11
++device.name WL60040 Multimode Wireles LAN MAC
+
+ vendor.id pci 0x11c1
+&device.id pci 0xab11
+&subvendor.id pci 0x11c1
+&subdevice.id pci 0xab12
++subdevice.name WaveLAN 11abg Cardbus card (Model 1102)
+
+ vendor.id pci 0x11c1
+&device.id pci 0xab11
+&subvendor.id pci 0x11c1
+&subdevice.id pci 0xab13
++subdevice.name WaveLAN 11abg MiniPCI card (Model 0512)
+
+ vendor.id pci 0x11c1
+&device.id pci 0xab11
+&subvendor.id pci 0x11c1
+&subdevice.id pci 0xab15
++subdevice.name WaveLAN 11abg Cardbus card (Model 1106)
+
+ vendor.id pci 0x11c1
+&device.id pci 0xab11
+&subvendor.id pci 0x11c1
+&subdevice.id pci 0xab16
++subdevice.name WaveLAN 11abg MiniPCI card (Model 0516)
+
+ vendor.id pci 0x11c1
+&device.id pci 0xab20
++device.name ORiNOCO PCI Adapter
+
+ vendor.id pci 0x11c1
+&device.id pci 0xab21
++device.name Agere Wireless PCI Adapter
+
+ vendor.id pci 0x11c1
+&device.id pci 0xab30
++device.name Hermes2 Mini-PCI WaveLAN a/b/g
+
+ vendor.id pci 0x11c1
+&device.id pci 0xab30
+&subvendor.id pci 0x14cd
+&subdevice.id pci 0x2012
++subdevice.name Hermes2 Mini-PCI WaveLAN a/b/g
+
+ vendor.id pci 0x11c2
++vendor.name Sand Microelectronics
+
+ vendor.id pci 0x11c3
++vendor.name NEC Corporation
+
+ vendor.id pci 0x11c4
++vendor.name Document Technologies, Inc
+
+ vendor.id pci 0x11c5
++vendor.name Shiva Corporation
+
+ vendor.id pci 0x11c6
++vendor.name Dainippon Screen Mfg. Co. Ltd
+
+ vendor.id pci 0x11c7
++vendor.name D.C.M. Data Systems
+
+ vendor.id pci 0x11c8
++vendor.name Dolphin Interconnect Solutions AS
+
+ vendor.id pci 0x11c8
+&device.id pci 0x0658
++device.name PSB32 SCI-Adapter D31x
+
+ vendor.id pci 0x11c8
+&device.id pci 0xd665
++device.name PSB64 SCI-Adapter D32x
+
+ vendor.id pci 0x11c8
+&device.id pci 0xd667
++device.name PSB66 SCI-Adapter D33x
+
+ vendor.id pci 0x11c9
++vendor.name Magma
+
+ vendor.id pci 0x11c9
+&device.id pci 0x0010
++device.name 16-line serial port w/- DMA
+
+ vendor.id pci 0x11c9
+&device.id pci 0x0011
++device.name 4-line serial port w/- DMA
+
+ vendor.id pci 0x11ca
++vendor.name LSI Systems, Inc
+
+ vendor.id pci 0x11cb
++vendor.name Specialix Research Ltd.
+
+ vendor.id pci 0x11cb
+&device.id pci 0x2000
++device.name PCI_9050
+
+ vendor.id pci 0x11cb
+&device.id pci 0x2000
+&subvendor.id pci 0x11cb
+&subdevice.id pci 0x0200
++subdevice.name SX
+
+ vendor.id pci 0x11cb
+&device.id pci 0x2000
+&subvendor.id pci 0x11cb
+&subdevice.id pci 0xb008
++subdevice.name I/O8+
+
+ vendor.id pci 0x11cb
+&device.id pci 0x4000
++device.name SUPI_1
+
+ vendor.id pci 0x11cb
+&device.id pci 0x8000
++device.name T225
+
+ vendor.id pci 0x11cc
++vendor.name Michels & Kleberhoff Computer GmbH
+
+ vendor.id pci 0x11cd
++vendor.name HAL Computer Systems, Inc.
+
+ vendor.id pci 0x11ce
++vendor.name Netaccess
+
+ vendor.id pci 0x11cf
++vendor.name Pioneer Electronic Corporation
+
+ vendor.id pci 0x11d0
++vendor.name Lockheed Martin Federal Systems-Manassas
+
+ vendor.id pci 0x11d1
++vendor.name Auravision
+
+ vendor.id pci 0x11d1
+&device.id pci 0x01f7
++device.name VxP524
+
+ vendor.id pci 0x11d2
++vendor.name Intercom Inc.
+
+ vendor.id pci 0x11d3
++vendor.name Trancell Systems Inc
+
+ vendor.id pci 0x11d4
++vendor.name Analog Devices
+
+ vendor.id pci 0x11d4
+&device.id pci 0x1535
++device.name Blackfin BF535 processor
+
+ vendor.id pci 0x11d4
+&device.id pci 0x1805
++device.name SM56 PCI modem
+
+ vendor.id pci 0x11d4
+&device.id pci 0x1889
++device.name AD1889 sound chip
+
+ vendor.id pci 0x11d5
++vendor.name Ikon Corporation
+
+ vendor.id pci 0x11d5
+&device.id pci 0x0115
++device.name 10115
+
+ vendor.id pci 0x11d5
+&device.id pci 0x0117
++device.name 10117
+
+ vendor.id pci 0x11d6
++vendor.name Tekelec Telecom
+
+ vendor.id pci 0x11d7
++vendor.name Trenton Technology, Inc.
+
+ vendor.id pci 0x11d8
++vendor.name Image Technologies Development
+
+ vendor.id pci 0x11d9
++vendor.name TEC Corporation
+
+ vendor.id pci 0x11da
++vendor.name Novell
+
+ vendor.id pci 0x11db
++vendor.name Sega Enterprises Ltd
+
+ vendor.id pci 0x11dc
++vendor.name Questra Corporation
+
+ vendor.id pci 0x11dd
++vendor.name Crosfield Electronics Limited
+
+ vendor.id pci 0x11de
++vendor.name Zoran Corporation
+
+ vendor.id pci 0x11de
+&device.id pci 0x6057
++device.name ZR36057PQC Video cutting chipset
+
+ vendor.id pci 0x11de
+&device.id pci 0x6057
+&subvendor.id pci 0x1031
+&subdevice.id pci 0x7efe
++subdevice.name DC10 Plus
+
+ vendor.id pci 0x11de
+&device.id pci 0x6057
+&subvendor.id pci 0x1031
+&subdevice.id pci 0xfc00
++subdevice.name MiroVIDEO DC50, Motion JPEG Capture/CODEC Board
+
+ vendor.id pci 0x11de
+&device.id pci 0x6057
+&subvendor.id pci 0x13ca
+&subdevice.id pci 0x4231
++subdevice.name JPEG/TV Card
+
+ vendor.id pci 0x11de
+&device.id pci 0x6120
++device.name ZR36120
+
+ vendor.id pci 0x11de
+&device.id pci 0x6120
+&subvendor.id pci 0x1328
+&subdevice.id pci 0xf001
++subdevice.name Cinemaster C DVD Decoder
+
+ vendor.id pci 0x11df
++vendor.name New Wave PDG
+
+ vendor.id pci 0x11e0
++vendor.name Cray Communications A/S
+
+ vendor.id pci 0x11e1
++vendor.name GEC Plessey Semi Inc.
+
+ vendor.id pci 0x11e2
++vendor.name Samsung Information Systems America
+
+ vendor.id pci 0x11e3
++vendor.name Quicklogic Corporation
+
+ vendor.id pci 0x11e3
+&device.id pci 0x5030
++device.name PC Watchdog
+
+ vendor.id pci 0x11e4
++vendor.name Second Wave Inc
+
+ vendor.id pci 0x11e5
++vendor.name IIX Consulting
+
+ vendor.id pci 0x11e6
++vendor.name Mitsui-Zosen System Research
+
+ vendor.id pci 0x11e7
++vendor.name Toshiba America, Elec. Company
+
+ vendor.id pci 0x11e8
++vendor.name Digital Processing Systems Inc.
+
+ vendor.id pci 0x11e9
++vendor.name Highwater Designs Ltd.
+
+ vendor.id pci 0x11ea
++vendor.name Elsag Bailey
+
+ vendor.id pci 0x11eb
++vendor.name Formation Inc.
+
+ vendor.id pci 0x11ec
++vendor.name Coreco Inc
+
+ vendor.id pci 0x11ed
++vendor.name Mediamatics
+
+ vendor.id pci 0x11ee
++vendor.name Dome Imaging Systems Inc
+
+ vendor.id pci 0x11ef
++vendor.name Nicolet Technologies B.V.
+
+ vendor.id pci 0x11f0
++vendor.name Compu-Shack
+
+ vendor.id pci 0x11f0
+&device.id pci 0x4231
++device.name FDDI
+
+ vendor.id pci 0x11f0
+&device.id pci 0x4232
++device.name FASTline UTP Quattro
+
+ vendor.id pci 0x11f0
+&device.id pci 0x4233
++device.name FASTline FO
+
+ vendor.id pci 0x11f0
+&device.id pci 0x4234
++device.name FASTline UTP
+
+ vendor.id pci 0x11f0
+&device.id pci 0x4235
++device.name FASTline-II UTP
+
+ vendor.id pci 0x11f0
+&device.id pci 0x4236
++device.name FASTline-II FO
+
+ vendor.id pci 0x11f0
+&device.id pci 0x4731
++device.name GIGAline
+
+ vendor.id pci 0x11f1
++vendor.name Symbios Logic Inc
+
+ vendor.id pci 0x11f2
++vendor.name Picture Tel Japan K.K.
+
+ vendor.id pci 0x11f3
++vendor.name Keithley Metrabyte
+
+ vendor.id pci 0x11f4
++vendor.name Kinetic Systems Corporation
+
+ vendor.id pci 0x11f4
+&device.id pci 0x2915
++device.name CAMAC controller
+
+ vendor.id pci 0x11f5
++vendor.name Computing Devices International
+
+ vendor.id pci 0x11f6
++vendor.name Compex
+
+ vendor.id pci 0x11f6
+&device.id pci 0x0112
++device.name ENet100VG4
+
+ vendor.id pci 0x11f6
+&device.id pci 0x0113
++device.name FreedomLine 100
+
+ vendor.id pci 0x11f6
+&device.id pci 0x1401
++device.name ReadyLink 2000
+
+ vendor.id pci 0x11f6
+&device.id pci 0x2011
++device.name RL100-ATX 10/100
+
+ vendor.id pci 0x11f6
+&device.id pci 0x2011
+&subvendor.id pci 0x11f6
+&subdevice.id pci 0x2011
++subdevice.name RL100-ATX
+
+ vendor.id pci 0x11f6
+&device.id pci 0x2201
++device.name ReadyLink 100TX (Winbond W89C840)
+
+ vendor.id pci 0x11f6
+&device.id pci 0x2201
+&subvendor.id pci 0x11f6
+&subdevice.id pci 0x2011
++subdevice.name ReadyLink 100TX
+
+ vendor.id pci 0x11f6
+&device.id pci 0x9881
++device.name RL100TX Fast Ethernet
+
+ vendor.id pci 0x11f7
++vendor.name Scientific Atlanta
+
+ vendor.id pci 0x11f8
++vendor.name PMC-Sierra Inc.
+
+ vendor.id pci 0x11f8
+&device.id pci 0x7375
++device.name PM7375 [LASAR-155 ATM SAR]
+
+ vendor.id pci 0x11f9
++vendor.name I-Cube Inc
+
+ vendor.id pci 0x11fa
++vendor.name Kasan Electronics Company, Ltd.
+
+ vendor.id pci 0x11fb
++vendor.name Datel Inc
+
+ vendor.id pci 0x11fc
++vendor.name Silicon Magic
+
+ vendor.id pci 0x11fd
++vendor.name High Street Consultants
+
+ vendor.id pci 0x11fe
++vendor.name Comtrol Corporation
+
+ vendor.id pci 0x11fe
+&device.id pci 0x0001
++device.name RocketPort 32 port w/external I/F
+
+ vendor.id pci 0x11fe
+&device.id pci 0x0002
++device.name RocketPort 8 port w/external I/F
+
+ vendor.id pci 0x11fe
+&device.id pci 0x0003
++device.name RocketPort 16 port w/external I/F
+
+ vendor.id pci 0x11fe
+&device.id pci 0x0004
++device.name RocketPort 4 port w/quad cable
+
+ vendor.id pci 0x11fe
+&device.id pci 0x0005
++device.name RocketPort 8 port w/octa cable
+
+ vendor.id pci 0x11fe
+&device.id pci 0x0006
++device.name RocketPort 8 port w/RJ11 connectors
+
+ vendor.id pci 0x11fe
+&device.id pci 0x0007
++device.name RocketPort 4 port w/RJ11 connectors
+
+ vendor.id pci 0x11fe
+&device.id pci 0x0008
++device.name RocketPort 8 port w/ DB78 SNI (Siemens) connector
+
+ vendor.id pci 0x11fe
+&device.id pci 0x0009
++device.name RocketPort 16 port w/ DB78 SNI (Siemens) connector
+
+ vendor.id pci 0x11fe
+&device.id pci 0x000a
++device.name RocketPort Plus 4 port
+
+ vendor.id pci 0x11fe
+&device.id pci 0x000b
++device.name RocketPort Plus 8 port
+
+ vendor.id pci 0x11fe
+&device.id pci 0x000c
++device.name RocketModem 6 port
+
+ vendor.id pci 0x11fe
+&device.id pci 0x000d
++device.name RocketModem 4-port
+
+ vendor.id pci 0x11fe
+&device.id pci 0x000e
++device.name RocketPort Plus 2 port RS232
+
+ vendor.id pci 0x11fe
+&device.id pci 0x000f
++device.name RocketPort Plus 2 port RS422
+
+ vendor.id pci 0x11fe
+&device.id pci 0x0801
++device.name RocketPort UPCI 32 port w/external I/F
+
+ vendor.id pci 0x11fe
+&device.id pci 0x0802
++device.name RocketPort UPCI 8 port w/external I/F
+
+ vendor.id pci 0x11fe
+&device.id pci 0x0803
++device.name RocketPort UPCI 16 port w/external I/F
+
+ vendor.id pci 0x11fe
+&device.id pci 0x0805
++device.name RocketPort UPCI 8 port w/octa cable
+
+ vendor.id pci 0x11fe
+&device.id pci 0x080c
++device.name RocketModem III 8 port
+
+ vendor.id pci 0x11fe
+&device.id pci 0x080d
++device.name RocketModem III 4 port
+
+ vendor.id pci 0x11fe
+&device.id pci 0x0903
++device.name RocketPort Compact PCI 16 port w/external I/F
+
+ vendor.id pci 0x11fe
+&device.id pci 0x8015
++device.name RocketPort 4-port UART 16954
+
+ vendor.id pci 0x11ff
++vendor.name Scion Corporation
+
+ vendor.id pci 0x11ff
+&device.id pci 0x0003
++device.name AG-5
+
+ vendor.id pci 0x1200
++vendor.name CSS Corporation
+
+ vendor.id pci 0x1201
++vendor.name Vista Controls Corp
+
+ vendor.id pci 0x1202
++vendor.name Network General Corp.
+
+ vendor.id pci 0x1202
+&device.id pci 0x4300
++device.name Gigabit Ethernet Adapter
+
+ vendor.id pci 0x1202
+&device.id pci 0x4300
+&subvendor.id pci 0x1202
+&subdevice.id pci 0x9841
++subdevice.name SK-9841 LX
+
+ vendor.id pci 0x1202
+&device.id pci 0x4300
+&subvendor.id pci 0x1202
+&subdevice.id pci 0x9842
++subdevice.name SK-9841 LX dual link
+
+ vendor.id pci 0x1202
+&device.id pci 0x4300
+&subvendor.id pci 0x1202
+&subdevice.id pci 0x9843
++subdevice.name SK-9843 SX
+
+ vendor.id pci 0x1202
+&device.id pci 0x4300
+&subvendor.id pci 0x1202
+&subdevice.id pci 0x9844
++subdevice.name SK-9843 SX dual link
+
+ vendor.id pci 0x1203
++vendor.name Bayer Corporation, Agfa Division
+
+ vendor.id pci 0x1204
++vendor.name Lattice Semiconductor Corporation
+
+ vendor.id pci 0x1205
++vendor.name Array Corporation
+
+ vendor.id pci 0x1206
++vendor.name Amdahl Corporation
+
+ vendor.id pci 0x1208
++vendor.name Parsytec GmbH
+
+ vendor.id pci 0x1208
+&device.id pci 0x4853
++device.name HS-Link Device
+
+ vendor.id pci 0x1209
++vendor.name SCI Systems Inc
+
+ vendor.id pci 0x120a
++vendor.name Synaptel
+
+ vendor.id pci 0x120b
++vendor.name Adaptive Solutions
+
+ vendor.id pci 0x120c
++vendor.name Technical Corp.
+
+ vendor.id pci 0x120d
++vendor.name Compression Labs, Inc.
+
+ vendor.id pci 0x120e
++vendor.name Cyclades Corporation
+
+ vendor.id pci 0x120e
+&device.id pci 0x0100
++device.name Cyclom-Y below first megabyte
+
+ vendor.id pci 0x120e
+&device.id pci 0x0101
++device.name Cyclom-Y above first megabyte
+
+ vendor.id pci 0x120e
+&device.id pci 0x0102
++device.name Cyclom-4Y below first megabyte
+
+ vendor.id pci 0x120e
+&device.id pci 0x0103
++device.name Cyclom-4Y above first megabyte
+
+ vendor.id pci 0x120e
+&device.id pci 0x0104
++device.name Cyclom-8Y below first megabyte
+
+ vendor.id pci 0x120e
+&device.id pci 0x0105
++device.name Cyclom-8Y above first megabyte
+
+ vendor.id pci 0x120e
+&device.id pci 0x0200
++device.name Cyclades-Z below first megabyte
+
+ vendor.id pci 0x120e
+&device.id pci 0x0201
++device.name Cyclades-Z above first megabyte
+
+ vendor.id pci 0x120e
+&device.id pci 0x0300
++device.name PC300/RSV or /X21 (2 ports)
+
+ vendor.id pci 0x120e
+&device.id pci 0x0301
++device.name PC300/RSV or /X21 (1 port)
+
+ vendor.id pci 0x120e
+&device.id pci 0x0310
++device.name PC300/TE (2 ports)
+
+ vendor.id pci 0x120e
+&device.id pci 0x0311
++device.name PC300/TE (1 port)
+
+ vendor.id pci 0x120e
+&device.id pci 0x0320
++device.name PC300/TE-M (2 ports)
+
+ vendor.id pci 0x120e
+&device.id pci 0x0321
++device.name PC300/TE-M (1 port)
+
+ vendor.id pci 0x120e
+&device.id pci 0x0400
++device.name PC400
+
+ vendor.id pci 0x120f
++vendor.name Essential Communications
+
+ vendor.id pci 0x120f
+&device.id pci 0x0001
++device.name Roadrunner serial HIPPI
+
+ vendor.id pci 0x1210
++vendor.name Hyperparallel Technologies
+
+ vendor.id pci 0x1211
++vendor.name Braintech Inc
+
+ vendor.id pci 0x1212
++vendor.name Kingston Technology Corp.
+
+ vendor.id pci 0x1213
++vendor.name Applied Intelligent Systems, Inc.
+
+ vendor.id pci 0x1214
++vendor.name Performance Technologies, Inc.
+
+ vendor.id pci 0x1215
++vendor.name Interware Co., Ltd
+
+ vendor.id pci 0x1216
++vendor.name Purup Prepress A/S
+
+ vendor.id pci 0x1217
++vendor.name O2 Micro, Inc.
+
+ vendor.id pci 0x1217
+&device.id pci 0x6729
++device.name OZ6729
+
+ vendor.id pci 0x1217
+&device.id pci 0x673a
++device.name OZ6730
+
+ vendor.id pci 0x1217
+&device.id pci 0x6832
++device.name OZ6832/6833 Cardbus Controller
+
+ vendor.id pci 0x1217
+&device.id pci 0x6836
++device.name OZ6836/6860 Cardbus Controller
+
+ vendor.id pci 0x1217
+&device.id pci 0x6872
++device.name OZ6812 Cardbus Controller
+
+ vendor.id pci 0x1217
+&device.id pci 0x6925
++device.name OZ6922 Cardbus Controller
+
+ vendor.id pci 0x1217
+&device.id pci 0x6933
++device.name OZ6933 Cardbus Controller
+
+ vendor.id pci 0x1217
+&device.id pci 0x6933
+&subvendor.id pci 0x1025
+&subdevice.id pci 0x1016
++subdevice.name Travelmate 612 TX
+
+ vendor.id pci 0x1217
+&device.id pci 0x6972
++device.name OZ6912 Cardbus Controller
+
+ vendor.id pci 0x1217
+&device.id pci 0x6972
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x020c
++subdevice.name ThinkPad R30
+
+ vendor.id pci 0x1217
+&device.id pci 0x6972
+&subvendor.id pci 0x1179
+&subdevice.id pci 0x0001
++subdevice.name Magnia Z310
+
+ vendor.id pci 0x1217
+&device.id pci 0x7110
++device.name OZ711Mx MultiMediaBay Accelerator
+
+ vendor.id pci 0x1217
+&device.id pci 0x7110
+&subvendor.id pci 0x103c
+&subdevice.id pci 0x0890
++subdevice.name NC6000 laptop
+
+ vendor.id pci 0x1217
+&device.id pci 0x7112
++device.name OZ711EC1/M1 SmartCardBus MultiMediaBay Controller
+
+ vendor.id pci 0x1217
+&device.id pci 0x7113
++device.name OZ711EC1 SmartCardBus Controller
+
+ vendor.id pci 0x1217
+&device.id pci 0x7114
++device.name OZ711M1 SmartCardBus MultiMediaBay Controller
+
+ vendor.id pci 0x1217
+&device.id pci 0x71e2
++device.name OZ711E2 SmartCardBus Controller
+
+ vendor.id pci 0x1217
+&device.id pci 0x7212
++device.name OZ711M2 SmartCardBus MultiMediaBay Controller
+
+ vendor.id pci 0x1217
+&device.id pci 0x7213
++device.name OZ6933E CardBus Controller
+
+ vendor.id pci 0x1217
+&device.id pci 0x7223
++device.name OZ711M3 SmartCardBus MultiMediaBay Controller
+
+ vendor.id pci 0x1217
+&device.id pci 0x7223
+&subvendor.id pci 0x103c
+&subdevice.id pci 0x0890
++subdevice.name NC6000 laptop
+
+ vendor.id pci 0x1218
++vendor.name Hybricon Corp.
+
+ vendor.id pci 0x1219
++vendor.name First Virtual Corporation
+
+ vendor.id pci 0x121a
++vendor.name 3Dfx Interactive, Inc.
+
+ vendor.id pci 0x121a
+&device.id pci 0x0001
++device.name Voodoo
+
+ vendor.id pci 0x121a
+&device.id pci 0x0002
++device.name Voodoo 2
+
+ vendor.id pci 0x121a
+&device.id pci 0x0003
++device.name Voodoo Banshee
+
+ vendor.id pci 0x121a
+&device.id pci 0x0003
+&subvendor.id pci 0x1092
+&subdevice.id pci 0x0003
++subdevice.name Monster Fusion
+
+ vendor.id pci 0x121a
+&device.id pci 0x0003
+&subvendor.id pci 0x1092
+&subdevice.id pci 0x4000
++subdevice.name Monster Fusion
+
+ vendor.id pci 0x121a
+&device.id pci 0x0003
+&subvendor.id pci 0x1092
+&subdevice.id pci 0x4002
++subdevice.name Monster Fusion
+
+ vendor.id pci 0x121a
+&device.id pci 0x0003
+&subvendor.id pci 0x1092
+&subdevice.id pci 0x4801
++subdevice.name Monster Fusion AGP
+
+ vendor.id pci 0x121a
+&device.id pci 0x0003
+&subvendor.id pci 0x1092
+&subdevice.id pci 0x4803
++subdevice.name Monster Fusion AGP
+
+ vendor.id pci 0x121a
+&device.id pci 0x0003
+&subvendor.id pci 0x1092
+&subdevice.id pci 0x8030
++subdevice.name Monster Fusion
+
+ vendor.id pci 0x121a
+&device.id pci 0x0003
+&subvendor.id pci 0x1092
+&subdevice.id pci 0x8035
++subdevice.name Monster Fusion AGP
+
+ vendor.id pci 0x121a
+&device.id pci 0x0003
+&subvendor.id pci 0x10b0
+&subdevice.id pci 0x0001
++subdevice.name Dragon 4000
+
+ vendor.id pci 0x121a
+&device.id pci 0x0003
+&subvendor.id pci 0x1102
+&subdevice.id pci 0x1018
++subdevice.name 3D Blaster Banshee VE
+
+ vendor.id pci 0x121a
+&device.id pci 0x0003
+&subvendor.id pci 0x121a
+&subdevice.id pci 0x0001
++subdevice.name Voodoo Banshee AGP
+
+ vendor.id pci 0x121a
+&device.id pci 0x0003
+&subvendor.id pci 0x121a
+&subdevice.id pci 0x0003
++subdevice.name Voodoo Banshee AGP SGRAM
+
+ vendor.id pci 0x121a
+&device.id pci 0x0003
+&subvendor.id pci 0x121a
+&subdevice.id pci 0x0004
++subdevice.name Voodoo Banshee
+
+ vendor.id pci 0x121a
+&device.id pci 0x0003
+&subvendor.id pci 0x139c
+&subdevice.id pci 0x0016
++subdevice.name Raven
+
+ vendor.id pci 0x121a
+&device.id pci 0x0003
+&subvendor.id pci 0x139c
+&subdevice.id pci 0x0017
++subdevice.name Raven
+
+ vendor.id pci 0x121a
+&device.id pci 0x0003
+&subvendor.id pci 0x14af
+&subdevice.id pci 0x0002
++subdevice.name Maxi Gamer Phoenix
+
+ vendor.id pci 0x121a
+&device.id pci 0x0004
++device.name Voodoo Banshee [Velocity 100]
+
+ vendor.id pci 0x121a
+&device.id pci 0x0005
++device.name Voodoo 3
+
+ vendor.id pci 0x121a
+&device.id pci 0x0005
+&subvendor.id pci 0x121a
+&subdevice.id pci 0x0004
++subdevice.name Voodoo3 AGP
+
+ vendor.id pci 0x121a
+&device.id pci 0x0005
+&subvendor.id pci 0x121a
+&subdevice.id pci 0x0030
++subdevice.name Voodoo3 AGP
+
+ vendor.id pci 0x121a
+&device.id pci 0x0005
+&subvendor.id pci 0x121a
+&subdevice.id pci 0x0031
++subdevice.name Voodoo3 AGP
+
+ vendor.id pci 0x121a
+&device.id pci 0x0005
+&subvendor.id pci 0x121a
+&subdevice.id pci 0x0034
++subdevice.name Voodoo3 AGP
+
+ vendor.id pci 0x121a
+&device.id pci 0x0005
+&subvendor.id pci 0x121a
+&subdevice.id pci 0x0036
++subdevice.name Voodoo3 2000 PCI
+
+ vendor.id pci 0x121a
+&device.id pci 0x0005
+&subvendor.id pci 0x121a
+&subdevice.id pci 0x0037
++subdevice.name Voodoo3 AGP
+
+ vendor.id pci 0x121a
+&device.id pci 0x0005
+&subvendor.id pci 0x121a
+&subdevice.id pci 0x0038
++subdevice.name Voodoo3 AGP
+
+ vendor.id pci 0x121a
+&device.id pci 0x0005
+&subvendor.id pci 0x121a
+&subdevice.id pci 0x003a
++subdevice.name Voodoo3 AGP
+
+ vendor.id pci 0x121a
+&device.id pci 0x0005
+&subvendor.id pci 0x121a
+&subdevice.id pci 0x0044
++subdevice.name Voodoo3
+
+ vendor.id pci 0x121a
+&device.id pci 0x0005
+&subvendor.id pci 0x121a
+&subdevice.id pci 0x004b
++subdevice.name Velocity 100
+
+ vendor.id pci 0x121a
+&device.id pci 0x0005
+&subvendor.id pci 0x121a
+&subdevice.id pci 0x004c
++subdevice.name Velocity 200
+
+ vendor.id pci 0x121a
+&device.id pci 0x0005
+&subvendor.id pci 0x121a
+&subdevice.id pci 0x004d
++subdevice.name Voodoo3 AGP
+
+ vendor.id pci 0x121a
+&device.id pci 0x0005
+&subvendor.id pci 0x121a
+&subdevice.id pci 0x004e
++subdevice.name Voodoo3 AGP
+
+ vendor.id pci 0x121a
+&device.id pci 0x0005
+&subvendor.id pci 0x121a
+&subdevice.id pci 0x0051
++subdevice.name Voodoo3 AGP
+
+ vendor.id pci 0x121a
+&device.id pci 0x0005
+&subvendor.id pci 0x121a
+&subdevice.id pci 0x0052
++subdevice.name Voodoo3 AGP
+
+ vendor.id pci 0x121a
+&device.id pci 0x0005
+&subvendor.id pci 0x121a
+&subdevice.id pci 0x0060
++subdevice.name Voodoo3 3500 TV (NTSC)
+
+ vendor.id pci 0x121a
+&device.id pci 0x0005
+&subvendor.id pci 0x121a
+&subdevice.id pci 0x0061
++subdevice.name Voodoo3 3500 TV (PAL)
+
+ vendor.id pci 0x121a
+&device.id pci 0x0005
+&subvendor.id pci 0x121a
+&subdevice.id pci 0x0062
++subdevice.name Voodoo3 3500 TV (SECAM)
+
+ vendor.id pci 0x121a
+&device.id pci 0x0009
++device.name Voodoo 4 / Voodoo 5
+
+ vendor.id pci 0x121a
+&device.id pci 0x0009
+&subvendor.id pci 0x121a
+&subdevice.id pci 0x0003
++subdevice.name Voodoo5 PCI 5500
+
+ vendor.id pci 0x121a
+&device.id pci 0x0009
+&subvendor.id pci 0x121a
+&subdevice.id pci 0x0009
++subdevice.name Voodoo5 AGP 5500/6000
+
+ vendor.id pci 0x121a
+&device.id pci 0x0057
++device.name Voodoo 3/3000 [Avenger]
+
+ vendor.id pci 0x121b
++vendor.name Advanced Telecommunications Modules
+
+ vendor.id pci 0x121c
++vendor.name Nippon Texaco., Ltd
+
+ vendor.id pci 0x121d
++vendor.name Lippert Automationstechnik GmbH
+
+ vendor.id pci 0x121e
++vendor.name CSPI
+
+ vendor.id pci 0x121f
++vendor.name Arcus Technology, Inc.
+
+ vendor.id pci 0x1220
++vendor.name Ariel Corporation
+
+ vendor.id pci 0x1220
+&device.id pci 0x1220
++device.name AMCC 5933 TMS320C80 DSP/Imaging board
+
+ vendor.id pci 0x1221
++vendor.name Contec Co., Ltd
+
+ vendor.id pci 0x1222
++vendor.name Ancor Communications, Inc.
+
+ vendor.id pci 0x1223
++vendor.name Artesyn Communication Products
+
+ vendor.id pci 0x1223
+&device.id pci 0x0003
++device.name PM/Link
+
+ vendor.id pci 0x1223
+&device.id pci 0x0004
++device.name PM/T1
+
+ vendor.id pci 0x1223
+&device.id pci 0x0005
++device.name PM/E1
+
+ vendor.id pci 0x1223
+&device.id pci 0x0008
++device.name PM/SLS
+
+ vendor.id pci 0x1223
+&device.id pci 0x0009
++device.name BajaSpan Resource Target
+
+ vendor.id pci 0x1223
+&device.id pci 0x000a
++device.name BajaSpan Section 0
+
+ vendor.id pci 0x1223
+&device.id pci 0x000b
++device.name BajaSpan Section 1
+
+ vendor.id pci 0x1223
+&device.id pci 0x000c
++device.name BajaSpan Section 2
+
+ vendor.id pci 0x1223
+&device.id pci 0x000d
++device.name BajaSpan Section 3
+
+ vendor.id pci 0x1223
+&device.id pci 0x000e
++device.name PM/PPC
+
+ vendor.id pci 0x1224
++vendor.name Interactive Images
+
+ vendor.id pci 0x1225
++vendor.name Power I/O, Inc.
+
+ vendor.id pci 0x1227
++vendor.name Tech-Source
+
+ vendor.id pci 0x1227
+&device.id pci 0x0006
++device.name Raptor GFX 8P
+
+ vendor.id pci 0x1228
++vendor.name Norsk Elektro Optikk A/S
+
+ vendor.id pci 0x1229
++vendor.name Data Kinesis Inc.
+
+ vendor.id pci 0x122a
++vendor.name Integrated Telecom
+
+ vendor.id pci 0x122b
++vendor.name LG Industrial Systems Co., Ltd
+
+ vendor.id pci 0x122c
++vendor.name Sican GmbH
+
+ vendor.id pci 0x122d
++vendor.name Aztech System Ltd
+
+ vendor.id pci 0x122d
+&device.id pci 0x1206
++device.name 368DSP
+
+ vendor.id pci 0x122d
+&device.id pci 0x1400
++device.name Trident PCI288-Q3DII (NX)
+
+ vendor.id pci 0x122d
+&device.id pci 0x50dc
++device.name 3328 Audio
+
+ vendor.id pci 0x122d
+&device.id pci 0x50dc
+&subvendor.id pci 0x122d
+&subdevice.id pci 0x0001
++subdevice.name 3328 Audio
+
+ vendor.id pci 0x122d
+&device.id pci 0x80da
++device.name 3328 Audio
+
+ vendor.id pci 0x122d
+&device.id pci 0x80da
+&subvendor.id pci 0x122d
+&subdevice.id pci 0x0001
++subdevice.name 3328 Audio
+
+ vendor.id pci 0x122e
++vendor.name Xyratex
+
+ vendor.id pci 0x122f
++vendor.name Andrew Corporation
+
+ vendor.id pci 0x1230
++vendor.name Fishcamp Engineering
+
+ vendor.id pci 0x1231
++vendor.name Woodward McCoach, Inc.
+
+ vendor.id pci 0x1232
++vendor.name GPT Limited
+
+ vendor.id pci 0x1233
++vendor.name Bus-Tech, Inc.
+
+ vendor.id pci 0x1234
++vendor.name Technical Corp.
+
+ vendor.id pci 0x1235
++vendor.name Risq Modular Systems, Inc.
+
+ vendor.id pci 0x1236
++vendor.name Sigma Designs Corporation
+
+ vendor.id pci 0x1236
+&device.id pci 0x0000
++device.name RealMagic64/GX
+
+ vendor.id pci 0x1236
+&device.id pci 0x6401
++device.name REALmagic 64/GX (SD 6425)
+
+ vendor.id pci 0x1237
++vendor.name Alta Technology Corporation
+
+ vendor.id pci 0x1238
++vendor.name Adtran
+
+ vendor.id pci 0x1239
++vendor.name 3DO Company
+
+ vendor.id pci 0x123a
++vendor.name Visicom Laboratories, Inc.
+
+ vendor.id pci 0x123b
++vendor.name Seeq Technology, Inc.
+
+ vendor.id pci 0x123c
++vendor.name Century Systems, Inc.
+
+ vendor.id pci 0x123d
++vendor.name Engineering Design Team, Inc.
+
+ vendor.id pci 0x123d
+&device.id pci 0x0000
++device.name EasyConnect 8/32
+
+ vendor.id pci 0x123d
+&device.id pci 0x0002
++device.name EasyConnect 8/64
+
+ vendor.id pci 0x123d
+&device.id pci 0x0003
++device.name EasyIO
+
+ vendor.id pci 0x123e
++vendor.name Simutech, Inc.
+
+ vendor.id pci 0x123f
++vendor.name C-Cube Microsystems
+
+ vendor.id pci 0x123f
+&device.id pci 0x00e4
++device.name MPEG
+
+ vendor.id pci 0x123f
+&device.id pci 0x8120
++device.name E4?
+
+ vendor.id pci 0x123f
+&device.id pci 0x8120
+&subvendor.id pci 0x11bd
+&subdevice.id pci 0x0006
++subdevice.name DV500 E4
+
+ vendor.id pci 0x123f
+&device.id pci 0x8120
+&subvendor.id pci 0x11bd
+&subdevice.id pci 0x000a
++subdevice.name DV500 E4
+
+ vendor.id pci 0x123f
+&device.id pci 0x8888
++device.name Cinemaster C 3.0 DVD Decoder
+
+ vendor.id pci 0x123f
+&device.id pci 0x8888
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x0001
++subdevice.name Cinemaster C 3.0 DVD Decoder
+
+ vendor.id pci 0x123f
+&device.id pci 0x8888
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x0002
++subdevice.name Cinemaster C 3.0 DVD Decoder
+
+ vendor.id pci 0x123f
+&device.id pci 0x8888
+&subvendor.id pci 0x1328
+&subdevice.id pci 0x0001
++subdevice.name Cinemaster C 3.0 DVD Decoder
+
+ vendor.id pci 0x1240
++vendor.name Marathon Technologies Corp.
+
+ vendor.id pci 0x1241
++vendor.name DSC Communications
+
+ vendor.id pci 0x1242
++vendor.name JNI Corporation
+
+ vendor.id pci 0x1242
+&device.id pci 0x1560
++device.name JNIC-1560 PCI-X Fibre Channel Controller
+
+ vendor.id pci 0x1242
+&device.id pci 0x1560
+&subvendor.id pci 0x1242
+&subdevice.id pci 0x6562
++subdevice.name FCX2-6562 Dual Channel PCI-X Fibre Channel Adapter
+
+ vendor.id pci 0x1242
+&device.id pci 0x1560
+&subvendor.id pci 0x1242
+&subdevice.id pci 0x656a
++subdevice.name FCX-6562 PCI-X Fibre Channel Adapter
+
+ vendor.id pci 0x1242
+&device.id pci 0x4643
++device.name FCI-1063 Fibre Channel Adapter
+
+ vendor.id pci 0x1242
+&device.id pci 0x6562
++device.name FCX2-6562 Dual Channel PCI-X Fibre Channel Adapter
+
+ vendor.id pci 0x1242
+&device.id pci 0x656a
++device.name FCX-6562 PCI-X Fibre Channel Adapter
+
+ vendor.id pci 0x1243
++vendor.name Delphax
+
+ vendor.id pci 0x1244
++vendor.name AVM Audiovisuelles MKTG & Computer System GmbH
+
+ vendor.id pci 0x1244
+&device.id pci 0x0700
++device.name B1 ISDN
+
+ vendor.id pci 0x1244
+&device.id pci 0x0800
++device.name C4 ISDN
+
+ vendor.id pci 0x1244
+&device.id pci 0x0a00
++device.name A1 ISDN [Fritz]
+
+ vendor.id pci 0x1244
+&device.id pci 0x0a00
+&subvendor.id pci 0x1244
+&subdevice.id pci 0x0a00
++subdevice.name FRITZ!Card ISDN Controller
+
+ vendor.id pci 0x1244
+&device.id pci 0x0e00
++device.name Fritz!PCI v2.0 ISDN
+
+ vendor.id pci 0x1244
+&device.id pci 0x1100
++device.name C2 ISDN
+
+ vendor.id pci 0x1244
+&device.id pci 0x1200
++device.name T1 ISDN
+
+ vendor.id pci 0x1244
+&device.id pci 0x2700
++device.name Fritz!Card DSL SL
+
+ vendor.id pci 0x1244
+&device.id pci 0x2900
++device.name Fritz!Card DSL v2.0
+
+ vendor.id pci 0x1245
++vendor.name A.P.D., S.A.
+
+ vendor.id pci 0x1246
++vendor.name Dipix Technologies, Inc.
+
+ vendor.id pci 0x1247
++vendor.name Xylon Research, Inc.
+
+ vendor.id pci 0x1248
++vendor.name Central Data Corporation
+
+ vendor.id pci 0x1249
++vendor.name Samsung Electronics Co., Ltd.
+
+ vendor.id pci 0x124a
++vendor.name AEG Electrocom GmbH
+
+ vendor.id pci 0x124b
++vendor.name SBS/Greenspring Modular I/O
+
+ vendor.id pci 0x124b
+&device.id pci 0x0040
++device.name PCI-40A or cPCI-200 Quad IndustryPack carrier
+
+ vendor.id pci 0x124b
+&device.id pci 0x0040
+&subvendor.id pci 0x124b
+&subdevice.id pci 0x9080
++subdevice.name PCI9080 Bridge
+
+ vendor.id pci 0x124c
++vendor.name Solitron Technologies, Inc.
+
+ vendor.id pci 0x124d
++vendor.name Stallion Technologies, Inc.
+
+ vendor.id pci 0x124d
+&device.id pci 0x0000
++device.name EasyConnection 8/32
+
+ vendor.id pci 0x124d
+&device.id pci 0x0002
++device.name EasyConnection 8/64
+
+ vendor.id pci 0x124d
+&device.id pci 0x0003
++device.name EasyIO
+
+ vendor.id pci 0x124d
+&device.id pci 0x0004
++device.name EasyConnection/RA
+
+ vendor.id pci 0x124e
++vendor.name Cylink
+
+ vendor.id pci 0x124f
++vendor.name Infortrend Technology, Inc.
+
+ vendor.id pci 0x124f
+&device.id pci 0x0041
++device.name IFT-2000 Series RAID Controller
+
+ vendor.id pci 0x1250
++vendor.name Hitachi Microcomputer System Ltd
+
+ vendor.id pci 0x1251
++vendor.name VLSI Solutions Oy
+
+ vendor.id pci 0x1253
++vendor.name Guzik Technical Enterprises
+
+ vendor.id pci 0x1254
++vendor.name Linear Systems Ltd.
+
+ vendor.id pci 0x1255
++vendor.name Optibase Ltd
+
+ vendor.id pci 0x1255
+&device.id pci 0x1110
++device.name MPEG Forge
+
+ vendor.id pci 0x1255
+&device.id pci 0x1210
++device.name MPEG Fusion
+
+ vendor.id pci 0x1255
+&device.id pci 0x2110
++device.name VideoPlex
+
+ vendor.id pci 0x1255
+&device.id pci 0x2120
++device.name VideoPlex CC
+
+ vendor.id pci 0x1255
+&device.id pci 0x2130
++device.name VideoQuest
+
+ vendor.id pci 0x1256
++vendor.name Perceptive Solutions, Inc.
+
+ vendor.id pci 0x1256
+&device.id pci 0x4201
++device.name PCI-2220I
+
+ vendor.id pci 0x1256
+&device.id pci 0x4401
++device.name PCI-2240I
+
+ vendor.id pci 0x1256
+&device.id pci 0x5201
++device.name PCI-2000
+
+ vendor.id pci 0x1257
++vendor.name Vertex Networks, Inc.
+
+ vendor.id pci 0x1258
++vendor.name Gilbarco, Inc.
+
+ vendor.id pci 0x1259
++vendor.name Allied Telesyn International
+
+ vendor.id pci 0x1259
+&device.id pci 0x2560
++device.name AT-2560 Fast Ethernet Adapter (i82557B)
+
+ vendor.id pci 0x1259
+&device.id pci 0xa117
++device.name RTL81xx Fast Ethernet
+
+ vendor.id pci 0x1259
+&device.id pci 0xa120
++device.name 21x4x DEC-Tulip compatible 10/100 Ethernet
+
+ vendor.id pci 0x125a
++vendor.name ABB Power Systems
+
+ vendor.id pci 0x125b
++vendor.name Asix Electronics Corporation
+
+ vendor.id pci 0x125b
+&device.id pci 0x1400
++device.name ALFA GFC2204 Fast Ethernet
+
+ vendor.id pci 0x125c
++vendor.name Aurora Technologies, Inc.
+
+ vendor.id pci 0x125c
+&device.id pci 0x0101
++device.name Saturn 4520P
+
+ vendor.id pci 0x125c
+&device.id pci 0x0640
++device.name Aries 16000P
+
+ vendor.id pci 0x125d
++vendor.name ESS Technology
+
+ vendor.id pci 0x125d
+&device.id pci 0x0000
++device.name ES336H Fax Modem (Early Model)
+
+ vendor.id pci 0x125d
+&device.id pci 0x1948
++device.name Solo?
+
+ vendor.id pci 0x125d
+&device.id pci 0x1968
++device.name ES1968 Maestro 2
+
+ vendor.id pci 0x125d
+&device.id pci 0x1968
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x0085
++subdevice.name ES1968 Maestro-2 PCI
+
+ vendor.id pci 0x125d
+&device.id pci 0x1968
+&subvendor.id pci 0x1033
+&subdevice.id pci 0x8051
++subdevice.name ES1968 Maestro-2 Audiodrive
+
+ vendor.id pci 0x125d
+&device.id pci 0x1969
++device.name ES1969 Solo-1 Audiodrive
+
+ vendor.id pci 0x125d
+&device.id pci 0x1969
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x0166
++subdevice.name ES1969 SOLO-1 AudioDrive on IBM Aptiva Mainboard
+
+ vendor.id pci 0x125d
+&device.id pci 0x1969
+&subvendor.id pci 0x125d
+&subdevice.id pci 0x8888
++subdevice.name Solo-1 Audio Adapter
+
+ vendor.id pci 0x125d
+&device.id pci 0x1978
++device.name ES1978 Maestro 2E
+
+ vendor.id pci 0x125d
+&device.id pci 0x1978
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0xb112
++subdevice.name Armada M700/E500
+
+ vendor.id pci 0x125d
+&device.id pci 0x1978
+&subvendor.id pci 0x1033
+&subdevice.id pci 0x803c
++subdevice.name ES1978 Maestro-2E Audiodrive
+
+ vendor.id pci 0x125d
+&device.id pci 0x1978
+&subvendor.id pci 0x1033
+&subdevice.id pci 0x8058
++subdevice.name ES1978 Maestro-2E Audiodrive
+
+ vendor.id pci 0x125d
+&device.id pci 0x1978
+&subvendor.id pci 0x1092
+&subdevice.id pci 0x4000
++subdevice.name Monster Sound MX400
+
+ vendor.id pci 0x125d
+&device.id pci 0x1978
+&subvendor.id pci 0x1179
+&subdevice.id pci 0x0001
++subdevice.name ES1978 Maestro-2E Audiodrive
+
+ vendor.id pci 0x125d
+&device.id pci 0x1988
++device.name ES1988 Allegro-1
+
+ vendor.id pci 0x125d
+&device.id pci 0x1988
+&subvendor.id pci 0x1092
+&subdevice.id pci 0x4100
++subdevice.name Sonic Impact S100
+
+ vendor.id pci 0x125d
+&device.id pci 0x1988
+&subvendor.id pci 0x125d
+&subdevice.id pci 0x1988
++subdevice.name ESS Allegro-1 Audiodrive
+
+ vendor.id pci 0x125d
+&device.id pci 0x1989
++device.name ESS Modem
+
+ vendor.id pci 0x125d
+&device.id pci 0x1989
+&subvendor.id pci 0x125d
+&subdevice.id pci 0x1989
++subdevice.name ESS Modem
+
+ vendor.id pci 0x125d
+&device.id pci 0x1998
++device.name ES1983S Maestro-3i PCI Audio Accelerator
+
+ vendor.id pci 0x125d
+&device.id pci 0x1998
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x00b1
++subdevice.name Latitude C600
+
+ vendor.id pci 0x125d
+&device.id pci 0x1998
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x00e6
++subdevice.name ES1983S Maestro-3i (Dell Inspiron 8100)
+
+ vendor.id pci 0x125d
+&device.id pci 0x1999
++device.name ES1983S Maestro-3i PCI Modem Accelerator
+
+ vendor.id pci 0x125d
+&device.id pci 0x199a
++device.name ES1983S Maestro-3i PCI Audio Accelerator
+
+ vendor.id pci 0x125d
+&device.id pci 0x199b
++device.name ES1983S Maestro-3i PCI Modem Accelerator
+
+ vendor.id pci 0x125d
+&device.id pci 0x2808
++device.name ES336H Fax Modem (Later Model)
+
+ vendor.id pci 0x125d
+&device.id pci 0x2838
++device.name ES2838/2839 SuperLink Modem
+
+ vendor.id pci 0x125d
+&device.id pci 0x2898
++device.name ES2898 Modem
+
+ vendor.id pci 0x125d
+&device.id pci 0x2898
+&subvendor.id pci 0x125d
+&subdevice.id pci 0x0424
++subdevice.name ES56-PI Data Fax Modem
+
+ vendor.id pci 0x125d
+&device.id pci 0x2898
+&subvendor.id pci 0x125d
+&subdevice.id pci 0x0425
++subdevice.name ES56T-PI Data Fax Modem
+
+ vendor.id pci 0x125d
+&device.id pci 0x2898
+&subvendor.id pci 0x125d
+&subdevice.id pci 0x0426
++subdevice.name ES56V-PI Data Fax Modem
+
+ vendor.id pci 0x125d
+&device.id pci 0x2898
+&subvendor.id pci 0x125d
+&subdevice.id pci 0x0427
++subdevice.name VW-PI Data Fax Modem
+
+ vendor.id pci 0x125d
+&device.id pci 0x2898
+&subvendor.id pci 0x125d
+&subdevice.id pci 0x0428
++subdevice.name ES56ST-PI Data Fax Modem
+
+ vendor.id pci 0x125d
+&device.id pci 0x2898
+&subvendor.id pci 0x125d
+&subdevice.id pci 0x0429
++subdevice.name ES56SV-PI Data Fax Modem
+
+ vendor.id pci 0x125d
+&device.id pci 0x2898
+&subvendor.id pci 0x147a
+&subdevice.id pci 0xc001
++subdevice.name ES56-PI Data Fax Modem
+
+ vendor.id pci 0x125d
+&device.id pci 0x2898
+&subvendor.id pci 0x14fe
+&subdevice.id pci 0x0428
++subdevice.name ES56-PI Data Fax Modem
+
+ vendor.id pci 0x125d
+&device.id pci 0x2898
+&subvendor.id pci 0x14fe
+&subdevice.id pci 0x0429
++subdevice.name ES56-PI Data Fax Modem
+
+ vendor.id pci 0x125e
++vendor.name Specialvideo Engineering SRL
+
+ vendor.id pci 0x125f
++vendor.name Concurrent Technologies, Inc.
+
+ vendor.id pci 0x1260
++vendor.name Intersil Corporation
+
+ vendor.id pci 0x1260
+&device.id pci 0x3872
++device.name Prism 2.5 Wavelan chipset
+
+ vendor.id pci 0x1260
+&device.id pci 0x3872
+&subvendor.id pci 0x1468
+&subdevice.id pci 0x0202
++subdevice.name LAN-Express IEEE 802.11b Wireless LAN
+
+ vendor.id pci 0x1260
+&device.id pci 0x3873
++device.name Prism 2.5 Wavelan chipset
+
+ vendor.id pci 0x1260
+&device.id pci 0x3873
+&subvendor.id pci 0x1186
+&subdevice.id pci 0x3501
++subdevice.name DWL-520 Wireless PCI Adapter
+
+ vendor.id pci 0x1260
+&device.id pci 0x3873
+&subvendor.id pci 0x1186
+&subdevice.id pci 0x3700
++subdevice.name DWL-520 Wireless PCI Adapter, Rev E1
+
+ vendor.id pci 0x1260
+&device.id pci 0x3873
+&subvendor.id pci 0x1385
+&subdevice.id pci 0x4105
++subdevice.name MA311 802.11b wireless adapter
+
+ vendor.id pci 0x1260
+&device.id pci 0x3873
+&subvendor.id pci 0x1668
+&subdevice.id pci 0x0414
++subdevice.name HWP01170-01 802.11b PCI Wireless Adapter
+
+ vendor.id pci 0x1260
+&device.id pci 0x3873
+&subvendor.id pci 0x16a5
+&subdevice.id pci 0x1601
++subdevice.name AIR.mate PC-400 PCI Wireless LAN Adapter
+
+ vendor.id pci 0x1260
+&device.id pci 0x3873
+&subvendor.id pci 0x1737
+&subdevice.id pci 0x3874
++subdevice.name WMP11 Wireless 802.11b PCI Adapter
+
+ vendor.id pci 0x1260
+&device.id pci 0x3873
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x2513
++subdevice.name Wireless 802.11b MiniPCI Adapter
+
+ vendor.id pci 0x1260
+&device.id pci 0x3886
++device.name ISL3886 [Prism Javelin/Prism Xbow]
+
+ vendor.id pci 0x1260
+&device.id pci 0x3886
+&subvendor.id pci 0x17cf
+&subdevice.id pci 0x0037
++subdevice.name Z-Com XG-901 and clones Wireless Adapter
+
+ vendor.id pci 0x1260
+&device.id pci 0x3890
++device.name Intersil ISL3890 [Prism GT/Prism Duette]
+
+ vendor.id pci 0x1260
+&device.id pci 0x3890
+&subvendor.id pci 0x10b8
+&subdevice.id pci 0x2802
++subdevice.name SMC2802W Wireless PCI Adapter
+
+ vendor.id pci 0x1260
+&device.id pci 0x3890
+&subvendor.id pci 0x10b8
+&subdevice.id pci 0x2835
++subdevice.name SMC2835W Wireless Cardbus Adapter
+
+ vendor.id pci 0x1260
+&device.id pci 0x3890
+&subvendor.id pci 0x10b8
+&subdevice.id pci 0xa835
++subdevice.name SMC2835W V2 Wireless Cardbus Adapter
+
+ vendor.id pci 0x1260
+&device.id pci 0x3890
+&subvendor.id pci 0x1113
+&subdevice.id pci 0xee03
++subdevice.name SMC2802W V2 Wireless PCI Adapter
+
+ vendor.id pci 0x1260
+&device.id pci 0x3890
+&subvendor.id pci 0x1186
+&subdevice.id pci 0x3202
++subdevice.name DWL-G650 A1 Wireless Adapter
+
+ vendor.id pci 0x1260
+&device.id pci 0x3890
+&subvendor.id pci 0x1259
+&subdevice.id pci 0xc104
++subdevice.name CG-WLCB54GT Wireless Adapter
+
+ vendor.id pci 0x1260
+&device.id pci 0x3890
+&subvendor.id pci 0x1385
+&subdevice.id pci 0x4800
++subdevice.name WG511 Wireless Adapter
+
+ vendor.id pci 0x1260
+&device.id pci 0x3890
+&subvendor.id pci 0x16a5
+&subdevice.id pci 0x1605
++subdevice.name ALLNET ALL0271 Wireless PCI Adapter
+
+ vendor.id pci 0x1260
+&device.id pci 0x3890
+&subvendor.id pci 0x17cf
+&subdevice.id pci 0x0014
++subdevice.name Z-Com XG-600 and clones Wireless Adapter
+
+ vendor.id pci 0x1260
+&device.id pci 0x3890
+&subvendor.id pci 0x17cf
+&subdevice.id pci 0x0020
++subdevice.name Z-Com XG-900 and clones Wireless Adapter
+
+ vendor.id pci 0x1260
+&device.id pci 0x8130
++device.name HMP8130 NTSC/PAL Video Decoder
+
+ vendor.id pci 0x1260
+&device.id pci 0x8131
++device.name HMP8131 NTSC/PAL Video Decoder
+
+ vendor.id pci 0x1261
++vendor.name Matsushita-Kotobuki Electronics Industries, Ltd.
+
+ vendor.id pci 0x1262
++vendor.name ES Computer Company, Ltd.
+
+ vendor.id pci 0x1263
++vendor.name Sonic Solutions
+
+ vendor.id pci 0x1264
++vendor.name Aval Nagasaki Corporation
+
+ vendor.id pci 0x1265
++vendor.name Casio Computer Co., Ltd.
+
+ vendor.id pci 0x1266
++vendor.name Microdyne Corporation
+
+ vendor.id pci 0x1266
+&device.id pci 0x0001
++device.name NE10/100 Adapter (i82557B)
+
+ vendor.id pci 0x1266
+&device.id pci 0x1910
++device.name NE2000Plus (RT8029) Ethernet Adapter
+
+ vendor.id pci 0x1266
+&device.id pci 0x1910
+&subvendor.id pci 0x1266
+&subdevice.id pci 0x1910
++subdevice.name NE2000Plus Ethernet Adapter
+
+ vendor.id pci 0x1267
++vendor.name S. A. Telecommunications
+
+ vendor.id pci 0x1267
+&device.id pci 0x5352
++device.name PCR2101
+
+ vendor.id pci 0x1267
+&device.id pci 0x5a4b
++device.name Telsat Turbo
+
+ vendor.id pci 0x1268
++vendor.name Tektronix
+
+ vendor.id pci 0x1269
++vendor.name Thomson-CSF/TTM
+
+ vendor.id pci 0x126a
++vendor.name Lexmark International, Inc.
+
+ vendor.id pci 0x126b
++vendor.name Adax, Inc.
+
+ vendor.id pci 0x126c
++vendor.name Northern Telecom
+
+ vendor.id pci 0x126c
+&device.id pci 0x1211
++device.name 10/100BaseTX [RTL81xx]
+
+ vendor.id pci 0x126c
+&device.id pci 0x126c
++device.name 802.11b Wireless Ethernet Adapter
+
+ vendor.id pci 0x126d
++vendor.name Splash Technology, Inc.
+
+ vendor.id pci 0x126e
++vendor.name Sumitomo Metal Industries, Ltd.
+
+ vendor.id pci 0x126f
++vendor.name Silicon Motion, Inc.
+
+ vendor.id pci 0x126f
+&device.id pci 0x0501
++device.name SM501 VoyagerGX
+
+ vendor.id pci 0x126f
+&device.id pci 0x0710
++device.name SM710 LynxEM
+
+ vendor.id pci 0x126f
+&device.id pci 0x0712
++device.name SM712 LynxEM+
+
+ vendor.id pci 0x126f
+&device.id pci 0x0720
++device.name SM720 Lynx3DM
+
+ vendor.id pci 0x126f
+&device.id pci 0x0730
++device.name SM731 Cougar3DR
+
+ vendor.id pci 0x126f
+&device.id pci 0x0810
++device.name SM810 LynxE
+
+ vendor.id pci 0x126f
+&device.id pci 0x0811
++device.name SM811 LynxE
+
+ vendor.id pci 0x126f
+&device.id pci 0x0820
++device.name SM820 Lynx3D
+
+ vendor.id pci 0x126f
+&device.id pci 0x0910
++device.name SM910
+
+ vendor.id pci 0x1270
++vendor.name Olympus Optical Co., Ltd.
+
+ vendor.id pci 0x1271
++vendor.name GW Instruments
+
+ vendor.id pci 0x1272
++vendor.name Telematics International
+
+ vendor.id pci 0x1273
++vendor.name Hughes Network Systems
+
+ vendor.id pci 0x1273
+&device.id pci 0x0002
++device.name DirecPC
+
+ vendor.id pci 0x1274
++vendor.name Ensoniq
+
+ vendor.id pci 0x1274
+&device.id pci 0x1171
++device.name ES1373 [AudioPCI] (also Creative Labs CT5803)
+
+ vendor.id pci 0x1274
+&device.id pci 0x1371
++device.name ES1371 [AudioPCI-97]
+
+ vendor.id pci 0x1274
+&device.id pci 0x1371
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0x0024
++subdevice.name AudioPCI on Motherboard Compaq Deskpro
+
+ vendor.id pci 0x1274
+&device.id pci 0x1371
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0xb1a7
++subdevice.name ES1371, ES1373 AudioPCI
+
+ vendor.id pci 0x1274
+&device.id pci 0x1371
+&subvendor.id pci 0x1033
+&subdevice.id pci 0x80ac
++subdevice.name ES1371, ES1373 AudioPCI
+
+ vendor.id pci 0x1274
+&device.id pci 0x1371
+&subvendor.id pci 0x1042
+&subdevice.id pci 0x1854
++subdevice.name Tazer
+
+ vendor.id pci 0x1274
+&device.id pci 0x1371
+&subvendor.id pci 0x107b
+&subdevice.id pci 0x8054
++subdevice.name Tabor2
+
+ vendor.id pci 0x1274
+&device.id pci 0x1371
+&subvendor.id pci 0x1274
+&subdevice.id pci 0x1371
++subdevice.name Creative Sound Blaster AudioPCI64V, AudioPCI128
+
+ vendor.id pci 0x1274
+&device.id pci 0x1371
+&subvendor.id pci 0x1462
+&subdevice.id pci 0x6470
++subdevice.name ES1371, ES1373 AudioPCI On Motherboard MS-6147 1.1A
+
+ vendor.id pci 0x1274
+&device.id pci 0x1371
+&subvendor.id pci 0x1462
+&subdevice.id pci 0x6560
++subdevice.name ES1371, ES1373 AudioPCI On Motherboard MS-6156 1.10
+
+ vendor.id pci 0x1274
+&device.id pci 0x1371
+&subvendor.id pci 0x1462
+&subdevice.id pci 0x6630
++subdevice.name ES1371, ES1373 AudioPCI On Motherboard MS-6163BX 1.0A
+
+ vendor.id pci 0x1274
+&device.id pci 0x1371
+&subvendor.id pci 0x1462
+&subdevice.id pci 0x6631
++subdevice.name ES1371, ES1373 AudioPCI On Motherboard MS-6163VIA 1.0A
+
+ vendor.id pci 0x1274
+&device.id pci 0x1371
+&subvendor.id pci 0x1462
+&subdevice.id pci 0x6632
++subdevice.name ES1371, ES1373 AudioPCI On Motherboard MS-6163BX 2.0A
+
+ vendor.id pci 0x1274
+&device.id pci 0x1371
+&subvendor.id pci 0x1462
+&subdevice.id pci 0x6633
++subdevice.name ES1371, ES1373 AudioPCI On Motherboard MS-6163VIA 2.0A
+
+ vendor.id pci 0x1274
+&device.id pci 0x1371
+&subvendor.id pci 0x1462
+&subdevice.id pci 0x6820
++subdevice.name ES1371, ES1373 AudioPCI On Motherboard MS-6182 1.00
+
+ vendor.id pci 0x1274
+&device.id pci 0x1371
+&subvendor.id pci 0x1462
+&subdevice.id pci 0x6822
++subdevice.name ES1371, ES1373 AudioPCI On Motherboard MS-6182 1.00A
+
+ vendor.id pci 0x1274
+&device.id pci 0x1371
+&subvendor.id pci 0x1462
+&subdevice.id pci 0x6830
++subdevice.name ES1371, ES1373 AudioPCI On Motherboard MS-6183 1.00
+
+ vendor.id pci 0x1274
+&device.id pci 0x1371
+&subvendor.id pci 0x1462
+&subdevice.id pci 0x6880
++subdevice.name ES1371, ES1373 AudioPCI On Motherboard MS-6188 1.00
+
+ vendor.id pci 0x1274
+&device.id pci 0x1371
+&subvendor.id pci 0x1462
+&subdevice.id pci 0x6900
++subdevice.name ES1371, ES1373 AudioPCI On Motherboard MS-6190 1.00
+
+ vendor.id pci 0x1274
+&device.id pci 0x1371
+&subvendor.id pci 0x1462
+&subdevice.id pci 0x6910
++subdevice.name ES1371, ES1373 AudioPCI On Motherboard MS-6191
+
+ vendor.id pci 0x1274
+&device.id pci 0x1371
+&subvendor.id pci 0x1462
+&subdevice.id pci 0x6930
++subdevice.name ES1371, ES1373 AudioPCI On Motherboard MS-6193
+
+ vendor.id pci 0x1274
+&device.id pci 0x1371
+&subvendor.id pci 0x1462
+&subdevice.id pci 0x6990
++subdevice.name ES1371, ES1373 AudioPCI On Motherboard MS-6199BX 2.0A
+
+ vendor.id pci 0x1274
+&device.id pci 0x1371
+&subvendor.id pci 0x1462
+&subdevice.id pci 0x6991
++subdevice.name ES1371, ES1373 AudioPCI On Motherboard MS-6199VIA 2.0A
+
+ vendor.id pci 0x1274
+&device.id pci 0x1371
+&subvendor.id pci 0x14a4
+&subdevice.id pci 0x2077
++subdevice.name ES1371, ES1373 AudioPCI On Motherboard KR639
+
+ vendor.id pci 0x1274
+&device.id pci 0x1371
+&subvendor.id pci 0x14a4
+&subdevice.id pci 0x2105
++subdevice.name ES1371, ES1373 AudioPCI On Motherboard MR800
+
+ vendor.id pci 0x1274
+&device.id pci 0x1371
+&subvendor.id pci 0x14a4
+&subdevice.id pci 0x2107
++subdevice.name ES1371, ES1373 AudioPCI On Motherboard MR801
+
+ vendor.id pci 0x1274
+&device.id pci 0x1371
+&subvendor.id pci 0x14a4
+&subdevice.id pci 0x2172
++subdevice.name ES1371, ES1373 AudioPCI On Motherboard DR739
+
+ vendor.id pci 0x1274
+&device.id pci 0x1371
+&subvendor.id pci 0x1509
+&subdevice.id pci 0x9902
++subdevice.name ES1371, ES1373 AudioPCI On Motherboard KW11
+
+ vendor.id pci 0x1274
+&device.id pci 0x1371
+&subvendor.id pci 0x1509
+&subdevice.id pci 0x9903
++subdevice.name ES1371, ES1373 AudioPCI On Motherboard KW31
+
+ vendor.id pci 0x1274
+&device.id pci 0x1371
+&subvendor.id pci 0x1509
+&subdevice.id pci 0x9904
++subdevice.name ES1371, ES1373 AudioPCI On Motherboard KA11
+
+ vendor.id pci 0x1274
+&device.id pci 0x1371
+&subvendor.id pci 0x1509
+&subdevice.id pci 0x9905
++subdevice.name ES1371, ES1373 AudioPCI On Motherboard KC13
+
+ vendor.id pci 0x1274
+&device.id pci 0x1371
+&subvendor.id pci 0x152d
+&subdevice.id pci 0x8801
++subdevice.name ES1371, ES1373 AudioPCI On Motherboard CP810E
+
+ vendor.id pci 0x1274
+&device.id pci 0x1371
+&subvendor.id pci 0x152d
+&subdevice.id pci 0x8802
++subdevice.name ES1371, ES1373 AudioPCI On Motherboard CP810
+
+ vendor.id pci 0x1274
+&device.id pci 0x1371
+&subvendor.id pci 0x152d
+&subdevice.id pci 0x8803
++subdevice.name ES1371, ES1373 AudioPCI On Motherboard P3810E
+
+ vendor.id pci 0x1274
+&device.id pci 0x1371
+&subvendor.id pci 0x152d
+&subdevice.id pci 0x8804
++subdevice.name ES1371, ES1373 AudioPCI On Motherboard P3810-S
+
+ vendor.id pci 0x1274
+&device.id pci 0x1371
+&subvendor.id pci 0x152d
+&subdevice.id pci 0x8805
++subdevice.name ES1371, ES1373 AudioPCI On Motherboard P3820-S
+
+ vendor.id pci 0x1274
+&device.id pci 0x1371
+&subvendor.id pci 0x270f
+&subdevice.id pci 0x2001
++subdevice.name ES1371, ES1373 AudioPCI On Motherboard 6CTR
+
+ vendor.id pci 0x1274
+&device.id pci 0x1371
+&subvendor.id pci 0x270f
+&subdevice.id pci 0x2200
++subdevice.name ES1371, ES1373 AudioPCI On Motherboard 6WTX
+
+ vendor.id pci 0x1274
+&device.id pci 0x1371
+&subvendor.id pci 0x270f
+&subdevice.id pci 0x3000
++subdevice.name ES1371, ES1373 AudioPCI On Motherboard 6WSV
+
+ vendor.id pci 0x1274
+&device.id pci 0x1371
+&subvendor.id pci 0x270f
+&subdevice.id pci 0x3100
++subdevice.name ES1371, ES1373 AudioPCI On Motherboard 6WIV2
+
+ vendor.id pci 0x1274
+&device.id pci 0x1371
+&subvendor.id pci 0x270f
+&subdevice.id pci 0x3102
++subdevice.name ES1371, ES1373 AudioPCI On Motherboard 6WIV
+
+ vendor.id pci 0x1274
+&device.id pci 0x1371
+&subvendor.id pci 0x270f
+&subdevice.id pci 0x7060
++subdevice.name ES1371, ES1373 AudioPCI On Motherboard 6ASA2
+
+ vendor.id pci 0x1274
+&device.id pci 0x1371
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x4249
++subdevice.name ES1371, ES1373 AudioPCI On Motherboard BI440ZX
+
+ vendor.id pci 0x1274
+&device.id pci 0x1371
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x424c
++subdevice.name ES1371, ES1373 AudioPCI On Motherboard BL440ZX
+
+ vendor.id pci 0x1274
+&device.id pci 0x1371
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x425a
++subdevice.name ES1371, ES1373 AudioPCI On Motherboard BZ440ZX
+
+ vendor.id pci 0x1274
+&device.id pci 0x1371
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x4341
++subdevice.name ES1371, ES1373 AudioPCI On Motherboard Cayman
+
+ vendor.id pci 0x1274
+&device.id pci 0x1371
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x4343
++subdevice.name ES1371, ES1373 AudioPCI On Motherboard Cape Cod
+
+ vendor.id pci 0x1274
+&device.id pci 0x1371
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x4649
++subdevice.name ES1371, ES1373 AudioPCI On Motherboard Fire Island
+
+ vendor.id pci 0x1274
+&device.id pci 0x1371
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x464a
++subdevice.name ES1371, ES1373 AudioPCI On Motherboard FJ440ZX
+
+ vendor.id pci 0x1274
+&device.id pci 0x1371
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x4d4f
++subdevice.name ES1371, ES1373 AudioPCI On Motherboard Montreal
+
+ vendor.id pci 0x1274
+&device.id pci 0x1371
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x4f43
++subdevice.name ES1371, ES1373 AudioPCI On Motherboard OC440LX
+
+ vendor.id pci 0x1274
+&device.id pci 0x1371
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x5243
++subdevice.name ES1371, ES1373 AudioPCI On Motherboard RC440BX
+
+ vendor.id pci 0x1274
+&device.id pci 0x1371
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x5352
++subdevice.name ES1371, ES1373 AudioPCI On Motherboard SunRiver
+
+ vendor.id pci 0x1274
+&device.id pci 0x1371
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x5643
++subdevice.name ES1371, ES1373 AudioPCI On Motherboard Vancouver
+
+ vendor.id pci 0x1274
+&device.id pci 0x1371
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x5753
++subdevice.name ES1371, ES1373 AudioPCI On Motherboard WS440BX
+
+ vendor.id pci 0x1274
+&device.id pci 0x5000
++device.name ES1370 [AudioPCI]
+
+ vendor.id pci 0x1274
+&device.id pci 0x5880
++device.name 5880 AudioPCI
+
+ vendor.id pci 0x1274
+&device.id pci 0x5880
+&subvendor.id pci 0x1274
+&subdevice.id pci 0x2000
++subdevice.name Creative Sound Blaster AudioPCI128
+
+ vendor.id pci 0x1274
+&device.id pci 0x5880
+&subvendor.id pci 0x1274
+&subdevice.id pci 0x2003
++subdevice.name Creative SoundBlaster AudioPCI 128
+
+ vendor.id pci 0x1274
+&device.id pci 0x5880
+&subvendor.id pci 0x1274
+&subdevice.id pci 0x5880
++subdevice.name Creative Sound Blaster AudioPCI128
+
+ vendor.id pci 0x1274
+&device.id pci 0x5880
+&subvendor.id pci 0x1274
+&subdevice.id pci 0x8001
++subdevice.name Sound Blaster 16PCI 4.1ch
+
+ vendor.id pci 0x1274
+&device.id pci 0x5880
+&subvendor.id pci 0x1458
+&subdevice.id pci 0xa000
++subdevice.name 5880 AudioPCI On Motherboard 6OXET
+
+ vendor.id pci 0x1274
+&device.id pci 0x5880
+&subvendor.id pci 0x1462
+&subdevice.id pci 0x6880
++subdevice.name 5880 AudioPCI On Motherboard MS-6188 1.00
+
+ vendor.id pci 0x1274
+&device.id pci 0x5880
+&subvendor.id pci 0x270f
+&subdevice.id pci 0x2001
++subdevice.name 5880 AudioPCI On Motherboard 6CTR
+
+ vendor.id pci 0x1274
+&device.id pci 0x5880
+&subvendor.id pci 0x270f
+&subdevice.id pci 0x2200
++subdevice.name 5880 AudioPCI On Motherboard 6WTX
+
+ vendor.id pci 0x1274
+&device.id pci 0x5880
+&subvendor.id pci 0x270f
+&subdevice.id pci 0x7040
++subdevice.name 5880 AudioPCI On Motherboard 6ATA4
+
+ vendor.id pci 0x1275
++vendor.name Network Appliance Corporation
+
+ vendor.id pci 0x1276
++vendor.name Switched Network Technologies, Inc.
+
+ vendor.id pci 0x1277
++vendor.name Comstream
+
+ vendor.id pci 0x1278
++vendor.name Transtech Parallel Systems Ltd.
+
+ vendor.id pci 0x1278
+&device.id pci 0x0701
++device.name TPE3/TM3 PowerPC Node
+
+ vendor.id pci 0x1278
+&device.id pci 0x0710
++device.name TPE5 PowerPC PCI board
+
+ vendor.id pci 0x1279
++vendor.name Transmeta Corporation
+
+ vendor.id pci 0x1279
+&device.id pci 0x0295
++device.name Northbridge
+
+ vendor.id pci 0x1279
+&device.id pci 0x0395
++device.name LongRun Northbridge
+
+ vendor.id pci 0x1279
+&device.id pci 0x0396
++device.name SDRAM controller
+
+ vendor.id pci 0x1279
+&device.id pci 0x0397
++device.name BIOS scratchpad
+
+ vendor.id pci 0x127a
++vendor.name Rockwell International
+
+ vendor.id pci 0x127a
+&device.id pci 0x1002
++device.name HCF 56k Data/Fax Modem
+
+ vendor.id pci 0x127a
+&device.id pci 0x1002
+&subvendor.id pci 0x1092
+&subdevice.id pci 0x094c
++subdevice.name SupraExpress 56i PRO [Diamond SUP2380]
+
+ vendor.id pci 0x127a
+&device.id pci 0x1002
+&subvendor.id pci 0x122d
+&subdevice.id pci 0x4002
++subdevice.name HPG / MDP3858-U
+
+ vendor.id pci 0x127a
+&device.id pci 0x1002
+&subvendor.id pci 0x122d
+&subdevice.id pci 0x4005
++subdevice.name MDP3858-E
+
+ vendor.id pci 0x127a
+&device.id pci 0x1002
+&subvendor.id pci 0x122d
+&subdevice.id pci 0x4007
++subdevice.name MDP3858-A/-NZ
+
+ vendor.id pci 0x127a
+&device.id pci 0x1002
+&subvendor.id pci 0x122d
+&subdevice.id pci 0x4012
++subdevice.name MDP3858-SA
+
+ vendor.id pci 0x127a
+&device.id pci 0x1002
+&subvendor.id pci 0x122d
+&subdevice.id pci 0x4017
++subdevice.name MDP3858-W
+
+ vendor.id pci 0x127a
+&device.id pci 0x1002
+&subvendor.id pci 0x122d
+&subdevice.id pci 0x4018
++subdevice.name MDP3858-W
+
+ vendor.id pci 0x127a
+&device.id pci 0x1002
+&subvendor.id pci 0x127a
+&subdevice.id pci 0x1002
++subdevice.name Rockwell 56K D/F HCF Modem
+
+ vendor.id pci 0x127a
+&device.id pci 0x1003
++device.name HCF 56k Data/Fax Modem
+
+ vendor.id pci 0x127a
+&device.id pci 0x1003
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0xb0bc
++subdevice.name 229-DF Zephyr
+
+ vendor.id pci 0x127a
+&device.id pci 0x1003
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0xb114
++subdevice.name 229-DF Cheetah
+
+ vendor.id pci 0x127a
+&device.id pci 0x1003
+&subvendor.id pci 0x1033
+&subdevice.id pci 0x802b
++subdevice.name 229-DF
+
+ vendor.id pci 0x127a
+&device.id pci 0x1003
+&subvendor.id pci 0x13df
+&subdevice.id pci 0x1003
++subdevice.name PCI56RX Modem
+
+ vendor.id pci 0x127a
+&device.id pci 0x1003
+&subvendor.id pci 0x13e0
+&subdevice.id pci 0x0117
++subdevice.name IBM
+
+ vendor.id pci 0x127a
+&device.id pci 0x1003
+&subvendor.id pci 0x13e0
+&subdevice.id pci 0x0147
++subdevice.name IBM F-1156IV+/R3 Spain V.90 Modem
+
+ vendor.id pci 0x127a
+&device.id pci 0x1003
+&subvendor.id pci 0x13e0
+&subdevice.id pci 0x0197
++subdevice.name IBM
+
+ vendor.id pci 0x127a
+&device.id pci 0x1003
+&subvendor.id pci 0x13e0
+&subdevice.id pci 0x01c7
++subdevice.name IBM F-1156IV+/R3 WW V.90 Modem
+
+ vendor.id pci 0x127a
+&device.id pci 0x1003
+&subvendor.id pci 0x13e0
+&subdevice.id pci 0x01f7
++subdevice.name IBM
+
+ vendor.id pci 0x127a
+&device.id pci 0x1003
+&subvendor.id pci 0x1436
+&subdevice.id pci 0x1003
++subdevice.name IBM
+
+ vendor.id pci 0x127a
+&device.id pci 0x1003
+&subvendor.id pci 0x1436
+&subdevice.id pci 0x1103
++subdevice.name IBM 5614PM3G V.90 Modem
+
+ vendor.id pci 0x127a
+&device.id pci 0x1003
+&subvendor.id pci 0x1436
+&subdevice.id pci 0x1602
++subdevice.name Compaq 229-DF Ducati
+
+ vendor.id pci 0x127a
+&device.id pci 0x1004
++device.name HCF 56k Data/Fax/Voice Modem
+
+ vendor.id pci 0x127a
+&device.id pci 0x1004
+&subvendor.id pci 0x1048
+&subdevice.id pci 0x1500
++subdevice.name MicroLink 56k Modem
+
+ vendor.id pci 0x127a
+&device.id pci 0x1004
+&subvendor.id pci 0x10cf
+&subdevice.id pci 0x1059
++subdevice.name Fujitsu 229-DFRT
+
+ vendor.id pci 0x127a
+&device.id pci 0x1005
++device.name HCF 56k Data/Fax/Voice/Spkp (w/Handset) Modem
+
+ vendor.id pci 0x127a
+&device.id pci 0x1005
+&subvendor.id pci 0x1033
+&subdevice.id pci 0x8029
++subdevice.name 229-DFSV
+
+ vendor.id pci 0x127a
+&device.id pci 0x1005
+&subvendor.id pci 0x1033
+&subdevice.id pci 0x8054
++subdevice.name Modem
+
+ vendor.id pci 0x127a
+&device.id pci 0x1005
+&subvendor.id pci 0x10cf
+&subdevice.id pci 0x103c
++subdevice.name Fujitsu
+
+ vendor.id pci 0x127a
+&device.id pci 0x1005
+&subvendor.id pci 0x10cf
+&subdevice.id pci 0x1055
++subdevice.name Fujitsu 229-DFSV
+
+ vendor.id pci 0x127a
+&device.id pci 0x1005
+&subvendor.id pci 0x10cf
+&subdevice.id pci 0x1056
++subdevice.name Fujitsu 229-DFSV
+
+ vendor.id pci 0x127a
+&device.id pci 0x1005
+&subvendor.id pci 0x122d
+&subdevice.id pci 0x4003
++subdevice.name MDP3858SP-U
+
+ vendor.id pci 0x127a
+&device.id pci 0x1005
+&subvendor.id pci 0x122d
+&subdevice.id pci 0x4006
++subdevice.name Packard Bell MDP3858V-E
+
+ vendor.id pci 0x127a
+&device.id pci 0x1005
+&subvendor.id pci 0x122d
+&subdevice.id pci 0x4008
++subdevice.name MDP3858SP-A/SP-NZ
+
+ vendor.id pci 0x127a
+&device.id pci 0x1005
+&subvendor.id pci 0x122d
+&subdevice.id pci 0x4009
++subdevice.name MDP3858SP-E
+
+ vendor.id pci 0x127a
+&device.id pci 0x1005
+&subvendor.id pci 0x122d
+&subdevice.id pci 0x4010
++subdevice.name MDP3858V-U
+
+ vendor.id pci 0x127a
+&device.id pci 0x1005
+&subvendor.id pci 0x122d
+&subdevice.id pci 0x4011
++subdevice.name MDP3858SP-SA
+
+ vendor.id pci 0x127a
+&device.id pci 0x1005
+&subvendor.id pci 0x122d
+&subdevice.id pci 0x4013
++subdevice.name MDP3858V-A/V-NZ
+
+ vendor.id pci 0x127a
+&device.id pci 0x1005
+&subvendor.id pci 0x122d
+&subdevice.id pci 0x4015
++subdevice.name MDP3858SP-W
+
+ vendor.id pci 0x127a
+&device.id pci 0x1005
+&subvendor.id pci 0x122d
+&subdevice.id pci 0x4016
++subdevice.name MDP3858V-W
+
+ vendor.id pci 0x127a
+&device.id pci 0x1005
+&subvendor.id pci 0x122d
+&subdevice.id pci 0x4019
++subdevice.name MDP3858V-SA
+
+ vendor.id pci 0x127a
+&device.id pci 0x1005
+&subvendor.id pci 0x13df
+&subdevice.id pci 0x1005
++subdevice.name PCI56RVP Modem
+
+ vendor.id pci 0x127a
+&device.id pci 0x1005
+&subvendor.id pci 0x13e0
+&subdevice.id pci 0x0187
++subdevice.name IBM
+
+ vendor.id pci 0x127a
+&device.id pci 0x1005
+&subvendor.id pci 0x13e0
+&subdevice.id pci 0x01a7
++subdevice.name IBM
+
+ vendor.id pci 0x127a
+&device.id pci 0x1005
+&subvendor.id pci 0x13e0
+&subdevice.id pci 0x01b7
++subdevice.name IBM DF-1156IV+/R3 Spain V.90 Modem
+
+ vendor.id pci 0x127a
+&device.id pci 0x1005
+&subvendor.id pci 0x13e0
+&subdevice.id pci 0x01d7
++subdevice.name IBM DF-1156IV+/R3 WW V.90 Modem
+
+ vendor.id pci 0x127a
+&device.id pci 0x1005
+&subvendor.id pci 0x1436
+&subdevice.id pci 0x1005
++subdevice.name IBM
+
+ vendor.id pci 0x127a
+&device.id pci 0x1005
+&subvendor.id pci 0x1436
+&subdevice.id pci 0x1105
++subdevice.name IBM
+
+ vendor.id pci 0x127a
+&device.id pci 0x1005
+&subvendor.id pci 0x1437
+&subdevice.id pci 0x1105
++subdevice.name IBM 5614PS3G V.90 Modem
+
+ vendor.id pci 0x127a
+&device.id pci 0x1022
++device.name HCF 56k Modem
+
+ vendor.id pci 0x127a
+&device.id pci 0x1022
+&subvendor.id pci 0x1436
+&subdevice.id pci 0x1303
++subdevice.name M3-5614PM3G V.90 Modem
+
+ vendor.id pci 0x127a
+&device.id pci 0x1023
++device.name HCF 56k Data/Fax Modem
+
+ vendor.id pci 0x127a
+&device.id pci 0x1023
+&subvendor.id pci 0x122d
+&subdevice.id pci 0x4020
++subdevice.name Packard Bell MDP3858-WE
+
+ vendor.id pci 0x127a
+&device.id pci 0x1023
+&subvendor.id pci 0x122d
+&subdevice.id pci 0x4023
++subdevice.name MDP3858-UE
+
+ vendor.id pci 0x127a
+&device.id pci 0x1023
+&subvendor.id pci 0x13e0
+&subdevice.id pci 0x0247
++subdevice.name IBM F-1156IV+/R6 Spain V.90 Modem
+
+ vendor.id pci 0x127a
+&device.id pci 0x1023
+&subvendor.id pci 0x13e0
+&subdevice.id pci 0x0297
++subdevice.name IBM
+
+ vendor.id pci 0x127a
+&device.id pci 0x1023
+&subvendor.id pci 0x13e0
+&subdevice.id pci 0x02c7
++subdevice.name IBM F-1156IV+/R6 WW V.90 Modem
+
+ vendor.id pci 0x127a
+&device.id pci 0x1023
+&subvendor.id pci 0x1436
+&subdevice.id pci 0x1203
++subdevice.name IBM
+
+ vendor.id pci 0x127a
+&device.id pci 0x1023
+&subvendor.id pci 0x1436
+&subdevice.id pci 0x1303
++subdevice.name IBM
+
+ vendor.id pci 0x127a
+&device.id pci 0x1024
++device.name HCF 56k Data/Fax/Voice Modem
+
+ vendor.id pci 0x127a
+&device.id pci 0x1025
++device.name HCF 56k Data/Fax/Voice/Spkp (w/Handset) Modem
+
+ vendor.id pci 0x127a
+&device.id pci 0x1025
+&subvendor.id pci 0x10cf
+&subdevice.id pci 0x106a
++subdevice.name Fujitsu 235-DFSV
+
+ vendor.id pci 0x127a
+&device.id pci 0x1025
+&subvendor.id pci 0x122d
+&subdevice.id pci 0x4021
++subdevice.name Packard Bell MDP3858V-WE
+
+ vendor.id pci 0x127a
+&device.id pci 0x1025
+&subvendor.id pci 0x122d
+&subdevice.id pci 0x4022
++subdevice.name MDP3858SP-WE
+
+ vendor.id pci 0x127a
+&device.id pci 0x1025
+&subvendor.id pci 0x122d
+&subdevice.id pci 0x4024
++subdevice.name MDP3858V-UE
+
+ vendor.id pci 0x127a
+&device.id pci 0x1025
+&subvendor.id pci 0x122d
+&subdevice.id pci 0x4025
++subdevice.name MDP3858SP-UE
+
+ vendor.id pci 0x127a
+&device.id pci 0x1026
++device.name HCF 56k PCI Speakerphone Modem
+
+ vendor.id pci 0x127a
+&device.id pci 0x1032
++device.name HCF 56k Modem
+
+ vendor.id pci 0x127a
+&device.id pci 0x1033
++device.name HCF 56k Modem
+
+ vendor.id pci 0x127a
+&device.id pci 0x1034
++device.name HCF 56k Modem
+
+ vendor.id pci 0x127a
+&device.id pci 0x1035
++device.name HCF 56k PCI Speakerphone Modem
+
+ vendor.id pci 0x127a
+&device.id pci 0x1036
++device.name HCF 56k Modem
+
+ vendor.id pci 0x127a
+&device.id pci 0x1085
++device.name HCF 56k Volcano PCI Modem
+
+ vendor.id pci 0x127a
+&device.id pci 0x2005
++device.name HCF 56k Data/Fax Modem
+
+ vendor.id pci 0x127a
+&device.id pci 0x2005
+&subvendor.id pci 0x104d
+&subdevice.id pci 0x8044
++subdevice.name 229-DFSV
+
+ vendor.id pci 0x127a
+&device.id pci 0x2005
+&subvendor.id pci 0x104d
+&subdevice.id pci 0x8045
++subdevice.name 229-DFSV
+
+ vendor.id pci 0x127a
+&device.id pci 0x2005
+&subvendor.id pci 0x104d
+&subdevice.id pci 0x8055
++subdevice.name PBE/Aztech 235W-DFSV
+
+ vendor.id pci 0x127a
+&device.id pci 0x2005
+&subvendor.id pci 0x104d
+&subdevice.id pci 0x8056
++subdevice.name 235-DFSV
+
+ vendor.id pci 0x127a
+&device.id pci 0x2005
+&subvendor.id pci 0x104d
+&subdevice.id pci 0x805a
++subdevice.name Modem
+
+ vendor.id pci 0x127a
+&device.id pci 0x2005
+&subvendor.id pci 0x104d
+&subdevice.id pci 0x805f
++subdevice.name Modem
+
+ vendor.id pci 0x127a
+&device.id pci 0x2005
+&subvendor.id pci 0x104d
+&subdevice.id pci 0x8074
++subdevice.name Modem
+
+ vendor.id pci 0x127a
+&device.id pci 0x2013
++device.name HSF 56k Data/Fax Modem
+
+ vendor.id pci 0x127a
+&device.id pci 0x2013
+&subvendor.id pci 0x1179
+&subdevice.id pci 0x0001
++subdevice.name Modem
+
+ vendor.id pci 0x127a
+&device.id pci 0x2013
+&subvendor.id pci 0x1179
+&subdevice.id pci 0xff00
++subdevice.name Modem
+
+ vendor.id pci 0x127a
+&device.id pci 0x2014
++device.name HSF 56k Data/Fax/Voice Modem
+
+ vendor.id pci 0x127a
+&device.id pci 0x2014
+&subvendor.id pci 0x10cf
+&subdevice.id pci 0x1057
++subdevice.name Fujitsu Citicorp III
+
+ vendor.id pci 0x127a
+&device.id pci 0x2014
+&subvendor.id pci 0x122d
+&subdevice.id pci 0x4050
++subdevice.name MSP3880-U
+
+ vendor.id pci 0x127a
+&device.id pci 0x2014
+&subvendor.id pci 0x122d
+&subdevice.id pci 0x4055
++subdevice.name MSP3880-W
+
+ vendor.id pci 0x127a
+&device.id pci 0x2015
++device.name HSF 56k Data/Fax/Voice/Spkp (w/Handset) Modem
+
+ vendor.id pci 0x127a
+&device.id pci 0x2015
+&subvendor.id pci 0x10cf
+&subdevice.id pci 0x1063
++subdevice.name Fujitsu
+
+ vendor.id pci 0x127a
+&device.id pci 0x2015
+&subvendor.id pci 0x10cf
+&subdevice.id pci 0x1064
++subdevice.name Fujitsu
+
+ vendor.id pci 0x127a
+&device.id pci 0x2015
+&subvendor.id pci 0x1468
+&subdevice.id pci 0x2015
++subdevice.name Fujitsu
+
+ vendor.id pci 0x127a
+&device.id pci 0x2016
++device.name HSF 56k Data/Fax/Voice/Spkp Modem
+
+ vendor.id pci 0x127a
+&device.id pci 0x2016
+&subvendor.id pci 0x122d
+&subdevice.id pci 0x4051
++subdevice.name MSP3880V-W
+
+ vendor.id pci 0x127a
+&device.id pci 0x2016
+&subvendor.id pci 0x122d
+&subdevice.id pci 0x4052
++subdevice.name MSP3880SP-W
+
+ vendor.id pci 0x127a
+&device.id pci 0x2016
+&subvendor.id pci 0x122d
+&subdevice.id pci 0x4054
++subdevice.name MSP3880V-U
+
+ vendor.id pci 0x127a
+&device.id pci 0x2016
+&subvendor.id pci 0x122d
+&subdevice.id pci 0x4056
++subdevice.name MSP3880SP-U
+
+ vendor.id pci 0x127a
+&device.id pci 0x2016
+&subvendor.id pci 0x122d
+&subdevice.id pci 0x4057
++subdevice.name MSP3880SP-A
+
+ vendor.id pci 0x127a
+&device.id pci 0x4311
++device.name Riptide HSF 56k PCI Modem
+
+ vendor.id pci 0x127a
+&device.id pci 0x4311
+&subvendor.id pci 0x127a
+&subdevice.id pci 0x4311
++subdevice.name Ring Modular? Riptide HSF RT HP Dom
+
+ vendor.id pci 0x127a
+&device.id pci 0x4311
+&subvendor.id pci 0x13e0
+&subdevice.id pci 0x0210
++subdevice.name HP-GVC
+
+ vendor.id pci 0x127a
+&device.id pci 0x4320
++device.name Riptide PCI Audio Controller
+
+ vendor.id pci 0x127a
+&device.id pci 0x4320
+&subvendor.id pci 0x1235
+&subdevice.id pci 0x4320
++subdevice.name Riptide PCI Audio Controller
+
+ vendor.id pci 0x127a
+&device.id pci 0x4321
++device.name Riptide HCF 56k PCI Modem
+
+ vendor.id pci 0x127a
+&device.id pci 0x4321
+&subvendor.id pci 0x1235
+&subdevice.id pci 0x4321
++subdevice.name Hewlett Packard DF
+
+ vendor.id pci 0x127a
+&device.id pci 0x4321
+&subvendor.id pci 0x1235
+&subdevice.id pci 0x4324
++subdevice.name Hewlett Packard DF
+
+ vendor.id pci 0x127a
+&device.id pci 0x4321
+&subvendor.id pci 0x13e0
+&subdevice.id pci 0x0210
++subdevice.name Hewlett Packard DF
+
+ vendor.id pci 0x127a
+&device.id pci 0x4321
+&subvendor.id pci 0x144d
+&subdevice.id pci 0x2321
++subdevice.name Riptide
+
+ vendor.id pci 0x127a
+&device.id pci 0x4322
++device.name Riptide PCI Game Controller
+
+ vendor.id pci 0x127a
+&device.id pci 0x4322
+&subvendor.id pci 0x1235
+&subdevice.id pci 0x4322
++subdevice.name Riptide PCI Game Controller
+
+ vendor.id pci 0x127a
+&device.id pci 0x8234
++device.name RapidFire 616X ATM155 Adapter
+
+ vendor.id pci 0x127a
+&device.id pci 0x8234
+&subvendor.id pci 0x108d
+&subdevice.id pci 0x0022
++subdevice.name RapidFire 616X ATM155 Adapter
+
+ vendor.id pci 0x127a
+&device.id pci 0x8234
+&subvendor.id pci 0x108d
+&subdevice.id pci 0x0027
++subdevice.name RapidFire 616X ATM155 Adapter
+
+ vendor.id pci 0x127b
++vendor.name Pixera Corporation
+
+ vendor.id pci 0x127c
++vendor.name Crosspoint Solutions, Inc.
+
+ vendor.id pci 0x127d
++vendor.name Vela Research
+
+ vendor.id pci 0x127e
++vendor.name Winnov, L.P.
+
+ vendor.id pci 0x127f
++vendor.name Fujifilm
+
+ vendor.id pci 0x1280
++vendor.name Photoscript Group Ltd.
+
+ vendor.id pci 0x1281
++vendor.name Yokogawa Electric Corporation
+
+ vendor.id pci 0x1282
++vendor.name Davicom Semiconductor, Inc.
+
+ vendor.id pci 0x1282
+&device.id pci 0x9009
++device.name Ethernet 100/10 MBit
+
+ vendor.id pci 0x1282
+&device.id pci 0x9100
++device.name 21x4x DEC-Tulip compatible 10/100 Ethernet
+
+ vendor.id pci 0x1282
+&device.id pci 0x9102
++device.name 21x4x DEC-Tulip compatible 10/100 Ethernet
+
+ vendor.id pci 0x1282
+&device.id pci 0x9132
++device.name Ethernet 100/10 MBit
+
+ vendor.id pci 0x1283
++vendor.name Integrated Technology Express, Inc.
+
+ vendor.id pci 0x1283
+&device.id pci 0x673a
++device.name IT8330G
+
+ vendor.id pci 0x1283
+&device.id pci 0x8212
++device.name IT/ITE8212 Dual channel ATA RAID controller (PCI version seems to be IT8212, embedded seems to be ITE8212)
+
+ vendor.id pci 0x1283
+&device.id pci 0x8212
+&subvendor.id pci 0x1283
+&subdevice.id pci 0x0001
++subdevice.name IT/ITE8212 Dual channel ATA RAID controller
+
+ vendor.id pci 0x1283
+&device.id pci 0x8330
++device.name IT8330G
+
+ vendor.id pci 0x1283
+&device.id pci 0x8872
++device.name IT8874F PCI Dual Serial Port Controller
+
+ vendor.id pci 0x1283
+&device.id pci 0x8888
++device.name IT8888F PCI to ISA Bridge with SMB
+
+ vendor.id pci 0x1283
+&device.id pci 0x8889
++device.name IT8889F PCI to ISA Bridge
+
+ vendor.id pci 0x1283
+&device.id pci 0xe886
++device.name IT8330G
+
+ vendor.id pci 0x1284
++vendor.name Sahara Networks, Inc.
+
+ vendor.id pci 0x1285
++vendor.name Platform Technologies, Inc.
+
+ vendor.id pci 0x1285
+&device.id pci 0x0100
++device.name AGOGO sound chip (aka ESS Maestro 1)
+
+ vendor.id pci 0x1286
++vendor.name Mazet GmbH
+
+ vendor.id pci 0x1287
++vendor.name M-Pact, Inc.
+
+ vendor.id pci 0x1287
+&device.id pci 0x001e
++device.name LS220D DVD Decoder
+
+ vendor.id pci 0x1287
+&device.id pci 0x001f
++device.name LS220C DVD Decoder
+
+ vendor.id pci 0x1288
++vendor.name Timestep Corporation
+
+ vendor.id pci 0x1289
++vendor.name AVC Technology, Inc.
+
+ vendor.id pci 0x128a
++vendor.name Asante Technologies, Inc.
+
+ vendor.id pci 0x128b
++vendor.name Transwitch Corporation
+
+ vendor.id pci 0x128c
++vendor.name Retix Corporation
+
+ vendor.id pci 0x128d
++vendor.name G2 Networks, Inc.
+
+ vendor.id pci 0x128d
+&device.id pci 0x0021
++device.name ATM155 Adapter
+
+ vendor.id pci 0x128e
++vendor.name Hoontech Corporation/Samho Multi Tech Ltd.
+
+ vendor.id pci 0x128e
+&device.id pci 0x0008
++device.name ST128 WSS/SB
+
+ vendor.id pci 0x128e
+&device.id pci 0x0009
++device.name ST128 SAM9407
+
+ vendor.id pci 0x128e
+&device.id pci 0x000a
++device.name ST128 Game Port
+
+ vendor.id pci 0x128e
+&device.id pci 0x000b
++device.name ST128 MPU Port
+
+ vendor.id pci 0x128e
+&device.id pci 0x000c
++device.name ST128 Ctrl Port
+
+ vendor.id pci 0x128f
++vendor.name Tateno Dennou, Inc.
+
+ vendor.id pci 0x1290
++vendor.name Sord Computer Corporation
+
+ vendor.id pci 0x1291
++vendor.name NCS Computer Italia
+
+ vendor.id pci 0x1292
++vendor.name Tritech Microelectronics Inc
+
+ vendor.id pci 0x1293
++vendor.name Media Reality Technology
+
+ vendor.id pci 0x1294
++vendor.name Rhetorex, Inc.
+
+ vendor.id pci 0x1295
++vendor.name Imagenation Corporation
+
+ vendor.id pci 0x1296
++vendor.name Kofax Image Products
+
+ vendor.id pci 0x1297
++vendor.name Holco Enterprise Co, Ltd/Shuttle Computer
+
+ vendor.id pci 0x1298
++vendor.name Spellcaster Telecommunications Inc.
+
+ vendor.id pci 0x1299
++vendor.name Knowledge Technology Lab.
+
+ vendor.id pci 0x129a
++vendor.name VMetro, inc.
+
+ vendor.id pci 0x129a
+&device.id pci 0x0615
++device.name PBT-615 PCI-X Bus Analyzer
+
+ vendor.id pci 0x129b
++vendor.name Image Access
+
+ vendor.id pci 0x129c
++vendor.name Jaycor
+
+ vendor.id pci 0x129d
++vendor.name Compcore Multimedia, Inc.
+
+ vendor.id pci 0x129e
++vendor.name Victor Company of Japan, Ltd.
+
+ vendor.id pci 0x129f
++vendor.name OEC Medical Systems, Inc.
+
+ vendor.id pci 0x12a0
++vendor.name Allen-Bradley Company
+
+ vendor.id pci 0x12a1
++vendor.name Simpact Associates, Inc.
+
+ vendor.id pci 0x12a2
++vendor.name Newgen Systems Corporation
+
+ vendor.id pci 0x12a3
++vendor.name Lucent Technologies
+
+ vendor.id pci 0x12a3
+&device.id pci 0x8105
++device.name T8105 H100 Digital Switch
+
+ vendor.id pci 0x12a4
++vendor.name NTT Electronics Technology Company
+
+ vendor.id pci 0x12a5
++vendor.name Vision Dynamics Ltd.
+
+ vendor.id pci 0x12a6
++vendor.name Scalable Networks, Inc.
+
+ vendor.id pci 0x12a7
++vendor.name AMO GmbH
+
+ vendor.id pci 0x12a8
++vendor.name News Datacom
+
+ vendor.id pci 0x12a9
++vendor.name Xiotech Corporation
+
+ vendor.id pci 0x12aa
++vendor.name SDL Communications, Inc.
+
+ vendor.id pci 0x12ab
++vendor.name Yuan Yuan Enterprise Co., Ltd.
+
+ vendor.id pci 0x12ab
+&device.id pci 0x0002
++device.name AU8830 [Vortex2] Based Sound Card With A3D Support
+
+ vendor.id pci 0x12ab
+&device.id pci 0x3000
++device.name MPG-200C PCI DVD Decoder Card
+
+ vendor.id pci 0x12ac
++vendor.name Measurex Corporation
+
+ vendor.id pci 0x12ad
++vendor.name Multidata GmbH
+
+ vendor.id pci 0x12ae
++vendor.name Alteon Networks Inc.
+
+ vendor.id pci 0x12ae
+&device.id pci 0x0001
++device.name AceNIC Gigabit Ethernet
+
+ vendor.id pci 0x12ae
+&device.id pci 0x0001
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x0104
++subdevice.name Gigabit Ethernet-SX PCI Adapter
+
+ vendor.id pci 0x12ae
+&device.id pci 0x0001
+&subvendor.id pci 0x12ae
+&subdevice.id pci 0x0001
++subdevice.name Gigabit Ethernet-SX (Universal)
+
+ vendor.id pci 0x12ae
+&device.id pci 0x0001
+&subvendor.id pci 0x1410
+&subdevice.id pci 0x0104
++subdevice.name Gigabit Ethernet-SX PCI Adapter
+
+ vendor.id pci 0x12ae
+&device.id pci 0x0002
++device.name AceNIC Gigabit Ethernet (Copper)
+
+ vendor.id pci 0x12ae
+&device.id pci 0x0002
+&subvendor.id pci 0x10a9
+&subdevice.id pci 0x8002
++subdevice.name Acenic Gigabit Ethernet
+
+ vendor.id pci 0x12ae
+&device.id pci 0x0002
+&subvendor.id pci 0x12ae
+&subdevice.id pci 0x0002
++subdevice.name Gigabit Ethernet-T (3C986-T)
+
+ vendor.id pci 0x12ae
+&device.id pci 0x00fa
++device.name Farallon PN9100-T Gigabit Ethernet
+
+ vendor.id pci 0x12af
++vendor.name TDK USA Corp
+
+ vendor.id pci 0x12b0
++vendor.name Jorge Scientific Corp
+
+ vendor.id pci 0x12b1
++vendor.name GammaLink
+
+ vendor.id pci 0x12b2
++vendor.name General Signal Networks
+
+ vendor.id pci 0x12b3
++vendor.name Inter-Face Co Ltd
+
+ vendor.id pci 0x12b4
++vendor.name FutureTel Inc
+
+ vendor.id pci 0x12b5
++vendor.name Granite Systems Inc.
+
+ vendor.id pci 0x12b6
++vendor.name Natural Microsystems
+
+ vendor.id pci 0x12b7
++vendor.name Cognex Modular Vision Systems Div. - Acumen Inc.
+
+ vendor.id pci 0x12b8
++vendor.name Korg
+
+ vendor.id pci 0x12b9
++vendor.name 3Com Corp, Modem Division (formerly US Robotics)
+
+ vendor.id pci 0x12b9
+&device.id pci 0x1006
++device.name WinModem
+
+ vendor.id pci 0x12b9
+&device.id pci 0x1006
+&subvendor.id pci 0x12b9
+&subdevice.id pci 0x005c
++subdevice.name USR 56k Internal Voice WinModem (Model 3472)
+
+ vendor.id pci 0x12b9
+&device.id pci 0x1006
+&subvendor.id pci 0x12b9
+&subdevice.id pci 0x005e
++subdevice.name USR 56k Internal WinModem (Models 662975)
+
+ vendor.id pci 0x12b9
+&device.id pci 0x1006
+&subvendor.id pci 0x12b9
+&subdevice.id pci 0x0062
++subdevice.name USR 56k Internal Voice WinModem (Model 662978)
+
+ vendor.id pci 0x12b9
+&device.id pci 0x1006
+&subvendor.id pci 0x12b9
+&subdevice.id pci 0x0068
++subdevice.name USR 56k Internal Voice WinModem (Model 5690)
+
+ vendor.id pci 0x12b9
+&device.id pci 0x1006
+&subvendor.id pci 0x12b9
+&subdevice.id pci 0x007a
++subdevice.name USR 56k Internal Voice WinModem (Model 662974)
+
+ vendor.id pci 0x12b9
+&device.id pci 0x1006
+&subvendor.id pci 0x12b9
+&subdevice.id pci 0x007f
++subdevice.name USR 56k Internal WinModem (Models 5698, 5699)
+
+ vendor.id pci 0x12b9
+&device.id pci 0x1006
+&subvendor.id pci 0x12b9
+&subdevice.id pci 0x0080
++subdevice.name USR 56k Internal WinModem (Models 2975, 3528)
+
+ vendor.id pci 0x12b9
+&device.id pci 0x1006
+&subvendor.id pci 0x12b9
+&subdevice.id pci 0x0081
++subdevice.name USR 56k Internal Voice WinModem (Models 2974, 3529)
+
+ vendor.id pci 0x12b9
+&device.id pci 0x1006
+&subvendor.id pci 0x12b9
+&subdevice.id pci 0x0091
++subdevice.name USR 56k Internal Voice WinModem (Model 2978)
+
+ vendor.id pci 0x12b9
+&device.id pci 0x1007
++device.name USR 56k Internal WinModem
+
+ vendor.id pci 0x12b9
+&device.id pci 0x1007
+&subvendor.id pci 0x12b9
+&subdevice.id pci 0x00a3
++subdevice.name USR 56k Internal WinModem (Model 3595)
+
+ vendor.id pci 0x12b9
+&device.id pci 0x1008
++device.name 56K FaxModem Model 5610
+
+ vendor.id pci 0x12b9
+&device.id pci 0x1008
+&subvendor.id pci 0x12b9
+&subdevice.id pci 0x00a2
++subdevice.name USR 56k Internal FAX Modem (Model 2977)
+
+ vendor.id pci 0x12b9
+&device.id pci 0x1008
+&subvendor.id pci 0x12b9
+&subdevice.id pci 0x00aa
++subdevice.name USR 56k Internal Voice Modem (Model 2976)
+
+ vendor.id pci 0x12b9
+&device.id pci 0x1008
+&subvendor.id pci 0x12b9
+&subdevice.id pci 0x00ab
++subdevice.name USR 56k Internal Voice Modem (Model 5609)
+
+ vendor.id pci 0x12b9
+&device.id pci 0x1008
+&subvendor.id pci 0x12b9
+&subdevice.id pci 0x00ac
++subdevice.name USR 56k Internal Voice Modem (Model 3298)
+
+ vendor.id pci 0x12b9
+&device.id pci 0x1008
+&subvendor.id pci 0x12b9
+&subdevice.id pci 0x00ad
++subdevice.name USR 56k Internal FAX Modem (Model 5610)
+
+ vendor.id pci 0x12ba
++vendor.name BittWare, Inc.
+
+ vendor.id pci 0x12bb
++vendor.name Nippon Unisoft Corporation
+
+ vendor.id pci 0x12bc
++vendor.name Array Microsystems
+
+ vendor.id pci 0x12bd
++vendor.name Computerm Corp.
+
+ vendor.id pci 0x12be
++vendor.name Anchor Chips Inc.
+
+ vendor.id pci 0x12be
+&device.id pci 0x3041
++device.name AN3041Q CO-MEM
+
+ vendor.id pci 0x12be
+&device.id pci 0x3042
++device.name AN3042Q CO-MEM Lite
+
+ vendor.id pci 0x12be
+&device.id pci 0x3042
+&subvendor.id pci 0x12be
+&subdevice.id pci 0x3042
++subdevice.name Anchor Chips Lite Evaluation Board
+
+ vendor.id pci 0x12bf
++vendor.name Fujifilm Microdevices
+
+ vendor.id pci 0x12c0
++vendor.name Infimed
+
+ vendor.id pci 0x12c1
++vendor.name GMM Research Corp
+
+ vendor.id pci 0x12c2
++vendor.name Mentec Limited
+
+ vendor.id pci 0x12c3
++vendor.name Holtek Microelectronics Inc
+
+ vendor.id pci 0x12c3
+&device.id pci 0x0058
++device.name PCI NE2K Ethernet
+
+ vendor.id pci 0x12c3
+&device.id pci 0x5598
++device.name PCI NE2K Ethernet
+
+ vendor.id pci 0x12c4
++vendor.name Connect Tech Inc
+
+ vendor.id pci 0x12c5
++vendor.name Picture Elements Incorporated
+
+ vendor.id pci 0x12c5
+&device.id pci 0x007e
++device.name Imaging/Scanning Subsystem Engine
+
+ vendor.id pci 0x12c5
+&device.id pci 0x007f
++device.name Imaging/Scanning Subsystem Engine
+
+ vendor.id pci 0x12c5
+&device.id pci 0x0081
++device.name PCIVST [Grayscale Thresholding Engine]
+
+ vendor.id pci 0x12c5
+&device.id pci 0x0085
++device.name Video Simulator/Sender
+
+ vendor.id pci 0x12c5
+&device.id pci 0x0086
++device.name THR2 Multi-scale Thresholder
+
+ vendor.id pci 0x12c6
++vendor.name Mitani Corporation
+
+ vendor.id pci 0x12c7
++vendor.name Dialogic Corp
+
+ vendor.id pci 0x12c8
++vendor.name G Force Co, Ltd
+
+ vendor.id pci 0x12c9
++vendor.name Gigi Operations
+
+ vendor.id pci 0x12ca
++vendor.name Integrated Computing Engines
+
+ vendor.id pci 0x12cb
++vendor.name Antex Electronics Corporation
+
+ vendor.id pci 0x12cc
++vendor.name Pluto Technologies International
+
+ vendor.id pci 0x12cd
++vendor.name Aims Lab
+
+ vendor.id pci 0x12ce
++vendor.name Netspeed Inc.
+
+ vendor.id pci 0x12cf
++vendor.name Prophet Systems, Inc.
+
+ vendor.id pci 0x12d0
++vendor.name GDE Systems, Inc.
+
+ vendor.id pci 0x12d1
++vendor.name PSITech
+
+ vendor.id pci 0x12d2
++vendor.name NVidia / SGS Thomson (Joint Venture)
+
+ vendor.id pci 0x12d2
+&device.id pci 0x0008
++device.name NV1
+
+ vendor.id pci 0x12d2
+&device.id pci 0x0009
++device.name DAC64
+
+ vendor.id pci 0x12d2
+&device.id pci 0x0018
++device.name Riva128
+
+ vendor.id pci 0x12d2
+&device.id pci 0x0018
+&subvendor.id pci 0x1048
+&subdevice.id pci 0x0c10
++subdevice.name VICTORY Erazor
+
+ vendor.id pci 0x12d2
+&device.id pci 0x0018
+&subvendor.id pci 0x107b
+&subdevice.id pci 0x8030
++subdevice.name STB Velocity 128
+
+ vendor.id pci 0x12d2
+&device.id pci 0x0018
+&subvendor.id pci 0x1092
+&subdevice.id pci 0x0350
++subdevice.name Viper V330
+
+ vendor.id pci 0x12d2
+&device.id pci 0x0018
+&subvendor.id pci 0x1092
+&subdevice.id pci 0x1092
++subdevice.name Viper V330
+
+ vendor.id pci 0x12d2
+&device.id pci 0x0018
+&subvendor.id pci 0x10b4
+&subdevice.id pci 0x1b1b
++subdevice.name STB Velocity 128
+
+ vendor.id pci 0x12d2
+&device.id pci 0x0018
+&subvendor.id pci 0x10b4
+&subdevice.id pci 0x1b1d
++subdevice.name STB Velocity 128
+
+ vendor.id pci 0x12d2
+&device.id pci 0x0018
+&subvendor.id pci 0x10b4
+&subdevice.id pci 0x1b1e
++subdevice.name STB Velocity 128, PAL TV-Out
+
+ vendor.id pci 0x12d2
+&device.id pci 0x0018
+&subvendor.id pci 0x10b4
+&subdevice.id pci 0x1b20
++subdevice.name STB Velocity 128 Sapphire
+
+ vendor.id pci 0x12d2
+&device.id pci 0x0018
+&subvendor.id pci 0x10b4
+&subdevice.id pci 0x1b21
++subdevice.name STB Velocity 128
+
+ vendor.id pci 0x12d2
+&device.id pci 0x0018
+&subvendor.id pci 0x10b4
+&subdevice.id pci 0x1b22
++subdevice.name STB Velocity 128 AGP, NTSC TV-Out
+
+ vendor.id pci 0x12d2
+&device.id pci 0x0018
+&subvendor.id pci 0x10b4
+&subdevice.id pci 0x1b23
++subdevice.name STB Velocity 128 AGP, PAL TV-Out
+
+ vendor.id pci 0x12d2
+&device.id pci 0x0018
+&subvendor.id pci 0x10b4
+&subdevice.id pci 0x1b27
++subdevice.name STB Velocity 128 DVD
+
+ vendor.id pci 0x12d2
+&device.id pci 0x0018
+&subvendor.id pci 0x10b4
+&subdevice.id pci 0x1b88
++subdevice.name MVP Pro 128
+
+ vendor.id pci 0x12d2
+&device.id pci 0x0018
+&subvendor.id pci 0x10b4
+&subdevice.id pci 0x222a
++subdevice.name STB Velocity 128 AGP
+
+ vendor.id pci 0x12d2
+&device.id pci 0x0018
+&subvendor.id pci 0x10b4
+&subdevice.id pci 0x2230
++subdevice.name STB Velocity 128
+
+ vendor.id pci 0x12d2
+&device.id pci 0x0018
+&subvendor.id pci 0x10b4
+&subdevice.id pci 0x2232
++subdevice.name STB Velocity 128
+
+ vendor.id pci 0x12d2
+&device.id pci 0x0018
+&subvendor.id pci 0x10b4
+&subdevice.id pci 0x2235
++subdevice.name STB Velocity 128 AGP
+
+ vendor.id pci 0x12d2
+&device.id pci 0x0018
+&subvendor.id pci 0x2a15
+&subdevice.id pci 0x54a3
++subdevice.name 3DVision-SAGP / 3DexPlorer 3000
+
+ vendor.id pci 0x12d2
+&device.id pci 0x0019
++device.name Riva128ZX
+
+ vendor.id pci 0x12d2
+&device.id pci 0x0020
++device.name TNT
+
+ vendor.id pci 0x12d2
+&device.id pci 0x0028
++device.name TNT2
+
+ vendor.id pci 0x12d2
+&device.id pci 0x0029
++device.name UTNT2
+
+ vendor.id pci 0x12d2
+&device.id pci 0x002c
++device.name VTNT2
+
+ vendor.id pci 0x12d2
+&device.id pci 0x00a0
++device.name ITNT2
+
+ vendor.id pci 0x12d3
++vendor.name Vingmed Sound A/S
+
+ vendor.id pci 0x12d4
++vendor.name Ulticom (Formerly DGM&S)
+
+ vendor.id pci 0x12d4
+&device.id pci 0x0200
++device.name T1 Card
+
+ vendor.id pci 0x12d5
++vendor.name Equator Technologies Inc
+
+ vendor.id pci 0x12d6
++vendor.name Analogic Corp
+
+ vendor.id pci 0x12d7
++vendor.name Biotronic SRL
+
+ vendor.id pci 0x12d8
++vendor.name Pericom Semiconductor
+
+ vendor.id pci 0x12d9
++vendor.name Aculab PLC
+
+ vendor.id pci 0x12d9
+&device.id pci 0x0002
++device.name PCI Prosody
+
+ vendor.id pci 0x12d9
+&device.id pci 0x0004
++device.name cPCI Prosody
+
+ vendor.id pci 0x12d9
+&device.id pci 0x0005
++device.name Aculab E1/T1 PCI card
+
+ vendor.id pci 0x12da
++vendor.name True Time Inc.
+
+ vendor.id pci 0x12db
++vendor.name Annapolis Micro Systems, Inc
+
+ vendor.id pci 0x12dc
++vendor.name Symicron Computer Communication Ltd.
+
+ vendor.id pci 0x12dd
++vendor.name Management Graphics
+
+ vendor.id pci 0x12de
++vendor.name Rainbow Technologies
+
+ vendor.id pci 0x12de
+&device.id pci 0x0200
++device.name CryptoSwift CS200
+
+ vendor.id pci 0x12df
++vendor.name SBS Technologies Inc
+
+ vendor.id pci 0x12e0
++vendor.name Chase Research
+
+ vendor.id pci 0x12e0
+&device.id pci 0x0010
++device.name ST16C654 Quad UART
+
+ vendor.id pci 0x12e0
+&device.id pci 0x0020
++device.name ST16C654 Quad UART
+
+ vendor.id pci 0x12e0
+&device.id pci 0x0030
++device.name ST16C654 Quad UART
+
+ vendor.id pci 0x12e1
++vendor.name Nintendo Co, Ltd
+
+ vendor.id pci 0x12e2
++vendor.name Datum Inc. Bancomm-Timing Division
+
+ vendor.id pci 0x12e3
++vendor.name Imation Corp - Medical Imaging Systems
+
+ vendor.id pci 0x12e4
++vendor.name Brooktrout Technology Inc
+
+ vendor.id pci 0x12e5
++vendor.name Apex Semiconductor Inc
+
+ vendor.id pci 0x12e6
++vendor.name Cirel Systems
+
+ vendor.id pci 0x12e7
++vendor.name Sunsgroup Corporation
+
+ vendor.id pci 0x12e8
++vendor.name Crisc Corp
+
+ vendor.id pci 0x12e9
++vendor.name GE Spacenet
+
+ vendor.id pci 0x12ea
++vendor.name Zuken
+
+ vendor.id pci 0x12eb
++vendor.name Aureal Semiconductor
+
+ vendor.id pci 0x12eb
+&device.id pci 0x0001
++device.name Vortex 1
+
+ vendor.id pci 0x12eb
+&device.id pci 0x0001
+&subvendor.id pci 0x104d
+&subdevice.id pci 0x8036
++subdevice.name AU8820 Vortex Digital Audio Processor
+
+ vendor.id pci 0x12eb
+&device.id pci 0x0001
+&subvendor.id pci 0x1092
+&subdevice.id pci 0x2000
++subdevice.name Sonic Impact A3D
+
+ vendor.id pci 0x12eb
+&device.id pci 0x0001
+&subvendor.id pci 0x1092
+&subdevice.id pci 0x2100
++subdevice.name Sonic Impact A3D
+
+ vendor.id pci 0x12eb
+&device.id pci 0x0001
+&subvendor.id pci 0x1092
+&subdevice.id pci 0x2110
++subdevice.name Sonic Impact A3D
+
+ vendor.id pci 0x12eb
+&device.id pci 0x0001
+&subvendor.id pci 0x1092
+&subdevice.id pci 0x2200
++subdevice.name Sonic Impact A3D
+
+ vendor.id pci 0x12eb
+&device.id pci 0x0001
+&subvendor.id pci 0x122d
+&subdevice.id pci 0x1002
++subdevice.name AU8820 Vortex Digital Audio Processor
+
+ vendor.id pci 0x12eb
+&device.id pci 0x0001
+&subvendor.id pci 0x12eb
+&subdevice.id pci 0x0001
++subdevice.name AU8820 Vortex Digital Audio Processor
+
+ vendor.id pci 0x12eb
+&device.id pci 0x0001
+&subvendor.id pci 0x5053
+&subdevice.id pci 0x3355
++subdevice.name Montego
+
+ vendor.id pci 0x12eb
+&device.id pci 0x0002
++device.name Vortex 2
+
+ vendor.id pci 0x12eb
+&device.id pci 0x0002
+&subvendor.id pci 0x104d
+&subdevice.id pci 0x8049
++subdevice.name AU8830 Vortex 3D Digital Audio Processor
+
+ vendor.id pci 0x12eb
+&device.id pci 0x0002
+&subvendor.id pci 0x104d
+&subdevice.id pci 0x807b
++subdevice.name AU8830 Vortex 3D Digital Audio Processor
+
+ vendor.id pci 0x12eb
+&device.id pci 0x0002
+&subvendor.id pci 0x1092
+&subdevice.id pci 0x3000
++subdevice.name Monster Sound II
+
+ vendor.id pci 0x12eb
+&device.id pci 0x0002
+&subvendor.id pci 0x1092
+&subdevice.id pci 0x3001
++subdevice.name Monster Sound II
+
+ vendor.id pci 0x12eb
+&device.id pci 0x0002
+&subvendor.id pci 0x1092
+&subdevice.id pci 0x3002
++subdevice.name Monster Sound II
+
+ vendor.id pci 0x12eb
+&device.id pci 0x0002
+&subvendor.id pci 0x1092
+&subdevice.id pci 0x3003
++subdevice.name Monster Sound II
+
+ vendor.id pci 0x12eb
+&device.id pci 0x0002
+&subvendor.id pci 0x1092
+&subdevice.id pci 0x3004
++subdevice.name Monster Sound II
+
+ vendor.id pci 0x12eb
+&device.id pci 0x0002
+&subvendor.id pci 0x12eb
+&subdevice.id pci 0x0001
++subdevice.name AU8830 Vortex 3D Digital Audio Processor
+
+ vendor.id pci 0x12eb
+&device.id pci 0x0002
+&subvendor.id pci 0x12eb
+&subdevice.id pci 0x0002
++subdevice.name AU8830 Vortex 3D Digital Audio Processor
+
+ vendor.id pci 0x12eb
+&device.id pci 0x0002
+&subvendor.id pci 0x12eb
+&subdevice.id pci 0x0088
++subdevice.name AU8830 Vortex 3D Digital Audio Processor
+
+ vendor.id pci 0x12eb
+&device.id pci 0x0002
+&subvendor.id pci 0x144d
+&subdevice.id pci 0x3510
++subdevice.name AU8830 Vortex 3D Digital Audio Processor
+
+ vendor.id pci 0x12eb
+&device.id pci 0x0002
+&subvendor.id pci 0x5053
+&subdevice.id pci 0x3356
++subdevice.name Montego II
+
+ vendor.id pci 0x12eb
+&device.id pci 0x0003
++device.name AU8810 Vortex Digital Audio Processor
+
+ vendor.id pci 0x12eb
+&device.id pci 0x0003
+&subvendor.id pci 0x104d
+&subdevice.id pci 0x8049
++subdevice.name AU8810 Vortex Digital Audio Processor
+
+ vendor.id pci 0x12eb
+&device.id pci 0x0003
+&subvendor.id pci 0x104d
+&subdevice.id pci 0x8077
++subdevice.name AU8810 Vortex Digital Audio Processor
+
+ vendor.id pci 0x12eb
+&device.id pci 0x0003
+&subvendor.id pci 0x109f
+&subdevice.id pci 0x1000
++subdevice.name AU8810 Vortex Digital Audio Processor
+
+ vendor.id pci 0x12eb
+&device.id pci 0x0003
+&subvendor.id pci 0x12eb
+&subdevice.id pci 0x0003
++subdevice.name AU8810 Vortex Digital Audio Processor
+
+ vendor.id pci 0x12eb
+&device.id pci 0x0003
+&subvendor.id pci 0x1462
+&subdevice.id pci 0x6780
++subdevice.name AU8810 Vortex Digital Audio Processor
+
+ vendor.id pci 0x12eb
+&device.id pci 0x0003
+&subvendor.id pci 0x14a4
+&subdevice.id pci 0x2073
++subdevice.name AU8810 Vortex Digital Audio Processor
+
+ vendor.id pci 0x12eb
+&device.id pci 0x0003
+&subvendor.id pci 0x14a4
+&subdevice.id pci 0x2091
++subdevice.name AU8810 Vortex Digital Audio Processor
+
+ vendor.id pci 0x12eb
+&device.id pci 0x0003
+&subvendor.id pci 0x14a4
+&subdevice.id pci 0x2104
++subdevice.name AU8810 Vortex Digital Audio Processor
+
+ vendor.id pci 0x12eb
+&device.id pci 0x0003
+&subvendor.id pci 0x14a4
+&subdevice.id pci 0x2106
++subdevice.name AU8810 Vortex Digital Audio Processor
+
+ vendor.id pci 0x12eb
+&device.id pci 0x8803
++device.name Vortex 56k Software Modem
+
+ vendor.id pci 0x12eb
+&device.id pci 0x8803
+&subvendor.id pci 0x12eb
+&subdevice.id pci 0x8803
++subdevice.name Vortex 56k Software Modem
+
+ vendor.id pci 0x12ec
++vendor.name 3A International, Inc.
+
+ vendor.id pci 0x12ed
++vendor.name Optivision Inc.
+
+ vendor.id pci 0x12ee
++vendor.name Orange Micro
+
+ vendor.id pci 0x12ef
++vendor.name Vienna Systems
+
+ vendor.id pci 0x12f0
++vendor.name Pentek
+
+ vendor.id pci 0x12f1
++vendor.name Sorenson Vision Inc
+
+ vendor.id pci 0x12f2
++vendor.name Gammagraphx, Inc.
+
+ vendor.id pci 0x12f3
++vendor.name Radstone Technology
+
+ vendor.id pci 0x12f4
++vendor.name Megatel
+
+ vendor.id pci 0x12f5
++vendor.name Forks
+
+ vendor.id pci 0x12f6
++vendor.name Dawson France
+
+ vendor.id pci 0x12f7
++vendor.name Cognex
+
+ vendor.id pci 0x12f8
++vendor.name Electronic Design GmbH
+
+ vendor.id pci 0x12f8
+&device.id pci 0x0002
++device.name VideoMaker
+
+ vendor.id pci 0x12f9
++vendor.name Four Fold Ltd
+
+ vendor.id pci 0x12fb
++vendor.name Spectrum Signal Processing
+
+ vendor.id pci 0x12fc
++vendor.name Capital Equipment Corp
+
+ vendor.id pci 0x12fd
++vendor.name I2S
+
+ vendor.id pci 0x12fe
++vendor.name ESD Electronic System Design GmbH
+
+ vendor.id pci 0x12ff
++vendor.name Lexicon
+
+ vendor.id pci 0x1300
++vendor.name Harman International Industries Inc
+
+ vendor.id pci 0x1302
++vendor.name Computer Sciences Corp
+
+ vendor.id pci 0x1303
++vendor.name Innovative Integration
+
+ vendor.id pci 0x1304
++vendor.name Juniper Networks
+
+ vendor.id pci 0x1305
++vendor.name Netphone, Inc
+
+ vendor.id pci 0x1306
++vendor.name Duet Technologies
+
+ vendor.id pci 0x1307
++vendor.name Measurement Computing
+
+ vendor.id pci 0x1307
+&device.id pci 0x0001
++device.name PCI-DAS1602/16
+
+ vendor.id pci 0x1307
+&device.id pci 0x000b
++device.name PCI-DIO48H
+
+ vendor.id pci 0x1307
+&device.id pci 0x000c
++device.name PCI-PDISO8
+
+ vendor.id pci 0x1307
+&device.id pci 0x000d
++device.name PCI-PDISO16
+
+ vendor.id pci 0x1307
+&device.id pci 0x000f
++device.name PCI-DAS1200
+
+ vendor.id pci 0x1307
+&device.id pci 0x0010
++device.name PCI-DAS1602/12
+
+ vendor.id pci 0x1307
+&device.id pci 0x0014
++device.name PCI-DIO24H
+
+ vendor.id pci 0x1307
+&device.id pci 0x0015
++device.name PCI-DIO24H/CTR3
+
+ vendor.id pci 0x1307
+&device.id pci 0x0016
++device.name PCI-DIO48H/CTR15
+
+ vendor.id pci 0x1307
+&device.id pci 0x0017
++device.name PCI-DIO96H
+
+ vendor.id pci 0x1307
+&device.id pci 0x0018
++device.name PCI-CTR05
+
+ vendor.id pci 0x1307
+&device.id pci 0x0019
++device.name PCI-DAS1200/JR
+
+ vendor.id pci 0x1307
+&device.id pci 0x001a
++device.name PCI-DAS1001
+
+ vendor.id pci 0x1307
+&device.id pci 0x001b
++device.name PCI-DAS1002
+
+ vendor.id pci 0x1307
+&device.id pci 0x001c
++device.name PCI-DAS1602JR/16
+
+ vendor.id pci 0x1307
+&device.id pci 0x001d
++device.name PCI-DAS6402/16
+
+ vendor.id pci 0x1307
+&device.id pci 0x001e
++device.name PCI-DAS6402/12
+
+ vendor.id pci 0x1307
+&device.id pci 0x001f
++device.name PCI-DAS16/M1
+
+ vendor.id pci 0x1307
+&device.id pci 0x0020
++device.name PCI-DDA02/12
+
+ vendor.id pci 0x1307
+&device.id pci 0x0021
++device.name PCI-DDA04/12
+
+ vendor.id pci 0x1307
+&device.id pci 0x0022
++device.name PCI-DDA08/12
+
+ vendor.id pci 0x1307
+&device.id pci 0x0023
++device.name PCI-DDA02/16
+
+ vendor.id pci 0x1307
+&device.id pci 0x0024
++device.name PCI-DDA04/16
+
+ vendor.id pci 0x1307
+&device.id pci 0x0025
++device.name PCI-DDA08/16
+
+ vendor.id pci 0x1307
+&device.id pci 0x0026
++device.name PCI-DAC04/12-HS
+
+ vendor.id pci 0x1307
+&device.id pci 0x0027
++device.name PCI-DAC04/16-HS
+
+ vendor.id pci 0x1307
+&device.id pci 0x0028
++device.name PCI-DIO24
+
+ vendor.id pci 0x1307
+&device.id pci 0x0029
++device.name PCI-DAS08
+
+ vendor.id pci 0x1307
+&device.id pci 0x002c
++device.name PCI-INT32
+
+ vendor.id pci 0x1307
+&device.id pci 0x0033
++device.name PCI-DUAL-AC5
+
+ vendor.id pci 0x1307
+&device.id pci 0x0034
++device.name PCI-DAS-TC
+
+ vendor.id pci 0x1307
+&device.id pci 0x0035
++device.name PCI-DAS64/M1/16
+
+ vendor.id pci 0x1307
+&device.id pci 0x0036
++device.name PCI-DAS64/M2/16
+
+ vendor.id pci 0x1307
+&device.id pci 0x0037
++device.name PCI-DAS64/M3/16
+
+ vendor.id pci 0x1307
+&device.id pci 0x004c
++device.name PCI-DAS1000
+
+ vendor.id pci 0x1307
+&device.id pci 0x004d
++device.name PCI-QUAD04
+
+ vendor.id pci 0x1307
+&device.id pci 0x0052
++device.name PCI-DAS4020/12
+
+ vendor.id pci 0x1307
+&device.id pci 0x005e
++device.name PCI-DAS6025
+
+ vendor.id pci 0x1308
++vendor.name Jato Technologies Inc.
+
+ vendor.id pci 0x1308
+&device.id pci 0x0001
++device.name NetCelerator Adapter
+
+ vendor.id pci 0x1308
+&device.id pci 0x0001
+&subvendor.id pci 0x1308
+&subdevice.id pci 0x0001
++subdevice.name NetCelerator Adapter
+
+ vendor.id pci 0x1309
++vendor.name AB Semiconductor Ltd
+
+ vendor.id pci 0x130a
++vendor.name Mitsubishi Electric Microcomputer
+
+ vendor.id pci 0x130b
++vendor.name Colorgraphic Communications Corp
+
+ vendor.id pci 0x130c
++vendor.name Ambex Technologies, Inc
+
+ vendor.id pci 0x130d
++vendor.name Accelerix Inc
+
+ vendor.id pci 0x130e
++vendor.name Yamatake-Honeywell Co. Ltd
+
+ vendor.id pci 0x130f
++vendor.name Advanet Inc
+
+ vendor.id pci 0x1310
++vendor.name Gespac
+
+ vendor.id pci 0x1311
++vendor.name Videoserver, Inc
+
+ vendor.id pci 0x1312
++vendor.name Acuity Imaging, Inc
+
+ vendor.id pci 0x1313
++vendor.name Yaskawa Electric Co.
+
+ vendor.id pci 0x1316
++vendor.name Teradyne Inc
+
+ vendor.id pci 0x1317
++vendor.name Linksys
+
+ vendor.id pci 0x1317
+&device.id pci 0x0981
++device.name 21x4x DEC-Tulip compatible 10/100 Ethernet
+
+ vendor.id pci 0x1317
+&device.id pci 0x0985
++device.name NC100 Network Everywhere Fast Ethernet 10/100
+
+ vendor.id pci 0x1317
+&device.id pci 0x1985
++device.name 21x4x DEC-Tulip compatible 10/100 Ethernet
+
+ vendor.id pci 0x1317
+&device.id pci 0x2850
++device.name HSP MicroModem 56
+
+ vendor.id pci 0x1317
+&device.id pci 0x8201
++device.name ADMtek ADM8211 802.11b Wireless Interface
+
+ vendor.id pci 0x1317
+&device.id pci 0x8201
+&subvendor.id pci 0x10b8
+&subdevice.id pci 0x2635
++subdevice.name SMC2635W 802.11b (11Mbps) wireless lan pcmcia (cardbus) card
+
+ vendor.id pci 0x1317
+&device.id pci 0x8201
+&subvendor.id pci 0x1317
+&subdevice.id pci 0x8201
++subdevice.name SMC2635W 802.11b (11mbps) wireless lan pcmcia (cardbus) card
+
+ vendor.id pci 0x1317
+&device.id pci 0x8211
++device.name ADMtek ADM8211 802.11b Wireless Interface
+
+ vendor.id pci 0x1317
+&device.id pci 0x9511
++device.name 21x4x DEC-Tulip compatible 10/100 Ethernet
+
+ vendor.id pci 0x1318
++vendor.name Packet Engines Inc.
+
+ vendor.id pci 0x1318
+&device.id pci 0x0911
++device.name GNIC-II PCI Gigabit Ethernet [Hamachi]
+
+ vendor.id pci 0x1319
++vendor.name Fortemedia, Inc
+
+ vendor.id pci 0x1319
+&device.id pci 0x0801
++device.name Xwave QS3000A [FM801]
+
+ vendor.id pci 0x1319
+&device.id pci 0x0802
++device.name Xwave QS3000A [FM801 game port]
+
+ vendor.id pci 0x1319
+&device.id pci 0x1000
++device.name FM801 PCI Audio
+
+ vendor.id pci 0x1319
+&device.id pci 0x1001
++device.name FM801 PCI Joystick
+
+ vendor.id pci 0x131a
++vendor.name Finisar Corp.
+
+ vendor.id pci 0x131c
++vendor.name Nippon Electro-Sensory Devices Corp
+
+ vendor.id pci 0x131d
++vendor.name Sysmic, Inc.
+
+ vendor.id pci 0x131e
++vendor.name Xinex Networks Inc
+
+ vendor.id pci 0x131f
++vendor.name Siig Inc
+
+ vendor.id pci 0x131f
+&device.id pci 0x1000
++device.name CyberSerial (1-port) 16550
+
+ vendor.id pci 0x131f
+&device.id pci 0x1001
++device.name CyberSerial (1-port) 16650
+
+ vendor.id pci 0x131f
+&device.id pci 0x1002
++device.name CyberSerial (1-port) 16850
+
+ vendor.id pci 0x131f
+&device.id pci 0x1010
++device.name Duet 1S(16550)+1P
+
+ vendor.id pci 0x131f
+&device.id pci 0x1011
++device.name Duet 1S(16650)+1P
+
+ vendor.id pci 0x131f
+&device.id pci 0x1012
++device.name Duet 1S(16850)+1P
+
+ vendor.id pci 0x131f
+&device.id pci 0x1020
++device.name CyberParallel (1-port)
+
+ vendor.id pci 0x131f
+&device.id pci 0x1021
++device.name CyberParallel (2-port)
+
+ vendor.id pci 0x131f
+&device.id pci 0x1030
++device.name CyberSerial (2-port) 16550
+
+ vendor.id pci 0x131f
+&device.id pci 0x1031
++device.name CyberSerial (2-port) 16650
+
+ vendor.id pci 0x131f
+&device.id pci 0x1032
++device.name CyberSerial (2-port) 16850
+
+ vendor.id pci 0x131f
+&device.id pci 0x1034
++device.name Trio 2S(16550)+1P
+
+ vendor.id pci 0x131f
+&device.id pci 0x1035
++device.name Trio 2S(16650)+1P
+
+ vendor.id pci 0x131f
+&device.id pci 0x1036
++device.name Trio 2S(16850)+1P
+
+ vendor.id pci 0x131f
+&device.id pci 0x1050
++device.name CyberSerial (4-port) 16550
+
+ vendor.id pci 0x131f
+&device.id pci 0x1051
++device.name CyberSerial (4-port) 16650
+
+ vendor.id pci 0x131f
+&device.id pci 0x1052
++device.name CyberSerial (4-port) 16850
+
+ vendor.id pci 0x131f
+&device.id pci 0x2000
++device.name CyberSerial (1-port) 16550
+
+ vendor.id pci 0x131f
+&device.id pci 0x2001
++device.name CyberSerial (1-port) 16650
+
+ vendor.id pci 0x131f
+&device.id pci 0x2002
++device.name CyberSerial (1-port) 16850
+
+ vendor.id pci 0x131f
+&device.id pci 0x2010
++device.name Duet 1S(16550)+1P
+
+ vendor.id pci 0x131f
+&device.id pci 0x2011
++device.name Duet 1S(16650)+1P
+
+ vendor.id pci 0x131f
+&device.id pci 0x2012
++device.name Duet 1S(16850)+1P
+
+ vendor.id pci 0x131f
+&device.id pci 0x2020
++device.name CyberParallel (1-port)
+
+ vendor.id pci 0x131f
+&device.id pci 0x2021
++device.name CyberParallel (2-port)
+
+ vendor.id pci 0x131f
+&device.id pci 0x2030
++device.name CyberSerial (2-port) 16550
+
+ vendor.id pci 0x131f
+&device.id pci 0x2030
+&subvendor.id pci 0x131f
+&subdevice.id pci 0x2030
++subdevice.name PCI Serial Card
+
+ vendor.id pci 0x131f
+&device.id pci 0x2031
++device.name CyberSerial (2-port) 16650
+
+ vendor.id pci 0x131f
+&device.id pci 0x2032
++device.name CyberSerial (2-port) 16850
+
+ vendor.id pci 0x131f
+&device.id pci 0x2040
++device.name Trio 1S(16550)+2P
+
+ vendor.id pci 0x131f
+&device.id pci 0x2041
++device.name Trio 1S(16650)+2P
+
+ vendor.id pci 0x131f
+&device.id pci 0x2042
++device.name Trio 1S(16850)+2P
+
+ vendor.id pci 0x131f
+&device.id pci 0x2050
++device.name CyberSerial (4-port) 16550
+
+ vendor.id pci 0x131f
+&device.id pci 0x2051
++device.name CyberSerial (4-port) 16650
+
+ vendor.id pci 0x131f
+&device.id pci 0x2052
++device.name CyberSerial (4-port) 16850
+
+ vendor.id pci 0x131f
+&device.id pci 0x2060
++device.name Trio 2S(16550)+1P
+
+ vendor.id pci 0x131f
+&device.id pci 0x2061
++device.name Trio 2S(16650)+1P
+
+ vendor.id pci 0x131f
+&device.id pci 0x2062
++device.name Trio 2S(16850)+1P
+
+ vendor.id pci 0x131f
+&device.id pci 0x2081
++device.name CyberSerial (8-port) ST16654
+
+ vendor.id pci 0x1320
++vendor.name Crypto AG
+
+ vendor.id pci 0x1321
++vendor.name Arcobel Graphics BV
+
+ vendor.id pci 0x1322
++vendor.name MTT Co., Ltd
+
+ vendor.id pci 0x1323
++vendor.name Dome Inc
+
+ vendor.id pci 0x1324
++vendor.name Sphere Communications
+
+ vendor.id pci 0x1325
++vendor.name Salix Technologies, Inc
+
+ vendor.id pci 0x1326
++vendor.name Seachange international
+
+ vendor.id pci 0x1327
++vendor.name Voss scientific
+
+ vendor.id pci 0x1328
++vendor.name quadrant international
+
+ vendor.id pci 0x1329
++vendor.name Productivity Enhancement
+
+ vendor.id pci 0x132a
++vendor.name Microcom Inc.
+
+ vendor.id pci 0x132b
++vendor.name Broadband Technologies
+
+ vendor.id pci 0x132c
++vendor.name Micrel Inc
+
+ vendor.id pci 0x132d
++vendor.name Integrated Silicon Solution, Inc.
+
+ vendor.id pci 0x1330
++vendor.name MMC Networks
+
+ vendor.id pci 0x1331
++vendor.name Radisys Corp.
+
+ vendor.id pci 0x1331
+&device.id pci 0x0030
++device.name ENP-2611
+
+ vendor.id pci 0x1331
+&device.id pci 0x8200
++device.name 82600 Host Bridge
+
+ vendor.id pci 0x1331
+&device.id pci 0x8201
++device.name 82600 IDE
+
+ vendor.id pci 0x1331
+&device.id pci 0x8202
++device.name 82600 USB
+
+ vendor.id pci 0x1331
+&device.id pci 0x8210
++device.name 82600 PCI Bridge
+
+ vendor.id pci 0x1332
++vendor.name Micro Memory
+
+ vendor.id pci 0x1332
+&device.id pci 0x5415
++device.name MM-5415CN PCI Memory Module with Battery Backup
+
+ vendor.id pci 0x1332
+&device.id pci 0x5425
++device.name MM-5425CN PCI 64/66 Memory Module with Battery Backup
+
+ vendor.id pci 0x1334
++vendor.name Redcreek Communications, Inc
+
+ vendor.id pci 0x1335
++vendor.name Videomail, Inc
+
+ vendor.id pci 0x1337
++vendor.name Third Planet Publishing
+
+ vendor.id pci 0x1338
++vendor.name BT Electronics
+
+ vendor.id pci 0x133a
++vendor.name Vtel Corp
+
+ vendor.id pci 0x133b
++vendor.name Softcom Microsystems
+
+ vendor.id pci 0x133c
++vendor.name Holontech Corp
+
+ vendor.id pci 0x133d
++vendor.name SS Technologies
+
+ vendor.id pci 0x133e
++vendor.name Virtual Computer Corp
+
+ vendor.id pci 0x133f
++vendor.name SCM Microsystems
+
+ vendor.id pci 0x1340
++vendor.name Atalla Corp
+
+ vendor.id pci 0x1341
++vendor.name Kyoto Microcomputer Co
+
+ vendor.id pci 0x1342
++vendor.name Promax Systems Inc
+
+ vendor.id pci 0x1343
++vendor.name Phylon Communications Inc
+
+ vendor.id pci 0x1344
++vendor.name Crucial Technology
+
+ vendor.id pci 0x1345
++vendor.name Arescom Inc
+
+ vendor.id pci 0x1347
++vendor.name Odetics
+
+ vendor.id pci 0x1349
++vendor.name Sumitomo Electric Industries, Ltd.
+
+ vendor.id pci 0x134a
++vendor.name DTC Technology Corp.
+
+ vendor.id pci 0x134a
+&device.id pci 0x0001
++device.name Domex 536
+
+ vendor.id pci 0x134a
+&device.id pci 0x0002
++device.name Domex DMX3194UP SCSI Adapter
+
+ vendor.id pci 0x134b
++vendor.name ARK Research Corp.
+
+ vendor.id pci 0x134c
++vendor.name Chori Joho System Co. Ltd
+
+ vendor.id pci 0x134d
++vendor.name PCTel Inc
+
+ vendor.id pci 0x134d
+&device.id pci 0x2189
++device.name HSP56 MicroModem
+
+ vendor.id pci 0x134d
+&device.id pci 0x2486
++device.name 2304WT V.92 MDC Modem
+
+ vendor.id pci 0x134d
+&device.id pci 0x7890
++device.name HSP MicroModem 56
+
+ vendor.id pci 0x134d
+&device.id pci 0x7890
+&subvendor.id pci 0x134d
+&subdevice.id pci 0x0001
++subdevice.name PCT789 adapter
+
+ vendor.id pci 0x134d
+&device.id pci 0x7891
++device.name HSP MicroModem 56
+
+ vendor.id pci 0x134d
+&device.id pci 0x7891
+&subvendor.id pci 0x134d
+&subdevice.id pci 0x0001
++subdevice.name HSP MicroModem 56
+
+ vendor.id pci 0x134d
+&device.id pci 0x7892
++device.name HSP MicroModem 56
+
+ vendor.id pci 0x134d
+&device.id pci 0x7893
++device.name HSP MicroModem 56
+
+ vendor.id pci 0x134d
+&device.id pci 0x7894
++device.name HSP MicroModem 56
+
+ vendor.id pci 0x134d
+&device.id pci 0x7895
++device.name HSP MicroModem 56
+
+ vendor.id pci 0x134d
+&device.id pci 0x7896
++device.name HSP MicroModem 56
+
+ vendor.id pci 0x134d
+&device.id pci 0x7897
++device.name HSP MicroModem 56
+
+ vendor.id pci 0x134e
++vendor.name CSTI
+
+ vendor.id pci 0x134f
++vendor.name Algo System Co Ltd
+
+ vendor.id pci 0x1350
++vendor.name Systec Co. Ltd
+
+ vendor.id pci 0x1351
++vendor.name Sonix Inc
+
+ vendor.id pci 0x1353
++vendor.name Thales Idatys
+
+ vendor.id pci 0x1353
+&device.id pci 0x0002
++device.name Proserver
+
+ vendor.id pci 0x1353
+&device.id pci 0x0003
++device.name PCI-FUT
+
+ vendor.id pci 0x1353
+&device.id pci 0x0004
++device.name PCI-S0
+
+ vendor.id pci 0x1353
+&device.id pci 0x0005
++device.name PCI-FUT-S0
+
+ vendor.id pci 0x1354
++vendor.name Dwave System Inc
+
+ vendor.id pci 0x1355
++vendor.name Kratos Analytical Ltd
+
+ vendor.id pci 0x1356
++vendor.name The Logical Co
+
+ vendor.id pci 0x1359
++vendor.name Prisa Networks
+
+ vendor.id pci 0x135a
++vendor.name Brain Boxes
+
+ vendor.id pci 0x135b
++vendor.name Giganet Inc
+
+ vendor.id pci 0x135c
++vendor.name Quatech Inc
+
+ vendor.id pci 0x135c
+&device.id pci 0x0010
++device.name QSC-100
+
+ vendor.id pci 0x135c
+&device.id pci 0x0020
++device.name DSC-100
+
+ vendor.id pci 0x135c
+&device.id pci 0x0030
++device.name DSC-200/300
+
+ vendor.id pci 0x135c
+&device.id pci 0x0040
++device.name QSC-200/300
+
+ vendor.id pci 0x135c
+&device.id pci 0x0050
++device.name ESC-100D
+
+ vendor.id pci 0x135c
+&device.id pci 0x0060
++device.name ESC-100M
+
+ vendor.id pci 0x135c
+&device.id pci 0x00f0
++device.name MPAC-100 Syncronous Serial Card (Zilog 85230)
+
+ vendor.id pci 0x135c
+&device.id pci 0x0170
++device.name QSCLP-100
+
+ vendor.id pci 0x135c
+&device.id pci 0x0180
++device.name DSCLP-100
+
+ vendor.id pci 0x135c
+&device.id pci 0x0190
++device.name SSCLP-100
+
+ vendor.id pci 0x135c
+&device.id pci 0x01a0
++device.name QSCLP-200/300
+
+ vendor.id pci 0x135c
+&device.id pci 0x01b0
++device.name DSCLP-200/300
+
+ vendor.id pci 0x135c
+&device.id pci 0x01c0
++device.name SSCLP-200/300
+
+ vendor.id pci 0x135d
++vendor.name ABB Network Partner AB
+
+ vendor.id pci 0x135e
++vendor.name Sealevel Systems Inc
+
+ vendor.id pci 0x135e
+&device.id pci 0x5101
++device.name Route 56.PCI - Multi-Protocol Serial Interface (Zilog Z16C32)
+
+ vendor.id pci 0x135e
+&device.id pci 0x7101
++device.name Single Port RS-232/422/485/530
+
+ vendor.id pci 0x135e
+&device.id pci 0x7201
++device.name Dual Port RS-232/422/485 Interface
+
+ vendor.id pci 0x135e
+&device.id pci 0x7202
++device.name Dual Port RS-232 Interface
+
+ vendor.id pci 0x135e
+&device.id pci 0x7401
++device.name Four Port RS-232 Interface
+
+ vendor.id pci 0x135e
+&device.id pci 0x7402
++device.name Four Port RS-422/485 Interface
+
+ vendor.id pci 0x135e
+&device.id pci 0x7801
++device.name Eight Port RS-232 Interface
+
+ vendor.id pci 0x135e
+&device.id pci 0x8001
++device.name 8001 Digital I/O Adapter
+
+ vendor.id pci 0x135f
++vendor.name I-Data International A-S
+
+ vendor.id pci 0x1360
++vendor.name Meinberg Funkuhren
+
+ vendor.id pci 0x1360
+&device.id pci 0x0101
++device.name PCI32 DCF77 Radio Clock
+
+ vendor.id pci 0x1360
+&device.id pci 0x0102
++device.name PCI509 DCF77 Radio Clock
+
+ vendor.id pci 0x1360
+&device.id pci 0x0103
++device.name PCI510 DCF77 Radio Clock
+
+ vendor.id pci 0x1360
+&device.id pci 0x0201
++device.name GPS167PCI GPS Receiver
+
+ vendor.id pci 0x1360
+&device.id pci 0x0202
++device.name GPS168PCI GPS Receiver
+
+ vendor.id pci 0x1360
+&device.id pci 0x0203
++device.name GPS169PCI GPS Receiver
+
+ vendor.id pci 0x1360
+&device.id pci 0x0301
++device.name TCR510PCI IRIG Receiver
+
+ vendor.id pci 0x1361
++vendor.name Soliton Systems K.K.
+
+ vendor.id pci 0x1362
++vendor.name Fujifacom Corporation
+
+ vendor.id pci 0x1363
++vendor.name Phoenix Technology Ltd
+
+ vendor.id pci 0x1364
++vendor.name ATM Communications Inc
+
+ vendor.id pci 0x1365
++vendor.name Hypercope GmbH
+
+ vendor.id pci 0x1366
++vendor.name Teijin Seiki Co. Ltd
+
+ vendor.id pci 0x1367
++vendor.name Hitachi Zosen Corporation
+
+ vendor.id pci 0x1368
++vendor.name Skyware Corporation
+
+ vendor.id pci 0x1369
++vendor.name Digigram
+
+ vendor.id pci 0x136a
++vendor.name High Soft Tech
+
+ vendor.id pci 0x136b
++vendor.name Kawasaki Steel Corporation
+
+ vendor.id pci 0x136b
+&device.id pci 0xff01
++device.name KL5A72002 Motion JPEG
+
+ vendor.id pci 0x136c
++vendor.name Adtek System Science Co Ltd
+
+ vendor.id pci 0x136d
++vendor.name Gigalabs Inc
+
+ vendor.id pci 0x136f
++vendor.name Applied Magic Inc
+
+ vendor.id pci 0x1370
++vendor.name ATL Products
+
+ vendor.id pci 0x1371
++vendor.name CNet Technology Inc
+
+ vendor.id pci 0x1371
+&device.id pci 0x434e
++device.name GigaCard Network Adapter
+
+ vendor.id pci 0x1371
+&device.id pci 0x434e
+&subvendor.id pci 0x1371
+&subdevice.id pci 0x434e
++subdevice.name N-Way PCI-Bus Giga-Card 1000/100/10Mbps(L)
+
+ vendor.id pci 0x1373
++vendor.name Silicon Vision Inc
+
+ vendor.id pci 0x1374
++vendor.name Silicom Ltd
+
+ vendor.id pci 0x1375
++vendor.name Argosystems Inc
+
+ vendor.id pci 0x1376
++vendor.name LMC
+
+ vendor.id pci 0x1377
++vendor.name Electronic Equipment Production & Distribution GmbH
+
+ vendor.id pci 0x1378
++vendor.name Telemann Co. Ltd
+
+ vendor.id pci 0x1379
++vendor.name Asahi Kasei Microsystems Co Ltd
+
+ vendor.id pci 0x137a
++vendor.name Mark of the Unicorn Inc
+
+ vendor.id pci 0x137a
+&device.id pci 0x0001
++device.name PCI-324 Audiowire Interface
+
+ vendor.id pci 0x137b
++vendor.name PPT Vision
+
+ vendor.id pci 0x137c
++vendor.name Iwatsu Electric Co Ltd
+
+ vendor.id pci 0x137d
++vendor.name Dynachip Corporation
+
+ vendor.id pci 0x137e
++vendor.name Patriot Scientific Corporation
+
+ vendor.id pci 0x137f
++vendor.name Japan Satellite Systems Inc
+
+ vendor.id pci 0x1380
++vendor.name Sanritz Automation Co Ltd
+
+ vendor.id pci 0x1381
++vendor.name Brains Co. Ltd
+
+ vendor.id pci 0x1382
++vendor.name Marian - Electronic & Software
+
+ vendor.id pci 0x1382
+&device.id pci 0x0001
++device.name ARC88 audio recording card
+
+ vendor.id pci 0x1382
+&device.id pci 0x2088
++device.name Marc-8 MIDI 8 channel audio card
+
+ vendor.id pci 0x1383
++vendor.name Controlnet Inc
+
+ vendor.id pci 0x1384
++vendor.name Reality Simulation Systems Inc
+
+ vendor.id pci 0x1385
++vendor.name Netgear
+
+ vendor.id pci 0x1385
+&device.id pci 0x0013
++device.name WG311T
+
+ vendor.id pci 0x1385
+&device.id pci 0x4100
++device.name 802.11b Wireless Adapter (MA301)
+
+ vendor.id pci 0x1385
+&device.id pci 0x4105
++device.name MA311 802.11b wireless adapter
+
+ vendor.id pci 0x1385
+&device.id pci 0x4400
++device.name WAG511 802.11a/b/g Dual Band Wireless PC Card
+
+ vendor.id pci 0x1385
+&device.id pci 0x4600
++device.name WAG511 802.11a/b/g Dual Band Wireless PC Card
+
+ vendor.id pci 0x1385
+&device.id pci 0x4601
++device.name WAG511 802.11a/b/g Dual Band Wireless PC Card
+
+ vendor.id pci 0x1385
+&device.id pci 0x4610
++device.name WAG511 802.11a/b/g Dual Band Wireless PC Card
+
+ vendor.id pci 0x1385
+&device.id pci 0x4a00
++device.name WAG311 802.11a/g Wireless PCI Adapter
+
+ vendor.id pci 0x1385
+&device.id pci 0x4c00
++device.name WG311v2 54 Mbps Wireless PCI Adapter
+
+ vendor.id pci 0x1385
+&device.id pci 0x620a
++device.name GA620 Gigabit Ethernet
+
+ vendor.id pci 0x1385
+&device.id pci 0x622a
++device.name GA622
+
+ vendor.id pci 0x1385
+&device.id pci 0x630a
++device.name GA630 Gigabit Ethernet
+
+ vendor.id pci 0x1385
+&device.id pci 0xf004
++device.name FA310TX
+
+ vendor.id pci 0x1386
++vendor.name Video Domain Technologies
+
+ vendor.id pci 0x1387
++vendor.name Systran Corp
+
+ vendor.id pci 0x1388
++vendor.name Hitachi Information Technology Co Ltd
+
+ vendor.id pci 0x1389
++vendor.name Applicom International
+
+ vendor.id pci 0x1389
+&device.id pci 0x0001
++device.name PCI1500PFB [Intelligent fieldbus adaptor]
+
+ vendor.id pci 0x138a
++vendor.name Fusion Micromedia Corp
+
+ vendor.id pci 0x138b
++vendor.name Tokimec Inc
+
+ vendor.id pci 0x138c
++vendor.name Silicon Reality
+
+ vendor.id pci 0x138d
++vendor.name Future Techno Designs pte Ltd
+
+ vendor.id pci 0x138e
++vendor.name Basler GmbH
+
+ vendor.id pci 0x138f
++vendor.name Patapsco Designs Inc
+
+ vendor.id pci 0x1390
++vendor.name Concept Development Inc
+
+ vendor.id pci 0x1391
++vendor.name Development Concepts Inc
+
+ vendor.id pci 0x1392
++vendor.name Medialight Inc
+
+ vendor.id pci 0x1393
++vendor.name Moxa Technologies Co Ltd
+
+ vendor.id pci 0x1393
+&device.id pci 0x1040
++device.name Smartio C104H/PCI
+
+ vendor.id pci 0x1393
+&device.id pci 0x1141
++device.name Industrio CP-114
+
+ vendor.id pci 0x1393
+&device.id pci 0x1680
++device.name Smartio C168H/PCI
+
+ vendor.id pci 0x1393
+&device.id pci 0x2040
++device.name Intellio CP-204J
+
+ vendor.id pci 0x1393
+&device.id pci 0x2180
++device.name Intellio C218 Turbo PCI
+
+ vendor.id pci 0x1393
+&device.id pci 0x3200
++device.name Intellio C320 Turbo PCI
+
+ vendor.id pci 0x1394
++vendor.name Level One Communications
+
+ vendor.id pci 0x1394
+&device.id pci 0x0001
++device.name LXT1001 Gigabit Ethernet
+
+ vendor.id pci 0x1394
+&device.id pci 0x0001
+&subvendor.id pci 0x1394
+&subdevice.id pci 0x0001
++subdevice.name NetCelerator Adapter
+
+ vendor.id pci 0x1395
++vendor.name Ambicom Inc
+
+ vendor.id pci 0x1396
++vendor.name Cipher Systems Inc
+
+ vendor.id pci 0x1397
++vendor.name Cologne Chip Designs GmbH
+
+ vendor.id pci 0x1397
+&device.id pci 0x2bd0
++device.name ISDN network controller [HFC-PCI]
+
+ vendor.id pci 0x1397
+&device.id pci 0x2bd0
+&subvendor.id pci 0x1397
+&subdevice.id pci 0x2bd0
++subdevice.name ISDN Board
+
+ vendor.id pci 0x1397
+&device.id pci 0x2bd0
+&subvendor.id pci 0xe4bf
+&subdevice.id pci 0x1000
++subdevice.name CI1-1-Harp
+
+ vendor.id pci 0x1398
++vendor.name Clarion co. Ltd
+
+ vendor.id pci 0x1399
++vendor.name Rios systems Co Ltd
+
+ vendor.id pci 0x139a
++vendor.name Alacritech Inc
+
+ vendor.id pci 0x139a
+&device.id pci 0x0001
++device.name Quad Port 10/100 Server Accelerator
+
+ vendor.id pci 0x139a
+&device.id pci 0x0003
++device.name Single Port 10/100 Server Accelerator
+
+ vendor.id pci 0x139a
+&device.id pci 0x0005
++device.name Single Port Gigabit Server Accelerator
+
+ vendor.id pci 0x139b
++vendor.name Mediasonic Multimedia Systems Ltd
+
+ vendor.id pci 0x139c
++vendor.name Quantum 3d Inc
+
+ vendor.id pci 0x139d
++vendor.name EPL limited
+
+ vendor.id pci 0x139e
++vendor.name Media4
+
+ vendor.id pci 0x139f
++vendor.name Aethra s.r.l.
+
+ vendor.id pci 0x13a0
++vendor.name Crystal Group Inc
+
+ vendor.id pci 0x13a1
++vendor.name Kawasaki Heavy Industries Ltd
+
+ vendor.id pci 0x13a2
++vendor.name Ositech Communications Inc
+
+ vendor.id pci 0x13a3
++vendor.name Hifn Inc.
+
+ vendor.id pci 0x13a3
+&device.id pci 0x0005
++device.name 7751 Security Processor
+
+ vendor.id pci 0x13a3
+&device.id pci 0x0006
++device.name 6500 Public Key Processor
+
+ vendor.id pci 0x13a3
+&device.id pci 0x0007
++device.name 7811 Security Processor
+
+ vendor.id pci 0x13a3
+&device.id pci 0x0012
++device.name 7951 Security Processor
+
+ vendor.id pci 0x13a3
+&device.id pci 0x0014
++device.name 78XX Security Processor
+
+ vendor.id pci 0x13a3
+&device.id pci 0x0016
++device.name 8065 Security Processor
+
+ vendor.id pci 0x13a3
+&device.id pci 0x0017
++device.name 8165 Security Processor
+
+ vendor.id pci 0x13a3
+&device.id pci 0x0018
++device.name 8154 Security Processor
+
+ vendor.id pci 0x13a4
++vendor.name Rascom Inc
+
+ vendor.id pci 0x13a5
++vendor.name Audio Digital Imaging Inc
+
+ vendor.id pci 0x13a6
++vendor.name Videonics Inc
+
+ vendor.id pci 0x13a7
++vendor.name Teles AG
+
+ vendor.id pci 0x13a8
++vendor.name Exar Corp.
+
+ vendor.id pci 0x13a8
+&device.id pci 0x0154
++device.name XR17C154 Quad UART
+
+ vendor.id pci 0x13a8
+&device.id pci 0x0158
++device.name XR17C158 Octal UART
+
+ vendor.id pci 0x13a9
++vendor.name Siemens Medical Systems, Ultrasound Group
+
+ vendor.id pci 0x13aa
++vendor.name Broadband Networks Inc
+
+ vendor.id pci 0x13ab
++vendor.name Arcom Control Systems Ltd
+
+ vendor.id pci 0x13ac
++vendor.name Motion Media Technology Ltd
+
+ vendor.id pci 0x13ad
++vendor.name Nexus Inc
+
+ vendor.id pci 0x13ae
++vendor.name ALD Technology Ltd
+
+ vendor.id pci 0x13af
++vendor.name T.Sqware
+
+ vendor.id pci 0x13b0
++vendor.name Maxspeed Corp
+
+ vendor.id pci 0x13b1
++vendor.name Tamura corporation
+
+ vendor.id pci 0x13b2
++vendor.name Techno Chips Co. Ltd
+
+ vendor.id pci 0x13b3
++vendor.name Lanart Corporation
+
+ vendor.id pci 0x13b4
++vendor.name Wellbean Co Inc
+
+ vendor.id pci 0x13b5
++vendor.name ARM
+
+ vendor.id pci 0x13b6
++vendor.name Dlog GmbH
+
+ vendor.id pci 0x13b7
++vendor.name Logic Devices Inc
+
+ vendor.id pci 0x13b8
++vendor.name Nokia Telecommunications oy
+
+ vendor.id pci 0x13b9
++vendor.name Elecom Co Ltd
+
+ vendor.id pci 0x13ba
++vendor.name Oxford Instruments
+
+ vendor.id pci 0x13bb
++vendor.name Sanyo Technosound Co Ltd
+
+ vendor.id pci 0x13bc
++vendor.name Bitran Corporation
+
+ vendor.id pci 0x13bd
++vendor.name Sharp corporation
+
+ vendor.id pci 0x13be
++vendor.name Miroku Jyoho Service Co. Ltd
+
+ vendor.id pci 0x13bf
++vendor.name Sharewave Inc
+
+ vendor.id pci 0x13c0
++vendor.name Microgate Corporation
+
+ vendor.id pci 0x13c0
+&device.id pci 0x0010
++device.name SyncLink Adapter v1
+
+ vendor.id pci 0x13c0
+&device.id pci 0x0020
++device.name SyncLink SCC Adapter
+
+ vendor.id pci 0x13c0
+&device.id pci 0x0030
++device.name SyncLink Multiport Adapter
+
+ vendor.id pci 0x13c0
+&device.id pci 0x0210
++device.name SyncLink Adapter v2
+
+ vendor.id pci 0x13c1
++vendor.name 3ware Inc
+
+ vendor.id pci 0x13c1
+&device.id pci 0x1000
++device.name 3ware Inc 3ware 5xxx/6xxx-series PATA-RAID
+
+ vendor.id pci 0x13c1
+&device.id pci 0x1001
++device.name 3ware Inc 3ware 7xxx/8xxx-series PATA/SATA-RAID
+
+ vendor.id pci 0x13c1
+&device.id pci 0x1001
+&subvendor.id pci 0x13c1
+&subdevice.id pci 0x1001
++subdevice.name 3ware Inc 3ware 7xxx/8xxx-series PATA/SATA-RAID
+
+ vendor.id pci 0x13c1
+&device.id pci 0x1002
++device.name 3ware Inc 3ware 9xxx-series SATA-RAID
+
+ vendor.id pci 0x13c2
++vendor.name Technotrend Systemtechnik GmbH
+
+ vendor.id pci 0x13c3
++vendor.name Janz Computer AG
+
+ vendor.id pci 0x13c4
++vendor.name Phase Metrics
+
+ vendor.id pci 0x13c5
++vendor.name Alphi Technology Corp
+
+ vendor.id pci 0x13c6
++vendor.name Condor Engineering Inc
+
+ vendor.id pci 0x13c6
+&device.id pci 0x0520
++device.name CEI-520 A429 Card
+
+ vendor.id pci 0x13c6
+&device.id pci 0x0620
++device.name CEI-620 A429 Card
+
+ vendor.id pci 0x13c6
+&device.id pci 0x0820
++device.name CEI-820 A429 Card
+
+ vendor.id pci 0x13c7
++vendor.name Blue Chip Technology Ltd
+
+ vendor.id pci 0x13c8
++vendor.name Apptech Inc
+
+ vendor.id pci 0x13c9
++vendor.name Eaton Corporation
+
+ vendor.id pci 0x13ca
++vendor.name Iomega Corporation
+
+ vendor.id pci 0x13cb
++vendor.name Yano Electric Co Ltd
+
+ vendor.id pci 0x13cc
++vendor.name Metheus Corporation
+
+ vendor.id pci 0x13cd
++vendor.name Compatible Systems Corporation
+
+ vendor.id pci 0x13ce
++vendor.name Cocom A/S
+
+ vendor.id pci 0x13cf
++vendor.name Studio Audio & Video Ltd
+
+ vendor.id pci 0x13d0
++vendor.name Techsan Electronics Co Ltd
+
+ vendor.id pci 0x13d0
+&device.id pci 0x2103
++device.name B2C2 FlexCopII DVB chip / Technisat SkyStar2 DVB card
+
+ vendor.id pci 0x13d0
+&device.id pci 0x2200
++device.name B2C2 FlexCopIII DVB chip / Technisat SkyStar2 DVB card
+
+ vendor.id pci 0x13d1
++vendor.name Abocom Systems Inc
+
+ vendor.id pci 0x13d1
+&device.id pci 0xab02
++device.name ADMtek Centaur-C rev 17 [D-Link DFE-680TX] CardBus Fast Ethernet Adapter
+
+ vendor.id pci 0x13d1
+&device.id pci 0xab03
++device.name 21x4x DEC-Tulip compatible 10/100 Ethernet
+
+ vendor.id pci 0x13d1
+&device.id pci 0xab06
++device.name RTL8139 [FE2000VX] CardBus Fast Ethernet Attached Port Adapter
+
+ vendor.id pci 0x13d1
+&device.id pci 0xab08
++device.name 21x4x DEC-Tulip compatible 10/100 Ethernet
+
+ vendor.id pci 0x13d2
++vendor.name Shark Multimedia Inc
+
+ vendor.id pci 0x13d3
++vendor.name IMC Networks
+
+ vendor.id pci 0x13d4
++vendor.name Graphics Microsystems Inc
+
+ vendor.id pci 0x13d5
++vendor.name Media 100 Inc
+
+ vendor.id pci 0x13d6
++vendor.name K.I. Technology Co Ltd
+
+ vendor.id pci 0x13d7
++vendor.name Toshiba Engineering Corporation
+
+ vendor.id pci 0x13d8
++vendor.name Phobos corporation
+
+ vendor.id pci 0x13d9
++vendor.name Apex PC Solutions Inc
+
+ vendor.id pci 0x13da
++vendor.name Intresource Systems pte Ltd
+
+ vendor.id pci 0x13db
++vendor.name Janich & Klass Computertechnik GmbH
+
+ vendor.id pci 0x13dc
++vendor.name Netboost Corporation
+
+ vendor.id pci 0x13dd
++vendor.name Multimedia Bundle Inc
+
+ vendor.id pci 0x13de
++vendor.name ABB Robotics Products AB
+
+ vendor.id pci 0x13df
++vendor.name E-Tech Inc
+
+ vendor.id pci 0x13df
+&device.id pci 0x0001
++device.name PCI56RVP Modem
+
+ vendor.id pci 0x13df
+&device.id pci 0x0001
+&subvendor.id pci 0x13df
+&subdevice.id pci 0x0001
++subdevice.name PCI56RVP Modem
+
+ vendor.id pci 0x13e0
++vendor.name GVC Corporation
+
+ vendor.id pci 0x13e1
++vendor.name Silicom Multimedia Systems Inc
+
+ vendor.id pci 0x13e2
++vendor.name Dynamics Research Corporation
+
+ vendor.id pci 0x13e3
++vendor.name Nest Inc
+
+ vendor.id pci 0x13e4
++vendor.name Calculex Inc
+
+ vendor.id pci 0x13e5
++vendor.name Telesoft Design Ltd
+
+ vendor.id pci 0x13e6
++vendor.name Argosy research Inc
+
+ vendor.id pci 0x13e7
++vendor.name NAC Incorporated
+
+ vendor.id pci 0x13e8
++vendor.name Chip Express Corporation
+
+ vendor.id pci 0x13e9
++vendor.name Intraserver Technology Inc
+
+ vendor.id pci 0x13ea
++vendor.name Dallas Semiconductor
+
+ vendor.id pci 0x13eb
++vendor.name Hauppauge Computer Works Inc
+
+ vendor.id pci 0x13ec
++vendor.name Zydacron Inc
+
+ vendor.id pci 0x13ed
++vendor.name Raytheion E-Systems
+
+ vendor.id pci 0x13ee
++vendor.name Hayes Microcomputer Products Inc
+
+ vendor.id pci 0x13ef
++vendor.name Coppercom Inc
+
+ vendor.id pci 0x13f0
++vendor.name Sundance Technology Inc
+
+ vendor.id pci 0x13f0
+&device.id pci 0x0201
++device.name ST201 Sundance Ethernet
+
+ vendor.id pci 0x13f1
++vendor.name Oce' - Technologies B.V.
+
+ vendor.id pci 0x13f2
++vendor.name Ford Microelectronics Inc
+
+ vendor.id pci 0x13f3
++vendor.name Mcdata Corporation
+
+ vendor.id pci 0x13f4
++vendor.name Troika Networks, Inc.
+
+ vendor.id pci 0x13f4
+&device.id pci 0x1401
++device.name Zentai Fibre Channel Adapter
+
+ vendor.id pci 0x13f5
++vendor.name Kansai Electric Co. Ltd
+
+ vendor.id pci 0x13f6
++vendor.name C-Media Electronics Inc
+
+ vendor.id pci 0x13f6
+&device.id pci 0x0011
++device.name CMI8738
+
+ vendor.id pci 0x13f6
+&device.id pci 0x0100
++device.name CM8338A
+
+ vendor.id pci 0x13f6
+&device.id pci 0x0100
+&subvendor.id pci 0x13f6
+&subdevice.id pci 0xffff
++subdevice.name CMI8338/C3DX PCI Audio Device
+
+ vendor.id pci 0x13f6
+&device.id pci 0x0101
++device.name CM8338B
+
+ vendor.id pci 0x13f6
+&device.id pci 0x0101
+&subvendor.id pci 0x13f6
+&subdevice.id pci 0x0101
++subdevice.name CMI8338-031 PCI Audio Device
+
+ vendor.id pci 0x13f6
+&device.id pci 0x0111
++device.name CM8738
+
+ vendor.id pci 0x13f6
+&device.id pci 0x0111
+&subvendor.id pci 0x1019
+&subdevice.id pci 0x0970
++subdevice.name P6STP-FL motherboard
+
+ vendor.id pci 0x13f6
+&device.id pci 0x0111
+&subvendor.id pci 0x1043
+&subdevice.id pci 0x8035
++subdevice.name CUSI-FX motherboard
+
+ vendor.id pci 0x13f6
+&device.id pci 0x0111
+&subvendor.id pci 0x1043
+&subdevice.id pci 0x8077
++subdevice.name CMI8738 6-channel audio controller
+
+ vendor.id pci 0x13f6
+&device.id pci 0x0111
+&subvendor.id pci 0x1043
+&subdevice.id pci 0x80e2
++subdevice.name CMI8738 6ch-MX
+
+ vendor.id pci 0x13f6
+&device.id pci 0x0111
+&subvendor.id pci 0x13f6
+&subdevice.id pci 0x0111
++subdevice.name CMI8738/C3DX PCI Audio Device
+
+ vendor.id pci 0x13f6
+&device.id pci 0x0111
+&subvendor.id pci 0x1681
+&subdevice.id pci 0xa000
++subdevice.name Gamesurround MUSE XL
+
+ vendor.id pci 0x13f6
+&device.id pci 0x0211
++device.name CM8738
+
+ vendor.id pci 0x13f7
++vendor.name Wildfire Communications
+
+ vendor.id pci 0x13f8
++vendor.name Ad Lib Multimedia Inc
+
+ vendor.id pci 0x13f9
++vendor.name NTT Advanced Technology Corp.
+
+ vendor.id pci 0x13fa
++vendor.name Pentland Systems Ltd
+
+ vendor.id pci 0x13fb
++vendor.name Aydin Corp
+
+ vendor.id pci 0x13fc
++vendor.name Computer Peripherals International
+
+ vendor.id pci 0x13fd
++vendor.name Micro Science Inc
+
+ vendor.id pci 0x13fe
++vendor.name Advantech Co. Ltd
+
+ vendor.id pci 0x13fe
+&device.id pci 0x1240
++device.name PCI-1240 4-channel stepper motor controller card w. Nova Electronics MCX314
+
+ vendor.id pci 0x13fe
+&device.id pci 0x1600
++device.name PCI-1612 4-port RS-232/422/485 PCI Communication Card
+
+ vendor.id pci 0x13fe
+&device.id pci 0x1752
++device.name PCI-1752
+
+ vendor.id pci 0x13fe
+&device.id pci 0x1754
++device.name PCI-1754
+
+ vendor.id pci 0x13fe
+&device.id pci 0x1756
++device.name PCI-1756
+
+ vendor.id pci 0x13ff
++vendor.name Silicon Spice Inc
+
+ vendor.id pci 0x1400
++vendor.name Artx Inc
+
+ vendor.id pci 0x1400
+&device.id pci 0x1401
++device.name 9432 TX
+
+ vendor.id pci 0x1401
++vendor.name CR-Systems A/S
+
+ vendor.id pci 0x1402
++vendor.name Meilhaus Electronic GmbH
+
+ vendor.id pci 0x1403
++vendor.name Ascor Inc
+
+ vendor.id pci 0x1404
++vendor.name Fundamental Software Inc
+
+ vendor.id pci 0x1405
++vendor.name Excalibur Systems Inc
+
+ vendor.id pci 0x1406
++vendor.name Oce' Printing Systems GmbH
+
+ vendor.id pci 0x1407
++vendor.name Lava Computer mfg Inc
+
+ vendor.id pci 0x1407
+&device.id pci 0x0100
++device.name Lava Dual Serial
+
+ vendor.id pci 0x1407
+&device.id pci 0x0101
++device.name Lava Quatro A
+
+ vendor.id pci 0x1407
+&device.id pci 0x0102
++device.name Lava Quatro B
+
+ vendor.id pci 0x1407
+&device.id pci 0x0120
++device.name Quattro-PCI A
+
+ vendor.id pci 0x1407
+&device.id pci 0x0121
++device.name Quattro-PCI B
+
+ vendor.id pci 0x1407
+&device.id pci 0x0180
++device.name Lava Octo A
+
+ vendor.id pci 0x1407
+&device.id pci 0x0181
++device.name Lava Octo B
+
+ vendor.id pci 0x1407
+&device.id pci 0x0200
++device.name Lava Port Plus
+
+ vendor.id pci 0x1407
+&device.id pci 0x0201
++device.name Lava Quad A
+
+ vendor.id pci 0x1407
+&device.id pci 0x0202
++device.name Lava Quad B
+
+ vendor.id pci 0x1407
+&device.id pci 0x0220
++device.name Lava Quattro PCI Ports A/B
+
+ vendor.id pci 0x1407
+&device.id pci 0x0221
++device.name Lava Quattro PCI Ports C/D
+
+ vendor.id pci 0x1407
+&device.id pci 0x0500
++device.name Lava Single Serial
+
+ vendor.id pci 0x1407
+&device.id pci 0x0600
++device.name Lava Port 650
+
+ vendor.id pci 0x1407
+&device.id pci 0x8000
++device.name Lava Parallel
+
+ vendor.id pci 0x1407
+&device.id pci 0x8001
++device.name Dual parallel port controller A
+
+ vendor.id pci 0x1407
+&device.id pci 0x8002
++device.name Lava Dual Parallel port A
+
+ vendor.id pci 0x1407
+&device.id pci 0x8003
++device.name Lava Dual Parallel port B
+
+ vendor.id pci 0x1407
+&device.id pci 0x8800
++device.name BOCA Research IOPPAR
+
+ vendor.id pci 0x1408
++vendor.name Aloka Co. Ltd
+
+ vendor.id pci 0x1409
++vendor.name Timedia Technology Co Ltd
+
+ vendor.id pci 0x1409
+&device.id pci 0x7168
++device.name PCI2S550 (Dual 16550 UART)
+
+ vendor.id pci 0x140a
++vendor.name DSP Research Inc
+
+ vendor.id pci 0x140b
++vendor.name Ramix Inc
+
+ vendor.id pci 0x140c
++vendor.name Elmic Systems Inc
+
+ vendor.id pci 0x140d
++vendor.name Matsushita Electric Works Ltd
+
+ vendor.id pci 0x140e
++vendor.name Goepel Electronic GmbH
+
+ vendor.id pci 0x140f
++vendor.name Salient Systems Corp
+
+ vendor.id pci 0x1410
++vendor.name Midas lab Inc
+
+ vendor.id pci 0x1411
++vendor.name Ikos Systems Inc
+
+ vendor.id pci 0x1412
++vendor.name VIA Technologies Inc.
+
+ vendor.id pci 0x1412
+&device.id pci 0x1712
++device.name ICE1712 [Envy24] PCI Multi-Channel I/O Controller
+
+ vendor.id pci 0x1412
+&device.id pci 0x1712
+&subvendor.id pci 0x1412
+&subdevice.id pci 0xd638
++subdevice.name M-Audio Delta 410
+
+ vendor.id pci 0x1412
+&device.id pci 0x1724
++device.name VT1720/24 [Envy24PT/HT] PCI Multi-Channel Audio Controller
+
+ vendor.id pci 0x1413
++vendor.name Addonics
+
+ vendor.id pci 0x1414
++vendor.name Microsoft Corporation
+
+ vendor.id pci 0x1415
++vendor.name Oxford Semiconductor Ltd
+
+ vendor.id pci 0x1415
+&device.id pci 0x8403
++device.name VScom 011H-EP1 1 port parallel adaptor
+
+ vendor.id pci 0x1415
+&device.id pci 0x9501
++device.name OX16PCI954 (Quad 16950 UART) function 0
+
+ vendor.id pci 0x1415
+&device.id pci 0x9501
+&subvendor.id pci 0x131f
+&subdevice.id pci 0x2050
++subdevice.name CyberPro (4-port)
+
+ vendor.id pci 0x1415
+&device.id pci 0x9501
+&subvendor.id pci 0x15ed
+&subdevice.id pci 0x2000
++subdevice.name MCCR Serial p0-3 of 8
+
+ vendor.id pci 0x1415
+&device.id pci 0x9501
+&subvendor.id pci 0x15ed
+&subdevice.id pci 0x2001
++subdevice.name MCCR Serial p0-3 of 16
+
+ vendor.id pci 0x1415
+&device.id pci 0x950a
++device.name EXSYS EX-41092 Dual 16950 Serial adapter
+
+ vendor.id pci 0x1415
+&device.id pci 0x950b
++device.name OXCB950 Cardbus 16950 UART
+
+ vendor.id pci 0x1415
+&device.id pci 0x9511
++device.name OX16PCI954 (Quad 16950 UART) function 1
+
+ vendor.id pci 0x1415
+&device.id pci 0x9511
+&subvendor.id pci 0x15ed
+&subdevice.id pci 0x2000
++subdevice.name MCCR Serial p4-7 of 8
+
+ vendor.id pci 0x1415
+&device.id pci 0x9511
+&subvendor.id pci 0x15ed
+&subdevice.id pci 0x2001
++subdevice.name MCCR Serial p4-15 of 16
+
+ vendor.id pci 0x1415
+&device.id pci 0x9521
++device.name OX16PCI952 (Dual 16950 UART)
+
+ vendor.id pci 0x1416
++vendor.name Multiwave Innovation pte Ltd
+
+ vendor.id pci 0x1417
++vendor.name Convergenet Technologies Inc
+
+ vendor.id pci 0x1418
++vendor.name Kyushu electronics systems Inc
+
+ vendor.id pci 0x1419
++vendor.name Excel Switching Corp
+
+ vendor.id pci 0x141a
++vendor.name Apache Micro Peripherals Inc
+
+ vendor.id pci 0x141b
++vendor.name Zoom Telephonics Inc
+
+ vendor.id pci 0x141d
++vendor.name Digitan Systems Inc
+
+ vendor.id pci 0x141e
++vendor.name Fanuc Ltd
+
+ vendor.id pci 0x141f
++vendor.name Visiontech Ltd
+
+ vendor.id pci 0x1420
++vendor.name Psion Dacom plc
+
+ vendor.id pci 0x1420
+&device.id pci 0x8002
++device.name Gold Card NetGlobal 56k+10/100Mb CardBus (Ethernet part)
+
+ vendor.id pci 0x1420
+&device.id pci 0x8003
++device.name Gold Card NetGlobal 56k+10/100Mb CardBus (Modem part)
+
+ vendor.id pci 0x1421
++vendor.name Ads Technologies Inc
+
+ vendor.id pci 0x1422
++vendor.name Ygrec Systems Co Ltd
+
+ vendor.id pci 0x1423
++vendor.name Custom Technology Corp.
+
+ vendor.id pci 0x1424
++vendor.name Videoserver Connections
+
+ vendor.id pci 0x1425
++vendor.name Chelsio Communications Inc
+
+ vendor.id pci 0x1426
++vendor.name Storage Technology Corp.
+
+ vendor.id pci 0x1427
++vendor.name Better On-Line Solutions
+
+ vendor.id pci 0x1428
++vendor.name Edec Co Ltd
+
+ vendor.id pci 0x1429
++vendor.name Unex Technology Corp.
+
+ vendor.id pci 0x142a
++vendor.name Kingmax Technology Inc
+
+ vendor.id pci 0x142b
++vendor.name Radiolan
+
+ vendor.id pci 0x142c
++vendor.name Minton Optic Industry Co Ltd
+
+ vendor.id pci 0x142d
++vendor.name Pix stream Inc
+
+ vendor.id pci 0x142e
++vendor.name Vitec Multimedia
+
+ vendor.id pci 0x142e
+&device.id pci 0x4020
++device.name VM2-2 [Video Maker 2] MPEG1/2 Encoder
+
+ vendor.id pci 0x142f
++vendor.name Radicom Research Inc
+
+ vendor.id pci 0x1430
++vendor.name ITT Aerospace/Communications Division
+
+ vendor.id pci 0x1431
++vendor.name Gilat Satellite Networks
+
+ vendor.id pci 0x1432
++vendor.name Edimax Computer Co.
+
+ vendor.id pci 0x1432
+&device.id pci 0x9130
++device.name RTL81xx Fast Ethernet
+
+ vendor.id pci 0x1433
++vendor.name Eltec Elektronik GmbH
+
+ vendor.id pci 0x1435
++vendor.name Real Time Devices US Inc.
+
+ vendor.id pci 0x1436
++vendor.name CIS Technology Inc
+
+ vendor.id pci 0x1437
++vendor.name Nissin Inc Co
+
+ vendor.id pci 0x1438
++vendor.name Atmel-dream
+
+ vendor.id pci 0x1439
++vendor.name Outsource Engineering & Mfg. Inc
+
+ vendor.id pci 0x143a
++vendor.name Stargate Solutions Inc
+
+ vendor.id pci 0x143b
++vendor.name Canon Research Center, America
+
+ vendor.id pci 0x143c
++vendor.name Amlogic Inc
+
+ vendor.id pci 0x143d
++vendor.name Tamarack Microelectronics Inc
+
+ vendor.id pci 0x143e
++vendor.name Jones Futurex Inc
+
+ vendor.id pci 0x143f
++vendor.name Lightwell Co Ltd - Zax Division
+
+ vendor.id pci 0x1440
++vendor.name ALGOL Corp.
+
+ vendor.id pci 0x1441
++vendor.name AGIE Ltd
+
+ vendor.id pci 0x1442
++vendor.name Phoenix Contact GmbH & Co.
+
+ vendor.id pci 0x1443
++vendor.name Unibrain S.A.
+
+ vendor.id pci 0x1444
++vendor.name TRW
+
+ vendor.id pci 0x1445
++vendor.name Logical DO Ltd
+
+ vendor.id pci 0x1446
++vendor.name Graphin Co Ltd
+
+ vendor.id pci 0x1447
++vendor.name AIM GmBH
+
+ vendor.id pci 0x1448
++vendor.name Alesis Studio Electronics
+
+ vendor.id pci 0x1449
++vendor.name TUT Systems Inc
+
+ vendor.id pci 0x144a
++vendor.name Adlink Technology
+
+ vendor.id pci 0x144a
+&device.id pci 0x7296
++device.name PCI-7296
+
+ vendor.id pci 0x144a
+&device.id pci 0x7432
++device.name PCI-7432
+
+ vendor.id pci 0x144a
+&device.id pci 0x7433
++device.name PCI-7433
+
+ vendor.id pci 0x144a
+&device.id pci 0x7434
++device.name PCI-7434
+
+ vendor.id pci 0x144a
+&device.id pci 0x7841
++device.name PCI-7841
+
+ vendor.id pci 0x144a
+&device.id pci 0x8133
++device.name PCI-8133
+
+ vendor.id pci 0x144a
+&device.id pci 0x8164
++device.name PCI-8164
+
+ vendor.id pci 0x144a
+&device.id pci 0x8554
++device.name PCI-8554
+
+ vendor.id pci 0x144a
+&device.id pci 0x9111
++device.name PCI-9111
+
+ vendor.id pci 0x144a
+&device.id pci 0x9113
++device.name PCI-9113
+
+ vendor.id pci 0x144a
+&device.id pci 0x9114
++device.name PCI-9114
+
+ vendor.id pci 0x144b
++vendor.name Loronix Information Systems Inc
+
+ vendor.id pci 0x144c
++vendor.name Catalina Research Inc
+
+ vendor.id pci 0x144d
++vendor.name Samsung Electronics Co Ltd
+
+ vendor.id pci 0x144e
++vendor.name OLITEC
+
+ vendor.id pci 0x144f
++vendor.name Askey Computer Corp.
+
+ vendor.id pci 0x1450
++vendor.name Octave Communications Ind.
+
+ vendor.id pci 0x1451
++vendor.name SP3D Chip Design GmBH
+
+ vendor.id pci 0x1453
++vendor.name MYCOM Inc
+
+ vendor.id pci 0x1454
++vendor.name Altiga Networks
+
+ vendor.id pci 0x1455
++vendor.name Logic Plus Plus Inc
+
+ vendor.id pci 0x1456
++vendor.name Advanced Hardware Architectures
+
+ vendor.id pci 0x1457
++vendor.name Nuera Communications Inc
+
+ vendor.id pci 0x1458
++vendor.name Giga-byte Technology
+
+ vendor.id pci 0x1459
++vendor.name DOOIN Electronics
+
+ vendor.id pci 0x145a
++vendor.name Escalate Networks Inc
+
+ vendor.id pci 0x145b
++vendor.name PRAIM SRL
+
+ vendor.id pci 0x145c
++vendor.name Cryptek
+
+ vendor.id pci 0x145d
++vendor.name Gallant Computer Inc
+
+ vendor.id pci 0x145e
++vendor.name Aashima Technology B.V.
+
+ vendor.id pci 0x145f
++vendor.name Baldor Electric Company
+
+ vendor.id pci 0x145f
+&device.id pci 0x0001
++device.name NextMove PCI
+
+ vendor.id pci 0x1460
++vendor.name DYNARC INC
+
+ vendor.id pci 0x1461
++vendor.name Avermedia Technologies Inc
+
+ vendor.id pci 0x1462
++vendor.name Micro-Star International Co., Ltd.
+
+ vendor.id pci 0x1462
+&device.id pci 0x6825
++device.name PCI Card wireless 11g [PC54G]
+
+ vendor.id pci 0x1462
+&device.id pci 0x8725
++device.name NVIDIA NV25 [GeForce4 Ti 4600] VGA Adapter
+
+ vendor.id pci 0x1462
+&device.id pci 0x9000
++device.name NVIDIA NV28 [GeForce4 Ti 4800] VGA Adapter
+
+ vendor.id pci 0x1462
+&device.id pci 0x9119
++device.name NVIDIA NV31 [GeForce FX 5600XT] VGA Adapter
+
+ vendor.id pci 0x1463
++vendor.name Fast Corporation
+
+ vendor.id pci 0x1464
++vendor.name Interactive Circuits & Systems Ltd
+
+ vendor.id pci 0x1465
++vendor.name GN NETTEST Telecom DIV.
+
+ vendor.id pci 0x1466
++vendor.name Designpro Inc.
+
+ vendor.id pci 0x1467
++vendor.name DIGICOM SPA
+
+ vendor.id pci 0x1468
++vendor.name AMBIT Microsystem Corp.
+
+ vendor.id pci 0x1469
++vendor.name Cleveland Motion Controls
+
+ vendor.id pci 0x146a
++vendor.name IFR
+
+ vendor.id pci 0x146b
++vendor.name Parascan Technologies Ltd
+
+ vendor.id pci 0x146c
++vendor.name Ruby Tech Corp.
+
+ vendor.id pci 0x146c
+&device.id pci 0x1430
++device.name FE-1430TX Fast Ethernet PCI Adapter
+
+ vendor.id pci 0x146d
++vendor.name Tachyon, INC.
+
+ vendor.id pci 0x146e
++vendor.name Williams Electronics Games, Inc.
+
+ vendor.id pci 0x146f
++vendor.name Multi Dimensional Consulting Inc
+
+ vendor.id pci 0x1470
++vendor.name Bay Networks
+
+ vendor.id pci 0x1471
++vendor.name Integrated Telecom Express Inc
+
+ vendor.id pci 0x1472
++vendor.name DAIKIN Industries, Ltd
+
+ vendor.id pci 0x1473
++vendor.name ZAPEX Technologies Inc
+
+ vendor.id pci 0x1474
++vendor.name Doug Carson & Associates
+
+ vendor.id pci 0x1475
++vendor.name PICAZO Communications
+
+ vendor.id pci 0x1476
++vendor.name MORTARA Instrument Inc
+
+ vendor.id pci 0x1477
++vendor.name Net Insight
+
+ vendor.id pci 0x1478
++vendor.name DIATREND Corporation
+
+ vendor.id pci 0x1479
++vendor.name TORAY Industries Inc
+
+ vendor.id pci 0x147a
++vendor.name FORMOSA Industrial Computing
+
+ vendor.id pci 0x147b
++vendor.name ABIT Computer Corp.
+
+ vendor.id pci 0x147c
++vendor.name AWARE, Inc.
+
+ vendor.id pci 0x147d
++vendor.name Interworks Computer Products
+
+ vendor.id pci 0x147e
++vendor.name Matsushita Graphic Communication Systems, Inc.
+
+ vendor.id pci 0x147f
++vendor.name NIHON UNISYS, Ltd.
+
+ vendor.id pci 0x1480
++vendor.name SCII Telecom
+
+ vendor.id pci 0x1481
++vendor.name BIOPAC Systems Inc
+
+ vendor.id pci 0x1482
++vendor.name ISYTEC - Integrierte Systemtechnik GmBH
+
+ vendor.id pci 0x1483
++vendor.name LABWAY Corporation
+
+ vendor.id pci 0x1484
++vendor.name Logic Corporation
+
+ vendor.id pci 0x1485
++vendor.name ERMA - Electronic GmBH
+
+ vendor.id pci 0x1486
++vendor.name L3 Communications Telemetry & Instrumentation
+
+ vendor.id pci 0x1487
++vendor.name MARQUETTE Medical Systems
+
+ vendor.id pci 0x1488
++vendor.name KONTRON Electronik GmBH
+
+ vendor.id pci 0x1489
++vendor.name KYE Systems Corporation
+
+ vendor.id pci 0x148a
++vendor.name OPTO
+
+ vendor.id pci 0x148b
++vendor.name INNOMEDIALOGIC Inc.
+
+ vendor.id pci 0x148c
++vendor.name C.P. Technology Co. Ltd
+
+ vendor.id pci 0x148d
++vendor.name DIGICOM Systems, Inc.
+
+ vendor.id pci 0x148d
+&device.id pci 0x1003
++device.name HCF 56k Data/Fax Modem
+
+ vendor.id pci 0x148e
++vendor.name OSI Plus Corporation
+
+ vendor.id pci 0x148f
++vendor.name Plant Equipment, Inc.
+
+ vendor.id pci 0x1490
++vendor.name Stone Microsystems PTY Ltd.
+
+ vendor.id pci 0x1491
++vendor.name ZEAL Corporation
+
+ vendor.id pci 0x1492
++vendor.name Time Logic Corporation
+
+ vendor.id pci 0x1493
++vendor.name MAKER Communications
+
+ vendor.id pci 0x1494
++vendor.name WINTOP Technology, Inc.
+
+ vendor.id pci 0x1495
++vendor.name TOKAI Communications Industry Co. Ltd
+
+ vendor.id pci 0x1496
++vendor.name JOYTECH Computer Co., Ltd.
+
+ vendor.id pci 0x1497
++vendor.name SMA Regelsysteme GmBH
+
+ vendor.id pci 0x1498
++vendor.name TEWS Datentechnik GmBH
+
+ vendor.id pci 0x1498
+&device.id pci 0x30c8
++device.name TPCI200
+
+ vendor.id pci 0x1499
++vendor.name EMTEC CO., Ltd
+
+ vendor.id pci 0x149a
++vendor.name ANDOR Technology Ltd
+
+ vendor.id pci 0x149b
++vendor.name SEIKO Instruments Inc
+
+ vendor.id pci 0x149c
++vendor.name OVISLINK Corp.
+
+ vendor.id pci 0x149d
++vendor.name NEWTEK Inc
+
+ vendor.id pci 0x149d
+&device.id pci 0x0001
++device.name Video Toaster for PC
+
+ vendor.id pci 0x149e
++vendor.name Mapletree Networks Inc.
+
+ vendor.id pci 0x149f
++vendor.name LECTRON Co Ltd
+
+ vendor.id pci 0x14a0
++vendor.name SOFTING GmBH
+
+ vendor.id pci 0x14a1
++vendor.name Systembase Co Ltd
+
+ vendor.id pci 0x14a2
++vendor.name Millennium Engineering Inc
+
+ vendor.id pci 0x14a3
++vendor.name Maverick Networks
+
+ vendor.id pci 0x14a4
++vendor.name GVC/BCM Advanced Research
+
+ vendor.id pci 0x14a5
++vendor.name XIONICS Document Technologies Inc
+
+ vendor.id pci 0x14a6
++vendor.name INOVA Computers GmBH & Co KG
+
+ vendor.id pci 0x14a7
++vendor.name MYTHOS Systems Inc
+
+ vendor.id pci 0x14a8
++vendor.name FEATRON Technologies Corporation
+
+ vendor.id pci 0x14a9
++vendor.name HIVERTEC Inc
+
+ vendor.id pci 0x14aa
++vendor.name Advanced MOS Technology Inc
+
+ vendor.id pci 0x14ab
++vendor.name Mentor Graphics Corp.
+
+ vendor.id pci 0x14ac
++vendor.name Novaweb Technologies Inc
+
+ vendor.id pci 0x14ad
++vendor.name Time Space Radio AB
+
+ vendor.id pci 0x14ae
++vendor.name CTI, Inc
+
+ vendor.id pci 0x14af
++vendor.name Guillemot Corporation
+
+ vendor.id pci 0x14af
+&device.id pci 0x7102
++device.name 3D Prophet II MX
+
+ vendor.id pci 0x14b0
++vendor.name BST Communication Technology Ltd
+
+ vendor.id pci 0x14b1
++vendor.name Nextcom K.K.
+
+ vendor.id pci 0x14b2
++vendor.name ENNOVATE Networks Inc
+
+ vendor.id pci 0x14b3
++vendor.name XPEED Inc
+
+ vendor.id pci 0x14b3
+&device.id pci 0x0000
++device.name DSL NIC
+
+ vendor.id pci 0x14b4
++vendor.name PHILIPS Business Electronics B.V.
+
+ vendor.id pci 0x14b5
++vendor.name Creamware GmBH
+
+ vendor.id pci 0x14b5
+&device.id pci 0x0200
++device.name Scope
+
+ vendor.id pci 0x14b5
+&device.id pci 0x0300
++device.name Pulsar
+
+ vendor.id pci 0x14b5
+&device.id pci 0x0400
++device.name PulsarSRB
+
+ vendor.id pci 0x14b5
+&device.id pci 0x0600
++device.name Pulsar2
+
+ vendor.id pci 0x14b5
+&device.id pci 0x0800
++device.name DSP-Board
+
+ vendor.id pci 0x14b5
+&device.id pci 0x0900
++device.name DSP-Board
+
+ vendor.id pci 0x14b5
+&device.id pci 0x0a00
++device.name DSP-Board
+
+ vendor.id pci 0x14b5
+&device.id pci 0x0b00
++device.name DSP-Board
+
+ vendor.id pci 0x14b6
++vendor.name Quantum Data Corp.
+
+ vendor.id pci 0x14b7
++vendor.name PROXIM Inc
+
+ vendor.id pci 0x14b7
+&device.id pci 0x0001
++device.name Symphony 4110
+
+ vendor.id pci 0x14b8
++vendor.name Techsoft Technology Co Ltd
+
+ vendor.id pci 0x14b9
++vendor.name AIRONET Wireless Communications
+
+ vendor.id pci 0x14b9
+&device.id pci 0x0001
++device.name PC4800
+
+ vendor.id pci 0x14b9
+&device.id pci 0x0340
++device.name PC4800
+
+ vendor.id pci 0x14b9
+&device.id pci 0x0350
++device.name PC4800
+
+ vendor.id pci 0x14b9
+&device.id pci 0x4500
++device.name PC4500
+
+ vendor.id pci 0x14b9
+&device.id pci 0x4800
++device.name Cisco Aironet 340 802.11b Wireless LAN Adapter/Aironet PC4800
+
+ vendor.id pci 0x14b9
+&device.id pci 0xa504
++device.name Cisco Aironet Wireless 802.11b
+
+ vendor.id pci 0x14b9
+&device.id pci 0xa505
++device.name Cisco Aironet CB20a 802.11a Wireless LAN Adapter
+
+ vendor.id pci 0x14b9
+&device.id pci 0xa506
++device.name Cisco Aironet Mini PCI b/g
+
+ vendor.id pci 0x14ba
++vendor.name INTERNIX Inc.
+
+ vendor.id pci 0x14bb
++vendor.name SEMTECH Corporation
+
+ vendor.id pci 0x14bc
++vendor.name Globespan Semiconductor Inc.
+
+ vendor.id pci 0x14bd
++vendor.name CARDIO Control N.V.
+
+ vendor.id pci 0x14be
++vendor.name L3 Communications
+
+ vendor.id pci 0x14bf
++vendor.name SPIDER Communications Inc.
+
+ vendor.id pci 0x14c0
++vendor.name COMPAL Electronics Inc
+
+ vendor.id pci 0x14c1
++vendor.name MYRICOM Inc.
+
+ vendor.id pci 0x14c1
+&device.id pci 0x8043
++device.name Myrinet 2000 Scalable Cluster Interconnect
+
+ vendor.id pci 0x14c2
++vendor.name DTK Computer
+
+ vendor.id pci 0x14c3
++vendor.name MEDIATEK Corp.
+
+ vendor.id pci 0x14c4
++vendor.name IWASAKI Information Systems Co Ltd
+
+ vendor.id pci 0x14c5
++vendor.name Automation Products AB
+
+ vendor.id pci 0x14c6
++vendor.name Data Race Inc
+
+ vendor.id pci 0x14c7
++vendor.name Modular Technology Holdings Ltd
+
+ vendor.id pci 0x14c8
++vendor.name Turbocomm Tech. Inc.
+
+ vendor.id pci 0x14c9
++vendor.name ODIN Telesystems Inc
+
+ vendor.id pci 0x14ca
++vendor.name PE Logic Corp.
+
+ vendor.id pci 0x14cb
++vendor.name Billionton Systems Inc
+
+ vendor.id pci 0x14cc
++vendor.name NAKAYO Telecommunications Inc
+
+ vendor.id pci 0x14cd
++vendor.name Universal Scientific Ind.
+
+ vendor.id pci 0x14ce
++vendor.name Whistle Communications
+
+ vendor.id pci 0x14cf
++vendor.name TEK Microsystems Inc.
+
+ vendor.id pci 0x14d0
++vendor.name Ericsson Axe R & D
+
+ vendor.id pci 0x14d1
++vendor.name Computer Hi-Tech Co Ltd
+
+ vendor.id pci 0x14d2
++vendor.name Titan Electronics Inc
+
+ vendor.id pci 0x14d2
+&device.id pci 0x8001
++device.name VScom 010L 1 port parallel adaptor
+
+ vendor.id pci 0x14d2
+&device.id pci 0x8002
++device.name VScom 020L 2 port parallel adaptor
+
+ vendor.id pci 0x14d2
+&device.id pci 0x8010
++device.name VScom 100L 1 port serial adaptor
+
+ vendor.id pci 0x14d2
+&device.id pci 0x8011
++device.name VScom 110L 1 port serial and 1 port parallel adaptor
+
+ vendor.id pci 0x14d2
+&device.id pci 0x8020
++device.name VScom 200L 1 port serial adaptor
+
+ vendor.id pci 0x14d2
+&device.id pci 0x8021
++device.name VScom 210L 2 port serial and 1 port parallel adaptor
+
+ vendor.id pci 0x14d2
+&device.id pci 0x8040
++device.name VScom 400L 4 port serial adaptor
+
+ vendor.id pci 0x14d2
+&device.id pci 0x8080
++device.name VScom 800L 8 port serial adaptor
+
+ vendor.id pci 0x14d2
+&device.id pci 0xa000
++device.name VScom 010H 1 port parallel adaptor
+
+ vendor.id pci 0x14d2
+&device.id pci 0xa001
++device.name VScom 100H 1 port serial adaptor
+
+ vendor.id pci 0x14d2
+&device.id pci 0xa003
++device.name VScom 400H 4 port serial adaptor
+
+ vendor.id pci 0x14d2
+&device.id pci 0xa004
++device.name VScom 400HF1 4 port serial adaptor
+
+ vendor.id pci 0x14d2
+&device.id pci 0xa005
++device.name VScom 200H 2 port serial adaptor
+
+ vendor.id pci 0x14d2
+&device.id pci 0xe001
++device.name VScom 010HV2 1 port parallel adaptor
+
+ vendor.id pci 0x14d2
+&device.id pci 0xe010
++device.name VScom 100HV2 1 port serial adaptor
+
+ vendor.id pci 0x14d2
+&device.id pci 0xe020
++device.name VScom 200HV2 2 port serial adaptor
+
+ vendor.id pci 0x14d3
++vendor.name CIRTECH (UK) Ltd
+
+ vendor.id pci 0x14d4
++vendor.name Panacom Technology Corp
+
+ vendor.id pci 0x14d5
++vendor.name Nitsuko Corporation
+
+ vendor.id pci 0x14d6
++vendor.name Accusys Inc
+
+ vendor.id pci 0x14d7
++vendor.name Hirakawa Hewtech Corp
+
+ vendor.id pci 0x14d8
++vendor.name HOPF Elektronik GmBH
+
+ vendor.id pci 0x14d9
++vendor.name Alliance Semiconductor Corporation
+
+ vendor.id pci 0x14d9
+&device.id pci 0x0010
++device.name AP1011/SP1011 HyperTransport-PCI Bridge [Sturgeon]
+
+ vendor.id pci 0x14d9
+&device.id pci 0x9000
++device.name AS90L10204/10208 HyperTransport to PCI-X Bridge
+
+ vendor.id pci 0x14da
++vendor.name National Aerospace Laboratories
+
+ vendor.id pci 0x14db
++vendor.name AFAVLAB Technology Inc
+
+ vendor.id pci 0x14db
+&device.id pci 0x2120
++device.name TK9902
+
+ vendor.id pci 0x14dc
++vendor.name Amplicon Liveline Ltd
+
+ vendor.id pci 0x14dc
+&device.id pci 0x0000
++device.name PCI230
+
+ vendor.id pci 0x14dc
+&device.id pci 0x0001
++device.name PCI242
+
+ vendor.id pci 0x14dc
+&device.id pci 0x0002
++device.name PCI244
+
+ vendor.id pci 0x14dc
+&device.id pci 0x0003
++device.name PCI247
+
+ vendor.id pci 0x14dc
+&device.id pci 0x0004
++device.name PCI248
+
+ vendor.id pci 0x14dc
+&device.id pci 0x0005
++device.name PCI249
+
+ vendor.id pci 0x14dc
+&device.id pci 0x0006
++device.name PCI260
+
+ vendor.id pci 0x14dc
+&device.id pci 0x0007
++device.name PCI224
+
+ vendor.id pci 0x14dc
+&device.id pci 0x0008
++device.name PCI234
+
+ vendor.id pci 0x14dc
+&device.id pci 0x0009
++device.name PCI236
+
+ vendor.id pci 0x14dc
+&device.id pci 0x000a
++device.name PCI272
+
+ vendor.id pci 0x14dc
+&device.id pci 0x000b
++device.name PCI215
+
+ vendor.id pci 0x14dd
++vendor.name Boulder Design Labs Inc
+
+ vendor.id pci 0x14de
++vendor.name Applied Integration Corporation
+
+ vendor.id pci 0x14df
++vendor.name ASIC Communications Corp
+
+ vendor.id pci 0x14e1
++vendor.name INVERTEX
+
+ vendor.id pci 0x14e2
++vendor.name INFOLIBRIA
+
+ vendor.id pci 0x14e3
++vendor.name AMTELCO
+
+ vendor.id pci 0x14e4
++vendor.name Broadcom Corporation
+
+ vendor.id pci 0x14e4
+&device.id pci 0x0800
++device.name Sentry5 Chipcommon I/O Controller
+
+ vendor.id pci 0x14e4
+&device.id pci 0x0804
++device.name Sentry5 PCI Bridge
+
+ vendor.id pci 0x14e4
+&device.id pci 0x0805
++device.name Sentry5 MIPS32 CPU
+
+ vendor.id pci 0x14e4
+&device.id pci 0x0806
++device.name Sentry5 Ethernet Controller
+
+ vendor.id pci 0x14e4
+&device.id pci 0x080b
++device.name Sentry5 Crypto Accelerator
+
+ vendor.id pci 0x14e4
+&device.id pci 0x080f
++device.name Sentry5 DDR/SDR RAM Controller
+
+ vendor.id pci 0x14e4
+&device.id pci 0x0811
++device.name Sentry5 External Interface Core
+
+ vendor.id pci 0x14e4
+&device.id pci 0x0816
++device.name BCM3302 Sentry5 MIPS32 CPU
+
+ vendor.id pci 0x14e4
+&device.id pci 0x1644
++device.name NetXtreme BCM5700 Gigabit Ethernet
+
+ vendor.id pci 0x14e4
+&device.id pci 0x1644
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x0277
++subdevice.name Broadcom Vigil B5700 1000Base-T
+
+ vendor.id pci 0x14e4
+&device.id pci 0x1644
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x00d1
++subdevice.name Broadcom BCM5700
+
+ vendor.id pci 0x14e4
+&device.id pci 0x1644
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x0106
++subdevice.name Broadcom BCM5700
+
+ vendor.id pci 0x14e4
+&device.id pci 0x1644
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x0109
++subdevice.name Broadcom BCM5700 1000Base-T
+
+ vendor.id pci 0x14e4
+&device.id pci 0x1644
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x010a
++subdevice.name Broadcom BCM5700 1000BaseTX
+
+ vendor.id pci 0x14e4
+&device.id pci 0x1644
+&subvendor.id pci 0x10b7
+&subdevice.id pci 0x1000
++subdevice.name 3C996-T 1000Base-T
+
+ vendor.id pci 0x14e4
+&device.id pci 0x1644
+&subvendor.id pci 0x10b7
+&subdevice.id pci 0x1001
++subdevice.name 3C996B-T 1000Base-T
+
+ vendor.id pci 0x14e4
+&device.id pci 0x1644
+&subvendor.id pci 0x10b7
+&subdevice.id pci 0x1002
++subdevice.name 3C996C-T 1000Base-T
+
+ vendor.id pci 0x14e4
+&device.id pci 0x1644
+&subvendor.id pci 0x10b7
+&subdevice.id pci 0x1003
++subdevice.name 3C997-T 1000Base-T Dual Port
+
+ vendor.id pci 0x14e4
+&device.id pci 0x1644
+&subvendor.id pci 0x10b7
+&subdevice.id pci 0x1004
++subdevice.name 3C996-SX 1000Base-SX
+
+ vendor.id pci 0x14e4
+&device.id pci 0x1644
+&subvendor.id pci 0x10b7
+&subdevice.id pci 0x1005
++subdevice.name 3C997-SX 1000Base-SX Dual Port
+
+ vendor.id pci 0x14e4
+&device.id pci 0x1644
+&subvendor.id pci 0x10b7
+&subdevice.id pci 0x1008
++subdevice.name 3C942 Gigabit LOM (31X31)
+
+ vendor.id pci 0x14e4
+&device.id pci 0x1644
+&subvendor.id pci 0x14e4
+&subdevice.id pci 0x0002
++subdevice.name NetXtreme 1000Base-SX
+
+ vendor.id pci 0x14e4
+&device.id pci 0x1644
+&subvendor.id pci 0x14e4
+&subdevice.id pci 0x0003
++subdevice.name NetXtreme 1000Base-SX
+
+ vendor.id pci 0x14e4
+&device.id pci 0x1644
+&subvendor.id pci 0x14e4
+&subdevice.id pci 0x0004
++subdevice.name NetXtreme 1000Base-T
+
+ vendor.id pci 0x14e4
+&device.id pci 0x1644
+&subvendor.id pci 0x14e4
+&subdevice.id pci 0x1028
++subdevice.name NetXtreme 1000BaseTX
+
+ vendor.id pci 0x14e4
+&device.id pci 0x1644
+&subvendor.id pci 0x14e4
+&subdevice.id pci 0x1644
++subdevice.name BCM5700 1000Base-T
+
+ vendor.id pci 0x14e4
+&device.id pci 0x1645
++device.name NetXtreme BCM5701 Gigabit Ethernet
+
+ vendor.id pci 0x14e4
+&device.id pci 0x1645
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0x007c
++subdevice.name Compaq NC7770 Gigabit Server Adapter
+
+ vendor.id pci 0x14e4
+&device.id pci 0x1645
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0x007d
++subdevice.name Compaq NC6770 Gigabit Server Adapter
+
+ vendor.id pci 0x14e4
+&device.id pci 0x1645
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0x0085
++subdevice.name Compaq NC7780 Gigabit Server Adapter
+
+ vendor.id pci 0x14e4
+&device.id pci 0x1645
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0x0099
++subdevice.name NC7780 Gigabit Server Adapter (embedded, WOL)
+
+ vendor.id pci 0x14e4
+&device.id pci 0x1645
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0x009a
++subdevice.name NC7770 Gigabit Server Adapter (PCI-X, 10/100/1000-T)
+
+ vendor.id pci 0x14e4
+&device.id pci 0x1645
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0x00c1
++subdevice.name NC6770 Gigabit Server Adapter (PCI-X, 1000-SX)
+
+ vendor.id pci 0x14e4
+&device.id pci 0x1645
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x0121
++subdevice.name Broadcom BCM5701 1000Base-T
+
+ vendor.id pci 0x14e4
+&device.id pci 0x1645
+&subvendor.id pci 0x103c
+&subdevice.id pci 0x128a
++subdevice.name HP 1000Base-T (PCI) [A7061A]
+
+ vendor.id pci 0x14e4
+&device.id pci 0x1645
+&subvendor.id pci 0x103c
+&subdevice.id pci 0x128b
++subdevice.name HP 1000Base-SX (PCI) [A7073A]
+
+ vendor.id pci 0x14e4
+&device.id pci 0x1645
+&subvendor.id pci 0x103c
+&subdevice.id pci 0x12a4
++subdevice.name HP Core Lan 1000Base-T
+
+ vendor.id pci 0x14e4
+&device.id pci 0x1645
+&subvendor.id pci 0x103c
+&subdevice.id pci 0x12c1
++subdevice.name HP IOX Core Lan 1000Base-T [A7109AX]
+
+ vendor.id pci 0x14e4
+&device.id pci 0x1645
+&subvendor.id pci 0x10a9
+&subdevice.id pci 0x8010
++subdevice.name SGI IO9/IO10 Gigabit Ethernet (Copper)
+
+ vendor.id pci 0x14e4
+&device.id pci 0x1645
+&subvendor.id pci 0x10a9
+&subdevice.id pci 0x8011
++subdevice.name SGI Gigabit Ethernet (Copper)
+
+ vendor.id pci 0x14e4
+&device.id pci 0x1645
+&subvendor.id pci 0x10a9
+&subdevice.id pci 0x8012
++subdevice.name SGI Gigabit Ethernet (Fiber)
+
+ vendor.id pci 0x14e4
+&device.id pci 0x1645
+&subvendor.id pci 0x10b7
+&subdevice.id pci 0x1004
++subdevice.name 3C996-SX 1000Base-SX
+
+ vendor.id pci 0x14e4
+&device.id pci 0x1645
+&subvendor.id pci 0x10b7
+&subdevice.id pci 0x1006
++subdevice.name 3C996B-T 1000Base-T
+
+ vendor.id pci 0x14e4
+&device.id pci 0x1645
+&subvendor.id pci 0x10b7
+&subdevice.id pci 0x1007
++subdevice.name 3C1000-T 1000Base-T
+
+ vendor.id pci 0x14e4
+&device.id pci 0x1645
+&subvendor.id pci 0x10b7
+&subdevice.id pci 0x1008
++subdevice.name 3C940-BR01 1000Base-T
+
+ vendor.id pci 0x14e4
+&device.id pci 0x1645
+&subvendor.id pci 0x14e4
+&subdevice.id pci 0x0001
++subdevice.name BCM5701 1000Base-T
+
+ vendor.id pci 0x14e4
+&device.id pci 0x1645
+&subvendor.id pci 0x14e4
+&subdevice.id pci 0x0005
++subdevice.name BCM5701 1000Base-T
+
+ vendor.id pci 0x14e4
+&device.id pci 0x1645
+&subvendor.id pci 0x14e4
+&subdevice.id pci 0x0006
++subdevice.name BCM5701 1000Base-T
+
+ vendor.id pci 0x14e4
+&device.id pci 0x1645
+&subvendor.id pci 0x14e4
+&subdevice.id pci 0x0007
++subdevice.name BCM5701 1000Base-SX
+
+ vendor.id pci 0x14e4
+&device.id pci 0x1645
+&subvendor.id pci 0x14e4
+&subdevice.id pci 0x0008
++subdevice.name BCM5701 1000Base-T
+
+ vendor.id pci 0x14e4
+&device.id pci 0x1645
+&subvendor.id pci 0x14e4
+&subdevice.id pci 0x8008
++subdevice.name BCM5701 1000Base-T
+
+ vendor.id pci 0x14e4
+&device.id pci 0x1646
++device.name NetXtreme BCM5702 Gigabit Ethernet
+
+ vendor.id pci 0x14e4
+&device.id pci 0x1646
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0x00bb
++subdevice.name Compaq NC7760 Gigabit Server Adapter
+
+ vendor.id pci 0x14e4
+&device.id pci 0x1646
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x0126
++subdevice.name Broadcom BCM5702 1000BaseTX
+
+ vendor.id pci 0x14e4
+&device.id pci 0x1646
+&subvendor.id pci 0x14e4
+&subdevice.id pci 0x8009
++subdevice.name BCM5702 1000BaseTX
+
+ vendor.id pci 0x14e4
+&device.id pci 0x1647
++device.name NetXtreme BCM5703 Gigabit Ethernet
+
+ vendor.id pci 0x14e4
+&device.id pci 0x1647
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0x0099
++subdevice.name Compaq NC7780 Gigabit Server Adapter
+
+ vendor.id pci 0x14e4
+&device.id pci 0x1647
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0x009a
++subdevice.name Compaq NC7770 Gigabit Server Adapter
+
+ vendor.id pci 0x14e4
+&device.id pci 0x1647
+&subvendor.id pci 0x10a9
+&subdevice.id pci 0x8010
++subdevice.name SGI IO9/IO10 Gigabit Ethernet (Copper)
+
+ vendor.id pci 0x14e4
+&device.id pci 0x1647
+&subvendor.id pci 0x14e4
+&subdevice.id pci 0x0009
++subdevice.name BCM5703 1000BaseTX
+
+ vendor.id pci 0x14e4
+&device.id pci 0x1647
+&subvendor.id pci 0x14e4
+&subdevice.id pci 0x000a
++subdevice.name BCM5703 1000BaseSX
+
+ vendor.id pci 0x14e4
+&device.id pci 0x1647
+&subvendor.id pci 0x14e4
+&subdevice.id pci 0x000b
++subdevice.name BCM5703 1000BaseTX
+
+ vendor.id pci 0x14e4
+&device.id pci 0x1647
+&subvendor.id pci 0x14e4
+&subdevice.id pci 0x8009
++subdevice.name BCM5703 1000BaseTX
+
+ vendor.id pci 0x14e4
+&device.id pci 0x1647
+&subvendor.id pci 0x14e4
+&subdevice.id pci 0x800a
++subdevice.name BCM5703 1000BaseTX
+
+ vendor.id pci 0x14e4
+&device.id pci 0x1648
++device.name NetXtreme BCM5704 Gigabit Ethernet
+
+ vendor.id pci 0x14e4
+&device.id pci 0x1648
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0x00cf
++subdevice.name NC7772 Gigabit Server Adapter (PCI-X, 10,100,1000-T)
+
+ vendor.id pci 0x14e4
+&device.id pci 0x1648
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0x00d0
++subdevice.name NC7782 Gigabit Server Adapter (PCI-X, 10,100,1000-T)
+
+ vendor.id pci 0x14e4
+&device.id pci 0x1648
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0x00d1
++subdevice.name NC7783 Gigabit Server Adapter (PCI-X, 10,100,1000-T)
+
+ vendor.id pci 0x14e4
+&device.id pci 0x1648
+&subvendor.id pci 0x10b7
+&subdevice.id pci 0x2000
++subdevice.name 3C998-T Dual Port 10/100/1000 PCI-X
+
+ vendor.id pci 0x14e4
+&device.id pci 0x1648
+&subvendor.id pci 0x10b7
+&subdevice.id pci 0x3000
++subdevice.name 3C999-T Quad Port 10/100/1000 PCI-X
+
+ vendor.id pci 0x14e4
+&device.id pci 0x1648
+&subvendor.id pci 0x1166
+&subdevice.id pci 0x1648
++subdevice.name NetXtreme CIOB-E 1000Base-T
+
+ vendor.id pci 0x14e4
+&device.id pci 0x164a
++device.name NetXtreme II BCM5706 Gigabit Ethernet
+
+ vendor.id pci 0x14e4
+&device.id pci 0x164d
++device.name NetXtreme BCM5702FE Gigabit Ethernet
+
+ vendor.id pci 0x14e4
+&device.id pci 0x1653
++device.name NetXtreme BCM5705 Gigabit Ethernet
+
+ vendor.id pci 0x14e4
+&device.id pci 0x1653
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0x00e3
++subdevice.name NC7761 Gigabit Server Adapter
+
+ vendor.id pci 0x14e4
+&device.id pci 0x1654
++device.name NetXtreme BCM5705_2 Gigabit Ethernet
+
+ vendor.id pci 0x14e4
+&device.id pci 0x1654
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0x00e3
++subdevice.name NC7761 Gigabit Server Adapter
+
+ vendor.id pci 0x14e4
+&device.id pci 0x1654
+&subvendor.id pci 0x103c
+&subdevice.id pci 0x3100
++subdevice.name NC1020 HP ProLiant Gigabit Server Adapter 32 PCI
+
+ vendor.id pci 0x14e4
+&device.id pci 0x1659
++device.name NetXtreme BCM5721 Gigabit Ethernet PCI Express
+
+ vendor.id pci 0x14e4
+&device.id pci 0x165d
++device.name NetXtreme BCM5705M Gigabit Ethernet
+
+ vendor.id pci 0x14e4
+&device.id pci 0x165e
++device.name NetXtreme BCM5705M_2 Gigabit Ethernet
+
+ vendor.id pci 0x14e4
+&device.id pci 0x165e
+&subvendor.id pci 0x103c
+&subdevice.id pci 0x0890
++subdevice.name NC6000 laptop
+
+ vendor.id pci 0x14e4
+&device.id pci 0x166e
++device.name 570x 10/100 Integrated Controller
+
+ vendor.id pci 0x14e4
+&device.id pci 0x1677
++device.name NetXtreme BCM5751 Gigabit Ethernet PCI Express
+
+ vendor.id pci 0x14e4
+&device.id pci 0x1677
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x0179
++subdevice.name Optiplex GX280
+
+ vendor.id pci 0x14e4
+&device.id pci 0x167d
++device.name NetXtreme BCM5751M Gigabit Ethernet PCI Express
+
+ vendor.id pci 0x14e4
+&device.id pci 0x167e
++device.name NetXtreme BCM5751F Fast Ethernet PCI Express
+
+ vendor.id pci 0x14e4
+&device.id pci 0x1696
++device.name NetXtreme BCM5782 Gigabit Ethernet
+
+ vendor.id pci 0x14e4
+&device.id pci 0x1696
+&subvendor.id pci 0x103c
+&subdevice.id pci 0x12bc
++subdevice.name HP d530 CMT (DG746A)
+
+ vendor.id pci 0x14e4
+&device.id pci 0x1696
+&subvendor.id pci 0x14e4
+&subdevice.id pci 0x000d
++subdevice.name NetXtreme BCM5782 1000Base-T
+
+ vendor.id pci 0x14e4
+&device.id pci 0x169c
++device.name NetXtreme BCM5788 Gigabit Ethernet
+
+ vendor.id pci 0x14e4
+&device.id pci 0x169d
++device.name NetLink BCM5789 Gigabit Ethernet PCI Express
+
+ vendor.id pci 0x14e4
+&device.id pci 0x16a6
++device.name NetXtreme BCM5702X Gigabit Ethernet
+
+ vendor.id pci 0x14e4
+&device.id pci 0x16a6
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0x00bb
++subdevice.name NC7760 Gigabit Server Adapter (PCI-X, 10/100/1000-T)
+
+ vendor.id pci 0x14e4
+&device.id pci 0x16a6
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x0126
++subdevice.name BCM5702 1000Base-T
+
+ vendor.id pci 0x14e4
+&device.id pci 0x16a6
+&subvendor.id pci 0x14e4
+&subdevice.id pci 0x000c
++subdevice.name BCM5702 1000Base-T
+
+ vendor.id pci 0x14e4
+&device.id pci 0x16a6
+&subvendor.id pci 0x14e4
+&subdevice.id pci 0x8009
++subdevice.name BCM5702 1000Base-T
+
+ vendor.id pci 0x14e4
+&device.id pci 0x16a7
++device.name NetXtreme BCM5703X Gigabit Ethernet
+
+ vendor.id pci 0x14e4
+&device.id pci 0x16a7
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0x00ca
++subdevice.name NC7771 Gigabit Server Adapter (PCI-X, 10,100,1000-T)
+
+ vendor.id pci 0x14e4
+&device.id pci 0x16a7
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0x00cb
++subdevice.name NC7781 Gigabit Server Adapter (PCI-X, 10,100,1000-T)
+
+ vendor.id pci 0x14e4
+&device.id pci 0x16a7
+&subvendor.id pci 0x14e4
+&subdevice.id pci 0x0009
++subdevice.name NetXtreme BCM5703 1000Base-T
+
+ vendor.id pci 0x14e4
+&device.id pci 0x16a7
+&subvendor.id pci 0x14e4
+&subdevice.id pci 0x000a
++subdevice.name NetXtreme BCM5703 1000Base-SX
+
+ vendor.id pci 0x14e4
+&device.id pci 0x16a7
+&subvendor.id pci 0x14e4
+&subdevice.id pci 0x000b
++subdevice.name NetXtreme BCM5703 1000Base-T
+
+ vendor.id pci 0x14e4
+&device.id pci 0x16a7
+&subvendor.id pci 0x14e4
+&subdevice.id pci 0x800a
++subdevice.name NetXtreme BCM5703 1000Base-T
+
+ vendor.id pci 0x14e4
+&device.id pci 0x16a8
++device.name NetXtreme BCM5704S Gigabit Ethernet
+
+ vendor.id pci 0x14e4
+&device.id pci 0x16a8
+&subvendor.id pci 0x10b7
+&subdevice.id pci 0x2001
++subdevice.name 3C998-SX Dual Port 1000-SX PCI-X
+
+ vendor.id pci 0x14e4
+&device.id pci 0x16aa
++device.name NetXtreme II BCM5706S Gigabit Ethernet
+
+ vendor.id pci 0x14e4
+&device.id pci 0x16c6
++device.name NetXtreme BCM5702A3 Gigabit Ethernet
+
+ vendor.id pci 0x14e4
+&device.id pci 0x16c6
+&subvendor.id pci 0x10b7
+&subdevice.id pci 0x1100
++subdevice.name 3C1000B-T 10/100/1000 PCI
+
+ vendor.id pci 0x14e4
+&device.id pci 0x16c6
+&subvendor.id pci 0x14e4
+&subdevice.id pci 0x000c
++subdevice.name BCM5702 1000Base-T
+
+ vendor.id pci 0x14e4
+&device.id pci 0x16c6
+&subvendor.id pci 0x14e4
+&subdevice.id pci 0x8009
++subdevice.name BCM5702 1000Base-T
+
+ vendor.id pci 0x14e4
+&device.id pci 0x16c7
++device.name NetXtreme BCM5703 Gigabit Ethernet
+
+ vendor.id pci 0x14e4
+&device.id pci 0x16c7
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0x00ca
++subdevice.name NC7771 Gigabit Server Adapter (PCI-X, 10,100,1000-T)
+
+ vendor.id pci 0x14e4
+&device.id pci 0x16c7
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0x00cb
++subdevice.name NC7781 Gigabit Server Adapter (PCI-X, 10,100,1000-T)
+
+ vendor.id pci 0x14e4
+&device.id pci 0x16c7
+&subvendor.id pci 0x103c
+&subdevice.id pci 0x12c3
++subdevice.name HP Combo FC/GigE-SX [A9782A]
+
+ vendor.id pci 0x14e4
+&device.id pci 0x16c7
+&subvendor.id pci 0x103c
+&subdevice.id pci 0x12ca
++subdevice.name HP Combo FC/GigE-T [A9784A]
+
+ vendor.id pci 0x14e4
+&device.id pci 0x16c7
+&subvendor.id pci 0x14e4
+&subdevice.id pci 0x0009
++subdevice.name NetXtreme BCM5703 1000Base-T
+
+ vendor.id pci 0x14e4
+&device.id pci 0x16c7
+&subvendor.id pci 0x14e4
+&subdevice.id pci 0x000a
++subdevice.name NetXtreme BCM5703 1000Base-SX
+
+ vendor.id pci 0x14e4
+&device.id pci 0x16dd
++device.name NetLink BCM5781 Gigabit Ethernet PCI Express
+
+ vendor.id pci 0x14e4
+&device.id pci 0x16f7
++device.name NetXtreme BCM5753 Gigabit Ethernet PCI Express
+
+ vendor.id pci 0x14e4
+&device.id pci 0x16fd
++device.name NetXtreme BCM5753M Gigabit Ethernet PCI Express
+
+ vendor.id pci 0x14e4
+&device.id pci 0x16fe
++device.name NetXtreme BCM5753F Fast Ethernet PCI Express
+
+ vendor.id pci 0x14e4
+&device.id pci 0x170c
++device.name BCM4401-B0 100Base-TX
+
+ vendor.id pci 0x14e4
+&device.id pci 0x170d
++device.name NetXtreme BCM5901 100Base-TX
+
+ vendor.id pci 0x14e4
+&device.id pci 0x170d
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x0545
++subdevice.name ThinkPad R40e (2684-HVG) builtin ethernet controller
+
+ vendor.id pci 0x14e4
+&device.id pci 0x170e
++device.name NetXtreme BCM5901 100Base-TX
+
+ vendor.id pci 0x14e4
+&device.id pci 0x3352
++device.name BCM3352
+
+ vendor.id pci 0x14e4
+&device.id pci 0x3360
++device.name BCM3360
+
+ vendor.id pci 0x14e4
+&device.id pci 0x4210
++device.name BCM4210 iLine10 HomePNA 2.0
+
+ vendor.id pci 0x14e4
+&device.id pci 0x4211
++device.name BCM4211 iLine10 HomePNA 2.0 + V.90 56k modem
+
+ vendor.id pci 0x14e4
+&device.id pci 0x4212
++device.name BCM4212 v.90 56k modem
+
+ vendor.id pci 0x14e4
+&device.id pci 0x4301
++device.name BCM4303 802.11b Wireless LAN Controller
+
+ vendor.id pci 0x14e4
+&device.id pci 0x4301
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x0407
++subdevice.name TrueMobile 1180 Onboard WLAN
+
+ vendor.id pci 0x14e4
+&device.id pci 0x4301
+&subvendor.id pci 0x1043
+&subdevice.id pci 0x0120
++subdevice.name WL-103b Wireless LAN PC Card
+
+ vendor.id pci 0x14e4
+&device.id pci 0x4305
++device.name BCM4307 V.90 56k Modem
+
+ vendor.id pci 0x14e4
+&device.id pci 0x4306
++device.name BCM4307 Ethernet Controller
+
+ vendor.id pci 0x14e4
+&device.id pci 0x4307
++device.name BCM4307 802.11b Wireless LAN Controller
+
+ vendor.id pci 0x14e4
+&device.id pci 0x4310
++device.name BCM4310 Chipcommon I/OController
+
+ vendor.id pci 0x14e4
+&device.id pci 0x4312
++device.name BCM4310 UART
+
+ vendor.id pci 0x14e4
+&device.id pci 0x4313
++device.name BCM4310 Ethernet Controller
+
+ vendor.id pci 0x14e4
+&device.id pci 0x4315
++device.name BCM4310 USB Controller
+
+ vendor.id pci 0x14e4
+&device.id pci 0x4320
++device.name BCM4306 802.11b/g Wireless LAN Controller
+
+ vendor.id pci 0x14e4
+&device.id pci 0x4320
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x0001
++subdevice.name TrueMobile 1300 WLAN Mini-PCI Card
+
+ vendor.id pci 0x14e4
+&device.id pci 0x4320
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x0003
++subdevice.name Wireless 1350 WLAN Mini-PCI Card
+
+ vendor.id pci 0x14e4
+&device.id pci 0x4320
+&subvendor.id pci 0x1043
+&subdevice.id pci 0x100f
++subdevice.name WL-100G
+
+ vendor.id pci 0x14e4
+&device.id pci 0x4320
+&subvendor.id pci 0x14e4
+&subdevice.id pci 0x4320
++subdevice.name Linksys WMP54G PCI
+
+ vendor.id pci 0x14e4
+&device.id pci 0x4320
+&subvendor.id pci 0x1737
+&subdevice.id pci 0x4320
++subdevice.name WPC54G
+
+ vendor.id pci 0x14e4
+&device.id pci 0x4320
+&subvendor.id pci 0x1799
+&subdevice.id pci 0x7010
++subdevice.name Belkin F5D7010 54g Wireless Network card
+
+ vendor.id pci 0x14e4
+&device.id pci 0x4321
++device.name BCM4306 802.11a Wireless LAN Controller
+
+ vendor.id pci 0x14e4
+&device.id pci 0x4322
++device.name BCM4306 UART
+
+ vendor.id pci 0x14e4
+&device.id pci 0x4324
++device.name BCM4309 802.11a/b/g
+
+ vendor.id pci 0x14e4
+&device.id pci 0x4324
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x0001
++subdevice.name Truemobile 1400
+
+ vendor.id pci 0x14e4
+&device.id pci 0x4324
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x0003
++subdevice.name Truemobile 1450 MiniPCI
+
+ vendor.id pci 0x14e4
+&device.id pci 0x4325
++device.name BCM43xG 802.11b/g
+
+ vendor.id pci 0x14e4
+&device.id pci 0x4325
+&subvendor.id pci 0x1414
+&subdevice.id pci 0x0003
++subdevice.name Wireless Notebook Adapter MN-720
+
+ vendor.id pci 0x14e4
+&device.id pci 0x4325
+&subvendor.id pci 0x1414
+&subdevice.id pci 0x0004
++subdevice.name Wireless PCI Adapter MN-730
+
+ vendor.id pci 0x14e4
+&device.id pci 0x4326
++device.name BCM4307 Chipcommon I/O Controller?
+
+ vendor.id pci 0x14e4
+&device.id pci 0x4401
++device.name BCM4401 100Base-T
+
+ vendor.id pci 0x14e4
+&device.id pci 0x4401
+&subvendor.id pci 0x1043
+&subdevice.id pci 0x80a8
++subdevice.name A7V8X motherboard
+
+ vendor.id pci 0x14e4
+&device.id pci 0x4402
++device.name BCM4402 Integrated 10/100BaseT
+
+ vendor.id pci 0x14e4
+&device.id pci 0x4403
++device.name BCM4402 V.90 56k Modem
+
+ vendor.id pci 0x14e4
+&device.id pci 0x4410
++device.name BCM4413 iLine32 HomePNA 2.0
+
+ vendor.id pci 0x14e4
+&device.id pci 0x4411
++device.name BCM4413 V.90 56k modem
+
+ vendor.id pci 0x14e4
+&device.id pci 0x4412
++device.name BCM4412 10/100BaseT
+
+ vendor.id pci 0x14e4
+&device.id pci 0x4430
++device.name BCM44xx CardBus iLine32 HomePNA 2.0
+
+ vendor.id pci 0x14e4
+&device.id pci 0x4432
++device.name BCM4432 CardBus 10/100BaseT
+
+ vendor.id pci 0x14e4
+&device.id pci 0x4610
++device.name BCM4610 Sentry5 PCI to SB Bridge
+
+ vendor.id pci 0x14e4
+&device.id pci 0x4611
++device.name BCM4610 Sentry5 iLine32 HomePNA 1.0
+
+ vendor.id pci 0x14e4
+&device.id pci 0x4612
++device.name BCM4610 Sentry5 V.90 56k Modem
+
+ vendor.id pci 0x14e4
+&device.id pci 0x4613
++device.name BCM4610 Sentry5 Ethernet Controller
+
+ vendor.id pci 0x14e4
+&device.id pci 0x4614
++device.name BCM4610 Sentry5 External Interface
+
+ vendor.id pci 0x14e4
+&device.id pci 0x4615
++device.name BCM4610 Sentry5 USB Controller
+
+ vendor.id pci 0x14e4
+&device.id pci 0x4704
++device.name BCM4704 PCI to SB Bridge
+
+ vendor.id pci 0x14e4
+&device.id pci 0x4705
++device.name BCM4704 Sentry5 802.11b Wireless LAN Controller
+
+ vendor.id pci 0x14e4
+&device.id pci 0x4706
++device.name BCM4704 Sentry5 Ethernet Controller
+
+ vendor.id pci 0x14e4
+&device.id pci 0x4707
++device.name BCM4704 Sentry5 USB Controller
+
+ vendor.id pci 0x14e4
+&device.id pci 0x4708
++device.name BCM4704 Crypto Accelerator
+
+ vendor.id pci 0x14e4
+&device.id pci 0x4710
++device.name BCM4710 Sentry5 PCI to SB Bridge
+
+ vendor.id pci 0x14e4
+&device.id pci 0x4711
++device.name BCM47xx Sentry5 iLine32 HomePNA 2.0
+
+ vendor.id pci 0x14e4
+&device.id pci 0x4712
++device.name BCM47xx V.92 56k modem
+
+ vendor.id pci 0x14e4
+&device.id pci 0x4713
++device.name Sentry5 Ethernet Controller
+
+ vendor.id pci 0x14e4
+&device.id pci 0x4714
++device.name BCM47xx Sentry5 External Interface
+
+ vendor.id pci 0x14e4
+&device.id pci 0x4715
++device.name Sentry5 USB Controller
+
+ vendor.id pci 0x14e4
+&device.id pci 0x4716
++device.name BCM47xx Sentry5 USB Host Controller
+
+ vendor.id pci 0x14e4
+&device.id pci 0x4717
++device.name BCM47xx Sentry5 USB Device Controller
+
+ vendor.id pci 0x14e4
+&device.id pci 0x4718
++device.name Sentry5 Crypto Accelerator
+
+ vendor.id pci 0x14e4
+&device.id pci 0x4720
++device.name BCM4712 MIPS CPU
+
+ vendor.id pci 0x14e4
+&device.id pci 0x5365
++device.name BCM5365P Sentry5 Host Bridge
+
+ vendor.id pci 0x14e4
+&device.id pci 0x5600
++device.name BCM5600 StrataSwitch 24+2 Ethernet Switch Controller
+
+ vendor.id pci 0x14e4
+&device.id pci 0x5605
++device.name BCM5605 StrataSwitch 24+2 Ethernet Switch Controller
+
+ vendor.id pci 0x14e4
+&device.id pci 0x5615
++device.name BCM5615 StrataSwitch 24+2 Ethernet Switch Controller
+
+ vendor.id pci 0x14e4
+&device.id pci 0x5625
++device.name BCM5625 StrataSwitch 24+2 Ethernet Switch Controller
+
+ vendor.id pci 0x14e4
+&device.id pci 0x5645
++device.name BCM5645 StrataSwitch 24+2 Ethernet Switch Controller
+
+ vendor.id pci 0x14e4
+&device.id pci 0x5670
++device.name BCM5670 8-Port 10GE Ethernet Switch Fabric
+
+ vendor.id pci 0x14e4
+&device.id pci 0x5680
++device.name BCM5680 G-Switch 8 Port Gigabit Ethernet Switch Controller
+
+ vendor.id pci 0x14e4
+&device.id pci 0x5690
++device.name BCM5690 12-port Multi-Layer Gigabit Ethernet Switch
+
+ vendor.id pci 0x14e4
+&device.id pci 0x5691
++device.name BCM5691 GE/10GE 8+2 Gigabit Ethernet Switch Controller
+
+ vendor.id pci 0x14e4
+&device.id pci 0x5820
++device.name BCM5820 Crypto Accelerator
+
+ vendor.id pci 0x14e4
+&device.id pci 0x5821
++device.name BCM5821 Crypto Accelerator
+
+ vendor.id pci 0x14e4
+&device.id pci 0x5822
++device.name BCM5822 Crypto Accelerator
+
+ vendor.id pci 0x14e4
+&device.id pci 0x5823
++device.name BCM5823 Crypto Accelerator
+
+ vendor.id pci 0x14e4
+&device.id pci 0x5824
++device.name BCM5824 Crypto Accelerator
+
+ vendor.id pci 0x14e4
+&device.id pci 0x5840
++device.name BCM5840 Crypto Accelerator
+
+ vendor.id pci 0x14e4
+&device.id pci 0x5841
++device.name BCM5841 Crypto Accelerator
+
+ vendor.id pci 0x14e4
+&device.id pci 0x5850
++device.name BCM5850 Crypto Accelerator
+
+ vendor.id pci 0x14e5
++vendor.name Pixelfusion Ltd
+
+ vendor.id pci 0x14e6
++vendor.name SHINING Technology Inc
+
+ vendor.id pci 0x14e7
++vendor.name 3CX
+
+ vendor.id pci 0x14e8
++vendor.name RAYCER Inc
+
+ vendor.id pci 0x14e9
++vendor.name GARNETS System CO Ltd
+
+ vendor.id pci 0x14ea
++vendor.name Planex Communications, Inc
+
+ vendor.id pci 0x14ea
+&device.id pci 0xab06
++device.name FNW-3603-TX CardBus Fast Ethernet
+
+ vendor.id pci 0x14ea
+&device.id pci 0xab07
++device.name RTL81xx RealTek Ethernet
+
+ vendor.id pci 0x14eb
++vendor.name SEIKO EPSON Corp
+
+ vendor.id pci 0x14ec
++vendor.name ACQIRIS
+
+ vendor.id pci 0x14ed
++vendor.name DATAKINETICS Ltd
+
+ vendor.id pci 0x14ee
++vendor.name MASPRO KENKOH Corp
+
+ vendor.id pci 0x14ef
++vendor.name CARRY Computer ENG. CO Ltd
+
+ vendor.id pci 0x14f0
++vendor.name CANON RESEACH CENTRE FRANCE
+
+ vendor.id pci 0x14f1
++vendor.name Conexant
+
+ vendor.id pci 0x14f1
+&device.id pci 0x1002
++device.name HCF 56k Modem
+
+ vendor.id pci 0x14f1
+&device.id pci 0x1003
++device.name HCF 56k Modem
+
+ vendor.id pci 0x14f1
+&device.id pci 0x1004
++device.name HCF 56k Modem
+
+ vendor.id pci 0x14f1
+&device.id pci 0x1005
++device.name HCF 56k Modem
+
+ vendor.id pci 0x14f1
+&device.id pci 0x1006
++device.name HCF 56k Modem
+
+ vendor.id pci 0x14f1
+&device.id pci 0x1022
++device.name HCF 56k Modem
+
+ vendor.id pci 0x14f1
+&device.id pci 0x1023
++device.name HCF 56k Modem
+
+ vendor.id pci 0x14f1
+&device.id pci 0x1024
++device.name HCF 56k Modem
+
+ vendor.id pci 0x14f1
+&device.id pci 0x1025
++device.name HCF 56k Modem
+
+ vendor.id pci 0x14f1
+&device.id pci 0x1026
++device.name HCF 56k Modem
+
+ vendor.id pci 0x14f1
+&device.id pci 0x1032
++device.name HCF 56k Modem
+
+ vendor.id pci 0x14f1
+&device.id pci 0x1033
++device.name HCF 56k Data/Fax Modem
+
+ vendor.id pci 0x14f1
+&device.id pci 0x1033
+&subvendor.id pci 0x1033
+&subdevice.id pci 0x8077
++subdevice.name NEC
+
+ vendor.id pci 0x14f1
+&device.id pci 0x1033
+&subvendor.id pci 0x122d
+&subdevice.id pci 0x4027
++subdevice.name Dell Zeus - MDP3880-W(B) Data Fax Modem
+
+ vendor.id pci 0x14f1
+&device.id pci 0x1033
+&subvendor.id pci 0x122d
+&subdevice.id pci 0x4030
++subdevice.name Dell Mercury - MDP3880-U(B) Data Fax Modem
+
+ vendor.id pci 0x14f1
+&device.id pci 0x1033
+&subvendor.id pci 0x122d
+&subdevice.id pci 0x4034
++subdevice.name Dell Thor - MDP3880-W(U) Data Fax Modem
+
+ vendor.id pci 0x14f1
+&device.id pci 0x1033
+&subvendor.id pci 0x13e0
+&subdevice.id pci 0x020d
++subdevice.name Dell Copper
+
+ vendor.id pci 0x14f1
+&device.id pci 0x1033
+&subvendor.id pci 0x13e0
+&subdevice.id pci 0x020e
++subdevice.name Dell Silver
+
+ vendor.id pci 0x14f1
+&device.id pci 0x1033
+&subvendor.id pci 0x13e0
+&subdevice.id pci 0x0261
++subdevice.name IBM
+
+ vendor.id pci 0x14f1
+&device.id pci 0x1033
+&subvendor.id pci 0x13e0
+&subdevice.id pci 0x0290
++subdevice.name Compaq Goldwing
+
+ vendor.id pci 0x14f1
+&device.id pci 0x1033
+&subvendor.id pci 0x13e0
+&subdevice.id pci 0x02a0
++subdevice.name IBM
+
+ vendor.id pci 0x14f1
+&device.id pci 0x1033
+&subvendor.id pci 0x13e0
+&subdevice.id pci 0x02b0
++subdevice.name IBM
+
+ vendor.id pci 0x14f1
+&device.id pci 0x1033
+&subvendor.id pci 0x13e0
+&subdevice.id pci 0x02c0
++subdevice.name Compaq Scooter
+
+ vendor.id pci 0x14f1
+&device.id pci 0x1033
+&subvendor.id pci 0x13e0
+&subdevice.id pci 0x02d0
++subdevice.name IBM
+
+ vendor.id pci 0x14f1
+&device.id pci 0x1033
+&subvendor.id pci 0x144f
+&subdevice.id pci 0x1500
++subdevice.name IBM P85-DF (1)
+
+ vendor.id pci 0x14f1
+&device.id pci 0x1033
+&subvendor.id pci 0x144f
+&subdevice.id pci 0x1501
++subdevice.name IBM P85-DF (2)
+
+ vendor.id pci 0x14f1
+&device.id pci 0x1033
+&subvendor.id pci 0x144f
+&subdevice.id pci 0x150a
++subdevice.name IBM P85-DF (3)
+
+ vendor.id pci 0x14f1
+&device.id pci 0x1033
+&subvendor.id pci 0x144f
+&subdevice.id pci 0x150b
++subdevice.name IBM P85-DF Low Profile (1)
+
+ vendor.id pci 0x14f1
+&device.id pci 0x1033
+&subvendor.id pci 0x144f
+&subdevice.id pci 0x1510
++subdevice.name IBM P85-DF Low Profile (2)
+
+ vendor.id pci 0x14f1
+&device.id pci 0x1034
++device.name HCF 56k Data/Fax/Voice Modem
+
+ vendor.id pci 0x14f1
+&device.id pci 0x1035
++device.name HCF 56k Data/Fax/Voice/Spkp (w/Handset) Modem
+
+ vendor.id pci 0x14f1
+&device.id pci 0x1035
+&subvendor.id pci 0x10cf
+&subdevice.id pci 0x1098
++subdevice.name Fujitsu P85-DFSV
+
+ vendor.id pci 0x14f1
+&device.id pci 0x1036
++device.name HCF 56k Data/Fax/Voice/Spkp Modem
+
+ vendor.id pci 0x14f1
+&device.id pci 0x1036
+&subvendor.id pci 0x104d
+&subdevice.id pci 0x8067
++subdevice.name HCF 56k Modem
+
+ vendor.id pci 0x14f1
+&device.id pci 0x1036
+&subvendor.id pci 0x122d
+&subdevice.id pci 0x4029
++subdevice.name MDP3880SP-W
+
+ vendor.id pci 0x14f1
+&device.id pci 0x1036
+&subvendor.id pci 0x122d
+&subdevice.id pci 0x4031
++subdevice.name MDP3880SP-U
+
+ vendor.id pci 0x14f1
+&device.id pci 0x1036
+&subvendor.id pci 0x13e0
+&subdevice.id pci 0x0209
++subdevice.name Dell Titanium
+
+ vendor.id pci 0x14f1
+&device.id pci 0x1036
+&subvendor.id pci 0x13e0
+&subdevice.id pci 0x020a
++subdevice.name Dell Graphite
+
+ vendor.id pci 0x14f1
+&device.id pci 0x1036
+&subvendor.id pci 0x13e0
+&subdevice.id pci 0x0260
++subdevice.name Gateway Red Owl
+
+ vendor.id pci 0x14f1
+&device.id pci 0x1036
+&subvendor.id pci 0x13e0
+&subdevice.id pci 0x0270
++subdevice.name Gateway White Horse
+
+ vendor.id pci 0x14f1
+&device.id pci 0x1052
++device.name HCF 56k Data/Fax Modem (Worldwide)
+
+ vendor.id pci 0x14f1
+&device.id pci 0x1053
++device.name HCF 56k Data/Fax Modem (Worldwide)
+
+ vendor.id pci 0x14f1
+&device.id pci 0x1054
++device.name HCF 56k Data/Fax/Voice Modem (Worldwide)
+
+ vendor.id pci 0x14f1
+&device.id pci 0x1055
++device.name HCF 56k Data/Fax/Voice/Spkp (w/Handset) Modem (Worldwide)
+
+ vendor.id pci 0x14f1
+&device.id pci 0x1056
++device.name HCF 56k Data/Fax/Voice/Spkp Modem (Worldwide)
+
+ vendor.id pci 0x14f1
+&device.id pci 0x1057
++device.name HCF 56k Data/Fax/Voice/Spkp Modem (Worldwide)
+
+ vendor.id pci 0x14f1
+&device.id pci 0x1059
++device.name HCF 56k Data/Fax/Voice Modem (Worldwide)
+
+ vendor.id pci 0x14f1
+&device.id pci 0x1063
++device.name HCF 56k Data/Fax Modem
+
+ vendor.id pci 0x14f1
+&device.id pci 0x1064
++device.name HCF 56k Data/Fax/Voice Modem
+
+ vendor.id pci 0x14f1
+&device.id pci 0x1065
++device.name HCF 56k Data/Fax/Voice/Spkp (w/Handset) Modem
+
+ vendor.id pci 0x14f1
+&device.id pci 0x1066
++device.name HCF 56k Data/Fax/Voice/Spkp Modem
+
+ vendor.id pci 0x14f1
+&device.id pci 0x1066
+&subvendor.id pci 0x122d
+&subdevice.id pci 0x4033
++subdevice.name Dell Athena - MDP3900V-U
+
+ vendor.id pci 0x14f1
+&device.id pci 0x1433
++device.name HCF 56k Data/Fax Modem
+
+ vendor.id pci 0x14f1
+&device.id pci 0x1434
++device.name HCF 56k Data/Fax/Voice Modem
+
+ vendor.id pci 0x14f1
+&device.id pci 0x1435
++device.name HCF 56k Data/Fax/Voice/Spkp (w/Handset) Modem
+
+ vendor.id pci 0x14f1
+&device.id pci 0x1436
++device.name HCF 56k Data/Fax Modem
+
+ vendor.id pci 0x14f1
+&device.id pci 0x1453
++device.name HCF 56k Data/Fax Modem
+
+ vendor.id pci 0x14f1
+&device.id pci 0x1453
+&subvendor.id pci 0x13e0
+&subdevice.id pci 0x0240
++subdevice.name IBM
+
+ vendor.id pci 0x14f1
+&device.id pci 0x1453
+&subvendor.id pci 0x13e0
+&subdevice.id pci 0x0250
++subdevice.name IBM
+
+ vendor.id pci 0x14f1
+&device.id pci 0x1453
+&subvendor.id pci 0x144f
+&subdevice.id pci 0x1502
++subdevice.name IBM P95-DF (1)
+
+ vendor.id pci 0x14f1
+&device.id pci 0x1453
+&subvendor.id pci 0x144f
+&subdevice.id pci 0x1503
++subdevice.name IBM P95-DF (2)
+
+ vendor.id pci 0x14f1
+&device.id pci 0x1454
++device.name HCF 56k Data/Fax/Voice Modem
+
+ vendor.id pci 0x14f1
+&device.id pci 0x1455
++device.name HCF 56k Data/Fax/Voice/Spkp (w/Handset) Modem
+
+ vendor.id pci 0x14f1
+&device.id pci 0x1456
++device.name HCF 56k Data/Fax/Voice/Spkp Modem
+
+ vendor.id pci 0x14f1
+&device.id pci 0x1456
+&subvendor.id pci 0x122d
+&subdevice.id pci 0x4035
++subdevice.name Dell Europa - MDP3900V-W
+
+ vendor.id pci 0x14f1
+&device.id pci 0x1456
+&subvendor.id pci 0x122d
+&subdevice.id pci 0x4302
++subdevice.name Dell MP3930V-W(C) MiniPCI
+
+ vendor.id pci 0x14f1
+&device.id pci 0x1610
++device.name ADSL AccessRunner PCI Arbitration Device
+
+ vendor.id pci 0x14f1
+&device.id pci 0x1611
++device.name AccessRunner PCI ADSL Interface Device
+
+ vendor.id pci 0x14f1
+&device.id pci 0x1620
++device.name ADSL AccessRunner V2 PCI Arbitration Device
+
+ vendor.id pci 0x14f1
+&device.id pci 0x1621
++device.name AccessRunner V2 PCI ADSL Interface Device
+
+ vendor.id pci 0x14f1
+&device.id pci 0x1622
++device.name AccessRunner V2 PCI ADSL Yukon WAN Adapter
+
+ vendor.id pci 0x14f1
+&device.id pci 0x1803
++device.name HCF 56k Modem
+
+ vendor.id pci 0x14f1
+&device.id pci 0x1803
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0x0023
++subdevice.name 623-LAN Grizzly
+
+ vendor.id pci 0x14f1
+&device.id pci 0x1803
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0x0043
++subdevice.name 623-LAN Yogi
+
+ vendor.id pci 0x14f1
+&device.id pci 0x1815
++device.name HCF 56k Modem
+
+ vendor.id pci 0x14f1
+&device.id pci 0x1815
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0x0022
++subdevice.name Grizzly
+
+ vendor.id pci 0x14f1
+&device.id pci 0x1815
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0x0042
++subdevice.name Yogi
+
+ vendor.id pci 0x14f1
+&device.id pci 0x2003
++device.name HSF 56k Data/Fax Modem
+
+ vendor.id pci 0x14f1
+&device.id pci 0x2004
++device.name HSF 56k Data/Fax/Voice Modem
+
+ vendor.id pci 0x14f1
+&device.id pci 0x2005
++device.name HSF 56k Data/Fax/Voice/Spkp (w/Handset) Modem
+
+ vendor.id pci 0x14f1
+&device.id pci 0x2006
++device.name HSF 56k Data/Fax/Voice/Spkp Modem
+
+ vendor.id pci 0x14f1
+&device.id pci 0x2013
++device.name HSF 56k Data/Fax Modem
+
+ vendor.id pci 0x14f1
+&device.id pci 0x2013
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0xb195
++subdevice.name Bear
+
+ vendor.id pci 0x14f1
+&device.id pci 0x2013
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0xb196
++subdevice.name Seminole 1
+
+ vendor.id pci 0x14f1
+&device.id pci 0x2013
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0xb1be
++subdevice.name Seminole 2
+
+ vendor.id pci 0x14f1
+&device.id pci 0x2013
+&subvendor.id pci 0x1025
+&subdevice.id pci 0x8013
++subdevice.name Acer
+
+ vendor.id pci 0x14f1
+&device.id pci 0x2013
+&subvendor.id pci 0x1033
+&subdevice.id pci 0x809d
++subdevice.name NEC
+
+ vendor.id pci 0x14f1
+&device.id pci 0x2013
+&subvendor.id pci 0x1033
+&subdevice.id pci 0x80bc
++subdevice.name NEC
+
+ vendor.id pci 0x14f1
+&device.id pci 0x2013
+&subvendor.id pci 0x155d
+&subdevice.id pci 0x6793
++subdevice.name HP
+
+ vendor.id pci 0x14f1
+&device.id pci 0x2013
+&subvendor.id pci 0x155d
+&subdevice.id pci 0x8850
++subdevice.name E Machines
+
+ vendor.id pci 0x14f1
+&device.id pci 0x2014
++device.name HSF 56k Data/Fax/Voice Modem
+
+ vendor.id pci 0x14f1
+&device.id pci 0x2015
++device.name HSF 56k Data/Fax/Voice/Spkp (w/Handset) Modem
+
+ vendor.id pci 0x14f1
+&device.id pci 0x2016
++device.name HSF 56k Data/Fax/Voice/Spkp Modem
+
+ vendor.id pci 0x14f1
+&device.id pci 0x2043
++device.name HSF 56k Data/Fax Modem (WorldW SmartDAA)
+
+ vendor.id pci 0x14f1
+&device.id pci 0x2044
++device.name HSF 56k Data/Fax/Voice Modem (WorldW SmartDAA)
+
+ vendor.id pci 0x14f1
+&device.id pci 0x2045
++device.name HSF 56k Data/Fax/Voice/Spkp (w/Handset) Modem (WorldW SmartDAA)
+
+ vendor.id pci 0x14f1
+&device.id pci 0x2046
++device.name HSF 56k Data/Fax/Voice/Spkp Modem (WorldW SmartDAA)
+
+ vendor.id pci 0x14f1
+&device.id pci 0x2063
++device.name HSF 56k Data/Fax Modem (SmartDAA)
+
+ vendor.id pci 0x14f1
+&device.id pci 0x2064
++device.name HSF 56k Data/Fax/Voice Modem (SmartDAA)
+
+ vendor.id pci 0x14f1
+&device.id pci 0x2065
++device.name HSF 56k Data/Fax/Voice/Spkp (w/Handset) Modem (SmartDAA)
+
+ vendor.id pci 0x14f1
+&device.id pci 0x2066
++device.name HSF 56k Data/Fax/Voice/Spkp Modem (SmartDAA)
+
+ vendor.id pci 0x14f1
+&device.id pci 0x2093
++device.name HSF 56k Modem
+
+ vendor.id pci 0x14f1
+&device.id pci 0x2093
+&subvendor.id pci 0x155d
+&subdevice.id pci 0x2f07
++subdevice.name Legend
+
+ vendor.id pci 0x14f1
+&device.id pci 0x2143
++device.name HSF 56k Data/Fax/Cell Modem (Mob WorldW SmartDAA)
+
+ vendor.id pci 0x14f1
+&device.id pci 0x2144
++device.name HSF 56k Data/Fax/Voice/Cell Modem (Mob WorldW SmartDAA)
+
+ vendor.id pci 0x14f1
+&device.id pci 0x2145
++device.name HSF 56k Data/Fax/Voice/Spkp (w/HS)/Cell Modem (Mob WorldW SmartDAA)
+
+ vendor.id pci 0x14f1
+&device.id pci 0x2146
++device.name HSF 56k Data/Fax/Voice/Spkp/Cell Modem (Mob WorldW SmartDAA)
+
+ vendor.id pci 0x14f1
+&device.id pci 0x2163
++device.name HSF 56k Data/Fax/Cell Modem (Mob SmartDAA)
+
+ vendor.id pci 0x14f1
+&device.id pci 0x2164
++device.name HSF 56k Data/Fax/Voice/Cell Modem (Mob SmartDAA)
+
+ vendor.id pci 0x14f1
+&device.id pci 0x2165
++device.name HSF 56k Data/Fax/Voice/Spkp (w/HS)/Cell Modem (Mob SmartDAA)
+
+ vendor.id pci 0x14f1
+&device.id pci 0x2166
++device.name HSF 56k Data/Fax/Voice/Spkp/Cell Modem (Mob SmartDAA)
+
+ vendor.id pci 0x14f1
+&device.id pci 0x2343
++device.name HSF 56k Data/Fax CardBus Modem (Mob WorldW SmartDAA)
+
+ vendor.id pci 0x14f1
+&device.id pci 0x2344
++device.name HSF 56k Data/Fax/Voice CardBus Modem (Mob WorldW SmartDAA)
+
+ vendor.id pci 0x14f1
+&device.id pci 0x2345
++device.name HSF 56k Data/Fax/Voice/Spkp (w/HS) CardBus Modem (Mob WorldW SmartDAA)
+
+ vendor.id pci 0x14f1
+&device.id pci 0x2346
++device.name HSF 56k Data/Fax/Voice/Spkp CardBus Modem (Mob WorldW SmartDAA)
+
+ vendor.id pci 0x14f1
+&device.id pci 0x2363
++device.name HSF 56k Data/Fax CardBus Modem (Mob SmartDAA)
+
+ vendor.id pci 0x14f1
+&device.id pci 0x2364
++device.name HSF 56k Data/Fax/Voice CardBus Modem (Mob SmartDAA)
+
+ vendor.id pci 0x14f1
+&device.id pci 0x2365
++device.name HSF 56k Data/Fax/Voice/Spkp (w/HS) CardBus Modem (Mob SmartDAA)
+
+ vendor.id pci 0x14f1
+&device.id pci 0x2366
++device.name HSF 56k Data/Fax/Voice/Spkp CardBus Modem (Mob SmartDAA)
+
+ vendor.id pci 0x14f1
+&device.id pci 0x2443
++device.name HSF 56k Data/Fax Modem (Mob WorldW SmartDAA)
+
+ vendor.id pci 0x14f1
+&device.id pci 0x2443
+&subvendor.id pci 0x104d
+&subdevice.id pci 0x8075
++subdevice.name Modem
+
+ vendor.id pci 0x14f1
+&device.id pci 0x2443
+&subvendor.id pci 0x104d
+&subdevice.id pci 0x8083
++subdevice.name Modem
+
+ vendor.id pci 0x14f1
+&device.id pci 0x2443
+&subvendor.id pci 0x104d
+&subdevice.id pci 0x8097
++subdevice.name Modem
+
+ vendor.id pci 0x14f1
+&device.id pci 0x2444
++device.name HSF 56k Data/Fax/Voice Modem (Mob WorldW SmartDAA)
+
+ vendor.id pci 0x14f1
+&device.id pci 0x2445
++device.name HSF 56k Data/Fax/Voice/Spkp (w/HS) Modem (Mob WorldW SmartDAA)
+
+ vendor.id pci 0x14f1
+&device.id pci 0x2446
++device.name HSF 56k Data/Fax/Voice/Spkp Modem (Mob WorldW SmartDAA)
+
+ vendor.id pci 0x14f1
+&device.id pci 0x2463
++device.name HSF 56k Data/Fax Modem (Mob SmartDAA)
+
+ vendor.id pci 0x14f1
+&device.id pci 0x2464
++device.name HSF 56k Data/Fax/Voice Modem (Mob SmartDAA)
+
+ vendor.id pci 0x14f1
+&device.id pci 0x2465
++device.name HSF 56k Data/Fax/Voice/Spkp (w/HS) Modem (Mob SmartDAA)
+
+ vendor.id pci 0x14f1
+&device.id pci 0x2466
++device.name HSF 56k Data/Fax/Voice/Spkp Modem (Mob SmartDAA)
+
+ vendor.id pci 0x14f1
+&device.id pci 0x2f00
++device.name HSF 56k HSFi Modem
+
+ vendor.id pci 0x14f1
+&device.id pci 0x2f00
+&subvendor.id pci 0x13e0
+&subdevice.id pci 0x8d84
++subdevice.name IBM HSFi V.90
+
+ vendor.id pci 0x14f1
+&device.id pci 0x2f00
+&subvendor.id pci 0x13e0
+&subdevice.id pci 0x8d85
++subdevice.name Compaq Stinger
+
+ vendor.id pci 0x14f1
+&device.id pci 0x2f00
+&subvendor.id pci 0x14f1
+&subdevice.id pci 0x2004
++subdevice.name Dynalink 56PMi
+
+ vendor.id pci 0x14f1
+&device.id pci 0x2f02
++device.name HSF 56k HSFi Data/Fax
+
+ vendor.id pci 0x14f1
+&device.id pci 0x2f11
++device.name HSF 56k HSFi Modem
+
+ vendor.id pci 0x14f1
+&device.id pci 0x8234
++device.name RS8234 ATM SAR Controller [ServiceSAR Plus]
+
+ vendor.id pci 0x14f1
+&device.id pci 0x8800
++device.name Winfast TV2000 XP
+
+ vendor.id pci 0x14f2
++vendor.name MOBILITY Electronics
+
+ vendor.id pci 0x14f2
+&device.id pci 0x0120
++device.name EV1000 bridge
+
+ vendor.id pci 0x14f2
+&device.id pci 0x0121
++device.name EV1000 Parallel port
+
+ vendor.id pci 0x14f2
+&device.id pci 0x0122
++device.name EV1000 Serial port
+
+ vendor.id pci 0x14f2
+&device.id pci 0x0123
++device.name EV1000 Keyboard controller
+
+ vendor.id pci 0x14f2
+&device.id pci 0x0124
++device.name EV1000 Mouse controller
+
+ vendor.id pci 0x14f3
++vendor.name BroadLogic
+
+ vendor.id pci 0x14f3
+&device.id pci 0x2030
++device.name 2030 DVB-S Satellite Reciever
+
+ vendor.id pci 0x14f3
+&device.id pci 0x2050
++device.name 2050 DVB-T Terrestrial (Cable) Reciever
+
+ vendor.id pci 0x14f3
+&device.id pci 0x2060
++device.name 2060 ATSC Terrestrial (Cable) Reciever
+
+ vendor.id pci 0x14f4
++vendor.name TOKYO Electronic Industry CO Ltd
+
+ vendor.id pci 0x14f5
++vendor.name SOPAC Ltd
+
+ vendor.id pci 0x14f6
++vendor.name COYOTE Technologies LLC
+
+ vendor.id pci 0x14f7
++vendor.name WOLF Technology Inc
+
+ vendor.id pci 0x14f8
++vendor.name AUDIOCODES Inc
+
+ vendor.id pci 0x14f8
+&device.id pci 0x2077
++device.name TP-240 dual span E1 VoIP PCI card
+
+ vendor.id pci 0x14f9
++vendor.name AG COMMUNICATIONS
+
+ vendor.id pci 0x14fa
++vendor.name WANDEL & GOCHERMANN
+
+ vendor.id pci 0x14fb
++vendor.name TRANSAS MARINE (UK) Ltd
+
+ vendor.id pci 0x14fc
++vendor.name Quadrics Ltd
+
+ vendor.id pci 0x14fc
+&device.id pci 0x0000
++device.name QsNet Elan3 Network Adapter
+
+ vendor.id pci 0x14fc
+&device.id pci 0x0001
++device.name QsNetII Elan4 Network Adapter
+
+ vendor.id pci 0x14fd
++vendor.name JAPAN Computer Industry Inc
+
+ vendor.id pci 0x14fe
++vendor.name ARCHTEK TELECOM Corp
+
+ vendor.id pci 0x14ff
++vendor.name TWINHEAD INTERNATIONAL Corp
+
+ vendor.id pci 0x1500
++vendor.name DELTA Electronics, Inc
+
+ vendor.id pci 0x1500
+&device.id pci 0x1360
++device.name RTL81xx RealTek Ethernet
+
+ vendor.id pci 0x1501
++vendor.name BANKSOFT CANADA Ltd
+
+ vendor.id pci 0x1502
++vendor.name MITSUBISHI ELECTRIC LOGISTICS SUPPORT Co Ltd
+
+ vendor.id pci 0x1503
++vendor.name KAWASAKI LSI USA Inc
+
+ vendor.id pci 0x1504
++vendor.name KAISER Electronics
+
+ vendor.id pci 0x1505
++vendor.name ITA INGENIEURBURO FUR TESTAUFGABEN GmbH
+
+ vendor.id pci 0x1506
++vendor.name CHAMELEON Systems Inc
+
+ vendor.id pci 0x1507
++vendor.name Motorola ?? / HTEC
+
+ vendor.id pci 0x1507
+&device.id pci 0x0001
++device.name MPC105 [Eagle]
+
+ vendor.id pci 0x1507
+&device.id pci 0x0002
++device.name MPC106 [Grackle]
+
+ vendor.id pci 0x1507
+&device.id pci 0x0003
++device.name MPC8240 [Kahlua]
+
+ vendor.id pci 0x1507
+&device.id pci 0x0100
++device.name MC145575 [HFC-PCI]
+
+ vendor.id pci 0x1507
+&device.id pci 0x0431
++device.name KTI829c 100VG
+
+ vendor.id pci 0x1507
+&device.id pci 0x4801
++device.name Raven
+
+ vendor.id pci 0x1507
+&device.id pci 0x4802
++device.name Falcon
+
+ vendor.id pci 0x1507
+&device.id pci 0x4803
++device.name Hawk
+
+ vendor.id pci 0x1507
+&device.id pci 0x4806
++device.name CPX8216
+
+ vendor.id pci 0x1508
++vendor.name HONDA CONNECTORS/MHOTRONICS Inc
+
+ vendor.id pci 0x1509
++vendor.name FIRST INTERNATIONAL Computer Inc
+
+ vendor.id pci 0x150a
++vendor.name FORVUS RESEARCH Inc
+
+ vendor.id pci 0x150b
++vendor.name YAMASHITA Systems Corp
+
+ vendor.id pci 0x150c
++vendor.name KYOPAL CO Ltd
+
+ vendor.id pci 0x150d
++vendor.name WARPSPPED Inc
+
+ vendor.id pci 0x150e
++vendor.name C-PORT Corp
+
+ vendor.id pci 0x150f
++vendor.name INTEC GmbH
+
+ vendor.id pci 0x1510
++vendor.name BEHAVIOR TECH Computer Corp
+
+ vendor.id pci 0x1511
++vendor.name CENTILLIUM Technology Corp
+
+ vendor.id pci 0x1512
++vendor.name ROSUN Technologies Inc
+
+ vendor.id pci 0x1513
++vendor.name Raychem
+
+ vendor.id pci 0x1514
++vendor.name TFL LAN Inc
+
+ vendor.id pci 0x1515
++vendor.name Advent design
+
+ vendor.id pci 0x1516
++vendor.name MYSON Technology Inc
+
+ vendor.id pci 0x1516
+&device.id pci 0x0800
++device.name MTD-8xx 100/10M Ethernet PCI Adapter
+
+ vendor.id pci 0x1516
+&device.id pci 0x0803
++device.name SURECOM EP-320X-S 100/10M Ethernet PCI Adapter
+
+ vendor.id pci 0x1516
+&device.id pci 0x0803
+&subvendor.id pci 0x1320
+&subdevice.id pci 0x10bd
++subdevice.name SURECOM EP-320X-S 100/10M Ethernet PCI Adapter
+
+ vendor.id pci 0x1516
+&device.id pci 0x0891
++device.name MTD-8xx 100/10M Ethernet PCI Adapter
+
+ vendor.id pci 0x1517
++vendor.name ECHOTEK Corp
+
+ vendor.id pci 0x1518
++vendor.name PEP MODULAR Computers GmbH
+
+ vendor.id pci 0x1519
++vendor.name TELEFON AKTIEBOLAGET LM Ericsson
+
+ vendor.id pci 0x151a
++vendor.name Globetek
+
+ vendor.id pci 0x151a
+&device.id pci 0x1002
++device.name PCI-1002
+
+ vendor.id pci 0x151a
+&device.id pci 0x1004
++device.name PCI-1004
+
+ vendor.id pci 0x151a
+&device.id pci 0x1008
++device.name PCI-1008
+
+ vendor.id pci 0x151b
++vendor.name COMBOX Ltd
+
+ vendor.id pci 0x151c
++vendor.name DIGITAL AUDIO LABS Inc
+
+ vendor.id pci 0x151d
++vendor.name Fujitsu Computer Products Of America
+
+ vendor.id pci 0x151e
++vendor.name MATRIX Corp
+
+ vendor.id pci 0x151f
++vendor.name TOPIC SEMICONDUCTOR Corp
+
+ vendor.id pci 0x151f
+&device.id pci 0x0000
++device.name TP560 Data/Fax/Voice 56k modem
+
+ vendor.id pci 0x1520
++vendor.name CHAPLET System Inc
+
+ vendor.id pci 0x1521
++vendor.name BELL Corp
+
+ vendor.id pci 0x1522
++vendor.name MainPine Ltd
+
+ vendor.id pci 0x1522
+&device.id pci 0x0100
++device.name PCI <-> IOBus Bridge
+
+ vendor.id pci 0x1522
+&device.id pci 0x0100
+&subvendor.id pci 0x1522
+&subdevice.id pci 0x0200
++subdevice.name RockForceDUO 2 Port V.92/V.44 Data/Fax/Voice Modem
+
+ vendor.id pci 0x1522
+&device.id pci 0x0100
+&subvendor.id pci 0x1522
+&subdevice.id pci 0x0300
++subdevice.name RockForceQUATRO 4 Port V.92/V.44 Data/Fax/Voice Modem
+
+ vendor.id pci 0x1522
+&device.id pci 0x0100
+&subvendor.id pci 0x1522
+&subdevice.id pci 0x0400
++subdevice.name RockForceDUO+ 2 Port V.92/V.44 Data/Fax/Voice Modem
+
+ vendor.id pci 0x1522
+&device.id pci 0x0100
+&subvendor.id pci 0x1522
+&subdevice.id pci 0x0500
++subdevice.name RockForceQUATRO+ 4 Port V.92/V.44 Data/Fax/Voice Modem
+
+ vendor.id pci 0x1522
+&device.id pci 0x0100
+&subvendor.id pci 0x1522
+&subdevice.id pci 0x0600
++subdevice.name RockForce+ 2 Port V.90 Data/Fax/Voice Modem
+
+ vendor.id pci 0x1522
+&device.id pci 0x0100
+&subvendor.id pci 0x1522
+&subdevice.id pci 0x0700
++subdevice.name RockForce+ 4 Port V.90 Data/Fax/Voice Modem
+
+ vendor.id pci 0x1522
+&device.id pci 0x0100
+&subvendor.id pci 0x1522
+&subdevice.id pci 0x0800
++subdevice.name RockForceOCTO+ 8 Port V.92/V.44 Data/Fax/Voice Modem
+
+ vendor.id pci 0x1522
+&device.id pci 0x0100
+&subvendor.id pci 0x1522
+&subdevice.id pci 0x0c00
++subdevice.name RockForceDUO+ 2 Port V.92/V.44 Data, V.34 Super-G3 Fax, Voice Modem
+
+ vendor.id pci 0x1522
+&device.id pci 0x0100
+&subvendor.id pci 0x1522
+&subdevice.id pci 0x0d00
++subdevice.name RockForceQUATRO+ 4 Port V.92/V.44 Data, V.34 Super-G3 Fax, Voice Modem
+
+ vendor.id pci 0x1522
+&device.id pci 0x0100
+&subvendor.id pci 0x1522
+&subdevice.id pci 0x1d00
++subdevice.name RockForceOCTO+ 8 Port V.92/V.44 Data, V.34 Super-G3 Fax, Voice Modem
+
+ vendor.id pci 0x1523
++vendor.name MUSIC Semiconductors
+
+ vendor.id pci 0x1524
++vendor.name ENE Technology Inc
+
+ vendor.id pci 0x1524
+&device.id pci 0x0510
++device.name CB710 Memory Card Reader Controller
+
+ vendor.id pci 0x1524
+&device.id pci 0x0610
++device.name PCI Smart Card Reader Controller
+
+ vendor.id pci 0x1524
+&device.id pci 0x1211
++device.name CB1211 Cardbus Controller
+
+ vendor.id pci 0x1524
+&device.id pci 0x1225
++device.name CB1225 Cardbus Controller
+
+ vendor.id pci 0x1524
+&device.id pci 0x1410
++device.name CB1410 Cardbus Controller
+
+ vendor.id pci 0x1524
+&device.id pci 0x1410
+&subvendor.id pci 0x1025
+&subdevice.id pci 0x005a
++subdevice.name TravelMate 290
+
+ vendor.id pci 0x1524
+&device.id pci 0x1411
++device.name CB-710/2/4 Cardbus Controller
+
+ vendor.id pci 0x1524
+&device.id pci 0x1412
++device.name CB-712/4 Cardbus Controller
+
+ vendor.id pci 0x1524
+&device.id pci 0x1420
++device.name CB1420 Cardbus Controller
+
+ vendor.id pci 0x1524
+&device.id pci 0x1421
++device.name CB-720/2/4 Cardbus Controller
+
+ vendor.id pci 0x1524
+&device.id pci 0x1422
++device.name CB-722/4 Cardbus Controller
+
+ vendor.id pci 0x1525
++vendor.name IMPACT Technologies
+
+ vendor.id pci 0x1526
++vendor.name ISS, Inc
+
+ vendor.id pci 0x1527
++vendor.name SOLECTRON
+
+ vendor.id pci 0x1528
++vendor.name ACKSYS
+
+ vendor.id pci 0x1529
++vendor.name AMERICAN MICROSystems Inc
+
+ vendor.id pci 0x152a
++vendor.name QUICKTURN DESIGN Systems
+
+ vendor.id pci 0x152b
++vendor.name FLYTECH Technology CO Ltd
+
+ vendor.id pci 0x152c
++vendor.name MACRAIGOR Systems LLC
+
+ vendor.id pci 0x152d
++vendor.name QUANTA Computer Inc
+
+ vendor.id pci 0x152e
++vendor.name MELEC Inc
+
+ vendor.id pci 0x152f
++vendor.name PHILIPS - CRYPTO
+
+ vendor.id pci 0x1530
++vendor.name ACQIS Technology Inc
+
+ vendor.id pci 0x1531
++vendor.name CHRYON Corp
+
+ vendor.id pci 0x1532
++vendor.name ECHELON Corp
+
+ vendor.id pci 0x1533
++vendor.name BALTIMORE
+
+ vendor.id pci 0x1534
++vendor.name ROAD Corp
+
+ vendor.id pci 0x1535
++vendor.name EVERGREEN Technologies Inc
+
+ vendor.id pci 0x1537
++vendor.name DATALEX COMMUNCATIONS
+
+ vendor.id pci 0x1538
++vendor.name ARALION Inc
+
+ vendor.id pci 0x1538
+&device.id pci 0x0303
++device.name ARS106S Ultra ATA 133/100/66 Host Controller
+
+ vendor.id pci 0x1539
++vendor.name ATELIER INFORMATIQUES et ELECTRONIQUE ETUDES S.A.
+
+ vendor.id pci 0x153a
++vendor.name ONO SOKKI
+
+ vendor.id pci 0x153b
++vendor.name TERRATEC Electronic GmbH
+
+ vendor.id pci 0x153b
+&device.id pci 0x1144
++device.name Aureon 5.1
+
+ vendor.id pci 0x153b
+&device.id pci 0x1147
++device.name Aureon 5.1 Sky
+
+ vendor.id pci 0x153b
+&device.id pci 0x1158
++device.name Philips Semiconductors SAA7134 (rev 01) [Terratec Cinergy 600 TV]
+
+ vendor.id pci 0x153c
++vendor.name ANTAL Electronic
+
+ vendor.id pci 0x153d
++vendor.name FILANET Corp
+
+ vendor.id pci 0x153e
++vendor.name TECHWELL Inc
+
+ vendor.id pci 0x153f
++vendor.name MIPS DENMARK
+
+ vendor.id pci 0x1540
++vendor.name PROVIDEO MULTIMEDIA Co Ltd
+
+ vendor.id pci 0x1541
++vendor.name MACHONE Communications
+
+ vendor.id pci 0x1542
++vendor.name VIVID Technology Inc
+
+ vendor.id pci 0x1543
++vendor.name SILICON Laboratories
+
+ vendor.id pci 0x1543
+&device.id pci 0x3052
++device.name Intel 537 [Winmodem]
+
+ vendor.id pci 0x1543
+&device.id pci 0x4c22
++device.name Si3036 MC'97 DAA
+
+ vendor.id pci 0x1544
++vendor.name DCM DATA Systems
+
+ vendor.id pci 0x1545
++vendor.name VISIONTEK
+
+ vendor.id pci 0x1546
++vendor.name IOI Technology Corp
+
+ vendor.id pci 0x1547
++vendor.name MITUTOYO Corp
+
+ vendor.id pci 0x1548
++vendor.name JET PROPULSION Laboratory
+
+ vendor.id pci 0x1549
++vendor.name INTERCONNECT Systems Solutions
+
+ vendor.id pci 0x154a
++vendor.name MAX Technologies Inc
+
+ vendor.id pci 0x154b
++vendor.name COMPUTEX Co Ltd
+
+ vendor.id pci 0x154c
++vendor.name VISUAL Technology Inc
+
+ vendor.id pci 0x154d
++vendor.name PAN INTERNATIONAL Industrial Corp
+
+ vendor.id pci 0x154e
++vendor.name SERVOTEST Ltd
+
+ vendor.id pci 0x154f
++vendor.name STRATABEAM Technology
+
+ vendor.id pci 0x1550
++vendor.name OPEN NETWORK Co Ltd
+
+ vendor.id pci 0x1551
++vendor.name SMART Electronic DEVELOPMENT GmBH
+
+ vendor.id pci 0x1552
++vendor.name RACAL AIRTECH Ltd
+
+ vendor.id pci 0x1553
++vendor.name CHICONY Electronics Co Ltd
+
+ vendor.id pci 0x1554
++vendor.name PROLINK Microsystems Corp
+
+ vendor.id pci 0x1555
++vendor.name GESYTEC GmBH
+
+ vendor.id pci 0x1556
++vendor.name PLD APPLICATIONS
+
+ vendor.id pci 0x1557
++vendor.name MEDIASTAR Co Ltd
+
+ vendor.id pci 0x1558
++vendor.name CLEVO/KAPOK Computer
+
+ vendor.id pci 0x1559
++vendor.name SI LOGIC Ltd
+
+ vendor.id pci 0x155a
++vendor.name INNOMEDIA Inc
+
+ vendor.id pci 0x155b
++vendor.name PROTAC INTERNATIONAL Corp
+
+ vendor.id pci 0x155c
++vendor.name Cemax-Icon Inc
+
+ vendor.id pci 0x155d
++vendor.name Mac System Co Ltd
+
+ vendor.id pci 0x155e
++vendor.name LP Elektronik GmbH
+
+ vendor.id pci 0x155f
++vendor.name Perle Systems Ltd
+
+ vendor.id pci 0x1560
++vendor.name Terayon Communications Systems
+
+ vendor.id pci 0x1561
++vendor.name Viewgraphics Inc
+
+ vendor.id pci 0x1562
++vendor.name Symbol Technologies
+
+ vendor.id pci 0x1563
++vendor.name A-Trend Technology Co Ltd
+
+ vendor.id pci 0x1564
++vendor.name Yamakatsu Electronics Industry Co Ltd
+
+ vendor.id pci 0x1565
++vendor.name Biostar Microtech Int'l Corp
+
+ vendor.id pci 0x1566
++vendor.name Ardent Technologies Inc
+
+ vendor.id pci 0x1567
++vendor.name Jungsoft
+
+ vendor.id pci 0x1568
++vendor.name DDK Electronics Inc
+
+ vendor.id pci 0x1569
++vendor.name Palit Microsystems Inc.
+
+ vendor.id pci 0x156a
++vendor.name Avtec Systems
+
+ vendor.id pci 0x156b
++vendor.name 2wire Inc
+
+ vendor.id pci 0x156c
++vendor.name Vidac Electronics GmbH
+
+ vendor.id pci 0x156d
++vendor.name Alpha-Top Corp
+
+ vendor.id pci 0x156e
++vendor.name Alfa Inc
+
+ vendor.id pci 0x156f
++vendor.name M-Systems Flash Disk Pioneers Ltd
+
+ vendor.id pci 0x1570
++vendor.name Lecroy Corp
+
+ vendor.id pci 0x1571
++vendor.name Contemporary Controls
+
+ vendor.id pci 0x1571
+&device.id pci 0xa001
++device.name CCSI PCI20-485 ARCnet
+
+ vendor.id pci 0x1571
+&device.id pci 0xa002
++device.name CCSI PCI20-485D ARCnet
+
+ vendor.id pci 0x1571
+&device.id pci 0xa003
++device.name CCSI PCI20-485X ARCnet
+
+ vendor.id pci 0x1571
+&device.id pci 0xa004
++device.name CCSI PCI20-CXB ARCnet
+
+ vendor.id pci 0x1571
+&device.id pci 0xa005
++device.name CCSI PCI20-CXS ARCnet
+
+ vendor.id pci 0x1571
+&device.id pci 0xa006
++device.name CCSI PCI20-FOG-SMA ARCnet
+
+ vendor.id pci 0x1571
+&device.id pci 0xa007
++device.name CCSI PCI20-FOG-ST ARCnet
+
+ vendor.id pci 0x1571
+&device.id pci 0xa008
++device.name CCSI PCI20-TB5 ARCnet
+
+ vendor.id pci 0x1571
+&device.id pci 0xa009
++device.name CCSI PCI20-5-485 5Mbit ARCnet
+
+ vendor.id pci 0x1571
+&device.id pci 0xa00a
++device.name CCSI PCI20-5-485D 5Mbit ARCnet
+
+ vendor.id pci 0x1571
+&device.id pci 0xa00b
++device.name CCSI PCI20-5-485X 5Mbit ARCnet
+
+ vendor.id pci 0x1571
+&device.id pci 0xa00c
++device.name CCSI PCI20-5-FOG-ST 5Mbit ARCnet
+
+ vendor.id pci 0x1571
+&device.id pci 0xa00d
++device.name CCSI PCI20-5-FOG-SMA 5Mbit ARCnet
+
+ vendor.id pci 0x1571
+&device.id pci 0xa201
++device.name CCSI PCI22-485 10Mbit ARCnet
+
+ vendor.id pci 0x1571
+&device.id pci 0xa202
++device.name CCSI PCI22-485D 10Mbit ARCnet
+
+ vendor.id pci 0x1571
+&device.id pci 0xa203
++device.name CCSI PCI22-485X 10Mbit ARCnet
+
+ vendor.id pci 0x1571
+&device.id pci 0xa204
++device.name CCSI PCI22-CHB 10Mbit ARCnet
+
+ vendor.id pci 0x1571
+&device.id pci 0xa205
++device.name CCSI PCI22-FOG_ST 10Mbit ARCnet
+
+ vendor.id pci 0x1571
+&device.id pci 0xa206
++device.name CCSI PCI22-THB 10Mbit ARCnet
+
+ vendor.id pci 0x1572
++vendor.name Otis Elevator Company
+
+ vendor.id pci 0x1573
++vendor.name Lattice - Vantis
+
+ vendor.id pci 0x1574
++vendor.name Fairchild Semiconductor
+
+ vendor.id pci 0x1575
++vendor.name Voltaire Advanced Data Security Ltd
+
+ vendor.id pci 0x1576
++vendor.name Viewcast COM
+
+ vendor.id pci 0x1578
++vendor.name HITT
+
+ vendor.id pci 0x1579
++vendor.name Dual Technology Corp
+
+ vendor.id pci 0x157a
++vendor.name Japan Elecronics Ind Inc
+
+ vendor.id pci 0x157b
++vendor.name Star Multimedia Corp
+
+ vendor.id pci 0x157c
++vendor.name Eurosoft (UK)
+
+ vendor.id pci 0x157c
+&device.id pci 0x8001
++device.name Fix2000 PCI Y2K Compliance Card
+
+ vendor.id pci 0x157d
++vendor.name Gemflex Networks
+
+ vendor.id pci 0x157e
++vendor.name Transition Networks
+
+ vendor.id pci 0x157f
++vendor.name PX Instruments Technology Ltd
+
+ vendor.id pci 0x1580
++vendor.name Primex Aerospace Co
+
+ vendor.id pci 0x1581
++vendor.name SEH Computertechnik GmbH
+
+ vendor.id pci 0x1582
++vendor.name Cytec Corp
+
+ vendor.id pci 0x1583
++vendor.name Inet Technologies Inc
+
+ vendor.id pci 0x1584
++vendor.name Uniwill Computer Corp
+
+ vendor.id pci 0x1585
++vendor.name Logitron
+
+ vendor.id pci 0x1586
++vendor.name Lancast Inc
+
+ vendor.id pci 0x1587
++vendor.name Konica Corp
+
+ vendor.id pci 0x1588
++vendor.name Solidum Systems Corp
+
+ vendor.id pci 0x1589
++vendor.name Atlantek Microsystems Pty Ltd
+
+ vendor.id pci 0x158a
++vendor.name Digalog Systems Inc
+
+ vendor.id pci 0x158b
++vendor.name Allied Data Technologies
+
+ vendor.id pci 0x158c
++vendor.name Hitachi Semiconductor & Devices Sales Co Ltd
+
+ vendor.id pci 0x158d
++vendor.name Point Multimedia Systems
+
+ vendor.id pci 0x158e
++vendor.name Lara Technology Inc
+
+ vendor.id pci 0x158f
++vendor.name Ditect Coop
+
+ vendor.id pci 0x1590
++vendor.name 3pardata Inc
+
+ vendor.id pci 0x1591
++vendor.name ARN
+
+ vendor.id pci 0x1592
++vendor.name Syba Tech Ltd
+
+ vendor.id pci 0x1592
+&device.id pci 0x0781
++device.name Multi-IO Card
+
+ vendor.id pci 0x1592
+&device.id pci 0x0782
++device.name Parallel Port Card 2xEPP
+
+ vendor.id pci 0x1592
+&device.id pci 0x0783
++device.name Multi-IO Card
+
+ vendor.id pci 0x1592
+&device.id pci 0x0785
++device.name Multi-IO Card
+
+ vendor.id pci 0x1592
+&device.id pci 0x0786
++device.name Multi-IO Card
+
+ vendor.id pci 0x1592
+&device.id pci 0x0787
++device.name Multi-IO Card
+
+ vendor.id pci 0x1592
+&device.id pci 0x0788
++device.name Multi-IO Card
+
+ vendor.id pci 0x1592
+&device.id pci 0x078a
++device.name Multi-IO Card
+
+ vendor.id pci 0x1593
++vendor.name Bops Inc
+
+ vendor.id pci 0x1594
++vendor.name Netgame Ltd
+
+ vendor.id pci 0x1595
++vendor.name Diva Systems Corp
+
+ vendor.id pci 0x1596
++vendor.name Folsom Research Inc
+
+ vendor.id pci 0x1597
++vendor.name Memec Design Services
+
+ vendor.id pci 0x1598
++vendor.name Granite Microsystems
+
+ vendor.id pci 0x1599
++vendor.name Delta Electronics Inc
+
+ vendor.id pci 0x159a
++vendor.name General Instrument
+
+ vendor.id pci 0x159b
++vendor.name Faraday Technology Corp
+
+ vendor.id pci 0x159c
++vendor.name Stratus Computer Systems
+
+ vendor.id pci 0x159d
++vendor.name Ningbo Harrison Electronics Co Ltd
+
+ vendor.id pci 0x159e
++vendor.name A-Max Technology Co Ltd
+
+ vendor.id pci 0x159f
++vendor.name Galea Network Security
+
+ vendor.id pci 0x15a0
++vendor.name Compumaster SRL
+
+ vendor.id pci 0x15a1
++vendor.name Geocast Network Systems
+
+ vendor.id pci 0x15a2
++vendor.name Catalyst Enterprises Inc
+
+ vendor.id pci 0x15a2
+&device.id pci 0x0001
++device.name TA700 PCI Bus Analyzer/Exerciser
+
+ vendor.id pci 0x15a3
++vendor.name Italtel
+
+ vendor.id pci 0x15a4
++vendor.name X-Net OY
+
+ vendor.id pci 0x15a5
++vendor.name Toyota Macs Inc
+
+ vendor.id pci 0x15a6
++vendor.name Sunlight Ultrasound Technologies Ltd
+
+ vendor.id pci 0x15a7
++vendor.name SSE Telecom Inc
+
+ vendor.id pci 0x15a8
++vendor.name Shanghai Communications Technologies Center
+
+ vendor.id pci 0x15aa
++vendor.name Moreton Bay
+
+ vendor.id pci 0x15ab
++vendor.name Bluesteel Networks Inc
+
+ vendor.id pci 0x15ac
++vendor.name North Atlantic Instruments
+
+ vendor.id pci 0x15ad
++vendor.name VMware Inc
+
+ vendor.id pci 0x15ad
+&device.id pci 0x0405
++device.name [VMware SVGA II] PCI Display Adapter
+
+ vendor.id pci 0x15ad
+&device.id pci 0x0710
++device.name Virtual SVGA
+
+ vendor.id pci 0x15ad
+&device.id pci 0x0720
++device.name VMware High-Speed Virtual NIC [vmxnet]
+
+ vendor.id pci 0x15ae
++vendor.name Amersham Pharmacia Biotech
+
+ vendor.id pci 0x15b0
++vendor.name Zoltrix International Ltd
+
+ vendor.id pci 0x15b1
++vendor.name Source Technology Inc
+
+ vendor.id pci 0x15b2
++vendor.name Mosaid Technologies Inc
+
+ vendor.id pci 0x15b3
++vendor.name Mellanox Technologies
+
+ vendor.id pci 0x15b3
+&device.id pci 0x5274
++device.name MT21108 InfiniBridge
+
+ vendor.id pci 0x15b3
+&device.id pci 0x5a44
++device.name MT23108 InfiniHost HCA
+
+ vendor.id pci 0x15b3
+&device.id pci 0x5a45
++device.name MT23108 InfiniHost HCA flash recovery (Tavor)
+
+ vendor.id pci 0x15b3
+&device.id pci 0x5a46
++device.name MT23108 InfiniHost HCA bridge
+
+ vendor.id pci 0x15b3
+&device.id pci 0x5e8c
++device.name MT24204 [InfiniHost III Lx HCA]
+
+ vendor.id pci 0x15b3
+&device.id pci 0x5e8d
++device.name MT24204 [InfiniHost III Lx HCA Flash Recovery]
+
+ vendor.id pci 0x15b3
+&device.id pci 0x6278
++device.name MT25208 InfiniHost III Ex HCA (Tavor compatibility mode)
+
+ vendor.id pci 0x15b3
+&device.id pci 0x6279
++device.name MT25208 [InfiniHost III Ex HCA Flash Recovery]
+
+ vendor.id pci 0x15b3
+&device.id pci 0x6282
++device.name MT25208 InfiniHost III Ex HCA
+
+ vendor.id pci 0x15b4
++vendor.name CCI/TRIAD
+
+ vendor.id pci 0x15b5
++vendor.name Cimetrics Inc
+
+ vendor.id pci 0x15b6
++vendor.name Texas Memory Systems Inc
+
+ vendor.id pci 0x15b7
++vendor.name Sandisk Corp
+
+ vendor.id pci 0x15b8
++vendor.name ADDI-DATA GmbH
+
+ vendor.id pci 0x15b9
++vendor.name Maestro Digital Communications
+
+ vendor.id pci 0x15ba
++vendor.name Impacct Technology Corp
+
+ vendor.id pci 0x15bb
++vendor.name Portwell Inc
+
+ vendor.id pci 0x15bc
++vendor.name Agilent Technologies
+
+ vendor.id pci 0x15bc
+&device.id pci 0x2922
++device.name 64 Bit, 133MHz PCI-X Exerciser & Protocol Checker
+
+ vendor.id pci 0x15bc
+&device.id pci 0x2928
++device.name 64 Bit, 66MHz PCI Exerciser & Analyzer
+
+ vendor.id pci 0x15bc
+&device.id pci 0x2929
++device.name 64 Bit, 133MHz PCI-X Analyzer & Exerciser
+
+ vendor.id pci 0x15bd
++vendor.name DFI Inc
+
+ vendor.id pci 0x15be
++vendor.name Sola Electronics
+
+ vendor.id pci 0x15bf
++vendor.name High Tech Computer Corp (HTC)
+
+ vendor.id pci 0x15c0
++vendor.name BVM Ltd
+
+ vendor.id pci 0x15c1
++vendor.name Quantel
+
+ vendor.id pci 0x15c2
++vendor.name Newer Technology Inc
+
+ vendor.id pci 0x15c3
++vendor.name Taiwan Mycomp Co Ltd
+
+ vendor.id pci 0x15c4
++vendor.name EVSX Inc
+
+ vendor.id pci 0x15c5
++vendor.name Procomp Informatics Ltd
+
+ vendor.id pci 0x15c5
+&device.id pci 0x8010
++device.name 1394b - 1394 Firewire 3-Port Host Adapter Card
+
+ vendor.id pci 0x15c6
++vendor.name Technical University of Budapest
+
+ vendor.id pci 0x15c7
++vendor.name Tateyama System Laboratory Co Ltd
+
+ vendor.id pci 0x15c7
+&device.id pci 0x0349
++device.name Tateyama C-PCI PLC/NC card Rev.01A
+
+ vendor.id pci 0x15c8
++vendor.name Penta Media Co Ltd
+
+ vendor.id pci 0x15c9
++vendor.name Serome Technology Inc
+
+ vendor.id pci 0x15ca
++vendor.name Bitboys OY
+
+ vendor.id pci 0x15cb
++vendor.name AG Electronics Ltd
+
+ vendor.id pci 0x15cc
++vendor.name Hotrail Inc
+
+ vendor.id pci 0x15cd
++vendor.name Dreamtech Co Ltd
+
+ vendor.id pci 0x15ce
++vendor.name Genrad Inc
+
+ vendor.id pci 0x15cf
++vendor.name Hilscher GmbH
+
+ vendor.id pci 0x15d1
++vendor.name Infineon Technologies AG
+
+ vendor.id pci 0x15d2
++vendor.name FIC (First International Computer Inc)
+
+ vendor.id pci 0x15d3
++vendor.name NDS Technologies Israel Ltd
+
+ vendor.id pci 0x15d4
++vendor.name Iwill Corp
+
+ vendor.id pci 0x15d5
++vendor.name Tatung Co
+
+ vendor.id pci 0x15d6
++vendor.name Entridia Corp
+
+ vendor.id pci 0x15d7
++vendor.name Rockwell-Collins Inc
+
+ vendor.id pci 0x15d8
++vendor.name Cybernetics Technology Co Ltd
+
+ vendor.id pci 0x15d9
++vendor.name Super Micro Computer Inc
+
+ vendor.id pci 0x15da
++vendor.name Cyberfirm Inc
+
+ vendor.id pci 0x15db
++vendor.name Applied Computing Systems Inc
+
+ vendor.id pci 0x15dc
++vendor.name Litronic Inc
+
+ vendor.id pci 0x15dc
+&device.id pci 0x0001
++device.name Argus 300 PCI Cryptography Module
+
+ vendor.id pci 0x15dd
++vendor.name Sigmatel Inc
+
+ vendor.id pci 0x15de
++vendor.name Malleable Technologies Inc
+
+ vendor.id pci 0x15df
++vendor.name Infinilink Corp
+
+ vendor.id pci 0x15e0
++vendor.name Cacheflow Inc
+
+ vendor.id pci 0x15e1
++vendor.name Voice Technologies Group Inc
+
+ vendor.id pci 0x15e2
++vendor.name Quicknet Technologies Inc
+
+ vendor.id pci 0x15e3
++vendor.name Networth Technologies Inc
+
+ vendor.id pci 0x15e4
++vendor.name VSN Systemen BV
+
+ vendor.id pci 0x15e5
++vendor.name Valley technologies Inc
+
+ vendor.id pci 0x15e6
++vendor.name Agere Inc
+
+ vendor.id pci 0x15e7
++vendor.name Get Engineering Corp
+
+ vendor.id pci 0x15e8
++vendor.name National Datacomm Corp
+
+ vendor.id pci 0x15e8
+&device.id pci 0x0130
++device.name Wireless PCI Card
+
+ vendor.id pci 0x15e9
++vendor.name Pacific Digital Corp
+
+ vendor.id pci 0x15e9
+&device.id pci 0x1841
++device.name ADMA-100 DiscStaQ ATA Controller
+
+ vendor.id pci 0x15ea
++vendor.name Tokyo Denshi Sekei K.K.
+
+ vendor.id pci 0x15eb
++vendor.name Drsearch GmbH
+
+ vendor.id pci 0x15ec
++vendor.name Beckhoff GmbH
+
+ vendor.id pci 0x15ec
+&device.id pci 0x3101
++device.name FC3101 Profibus DP 1 Channel PCI
+
+ vendor.id pci 0x15ec
+&device.id pci 0x5102
++device.name FC5102
+
+ vendor.id pci 0x15ed
++vendor.name Macrolink Inc
+
+ vendor.id pci 0x15ee
++vendor.name In Win Development Inc
+
+ vendor.id pci 0x15ef
++vendor.name Intelligent Paradigm Inc
+
+ vendor.id pci 0x15f0
++vendor.name B-Tree Systems Inc
+
+ vendor.id pci 0x15f1
++vendor.name Times N Systems Inc
+
+ vendor.id pci 0x15f2
++vendor.name Diagnostic Instruments Inc
+
+ vendor.id pci 0x15f3
++vendor.name Digitmedia Corp
+
+ vendor.id pci 0x15f4
++vendor.name Valuesoft
+
+ vendor.id pci 0x15f5
++vendor.name Power Micro Research
+
+ vendor.id pci 0x15f6
++vendor.name Extreme Packet Device Inc
+
+ vendor.id pci 0x15f7
++vendor.name Banctec
+
+ vendor.id pci 0x15f8
++vendor.name Koga Electronics Co
+
+ vendor.id pci 0x15f9
++vendor.name Zenith Electronics Corp
+
+ vendor.id pci 0x15fa
++vendor.name J.P. Axzam Corp
+
+ vendor.id pci 0x15fb
++vendor.name Zilog Inc
+
+ vendor.id pci 0x15fc
++vendor.name Techsan Electronics Co Ltd
+
+ vendor.id pci 0x15fd
++vendor.name N-CUBED.NET
+
+ vendor.id pci 0x15fe
++vendor.name Kinpo Electronics Inc
+
+ vendor.id pci 0x15ff
++vendor.name Fastpoint Technologies Inc
+
+ vendor.id pci 0x1600
++vendor.name Northrop Grumman - Canada Ltd
+
+ vendor.id pci 0x1601
++vendor.name Tenta Technology
+
+ vendor.id pci 0x1602
++vendor.name Prosys-tec Inc
+
+ vendor.id pci 0x1603
++vendor.name Nokia Wireless Communications
+
+ vendor.id pci 0x1604
++vendor.name Central System Research Co Ltd
+
+ vendor.id pci 0x1605
++vendor.name Pairgain Technologies
+
+ vendor.id pci 0x1606
++vendor.name Europop AG
+
+ vendor.id pci 0x1607
++vendor.name Lava Semiconductor Manufacturing Inc
+
+ vendor.id pci 0x1608
++vendor.name Automated Wagering International
+
+ vendor.id pci 0x1609
++vendor.name Scimetric Instruments Inc
+
+ vendor.id pci 0x1612
++vendor.name Telesynergy Research Inc.
+
+ vendor.id pci 0x1619
++vendor.name FarSite Communications Ltd
+
+ vendor.id pci 0x1619
+&device.id pci 0x0400
++device.name FarSync T2P (2 port X.21/V.35/V.24)
+
+ vendor.id pci 0x1619
+&device.id pci 0x0440
++device.name FarSync T4P (4 port X.21/V.35/V.24)
+
+ vendor.id pci 0x161f
++vendor.name Rioworks
+
+ vendor.id pci 0x1626
++vendor.name TDK Semiconductor Corp.
+
+ vendor.id pci 0x1626
+&device.id pci 0x8410
++device.name RTL81xx Fast Ethernet
+
+ vendor.id pci 0x1629
++vendor.name Kongsberg Spacetec AS
+
+ vendor.id pci 0x1629
+&device.id pci 0x1003
++device.name Format synchronizer v3.0
+
+ vendor.id pci 0x1629
+&device.id pci 0x2002
++device.name Fast Universal Data Output
+
+ vendor.id pci 0x1637
++vendor.name Linksys
+
+ vendor.id pci 0x1637
+&device.id pci 0x3874
++device.name Linksys 802.11b WMP11 PCI Wireless card
+
+ vendor.id pci 0x1638
++vendor.name Standard Microsystems Corp [SMC]
+
+ vendor.id pci 0x1638
+&device.id pci 0x1100
++device.name SMC2602W EZConnect / Addtron AWA-100 / Eumitcom PCI WL11000
+
+ vendor.id pci 0x163c
++vendor.name Smart Link Ltd.
+
+ vendor.id pci 0x163c
+&device.id pci 0x3052
++device.name SmartLink SmartPCI562 56K Modem
+
+ vendor.id pci 0x163c
+&device.id pci 0x5449
++device.name SmartPCI561 Modem
+
+ vendor.id pci 0x1657
++vendor.name Brocade Communications Systems, Inc.
+
+ vendor.id pci 0x165a
++vendor.name Epix Inc
+
+ vendor.id pci 0x165a
+&device.id pci 0xc100
++device.name PIXCI(R) CL1 Camera Link Video Capture Board [custom QL5232]
+
+ vendor.id pci 0x165a
+&device.id pci 0xd200
++device.name PIXCI(R) D2X Digital Video Capture Board [custom QL5232]
+
+ vendor.id pci 0x165a
+&device.id pci 0xd300
++device.name PIXCI(R) D3X Digital Video Capture Board [custom QL5232]
+
+ vendor.id pci 0x165d
++vendor.name Hsing Tech. Enterprise Co., Ltd.
+
+ vendor.id pci 0x1661
++vendor.name Worldspace Corp.
+
+ vendor.id pci 0x1668
++vendor.name Actiontec Electronics Inc
+
+ vendor.id pci 0x1668
+&device.id pci 0x0100
++device.name Mini-PCI bridge
+
+ vendor.id pci 0x166d
++vendor.name Broadcom Corporation
+
+ vendor.id pci 0x166d
+&device.id pci 0x0001
++device.name SiByte BCM1125/1125H/1250 System-on-a-Chip PCI
+
+ vendor.id pci 0x166d
+&device.id pci 0x0002
++device.name SiByte BCM1125H/1250 System-on-a-Chip HyperTransport
+
+ vendor.id pci 0x1677
++vendor.name Bernecker + Rainer
+
+ vendor.id pci 0x1677
+&device.id pci 0x104e
++device.name 5LS172.6 B&R Dual CAN Interface Card
+
+ vendor.id pci 0x1677
+&device.id pci 0x12d7
++device.name 5LS172.61 B&R Dual CAN Interface Card
+
+ vendor.id pci 0x167b
++vendor.name ZyDAS Technology Corp.
+
+ vendor.id pci 0x1681
++vendor.name Hercules
+
+ vendor.id pci 0x1681
+&device.id pci 0x0010
++device.name Hercules 3d Prophet II Ultra 64MB [ 350 MHz NV15BR core, 128-bit DDR @ 460 MHz, 1.5v AGP4x ]
+
+ vendor.id pci 0x1688
++vendor.name CastleNet Technology Inc.
+
+ vendor.id pci 0x1688
+&device.id pci 0x1170
++device.name WLAN 802.11b card
+
+ vendor.id pci 0x168c
++vendor.name Atheros Communications, Inc.
+
+ vendor.id pci 0x168c
+&device.id pci 0x0007
++device.name AR5000 802.11a Wireless Adapter
+
+ vendor.id pci 0x168c
+&device.id pci 0x0011
++device.name AR5210 802.11a NIC
+
+ vendor.id pci 0x168c
+&device.id pci 0x0012
++device.name AR5211 802.11ab NIC
+
+ vendor.id pci 0x168c
+&device.id pci 0x0013
++device.name AR5212 802.11abg NIC
+
+ vendor.id pci 0x168c
+&device.id pci 0x0013
+&subvendor.id pci 0x1186
+&subdevice.id pci 0x3202
++subdevice.name D-link DWL-G650 B3 Wireless cardbus adapter
+
+ vendor.id pci 0x168c
+&device.id pci 0x0013
+&subvendor.id pci 0x1186
+&subdevice.id pci 0x3203
++subdevice.name DWL-G520 Wireless PCI Adapter
+
+ vendor.id pci 0x168c
+&device.id pci 0x0013
+&subvendor.id pci 0x1186
+&subdevice.id pci 0x3a13
++subdevice.name DWL-G520 Wireless PCI Adapter rev. B
+
+ vendor.id pci 0x168c
+&device.id pci 0x0013
+&subvendor.id pci 0x1186
+&subdevice.id pci 0x3a94
++subdevice.name C54C Wireless 801.11g cardbus
+
+ vendor.id pci 0x168c
+&device.id pci 0x0013
+&subvendor.id pci 0x1385
+&subdevice.id pci 0x4d00
++subdevice.name Netgear WG311T Wireless PCI Adapter
+
+ vendor.id pci 0x168c
+&device.id pci 0x0013
+&subvendor.id pci 0x14b7
+&subdevice.id pci 0x0a60
++subdevice.name 8482-WD ORiNOCO 11a/b/g Wireless PCI Adapter
+
+ vendor.id pci 0x168c
+&device.id pci 0x0013
+&subvendor.id pci 0x168c
+&subdevice.id pci 0x0013
++subdevice.name WG511T Wireless CardBus Adapter
+
+ vendor.id pci 0x168c
+&device.id pci 0x0013
+&subvendor.id pci 0x168c
+&subdevice.id pci 0x1025
++subdevice.name DWL-G650B2 Wireless CardBus Adapter
+
+ vendor.id pci 0x168c
+&device.id pci 0x0013
+&subvendor.id pci 0x168c
+&subdevice.id pci 0x2026
++subdevice.name Netgate 5354MP ARIES a(108Mb turbo)/b/g MiniPCI Adapter
+
+ vendor.id pci 0x168c
+&device.id pci 0x1014
++device.name AR5212 802.11abg NIC
+
+ vendor.id pci 0x16a5
++vendor.name Tekram Technology Co.,Ltd.
+
+ vendor.id pci 0x16ab
++vendor.name Global Sun Technology Inc
+
+ vendor.id pci 0x16ab
+&device.id pci 0x1100
++device.name GL24110P
+
+ vendor.id pci 0x16ab
+&device.id pci 0x1101
++device.name PLX9052 PCMCIA-to-PCI Wireless LAN
+
+ vendor.id pci 0x16ab
+&device.id pci 0x1102
++device.name PCMCIA-to-PCI Wireless Network Bridge
+
+ vendor.id pci 0x16ae
++vendor.name Safenet Inc
+
+ vendor.id pci 0x16ae
+&device.id pci 0x1141
++device.name SafeXcel-1141
+
+ vendor.id pci 0x16b4
++vendor.name Aspex Semiconductor Ltd
+
+ vendor.id pci 0x16be
++vendor.name Creatix Polymedia GmbH
+
+ vendor.id pci 0x16ca
++vendor.name CENATEK Inc
+
+ vendor.id pci 0x16ca
+&device.id pci 0x0001
++device.name Rocket Drive DL
+
+ vendor.id pci 0x16cd
++vendor.name Densitron Technologies
+
+ vendor.id pci 0x16ce
++vendor.name Roland Corp.
+
+ vendor.id pci 0x16df
++vendor.name PIKA Technologies Inc.
+
+ vendor.id pci 0x16e3
++vendor.name European Space Agency
+
+ vendor.id pci 0x16e3
+&device.id pci 0x1e0f
++device.name LEON2FT Processor
+
+ vendor.id pci 0x16ec
++vendor.name U.S. Robotics
+
+ vendor.id pci 0x16ec
+&device.id pci 0x00ff
++device.name USR997900 10/100 Mbps PCI Network Card
+
+ vendor.id pci 0x16ec
+&device.id pci 0x3685
++device.name Wireless Access PCI Adapter Model 022415
+
+ vendor.id pci 0x16ed
++vendor.name Sycron N. V.
+
+ vendor.id pci 0x16ed
+&device.id pci 0x1001
++device.name UMIO communication card
+
+ vendor.id pci 0x16f3
++vendor.name Jetway Information Co., Ltd.
+
+ vendor.id pci 0x16f4
++vendor.name Vweb Corp
+
+ vendor.id pci 0x16f4
+&device.id pci 0x8000
++device.name VW2010
+
+ vendor.id pci 0x16f6
++vendor.name VideoTele.com, Inc.
+
+ vendor.id pci 0x1702
++vendor.name Internet Machines Corporation (IMC)
+
+ vendor.id pci 0x1705
++vendor.name Digital First, Inc.
+
+ vendor.id pci 0x170b
++vendor.name NetOctave
+
+ vendor.id pci 0x170b
+&device.id pci 0x0100
++device.name NSP2000-SSL crypto accelerator
+
+ vendor.id pci 0x170c
++vendor.name YottaYotta Inc.
+
+ vendor.id pci 0x1725
++vendor.name Vitesse Semiconductor
+
+ vendor.id pci 0x1725
+&device.id pci 0x7174
++device.name VSC7174 PCI/PCI-X Serial ATA Host Bus Controller
+
+ vendor.id pci 0x172a
++vendor.name Accelerated Encryption
+
+ vendor.id pci 0x1734
++vendor.name Fujitsu Siemens Computer GmbH
+
+ vendor.id pci 0x1737
++vendor.name Linksys
+
+ vendor.id pci 0x1737
+&device.id pci 0x0013
++device.name WMP54G Wireless Pci Card
+
+ vendor.id pci 0x1737
+&device.id pci 0x0015
++device.name WMP54GS Wireless Pci Card
+
+ vendor.id pci 0x1737
+&device.id pci 0x1032
++device.name Gigabit Network Adapter
+
+ vendor.id pci 0x1737
+&device.id pci 0x1032
+&subvendor.id pci 0x1737
+&subdevice.id pci 0x0015
++subdevice.name EG1032 v2 Instant Gigabit Network Adapter
+
+ vendor.id pci 0x1737
+&device.id pci 0x1064
++device.name Gigabit Network Adapter
+
+ vendor.id pci 0x1737
+&device.id pci 0x1064
+&subvendor.id pci 0x1737
+&subdevice.id pci 0x0016
++subdevice.name EG1064 v2 Instant Gigabit Network Adapter
+
+ vendor.id pci 0x1737
+&device.id pci 0xab08
++device.name 21x4x DEC-Tulip compatible 10/100 Ethernet
+
+ vendor.id pci 0x1737
+&device.id pci 0xab09
++device.name 21x4x DEC-Tulip compatible 10/100 Ethernet
+
+ vendor.id pci 0x173b
++vendor.name Altima (nee Broadcom)
+
+ vendor.id pci 0x173b
+&device.id pci 0x03e8
++device.name AC1000 Gigabit Ethernet
+
+ vendor.id pci 0x173b
+&device.id pci 0x03e9
++device.name AC1001 Gigabit Ethernet
+
+ vendor.id pci 0x173b
+&device.id pci 0x03ea
++device.name AC9100 Gigabit Ethernet
+
+ vendor.id pci 0x173b
+&device.id pci 0x03ea
+&subvendor.id pci 0x173b
+&subdevice.id pci 0x0001
++subdevice.name AC1002
+
+ vendor.id pci 0x173b
+&device.id pci 0x03eb
++device.name AC1003 Gigabit Ethernet
+
+ vendor.id pci 0x1743
++vendor.name Peppercon AG
+
+ vendor.id pci 0x1743
+&device.id pci 0x8139
++device.name ROL/F-100 Fast Ethernet Adapter with ROL
+
+ vendor.id pci 0x1749
++vendor.name RLX Technologies
+
+ vendor.id pci 0x174b
++vendor.name PC Partner Limited
+
+ vendor.id pci 0x174d
++vendor.name WellX Telecom SA
+
+ vendor.id pci 0x175c
++vendor.name AudioScience Inc
+
+ vendor.id pci 0x175e
++vendor.name Sanera Systems, Inc.
+
+ vendor.id pci 0x1787
++vendor.name Hightech Information System Ltd.
+
+ vendor.id pci 0x1796
++vendor.name Research Centre Juelich
+
+ vendor.id pci 0x1796
+&device.id pci 0x0001
++device.name SIS1100 [Gigabit link]
+
+ vendor.id pci 0x1796
+&device.id pci 0x0002
++device.name HOTlink
+
+ vendor.id pci 0x1796
+&device.id pci 0x0003
++device.name Counter Timer
+
+ vendor.id pci 0x1796
+&device.id pci 0x0004
++device.name CAMAC Controller
+
+ vendor.id pci 0x1796
+&device.id pci 0x0005
++device.name PROFIBUS
+
+ vendor.id pci 0x1796
+&device.id pci 0x0006
++device.name AMCC HOTlink
+
+ vendor.id pci 0x1797
++vendor.name JumpTec h, GMBH
+
+ vendor.id pci 0x1799
++vendor.name Belkin
+
+ vendor.id pci 0x1799
+&device.id pci 0x6001
++device.name Wireless PCI Card - F5D6001
+
+ vendor.id pci 0x1799
+&device.id pci 0x6020
++device.name Wireless PCMCIA Card - F5D6020
+
+ vendor.id pci 0x1799
+&device.id pci 0x6060
++device.name Wireless PDA Card - F5D6060
+
+ vendor.id pci 0x1799
+&device.id pci 0x7000
++device.name Wireless PCI Card - F5D7000
+
+ vendor.id pci 0x17a0
++vendor.name Genesys Logic, Inc
+
+ vendor.id pci 0x17a0
+&device.id pci 0x8033
++device.name GL880S USB 1.1 controller
+
+ vendor.id pci 0x17a0
+&device.id pci 0x8034
++device.name GL880S USB 2.0 controller
+
+ vendor.id pci 0x17af
++vendor.name Hightech Information System Ltd.
+
+ vendor.id pci 0x17b3
++vendor.name Hawking Technologies
+
+ vendor.id pci 0x17b3
+&device.id pci 0xab08
++device.name PN672TX 10/100 Ethernet
+
+ vendor.id pci 0x17b4
++vendor.name Indra Networks, Inc.
+
+ vendor.id pci 0x17b4
+&device.id pci 0x0011
++device.name WebEnhance 100 GZIP Compression Card
+
+ vendor.id pci 0x17c0
++vendor.name Wistron Corp.
+
+ vendor.id pci 0x17c2
++vendor.name Newisys, Inc.
+
+ vendor.id pci 0x17cc
++vendor.name NetChip Technology, Inc
+
+ vendor.id pci 0x17cc
+&device.id pci 0x2280
++device.name USB 2.0
+
+ vendor.id pci 0x17d3
++vendor.name Areca Technology Corp.
+
+ vendor.id pci 0x17d5
++vendor.name S2io Inc.
+
+ vendor.id pci 0x17de
++vendor.name KWorld Computer Co. Ltd.
+
+ vendor.id pci 0x17ee
++vendor.name Connect Components Ltd
+
+ vendor.id pci 0x17fe
++vendor.name Linksys, A Division of Cisco Systems
+
+ vendor.id pci 0x17fe
+&device.id pci 0x2220
++device.name [AirConn] INPROCOMM IPN 2220 Wireless LAN Adapter (rev 01)
+
+ vendor.id pci 0x1813
++vendor.name Ambient Technologies Inc
+
+ vendor.id pci 0x1813
+&device.id pci 0x4000
++device.name HaM controllerless modem
+
+ vendor.id pci 0x1813
+&device.id pci 0x4000
+&subvendor.id pci 0x16be
+&subdevice.id pci 0x0001
++subdevice.name V9x HAM Data Fax Modem
+
+ vendor.id pci 0x1813
+&device.id pci 0x4100
++device.name HaM plus Data Fax Modem
+
+ vendor.id pci 0x1813
+&device.id pci 0x4100
+&subvendor.id pci 0x16be
+&subdevice.id pci 0x0002
++subdevice.name V9x HAM 1394
+
+ vendor.id pci 0x1814
++vendor.name RaLink
+
+ vendor.id pci 0x1814
+&device.id pci 0x0101
++device.name Wireless PCI Adpator RT2400 / RT2460
+
+ vendor.id pci 0x1814
+&device.id pci 0x0201
++device.name Ralink RT2500 802.11 Cardbus Reference Card
+
+ vendor.id pci 0x1814
+&device.id pci 0x0201
+&subvendor.id pci 0x1371
+&subdevice.id pci 0x001e
++subdevice.name CWC-854 Wireless-G CardBus Adapter
+
+ vendor.id pci 0x1814
+&device.id pci 0x0201
+&subvendor.id pci 0x1371
+&subdevice.id pci 0x001f
++subdevice.name CWM-854 Wireless-G Mini PCI Adapter
+
+ vendor.id pci 0x1814
+&device.id pci 0x0201
+&subvendor.id pci 0x1371
+&subdevice.id pci 0x0020
++subdevice.name CWP-854 Wireless-G PCI Adapter
+
+ vendor.id pci 0x1820
++vendor.name InfiniCon Systems Inc.
+
+ vendor.id pci 0x1822
++vendor.name Twinhan Technology Co. Ltd
+
+ vendor.id pci 0x182d
++vendor.name SiteCom Europe BV
+
+ vendor.id pci 0x182d
+&device.id pci 0x3069
++device.name ISDN PCI DC-105V2
+
+ vendor.id pci 0x1830
++vendor.name Credence Systems Corporation
+
+ vendor.id pci 0x183b
++vendor.name MikroM GmbH
+
+ vendor.id pci 0x183b
+&device.id pci 0x08a7
++device.name MVC100 DVI
+
+ vendor.id pci 0x183b
+&device.id pci 0x08a8
++device.name MVC101 SDI
+
+ vendor.id pci 0x183b
+&device.id pci 0x08a9
++device.name MVC102 DVI+Audio
+
+ vendor.id pci 0x1849
++vendor.name ASRock Incorporation
+
+ vendor.id pci 0x1851
++vendor.name Microtune, Inc.
+
+ vendor.id pci 0x1852
++vendor.name Anritsu Corp.
+
+ vendor.id pci 0x185f
++vendor.name Wistron NeWeb Corp.
+
+ vendor.id pci 0x1867
++vendor.name Topspin Communications
+
+ vendor.id pci 0x1867
+&device.id pci 0x5a44
++device.name MT23108 InfiniHost HCA
+
+ vendor.id pci 0x1867
+&device.id pci 0x5a45
++device.name MT23108 InfiniHost HCA flash recovery
+
+ vendor.id pci 0x1867
+&device.id pci 0x5a46
++device.name MT23108 InfiniHost HCA bridge
+
+ vendor.id pci 0x1867
+&device.id pci 0x6278
++device.name MT25208 InfiniHost III Ex HCA (Tavor compatibility mode)
+
+ vendor.id pci 0x1867
+&device.id pci 0x6282
++device.name MT25208 InfiniHost III Ex HCA
+
+ vendor.id pci 0x187e
++vendor.name ZyXEL Communication Corporation
+
+ vendor.id pci 0x1888
++vendor.name Varisys Ltd
+
+ vendor.id pci 0x1888
+&device.id pci 0x0301
++device.name VMFX1 FPGA PMC module
+
+ vendor.id pci 0x1888
+&device.id pci 0x0601
++device.name VSM2 dual PMC carrier
+
+ vendor.id pci 0x1888
+&device.id pci 0x0710
++device.name VS14x series PowerPC PCI board
+
+ vendor.id pci 0x1888
+&device.id pci 0x0720
++device.name VS24x series PowerPC PCI board
+
+ vendor.id pci 0x1894
++vendor.name KNC One
+
+ vendor.id pci 0x1896
++vendor.name B&B Electronics Manufacturing Company, Inc.
+
+ vendor.id pci 0x18a1
++vendor.name Astute Networks Inc.
+
+ vendor.id pci 0x18ac
++vendor.name DViCO Corporation
+
+ vendor.id pci 0x18ac
+&device.id pci 0xd810
++device.name FusionHDTV 3 Gold
+
+ vendor.id pci 0x18b8
++vendor.name Ammasso
+
+ vendor.id pci 0x18bc
++vendor.name Info-Tek Corp.
+
+ vendor.id pci 0x18c8
++vendor.name Cray Inc
+
+ vendor.id pci 0x18c9
++vendor.name ARVOO Engineering BV
+
+ vendor.id pci 0x18ca
++vendor.name XGI - Xabre Graphics Inc
+
+ vendor.id pci 0x18ca
+&device.id pci 0x0040
++device.name Volari V8
+
+ vendor.id pci 0x18e6
++vendor.name MPL AG
+
+ vendor.id pci 0x18e6
+&device.id pci 0x0001
++device.name OSCI [Octal Serial Communication Interface]
+
+ vendor.id pci 0x18f7
++vendor.name Commtech, Inc.
+
+ vendor.id pci 0x18f7
+&device.id pci 0x0001
++device.name Fastcom ESCC-PCI-335
+
+ vendor.id pci 0x18f7
+&device.id pci 0x0002
++device.name Fastcom 422/4-PCI-335
+
+ vendor.id pci 0x18f7
+&device.id pci 0x0004
++device.name Fastcom 422/2-PCI-335
+
+ vendor.id pci 0x18f7
+&device.id pci 0x0005
++device.name Fastcom IGESCC-PCI-ISO/1
+
+ vendor.id pci 0x18f7
+&device.id pci 0x000a
++device.name Fastcom 232/4-PCI-335
+
+ vendor.id pci 0x18fb
++vendor.name Resilience Corporation
+
+ vendor.id pci 0x1924
++vendor.name Level 5 Networks Inc.
+
+ vendor.id pci 0x1966
++vendor.name Orad Hi-Tec Systems
+
+ vendor.id pci 0x1975
++vendor.name Pudlis Co. Ltd.
+
+ vendor.id pci 0x1993
++vendor.name Innominate Security Technologies AG
+
+ vendor.id pci 0x1a08
++vendor.name Sierra semiconductor
+
+ vendor.id pci 0x1a08
+&device.id pci 0x0000
++device.name SC15064
+
+ vendor.id pci 0x1b13
++vendor.name Jaton Corp
+
+ vendor.id pci 0x1c1c
++vendor.name Symphony
+
+ vendor.id pci 0x1c1c
+&device.id pci 0x0001
++device.name 82C101
+
+ vendor.id pci 0x1d44
++vendor.name DPT
+
+ vendor.id pci 0x1d44
+&device.id pci 0xa400
++device.name PM2x24/PM3224
+
+ vendor.id pci 0x1de1
++vendor.name Tekram Technology Co.,Ltd.
+
+ vendor.id pci 0x1de1
+&device.id pci 0x0391
++device.name TRM-S1040
+
+ vendor.id pci 0x1de1
+&device.id pci 0x2020
++device.name DC-390
+
+ vendor.id pci 0x1de1
+&device.id pci 0x690c
++device.name 690c
+
+ vendor.id pci 0x1de1
+&device.id pci 0xdc29
++device.name DC290
+
+ vendor.id pci 0x1fc0
++vendor.name Tumsan Oy
+
+ vendor.id pci 0x1fc0
+&device.id pci 0x0300
++device.name E2200 Dual E1/Rawpipe Card
+
+ vendor.id pci 0x2000
++vendor.name Smart Link Ltd.
+
+ vendor.id pci 0x2001
++vendor.name Temporal Research Ltd
+
+ vendor.id pci 0x2003
++vendor.name Smart Link Ltd.
+
+ vendor.id pci 0x2004
++vendor.name Smart Link Ltd.
+
+ vendor.id pci 0x21c3
++vendor.name 21st Century Computer Corp.
+
+ vendor.id pci 0x2348
++vendor.name Racore
+
+ vendor.id pci 0x2348
+&device.id pci 0x2010
++device.name 8142 100VG/AnyLAN
+
+ vendor.id pci 0x2646
++vendor.name Kingston Technologies
+
+ vendor.id pci 0x270b
++vendor.name Xantel Corporation
+
+ vendor.id pci 0x270f
++vendor.name Chaintech Computer Co. Ltd
+
+ vendor.id pci 0x2711
++vendor.name AVID Technology Inc.
+
+ vendor.id pci 0x2a15
++vendor.name 3D Vision(???)
+
+ vendor.id pci 0x3000
++vendor.name Hansol Electronics Inc.
+
+ vendor.id pci 0x3142
++vendor.name Post Impression Systems.
+
+ vendor.id pci 0x3388
++vendor.name Hint Corp
+
+ vendor.id pci 0x3388
+&device.id pci 0x0013
++device.name HiNT HC4 PCI to ISDN bridge, Multimedia audio controller
+
+ vendor.id pci 0x3388
+&device.id pci 0x0014
++device.name HiNT HC4 PCI to ISDN bridge, Network controller
+
+ vendor.id pci 0x3388
+&device.id pci 0x0020
++device.name HB6 Universal PCI-PCI bridge (transparent mode)
+
+ vendor.id pci 0x3388
+&device.id pci 0x0021
++device.name HB6 Universal PCI-PCI bridge (non-transparent mode)
+
+ vendor.id pci 0x3388
+&device.id pci 0x0021
+&subvendor.id pci 0x4c53
+&subdevice.id pci 0x1050
++subdevice.name CT7 mainboard
+
+ vendor.id pci 0x3388
+&device.id pci 0x0021
+&subvendor.id pci 0x4c53
+&subdevice.id pci 0x1080
++subdevice.name CT8 mainboard
+
+ vendor.id pci 0x3388
+&device.id pci 0x0021
+&subvendor.id pci 0x4c53
+&subdevice.id pci 0x10a0
++subdevice.name CA3/CR3 mainboard
+
+ vendor.id pci 0x3388
+&device.id pci 0x0021
+&subvendor.id pci 0x4c53
+&subdevice.id pci 0x3010
++subdevice.name PPCI mezzanine (32-bit PMC)
+
+ vendor.id pci 0x3388
+&device.id pci 0x0021
+&subvendor.id pci 0x4c53
+&subdevice.id pci 0x3011
++subdevice.name PPCI mezzanine (64-bit PMC)
+
+ vendor.id pci 0x3388
+&device.id pci 0x0022
++device.name HiNT HB4 PCI-PCI Bridge (PCI6150)
+
+ vendor.id pci 0x3388
+&device.id pci 0x0026
++device.name HB2 PCI-PCI Bridge
+
+ vendor.id pci 0x3388
+&device.id pci 0x101a
++device.name E.Band [AudioTrak Inca88]
+
+ vendor.id pci 0x3388
+&device.id pci 0x101b
++device.name E.Band [AudioTrak Inca88]
+
+ vendor.id pci 0x3388
+&device.id pci 0x8011
++device.name VXPro II Chipset
+
+ vendor.id pci 0x3388
+&device.id pci 0x8011
+&subvendor.id pci 0x3388
+&subdevice.id pci 0x8011
++subdevice.name VXPro II Chipset CPU to PCI Bridge
+
+ vendor.id pci 0x3388
+&device.id pci 0x8012
++device.name VXPro II Chipset
+
+ vendor.id pci 0x3388
+&device.id pci 0x8012
+&subvendor.id pci 0x3388
+&subdevice.id pci 0x8012
++subdevice.name VXPro II Chipset PCI to ISA Bridge
+
+ vendor.id pci 0x3388
+&device.id pci 0x8013
++device.name VXPro II IDE
+
+ vendor.id pci 0x3388
+&device.id pci 0x8013
+&subvendor.id pci 0x3388
+&subdevice.id pci 0x8013
++subdevice.name VXPro II Chipset EIDE Controller
+
+ vendor.id pci 0x3411
++vendor.name Quantum Designs (H.K.) Inc
+
+ vendor.id pci 0x3513
++vendor.name ARCOM Control Systems Ltd
+
+ vendor.id pci 0x3842
++vendor.name eVga.com. Corp.
+
+ vendor.id pci 0x38ef
++vendor.name 4Links
+
+ vendor.id pci 0x3d3d
++vendor.name 3DLabs
+
+ vendor.id pci 0x3d3d
+&device.id pci 0x0001
++device.name GLINT 300SX
+
+ vendor.id pci 0x3d3d
+&device.id pci 0x0002
++device.name GLINT 500TX
+
+ vendor.id pci 0x3d3d
+&device.id pci 0x0003
++device.name GLINT Delta
+
+ vendor.id pci 0x3d3d
+&device.id pci 0x0004
++device.name Permedia
+
+ vendor.id pci 0x3d3d
+&device.id pci 0x0005
++device.name Permedia
+
+ vendor.id pci 0x3d3d
+&device.id pci 0x0006
++device.name GLINT MX
+
+ vendor.id pci 0x3d3d
+&device.id pci 0x0007
++device.name 3D Extreme
+
+ vendor.id pci 0x3d3d
+&device.id pci 0x0008
++device.name GLINT Gamma G1
+
+ vendor.id pci 0x3d3d
+&device.id pci 0x0009
++device.name Permedia II 2D+3D
+
+ vendor.id pci 0x3d3d
+&device.id pci 0x0009
+&subvendor.id pci 0x1040
+&subdevice.id pci 0x0011
++subdevice.name AccelStar II
+
+ vendor.id pci 0x3d3d
+&device.id pci 0x0009
+&subvendor.id pci 0x13e9
+&subdevice.id pci 0x1000
++subdevice.name 6221L-4U
+
+ vendor.id pci 0x3d3d
+&device.id pci 0x0009
+&subvendor.id pci 0x3d3d
+&subdevice.id pci 0x0100
++subdevice.name AccelStar II 3D Accelerator
+
+ vendor.id pci 0x3d3d
+&device.id pci 0x0009
+&subvendor.id pci 0x3d3d
+&subdevice.id pci 0x0111
++subdevice.name Permedia 3:16
+
+ vendor.id pci 0x3d3d
+&device.id pci 0x0009
+&subvendor.id pci 0x3d3d
+&subdevice.id pci 0x0114
++subdevice.name Santa Ana
+
+ vendor.id pci 0x3d3d
+&device.id pci 0x0009
+&subvendor.id pci 0x3d3d
+&subdevice.id pci 0x0116
++subdevice.name Oxygen GVX1
+
+ vendor.id pci 0x3d3d
+&device.id pci 0x0009
+&subvendor.id pci 0x3d3d
+&subdevice.id pci 0x0119
++subdevice.name Scirocco
+
+ vendor.id pci 0x3d3d
+&device.id pci 0x0009
+&subvendor.id pci 0x3d3d
+&subdevice.id pci 0x0120
++subdevice.name Santa Ana PCL
+
+ vendor.id pci 0x3d3d
+&device.id pci 0x0009
+&subvendor.id pci 0x3d3d
+&subdevice.id pci 0x0125
++subdevice.name Oxygen VX1
+
+ vendor.id pci 0x3d3d
+&device.id pci 0x0009
+&subvendor.id pci 0x3d3d
+&subdevice.id pci 0x0127
++subdevice.name Permedia3 Create!
+
+ vendor.id pci 0x3d3d
+&device.id pci 0x000a
++device.name GLINT R3
+
+ vendor.id pci 0x3d3d
+&device.id pci 0x000a
+&subvendor.id pci 0x3d3d
+&subdevice.id pci 0x0121
++subdevice.name Oxygen VX1
+
+ vendor.id pci 0x3d3d
+&device.id pci 0x000c
++device.name GLINT R3 [Oxygen VX1]
+
+ vendor.id pci 0x3d3d
+&device.id pci 0x000c
+&subvendor.id pci 0x3d3d
+&subdevice.id pci 0x0144
++subdevice.name Oxygen VX1-4X AGP [Permedia 4]
+
+ vendor.id pci 0x3d3d
+&device.id pci 0x000d
++device.name GLint R4 rev A
+
+ vendor.id pci 0x3d3d
+&device.id pci 0x0011
++device.name GLint R4 rev B
+
+ vendor.id pci 0x3d3d
+&device.id pci 0x0012
++device.name GLint R5 rev A
+
+ vendor.id pci 0x3d3d
+&device.id pci 0x0013
++device.name GLint R5 rev B
+
+ vendor.id pci 0x3d3d
+&device.id pci 0x0020
++device.name VP10 visual processor
+
+ vendor.id pci 0x3d3d
+&device.id pci 0x0022
++device.name VP10 visual processor
+
+ vendor.id pci 0x3d3d
+&device.id pci 0x0024
++device.name VP9 visual processor
+
+ vendor.id pci 0x3d3d
+&device.id pci 0x0100
++device.name Permedia II 2D+3D
+
+ vendor.id pci 0x3d3d
+&device.id pci 0x07a1
++device.name Wildcat III 6210
+
+ vendor.id pci 0x3d3d
+&device.id pci 0x07a2
++device.name Sun XVR-500 Graphics Accelerator
+
+ vendor.id pci 0x3d3d
+&device.id pci 0x07a3
++device.name Wildcat IV 7210
+
+ vendor.id pci 0x3d3d
+&device.id pci 0x1004
++device.name Permedia
+
+ vendor.id pci 0x3d3d
+&device.id pci 0x3d04
++device.name Permedia
+
+ vendor.id pci 0x3d3d
+&device.id pci 0xffff
++device.name Glint VGA
+
+ vendor.id pci 0x4005
++vendor.name Avance Logic Inc.
+
+ vendor.id pci 0x4005
+&device.id pci 0x0300
++device.name ALS300 PCI Audio Device
+
+ vendor.id pci 0x4005
+&device.id pci 0x0308
++device.name ALS300+ PCI Audio Device
+
+ vendor.id pci 0x4005
+&device.id pci 0x0309
++device.name PCI Input Controller
+
+ vendor.id pci 0x4005
+&device.id pci 0x1064
++device.name ALG-2064
+
+ vendor.id pci 0x4005
+&device.id pci 0x2064
++device.name ALG-2064i
+
+ vendor.id pci 0x4005
+&device.id pci 0x2128
++device.name ALG-2364A GUI Accelerator
+
+ vendor.id pci 0x4005
+&device.id pci 0x2301
++device.name ALG-2301
+
+ vendor.id pci 0x4005
+&device.id pci 0x2302
++device.name ALG-2302
+
+ vendor.id pci 0x4005
+&device.id pci 0x2303
++device.name AVG-2302 GUI Accelerator
+
+ vendor.id pci 0x4005
+&device.id pci 0x2364
++device.name ALG-2364A
+
+ vendor.id pci 0x4005
+&device.id pci 0x2464
++device.name ALG-2464
+
+ vendor.id pci 0x4005
+&device.id pci 0x2501
++device.name ALG-2564A/25128A
+
+ vendor.id pci 0x4005
+&device.id pci 0x4000
++device.name ALS4000 Audio Chipset
+
+ vendor.id pci 0x4005
+&device.id pci 0x4000
+&subvendor.id pci 0x4005
+&subdevice.id pci 0x4000
++subdevice.name ALS4000 Audio Chipset
+
+ vendor.id pci 0x4005
+&device.id pci 0x4710
++device.name ALC200/200P
+
+ vendor.id pci 0x4033
++vendor.name Addtron Technology Co, Inc.
+
+ vendor.id pci 0x4033
+&device.id pci 0x1360
++device.name RTL8139 Ethernet
+
+ vendor.id pci 0x4143
++vendor.name Digital Equipment Corp
+
+ vendor.id pci 0x4144
++vendor.name Alpha Data
+
+ vendor.id pci 0x416c
++vendor.name Aladdin Knowledge Systems
+
+ vendor.id pci 0x416c
+&device.id pci 0x0100
++device.name AladdinCARD
+
+ vendor.id pci 0x416c
+&device.id pci 0x0200
++device.name CPC
+
+ vendor.id pci 0x4444
++vendor.name Internext Compression Inc
+
+ vendor.id pci 0x4444
+&device.id pci 0x0016
++device.name iTVC16 (CX23416) MPEG-2 Encoder
+
+ vendor.id pci 0x4444
+&device.id pci 0x0016
+&subvendor.id pci 0x0070
+&subdevice.id pci 0x4009
++subdevice.name WinTV PVR 250
+
+ vendor.id pci 0x4444
+&device.id pci 0x0803
++device.name iTVC15 MPEG-2 Encoder
+
+ vendor.id pci 0x4444
+&device.id pci 0x0803
+&subvendor.id pci 0x0070
+&subdevice.id pci 0x4000
++subdevice.name WinTV PVR-350
+
+ vendor.id pci 0x4444
+&device.id pci 0x0803
+&subvendor.id pci 0x0070
+&subdevice.id pci 0x4001
++subdevice.name WinTV PVR-250
+
+ vendor.id pci 0x4468
++vendor.name Bridgeport machines
+
+ vendor.id pci 0x4594
++vendor.name Cogetec Informatique Inc
+
+ vendor.id pci 0x45fb
++vendor.name Baldor Electric Company
+
+ vendor.id pci 0x4680
++vendor.name Umax Computer Corp
+
+ vendor.id pci 0x4843
++vendor.name Hercules Computer Technology Inc
+
+ vendor.id pci 0x4916
++vendor.name RedCreek Communications Inc
+
+ vendor.id pci 0x4916
+&device.id pci 0x1960
++device.name RedCreek PCI adapter
+
+ vendor.id pci 0x4943
++vendor.name Growth Networks
+
+ vendor.id pci 0x494f
++vendor.name ACCES I/O Products, Inc.
+
+ vendor.id pci 0x494f
+&device.id pci 0x10e8
++device.name LPCI-COM-8SM
+
+ vendor.id pci 0x4978
++vendor.name Axil Computer Inc
+
+ vendor.id pci 0x4a14
++vendor.name NetVin
+
+ vendor.id pci 0x4a14
+&device.id pci 0x5000
++device.name NV5000SC
+
+ vendor.id pci 0x4a14
+&device.id pci 0x5000
+&subvendor.id pci 0x4a14
+&subdevice.id pci 0x5000
++subdevice.name RT8029-Based Ethernet Adapter
+
+ vendor.id pci 0x4b10
++vendor.name Buslogic Inc.
+
+ vendor.id pci 0x4c48
++vendor.name LUNG HWA Electronics
+
+ vendor.id pci 0x4c53
++vendor.name SBS Technologies
+
+ vendor.id pci 0x4c53
+&device.id pci 0x0000
++device.name PLUSTEST device
+
+ vendor.id pci 0x4c53
+&device.id pci 0x0000
+&subvendor.id pci 0x4c53
+&subdevice.id pci 0x3000
++subdevice.name PLUSTEST card (PC104+)
+
+ vendor.id pci 0x4c53
+&device.id pci 0x0000
+&subvendor.id pci 0x4c53
+&subdevice.id pci 0x3001
++subdevice.name PLUSTEST card (PMC)
+
+ vendor.id pci 0x4c53
+&device.id pci 0x0001
++device.name PLUSTEST-MM device
+
+ vendor.id pci 0x4c53
+&device.id pci 0x0001
+&subvendor.id pci 0x4c53
+&subdevice.id pci 0x3002
++subdevice.name PLUSTEST-MM card (PMC)
+
+ vendor.id pci 0x4ca1
++vendor.name Seanix Technology Inc
+
+ vendor.id pci 0x4d51
++vendor.name MediaQ Inc.
+
+ vendor.id pci 0x4d51
+&device.id pci 0x0200
++device.name MQ-200
+
+ vendor.id pci 0x4d54
++vendor.name Microtechnica Co Ltd
+
+ vendor.id pci 0x4ddc
++vendor.name ILC Data Device Corp
+
+ vendor.id pci 0x4ddc
+&device.id pci 0x0100
++device.name DD-42924I5-300 (ARINC 429 Data Bus)
+
+ vendor.id pci 0x4ddc
+&device.id pci 0x0801
++device.name BU-65570I1 MIL-STD-1553 Test and Simulation
+
+ vendor.id pci 0x4ddc
+&device.id pci 0x0802
++device.name BU-65570I2 MIL-STD-1553 Test and Simulation
+
+ vendor.id pci 0x4ddc
+&device.id pci 0x0811
++device.name BU-65572I1 MIL-STD-1553 Test and Simulation
+
+ vendor.id pci 0x4ddc
+&device.id pci 0x0812
++device.name BU-65572I2 MIL-STD-1553 Test and Simulation
+
+ vendor.id pci 0x4ddc
+&device.id pci 0x0881
++device.name BU-65570T1 MIL-STD-1553 Test and Simulation
+
+ vendor.id pci 0x4ddc
+&device.id pci 0x0882
++device.name BU-65570T2 MIL-STD-1553 Test and Simulation
+
+ vendor.id pci 0x4ddc
+&device.id pci 0x0891
++device.name BU-65572T1 MIL-STD-1553 Test and Simulation
+
+ vendor.id pci 0x4ddc
+&device.id pci 0x0892
++device.name BU-65572T2 MIL-STD-1553 Test and Simulation
+
+ vendor.id pci 0x4ddc
+&device.id pci 0x0901
++device.name BU-65565C1 MIL-STD-1553 Data Bus
+
+ vendor.id pci 0x4ddc
+&device.id pci 0x0902
++device.name BU-65565C2 MIL-STD-1553 Data Bus
+
+ vendor.id pci 0x4ddc
+&device.id pci 0x0903
++device.name BU-65565C3 MIL-STD-1553 Data Bus
+
+ vendor.id pci 0x4ddc
+&device.id pci 0x0904
++device.name BU-65565C4 MIL-STD-1553 Data Bus
+
+ vendor.id pci 0x4ddc
+&device.id pci 0x0b01
++device.name BU-65569I1 MIL-STD-1553 Data Bus
+
+ vendor.id pci 0x4ddc
+&device.id pci 0x0b02
++device.name BU-65569I2 MIL-STD-1553 Data Bus
+
+ vendor.id pci 0x4ddc
+&device.id pci 0x0b03
++device.name BU-65569I3 MIL-STD-1553 Data Bus
+
+ vendor.id pci 0x4ddc
+&device.id pci 0x0b04
++device.name BU-65569I4 MIL-STD-1553 Data Bus
+
+ vendor.id pci 0x5046
++vendor.name GemTek Technology Corporation
+
+ vendor.id pci 0x5046
+&device.id pci 0x1001
++device.name PCI Radio
+
+ vendor.id pci 0x5053
++vendor.name Voyetra Technologies
+
+ vendor.id pci 0x5053
+&device.id pci 0x2010
++device.name Daytona Audio Adapter
+
+ vendor.id pci 0x5136
++vendor.name S S Technologies
+
+ vendor.id pci 0x5143
++vendor.name Qualcomm Inc
+
+ vendor.id pci 0x5145
++vendor.name Ensoniq (Old)
+
+ vendor.id pci 0x5145
+&device.id pci 0x3031
++device.name Concert AudioPCI
+
+ vendor.id pci 0x5168
++vendor.name Animation Technologies Inc.
+
+ vendor.id pci 0x5301
++vendor.name Alliance Semiconductor Corp.
+
+ vendor.id pci 0x5301
+&device.id pci 0x0001
++device.name ProMotion aT3D
+
+ vendor.id pci 0x5333
++vendor.name S3 Inc.
+
+ vendor.id pci 0x5333
+&device.id pci 0x0551
++device.name Plato/PX (system)
+
+ vendor.id pci 0x5333
+&device.id pci 0x5631
++device.name 86c325 [ViRGE]
+
+ vendor.id pci 0x5333
+&device.id pci 0x8800
++device.name 86c866 [Vision 866]
+
+ vendor.id pci 0x5333
+&device.id pci 0x8801
++device.name 86c964 [Vision 964]
+
+ vendor.id pci 0x5333
+&device.id pci 0x8810
++device.name 86c764_0 [Trio 32 vers 0]
+
+ vendor.id pci 0x5333
+&device.id pci 0x8811
++device.name 86c764/765 [Trio32/64/64V+]
+
+ vendor.id pci 0x5333
+&device.id pci 0x8812
++device.name 86cM65 [Aurora64V+]
+
+ vendor.id pci 0x5333
+&device.id pci 0x8813
++device.name 86c764_3 [Trio 32/64 vers 3]
+
+ vendor.id pci 0x5333
+&device.id pci 0x8814
++device.name 86c767 [Trio 64UV+]
+
+ vendor.id pci 0x5333
+&device.id pci 0x8815
++device.name 86cM65 [Aurora 128]
+
+ vendor.id pci 0x5333
+&device.id pci 0x883d
++device.name 86c988 [ViRGE/VX]
+
+ vendor.id pci 0x5333
+&device.id pci 0x8870
++device.name FireGL
+
+ vendor.id pci 0x5333
+&device.id pci 0x8880
++device.name 86c868 [Vision 868 VRAM] vers 0
+
+ vendor.id pci 0x5333
+&device.id pci 0x8881
++device.name 86c868 [Vision 868 VRAM] vers 1
+
+ vendor.id pci 0x5333
+&device.id pci 0x8882
++device.name 86c868 [Vision 868 VRAM] vers 2
+
+ vendor.id pci 0x5333
+&device.id pci 0x8883
++device.name 86c868 [Vision 868 VRAM] vers 3
+
+ vendor.id pci 0x5333
+&device.id pci 0x88b0
++device.name 86c928 [Vision 928 VRAM] vers 0
+
+ vendor.id pci 0x5333
+&device.id pci 0x88b1
++device.name 86c928 [Vision 928 VRAM] vers 1
+
+ vendor.id pci 0x5333
+&device.id pci 0x88b2
++device.name 86c928 [Vision 928 VRAM] vers 2
+
+ vendor.id pci 0x5333
+&device.id pci 0x88b3
++device.name 86c928 [Vision 928 VRAM] vers 3
+
+ vendor.id pci 0x5333
+&device.id pci 0x88c0
++device.name 86c864 [Vision 864 DRAM] vers 0
+
+ vendor.id pci 0x5333
+&device.id pci 0x88c1
++device.name 86c864 [Vision 864 DRAM] vers 1
+
+ vendor.id pci 0x5333
+&device.id pci 0x88c2
++device.name 86c864 [Vision 864-P DRAM] vers 2
+
+ vendor.id pci 0x5333
+&device.id pci 0x88c3
++device.name 86c864 [Vision 864-P DRAM] vers 3
+
+ vendor.id pci 0x5333
+&device.id pci 0x88d0
++device.name 86c964 [Vision 964 VRAM] vers 0
+
+ vendor.id pci 0x5333
+&device.id pci 0x88d1
++device.name 86c964 [Vision 964 VRAM] vers 1
+
+ vendor.id pci 0x5333
+&device.id pci 0x88d2
++device.name 86c964 [Vision 964-P VRAM] vers 2
+
+ vendor.id pci 0x5333
+&device.id pci 0x88d3
++device.name 86c964 [Vision 964-P VRAM] vers 3
+
+ vendor.id pci 0x5333
+&device.id pci 0x88f0
++device.name 86c968 [Vision 968 VRAM] rev 0
+
+ vendor.id pci 0x5333
+&device.id pci 0x88f1
++device.name 86c968 [Vision 968 VRAM] rev 1
+
+ vendor.id pci 0x5333
+&device.id pci 0x88f2
++device.name 86c968 [Vision 968 VRAM] rev 2
+
+ vendor.id pci 0x5333
+&device.id pci 0x88f3
++device.name 86c968 [Vision 968 VRAM] rev 3
+
+ vendor.id pci 0x5333
+&device.id pci 0x8900
++device.name 86c755 [Trio 64V2/DX]
+
+ vendor.id pci 0x5333
+&device.id pci 0x8900
+&subvendor.id pci 0x5333
+&subdevice.id pci 0x8900
++subdevice.name 86C775 Trio64V2/DX
+
+ vendor.id pci 0x5333
+&device.id pci 0x8901
++device.name 86c775/86c785 [Trio 64V2/DX or /GX]
+
+ vendor.id pci 0x5333
+&device.id pci 0x8901
+&subvendor.id pci 0x5333
+&subdevice.id pci 0x8901
++subdevice.name 86C775 Trio64V2/DX, 86C785 Trio64V2/GX
+
+ vendor.id pci 0x5333
+&device.id pci 0x8902
++device.name Plato/PX
+
+ vendor.id pci 0x5333
+&device.id pci 0x8903
++device.name Trio 3D business multimedia
+
+ vendor.id pci 0x5333
+&device.id pci 0x8904
++device.name Trio 64 3D
+
+ vendor.id pci 0x5333
+&device.id pci 0x8904
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x00db
++subdevice.name Integrated Trio3D
+
+ vendor.id pci 0x5333
+&device.id pci 0x8904
+&subvendor.id pci 0x5333
+&subdevice.id pci 0x8904
++subdevice.name 86C365 Trio3D AGP
+
+ vendor.id pci 0x5333
+&device.id pci 0x8905
++device.name Trio 64V+ family
+
+ vendor.id pci 0x5333
+&device.id pci 0x8906
++device.name Trio 64V+ family
+
+ vendor.id pci 0x5333
+&device.id pci 0x8907
++device.name Trio 64V+ family
+
+ vendor.id pci 0x5333
+&device.id pci 0x8908
++device.name Trio 64V+ family
+
+ vendor.id pci 0x5333
+&device.id pci 0x8909
++device.name Trio 64V+ family
+
+ vendor.id pci 0x5333
+&device.id pci 0x890a
++device.name Trio 64V+ family
+
+ vendor.id pci 0x5333
+&device.id pci 0x890b
++device.name Trio 64V+ family
+
+ vendor.id pci 0x5333
+&device.id pci 0x890c
++device.name Trio 64V+ family
+
+ vendor.id pci 0x5333
+&device.id pci 0x890d
++device.name Trio 64V+ family
+
+ vendor.id pci 0x5333
+&device.id pci 0x890e
++device.name Trio 64V+ family
+
+ vendor.id pci 0x5333
+&device.id pci 0x890f
++device.name Trio 64V+ family
+
+ vendor.id pci 0x5333
+&device.id pci 0x8a01
++device.name ViRGE/DX or /GX
+
+ vendor.id pci 0x5333
+&device.id pci 0x8a01
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0xb032
++subdevice.name ViRGE/GX
+
+ vendor.id pci 0x5333
+&device.id pci 0x8a01
+&subvendor.id pci 0x10b4
+&subdevice.id pci 0x1617
++subdevice.name Nitro 3D
+
+ vendor.id pci 0x5333
+&device.id pci 0x8a01
+&subvendor.id pci 0x10b4
+&subdevice.id pci 0x1717
++subdevice.name Nitro 3D
+
+ vendor.id pci 0x5333
+&device.id pci 0x8a01
+&subvendor.id pci 0x5333
+&subdevice.id pci 0x8a01
++subdevice.name ViRGE/DX
+
+ vendor.id pci 0x5333
+&device.id pci 0x8a10
++device.name ViRGE/GX2
+
+ vendor.id pci 0x5333
+&device.id pci 0x8a10
+&subvendor.id pci 0x1092
+&subdevice.id pci 0x8a10
++subdevice.name Stealth 3D 4000
+
+ vendor.id pci 0x5333
+&device.id pci 0x8a13
++device.name 86c368 [Trio 3D/2X]
+
+ vendor.id pci 0x5333
+&device.id pci 0x8a13
+&subvendor.id pci 0x5333
+&subdevice.id pci 0x8a13
++subdevice.name Trio3D/2X
+
+ vendor.id pci 0x5333
+&device.id pci 0x8a20
++device.name 86c794 [Savage 3D]
+
+ vendor.id pci 0x5333
+&device.id pci 0x8a20
+&subvendor.id pci 0x5333
+&subdevice.id pci 0x8a20
++subdevice.name 86C391 Savage3D
+
+ vendor.id pci 0x5333
+&device.id pci 0x8a21
++device.name 86c390 [Savage 3D/MV]
+
+ vendor.id pci 0x5333
+&device.id pci 0x8a21
+&subvendor.id pci 0x5333
+&subdevice.id pci 0x8a21
++subdevice.name 86C390 Savage3D/MV
+
+ vendor.id pci 0x5333
+&device.id pci 0x8a22
++device.name Savage 4
+
+ vendor.id pci 0x5333
+&device.id pci 0x8a22
+&subvendor.id pci 0x1033
+&subdevice.id pci 0x8068
++subdevice.name Savage 4
+
+ vendor.id pci 0x5333
+&device.id pci 0x8a22
+&subvendor.id pci 0x1033
+&subdevice.id pci 0x8069
++subdevice.name Savage 4
+
+ vendor.id pci 0x5333
+&device.id pci 0x8a22
+&subvendor.id pci 0x1033
+&subdevice.id pci 0x8110
++subdevice.name Savage4 LT
+
+ vendor.id pci 0x5333
+&device.id pci 0x8a22
+&subvendor.id pci 0x105d
+&subdevice.id pci 0x0018
++subdevice.name SR9 8Mb SDRAM
+
+ vendor.id pci 0x5333
+&device.id pci 0x8a22
+&subvendor.id pci 0x105d
+&subdevice.id pci 0x002a
++subdevice.name SR9 Pro 16Mb SDRAM
+
+ vendor.id pci 0x5333
+&device.id pci 0x8a22
+&subvendor.id pci 0x105d
+&subdevice.id pci 0x003a
++subdevice.name SR9 Pro 32Mb SDRAM
+
+ vendor.id pci 0x5333
+&device.id pci 0x8a22
+&subvendor.id pci 0x105d
+&subdevice.id pci 0x092f
++subdevice.name SR9 Pro+ 16Mb SGRAM
+
+ vendor.id pci 0x5333
+&device.id pci 0x8a22
+&subvendor.id pci 0x1092
+&subdevice.id pci 0x4207
++subdevice.name Stealth III S540
+
+ vendor.id pci 0x5333
+&device.id pci 0x8a22
+&subvendor.id pci 0x1092
+&subdevice.id pci 0x4800
++subdevice.name Stealth III S540
+
+ vendor.id pci 0x5333
+&device.id pci 0x8a22
+&subvendor.id pci 0x1092
+&subdevice.id pci 0x4807
++subdevice.name SpeedStar A90
+
+ vendor.id pci 0x5333
+&device.id pci 0x8a22
+&subvendor.id pci 0x1092
+&subdevice.id pci 0x4808
++subdevice.name Stealth III S540
+
+ vendor.id pci 0x5333
+&device.id pci 0x8a22
+&subvendor.id pci 0x1092
+&subdevice.id pci 0x4809
++subdevice.name Stealth III S540
+
+ vendor.id pci 0x5333
+&device.id pci 0x8a22
+&subvendor.id pci 0x1092
+&subdevice.id pci 0x480e
++subdevice.name Stealth III S540
+
+ vendor.id pci 0x5333
+&device.id pci 0x8a22
+&subvendor.id pci 0x1092
+&subdevice.id pci 0x4904
++subdevice.name Stealth III S520
+
+ vendor.id pci 0x5333
+&device.id pci 0x8a22
+&subvendor.id pci 0x1092
+&subdevice.id pci 0x4905
++subdevice.name SpeedStar A200
+
+ vendor.id pci 0x5333
+&device.id pci 0x8a22
+&subvendor.id pci 0x1092
+&subdevice.id pci 0x4a09
++subdevice.name Stealth III S540
+
+ vendor.id pci 0x5333
+&device.id pci 0x8a22
+&subvendor.id pci 0x1092
+&subdevice.id pci 0x4a0b
++subdevice.name Stealth III S540 Xtreme
+
+ vendor.id pci 0x5333
+&device.id pci 0x8a22
+&subvendor.id pci 0x1092
+&subdevice.id pci 0x4a0f
++subdevice.name Stealth III S540
+
+ vendor.id pci 0x5333
+&device.id pci 0x8a22
+&subvendor.id pci 0x1092
+&subdevice.id pci 0x4e01
++subdevice.name Stealth III S540
+
+ vendor.id pci 0x5333
+&device.id pci 0x8a22
+&subvendor.id pci 0x1102
+&subdevice.id pci 0x101d
++subdevice.name 3d Blaster Savage 4
+
+ vendor.id pci 0x5333
+&device.id pci 0x8a22
+&subvendor.id pci 0x1102
+&subdevice.id pci 0x101e
++subdevice.name 3d Blaster Savage 4
+
+ vendor.id pci 0x5333
+&device.id pci 0x8a22
+&subvendor.id pci 0x5333
+&subdevice.id pci 0x8100
++subdevice.name 86C394-397 Savage4 SDRAM 100
+
+ vendor.id pci 0x5333
+&device.id pci 0x8a22
+&subvendor.id pci 0x5333
+&subdevice.id pci 0x8110
++subdevice.name 86C394-397 Savage4 SDRAM 110
+
+ vendor.id pci 0x5333
+&device.id pci 0x8a22
+&subvendor.id pci 0x5333
+&subdevice.id pci 0x8125
++subdevice.name 86C394-397 Savage4 SDRAM 125
+
+ vendor.id pci 0x5333
+&device.id pci 0x8a22
+&subvendor.id pci 0x5333
+&subdevice.id pci 0x8143
++subdevice.name 86C394-397 Savage4 SDRAM 143
+
+ vendor.id pci 0x5333
+&device.id pci 0x8a22
+&subvendor.id pci 0x5333
+&subdevice.id pci 0x8a22
++subdevice.name 86C394-397 Savage4
+
+ vendor.id pci 0x5333
+&device.id pci 0x8a22
+&subvendor.id pci 0x5333
+&subdevice.id pci 0x8a2e
++subdevice.name 86C394-397 Savage4 32bit
+
+ vendor.id pci 0x5333
+&device.id pci 0x8a22
+&subvendor.id pci 0x5333
+&subdevice.id pci 0x9125
++subdevice.name 86C394-397 Savage4 SGRAM 125
+
+ vendor.id pci 0x5333
+&device.id pci 0x8a22
+&subvendor.id pci 0x5333
+&subdevice.id pci 0x9143
++subdevice.name 86C394-397 Savage4 SGRAM 143
+
+ vendor.id pci 0x5333
+&device.id pci 0x8a23
++device.name Savage 4
+
+ vendor.id pci 0x5333
+&device.id pci 0x8a25
++device.name ProSavage PM133
+
+ vendor.id pci 0x5333
+&device.id pci 0x8a26
++device.name ProSavage KM133
+
+ vendor.id pci 0x5333
+&device.id pci 0x8c00
++device.name ViRGE/M3
+
+ vendor.id pci 0x5333
+&device.id pci 0x8c01
++device.name ViRGE/MX
+
+ vendor.id pci 0x5333
+&device.id pci 0x8c01
+&subvendor.id pci 0x1179
+&subdevice.id pci 0x0001
++subdevice.name ViRGE/MX
+
+ vendor.id pci 0x5333
+&device.id pci 0x8c02
++device.name ViRGE/MX+
+
+ vendor.id pci 0x5333
+&device.id pci 0x8c03
++device.name ViRGE/MX+MV
+
+ vendor.id pci 0x5333
+&device.id pci 0x8c10
++device.name 86C270-294 Savage/MX-MV
+
+ vendor.id pci 0x5333
+&device.id pci 0x8c11
++device.name 82C270-294 Savage/MX
+
+ vendor.id pci 0x5333
+&device.id pci 0x8c12
++device.name 86C270-294 Savage/IX-MV
+
+ vendor.id pci 0x5333
+&device.id pci 0x8c12
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x017f
++subdevice.name ThinkPad T20
+
+ vendor.id pci 0x5333
+&device.id pci 0x8c13
++device.name 86C270-294 Savage/IX
+
+ vendor.id pci 0x5333
+&device.id pci 0x8c13
+&subvendor.id pci 0x1179
+&subdevice.id pci 0x0001
++subdevice.name Magnia Z310
+
+ vendor.id pci 0x5333
+&device.id pci 0x8c22
++device.name SuperSavage MX/128
+
+ vendor.id pci 0x5333
+&device.id pci 0x8c24
++device.name SuperSavage MX/64
+
+ vendor.id pci 0x5333
+&device.id pci 0x8c26
++device.name SuperSavage MX/64C
+
+ vendor.id pci 0x5333
+&device.id pci 0x8c2a
++device.name SuperSavage IX/128 SDR
+
+ vendor.id pci 0x5333
+&device.id pci 0x8c2b
++device.name SuperSavage IX/128 DDR
+
+ vendor.id pci 0x5333
+&device.id pci 0x8c2c
++device.name SuperSavage IX/64 SDR
+
+ vendor.id pci 0x5333
+&device.id pci 0x8c2d
++device.name SuperSavage IX/64 DDR
+
+ vendor.id pci 0x5333
+&device.id pci 0x8c2e
++device.name SuperSavage IX/C SDR
+
+ vendor.id pci 0x5333
+&device.id pci 0x8c2e
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x01fc
++subdevice.name ThinkPad T23 (2647-4MG)
+
+ vendor.id pci 0x5333
+&device.id pci 0x8c2f
++device.name SuperSavage IX/C DDR
+
+ vendor.id pci 0x5333
+&device.id pci 0x8d01
++device.name 86C380 [ProSavageDDR K4M266]
+
+ vendor.id pci 0x5333
+&device.id pci 0x8d02
++device.name VT8636A [ProSavage KN133] AGP4X VGA Controller (TwisterK)
+
+ vendor.id pci 0x5333
+&device.id pci 0x8d03
++device.name VT8751 [ProSavageDDR P4M266]
+
+ vendor.id pci 0x5333
+&device.id pci 0x8d04
++device.name VT8375 [ProSavage8 KM266/KL266]
+
+ vendor.id pci 0x5333
+&device.id pci 0x9102
++device.name 86C410 Savage 2000
+
+ vendor.id pci 0x5333
+&device.id pci 0x9102
+&subvendor.id pci 0x1092
+&subdevice.id pci 0x5932
++subdevice.name Viper II Z200
+
+ vendor.id pci 0x5333
+&device.id pci 0x9102
+&subvendor.id pci 0x1092
+&subdevice.id pci 0x5934
++subdevice.name Viper II Z200
+
+ vendor.id pci 0x5333
+&device.id pci 0x9102
+&subvendor.id pci 0x1092
+&subdevice.id pci 0x5952
++subdevice.name Viper II Z200
+
+ vendor.id pci 0x5333
+&device.id pci 0x9102
+&subvendor.id pci 0x1092
+&subdevice.id pci 0x5954
++subdevice.name Viper II Z200
+
+ vendor.id pci 0x5333
+&device.id pci 0x9102
+&subvendor.id pci 0x1092
+&subdevice.id pci 0x5a35
++subdevice.name Viper II Z200
+
+ vendor.id pci 0x5333
+&device.id pci 0x9102
+&subvendor.id pci 0x1092
+&subdevice.id pci 0x5a37
++subdevice.name Viper II Z200
+
+ vendor.id pci 0x5333
+&device.id pci 0x9102
+&subvendor.id pci 0x1092
+&subdevice.id pci 0x5a55
++subdevice.name Viper II Z200
+
+ vendor.id pci 0x5333
+&device.id pci 0x9102
+&subvendor.id pci 0x1092
+&subdevice.id pci 0x5a57
++subdevice.name Viper II Z200
+
+ vendor.id pci 0x5333
+&device.id pci 0xca00
++device.name SonicVibes
+
+ vendor.id pci 0x544c
++vendor.name Teralogic Inc
+
+ vendor.id pci 0x544c
+&device.id pci 0x0350
++device.name TL880-based HDTV/ATSC tuner
+
+ vendor.id pci 0x5455
++vendor.name Technische University Berlin
+
+ vendor.id pci 0x5455
+&device.id pci 0x4458
++device.name S5933
+
+ vendor.id pci 0x5519
++vendor.name Cnet Technologies, Inc.
+
+ vendor.id pci 0x5544
++vendor.name Dunord Technologies
+
+ vendor.id pci 0x5544
+&device.id pci 0x0001
++device.name I-30xx Scanner Interface
+
+ vendor.id pci 0x5555
++vendor.name Genroco, Inc
+
+ vendor.id pci 0x5555
+&device.id pci 0x0003
++device.name TURBOstor HFP-832 [HiPPI NIC]
+
+ vendor.id pci 0x5654
++vendor.name VoiceTronix Pty Ltd
+
+ vendor.id pci 0x5654
+&device.id pci 0x3132
++device.name OpenSwitch12
+
+ vendor.id pci 0x5700
++vendor.name Netpower
+
+ vendor.id pci 0x5851
++vendor.name Exacq Technologies
+
+ vendor.id pci 0x6356
++vendor.name UltraStor
+
+ vendor.id pci 0x6374
++vendor.name c't Magazin fuer Computertechnik
+
+ vendor.id pci 0x6374
+&device.id pci 0x6773
++device.name GPPCI
+
+ vendor.id pci 0x6409
++vendor.name Logitec Corp.
+
+ vendor.id pci 0x6666
++vendor.name Decision Computer International Co.
+
+ vendor.id pci 0x6666
+&device.id pci 0x0001
++device.name PCCOM4
+
+ vendor.id pci 0x6666
+&device.id pci 0x0002
++device.name PCCOM8
+
+ vendor.id pci 0x7604
++vendor.name O.N. Electronic Co Ltd.
+
+ vendor.id pci 0x7bde
++vendor.name MIDAC Corporation
+
+ vendor.id pci 0x7fed
++vendor.name PowerTV
+
+ vendor.id pci 0x8008
++vendor.name Quancom Electronic GmbH
+
+ vendor.id pci 0x8008
+&device.id pci 0x0010
++device.name WDOG1 [PCI-Watchdog 1]
+
+ vendor.id pci 0x8008
+&device.id pci 0x0011
++device.name PWDOG2 [PCI-Watchdog 2]
+
+ vendor.id pci 0x807d
++vendor.name Asustek Computer, Inc.
+
+ vendor.id pci 0x8086
++vendor.name Intel Corporation
+
+ vendor.id pci 0x8086
+&device.id pci 0x0007
++device.name 82379AB
+
+ vendor.id pci 0x8086
+&device.id pci 0x0008
++device.name Extended Express System Support Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x0008
+&subvendor.id pci 0x0008
+&subdevice.id pci 0x1000
++subdevice.name WorldMark 4300 INCA ASIC
+
+ vendor.id pci 0x8086
+&device.id pci 0x0039
++device.name 21145 Fast Ethernet
+
+ vendor.id pci 0x8086
+&device.id pci 0x0122
++device.name 82437FX
+
+ vendor.id pci 0x8086
+&device.id pci 0x0309
++device.name 80303 I/O Processor PCI-to-PCI Bridge
+
+ vendor.id pci 0x8086
+&device.id pci 0x030d
++device.name 80312 I/O Companion Chip PCI-to-PCI Bridge
+
+ vendor.id pci 0x8086
+&device.id pci 0x0326
++device.name 6700/6702PXH I/OxAPIC Interrupt Controller A
+
+ vendor.id pci 0x8086
+&device.id pci 0x0327
++device.name 6700PXH I/OxAPIC Interrupt Controller B
+
+ vendor.id pci 0x8086
+&device.id pci 0x0329
++device.name 6700PXH PCI Express-to-PCI Bridge A
+
+ vendor.id pci 0x8086
+&device.id pci 0x032a
++device.name 6700PXH PCI Express-to-PCI Bridge B
+
+ vendor.id pci 0x8086
+&device.id pci 0x032c
++device.name 6702PXH PCI Express-to-PCI Bridge A
+
+ vendor.id pci 0x8086
+&device.id pci 0x0330
++device.name 80332 [Dobson] I/O processor
+
+ vendor.id pci 0x8086
+&device.id pci 0x0331
++device.name 80332 [Dobson] I/O processor
+
+ vendor.id pci 0x8086
+&device.id pci 0x0332
++device.name 80332 [Dobson] I/O processor
+
+ vendor.id pci 0x8086
+&device.id pci 0x0333
++device.name 80332 [Dobson] I/O processor
+
+ vendor.id pci 0x8086
+&device.id pci 0x0334
++device.name 80332 [Dobson] I/O processor
+
+ vendor.id pci 0x8086
+&device.id pci 0x0335
++device.name 80331 [Lindsay] I/O processor
+
+ vendor.id pci 0x8086
+&device.id pci 0x0336
++device.name 80331 [Lindsay] I/O processor
+
+ vendor.id pci 0x8086
+&device.id pci 0x0340
++device.name 41210 [Lanai] Serial to Parallel PCI Bridge
+
+ vendor.id pci 0x8086
+&device.id pci 0x0341
++device.name 41210 [Lanai] Serial to Parallel PCI Bridge
+
+ vendor.id pci 0x8086
+&device.id pci 0x0482
++device.name 82375EB/SB PCI to EISA Bridge
+
+ vendor.id pci 0x8086
+&device.id pci 0x0483
++device.name 82424TX/ZX [Saturn] CPU to PCI bridge
+
+ vendor.id pci 0x8086
+&device.id pci 0x0484
++device.name 82378ZB/IB, 82379AB (SIO, SIO.A) PCI to ISA Bridge
+
+ vendor.id pci 0x8086
+&device.id pci 0x0486
++device.name 82425EX/ZX [Aries] PCIset with ISA bridge
+
+ vendor.id pci 0x8086
+&device.id pci 0x04a3
++device.name 82434LX/NX [Mercury/Neptune] Processor to PCI bridge
+
+ vendor.id pci 0x8086
+&device.id pci 0x04d0
++device.name 82437FX [Triton FX]
+
+ vendor.id pci 0x8086
+&device.id pci 0x0500
++device.name E8870 Processor bus control
+
+ vendor.id pci 0x8086
+&device.id pci 0x0501
++device.name E8870 Memory controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x0502
++device.name E8870 Scalability Port 0
+
+ vendor.id pci 0x8086
+&device.id pci 0x0503
++device.name E8870 Scalability Port 1
+
+ vendor.id pci 0x8086
+&device.id pci 0x0510
++device.name E8870IO Hub Interface Port 0 registers (8-bit compatibility port)
+
+ vendor.id pci 0x8086
+&device.id pci 0x0511
++device.name E8870IO Hub Interface Port 1 registers
+
+ vendor.id pci 0x8086
+&device.id pci 0x0512
++device.name E8870IO Hub Interface Port 2 registers
+
+ vendor.id pci 0x8086
+&device.id pci 0x0513
++device.name E8870IO Hub Interface Port 3 registers
+
+ vendor.id pci 0x8086
+&device.id pci 0x0514
++device.name E8870IO Hub Interface Port 4 registers
+
+ vendor.id pci 0x8086
+&device.id pci 0x0515
++device.name E8870IO General SIOH registers
+
+ vendor.id pci 0x8086
+&device.id pci 0x0516
++device.name E8870IO RAS registers
+
+ vendor.id pci 0x8086
+&device.id pci 0x0530
++device.name E8870SP Scalability Port 0 registers
+
+ vendor.id pci 0x8086
+&device.id pci 0x0531
++device.name E8870SP Scalability Port 1 registers
+
+ vendor.id pci 0x8086
+&device.id pci 0x0532
++device.name E8870SP Scalability Port 2 registers
+
+ vendor.id pci 0x8086
+&device.id pci 0x0533
++device.name E8870SP Scalability Port 3 registers
+
+ vendor.id pci 0x8086
+&device.id pci 0x0534
++device.name E8870SP Scalability Port 4 registers
+
+ vendor.id pci 0x8086
+&device.id pci 0x0535
++device.name E8870SP Scalability Port 5 registers
+
+ vendor.id pci 0x8086
+&device.id pci 0x0536
++device.name E8870SP Interleave registers 0 and 1
+
+ vendor.id pci 0x8086
+&device.id pci 0x0537
++device.name E8870SP Interleave registers 2 and 3
+
+ vendor.id pci 0x8086
+&device.id pci 0x0600
++device.name RAID Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x0600
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x01c1
++subdevice.name ICP Vortex GDT8546RZ
+
+ vendor.id pci 0x8086
+&device.id pci 0x0600
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x01f7
++subdevice.name SCRU32
+
+ vendor.id pci 0x8086
+&device.id pci 0x061f
++device.name 80303 I/O Processor
+
+ vendor.id pci 0x8086
+&device.id pci 0x0960
++device.name 80960RP [i960 RP Microprocessor/Bridge]
+
+ vendor.id pci 0x8086
+&device.id pci 0x0962
++device.name 80960RM [i960RM Bridge]
+
+ vendor.id pci 0x8086
+&device.id pci 0x0964
++device.name 80960RP [i960 RP Microprocessor/Bridge]
+
+ vendor.id pci 0x8086
+&device.id pci 0x1000
++device.name 82542 Gigabit Ethernet Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x1000
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0xb0df
++subdevice.name Compaq NC6132 Gigabit Module
+
+ vendor.id pci 0x8086
+&device.id pci 0x1000
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0xb0e0
++subdevice.name Compaq NC6133 Gigabit Module
+
+ vendor.id pci 0x8086
+&device.id pci 0x1000
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0xb123
++subdevice.name Compaq NC6134 Gigabit NIC
+
+ vendor.id pci 0x8086
+&device.id pci 0x1000
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x0119
++subdevice.name Netfinity Gigabit Ethernet SX Adapter
+
+ vendor.id pci 0x8086
+&device.id pci 0x1000
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x1000
++subdevice.name PRO/1000 Gigabit Server Adapter
+
+ vendor.id pci 0x8086
+&device.id pci 0x1001
++device.name 82543GC Gigabit Ethernet Controller (Fiber)
+
+ vendor.id pci 0x8086
+&device.id pci 0x1001
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0x004a
++subdevice.name Compaq NC6136 Gigabit Server Adapter
+
+ vendor.id pci 0x8086
+&device.id pci 0x1001
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x01ea
++subdevice.name Netfinity Gigabit Ethernet SX Adapter
+
+ vendor.id pci 0x8086
+&device.id pci 0x1001
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x1002
++subdevice.name PRO/1000 F Server Adapter
+
+ vendor.id pci 0x8086
+&device.id pci 0x1001
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x1003
++subdevice.name PRO/1000 F Server Adapter
+
+ vendor.id pci 0x8086
+&device.id pci 0x1002
++device.name Pro 100 LAN+Modem 56 Cardbus II
+
+ vendor.id pci 0x8086
+&device.id pci 0x1002
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x200e
++subdevice.name Pro 100 LAN+Modem 56 Cardbus II
+
+ vendor.id pci 0x8086
+&device.id pci 0x1002
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x2013
++subdevice.name Pro 100 SR Mobile Combo Adapter
+
+ vendor.id pci 0x8086
+&device.id pci 0x1002
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x2017
++subdevice.name Pro 100 S Combo Mobile Adapter
+
+ vendor.id pci 0x8086
+&device.id pci 0x1004
++device.name 82543GC Gigabit Ethernet Controller (Copper)
+
+ vendor.id pci 0x8086
+&device.id pci 0x1004
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0x0049
++subdevice.name Compaq NC7132 Gigabit Upgrade Module
+
+ vendor.id pci 0x8086
+&device.id pci 0x1004
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0xb1a4
++subdevice.name Compaq NC7131 Gigabit Server Adapter
+
+ vendor.id pci 0x8086
+&device.id pci 0x1004
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x10f2
++subdevice.name Gigabit Ethernet Server Adapter
+
+ vendor.id pci 0x8086
+&device.id pci 0x1004
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x1004
++subdevice.name PRO/1000 T Server Adapter
+
+ vendor.id pci 0x8086
+&device.id pci 0x1004
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x2004
++subdevice.name PRO/1000 T Server Adapter
+
+ vendor.id pci 0x8086
+&device.id pci 0x1008
++device.name 82544EI Gigabit Ethernet Controller (Copper)
+
+ vendor.id pci 0x8086
+&device.id pci 0x1008
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x0269
++subdevice.name iSeries 1000/100/10 Ethernet Adapter
+
+ vendor.id pci 0x8086
+&device.id pci 0x1008
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x011c
++subdevice.name PRO/1000 XT Network Connection
+
+ vendor.id pci 0x8086
+&device.id pci 0x1008
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x1107
++subdevice.name PRO/1000 XT Server Adapter
+
+ vendor.id pci 0x8086
+&device.id pci 0x1008
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x2107
++subdevice.name PRO/1000 XT Server Adapter
+
+ vendor.id pci 0x8086
+&device.id pci 0x1008
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x2110
++subdevice.name PRO/1000 XT Server Adapter
+
+ vendor.id pci 0x8086
+&device.id pci 0x1008
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x3108
++subdevice.name PRO/1000 XT Network Connection
+
+ vendor.id pci 0x8086
+&device.id pci 0x1009
++device.name 82544EI Gigabit Ethernet Controller (Fiber)
+
+ vendor.id pci 0x8086
+&device.id pci 0x1009
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x0268
++subdevice.name iSeries Gigabit Ethernet Adapter
+
+ vendor.id pci 0x8086
+&device.id pci 0x1009
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x1109
++subdevice.name PRO/1000 XF Server Adapter
+
+ vendor.id pci 0x8086
+&device.id pci 0x1009
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x2109
++subdevice.name PRO/1000 XF Server Adapter
+
+ vendor.id pci 0x8086
+&device.id pci 0x100c
++device.name 82544GC Gigabit Ethernet Controller (Copper)
+
+ vendor.id pci 0x8086
+&device.id pci 0x100c
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x1112
++subdevice.name PRO/1000 T Desktop Adapter
+
+ vendor.id pci 0x8086
+&device.id pci 0x100c
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x2112
++subdevice.name PRO/1000 T Desktop Adapter
+
+ vendor.id pci 0x8086
+&device.id pci 0x100d
++device.name 82544GC Gigabit Ethernet Controller (LOM)
+
+ vendor.id pci 0x8086
+&device.id pci 0x100d
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x0123
++subdevice.name PRO/1000 XT Network Connection
+
+ vendor.id pci 0x8086
+&device.id pci 0x100d
+&subvendor.id pci 0x1079
+&subdevice.id pci 0x891f
++subdevice.name 82544GC Based Network Connection
+
+ vendor.id pci 0x8086
+&device.id pci 0x100d
+&subvendor.id pci 0x4c53
+&subdevice.id pci 0x1080
++subdevice.name CT8 mainboard
+
+ vendor.id pci 0x8086
+&device.id pci 0x100d
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x110d
++subdevice.name 82544GC Based Network Connection
+
+ vendor.id pci 0x8086
+&device.id pci 0x100e
++device.name 82540EM Gigabit Ethernet Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x100e
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x0265
++subdevice.name PRO/1000 MT Network Connection
+
+ vendor.id pci 0x8086
+&device.id pci 0x100e
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x0267
++subdevice.name PRO/1000 MT Network Connection
+
+ vendor.id pci 0x8086
+&device.id pci 0x100e
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x026a
++subdevice.name PRO/1000 MT Network Connection
+
+ vendor.id pci 0x8086
+&device.id pci 0x100e
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x002e
++subdevice.name Optiplex GX260
+
+ vendor.id pci 0x8086
+&device.id pci 0x100e
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x0151
++subdevice.name PRO/1000 MT Network Connection
+
+ vendor.id pci 0x8086
+&device.id pci 0x100e
+&subvendor.id pci 0x107b
+&subdevice.id pci 0x8920
++subdevice.name PRO/1000 MT Desktop Adapter
+
+ vendor.id pci 0x8086
+&device.id pci 0x100e
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x001e
++subdevice.name PRO/1000 MT Desktop Adapter
+
+ vendor.id pci 0x8086
+&device.id pci 0x100e
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x002e
++subdevice.name PRO/1000 MT Desktop Adapter
+
+ vendor.id pci 0x8086
+&device.id pci 0x100f
++device.name 82545EM Gigabit Ethernet Controller (Copper)
+
+ vendor.id pci 0x8086
+&device.id pci 0x100f
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x0269
++subdevice.name iSeries 1000/100/10 Ethernet Adapter
+
+ vendor.id pci 0x8086
+&device.id pci 0x100f
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x028e
++subdevice.name PRO/1000 MT Network Connection
+
+ vendor.id pci 0x8086
+&device.id pci 0x100f
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x1000
++subdevice.name PRO/1000 MT Network Connection
+
+ vendor.id pci 0x8086
+&device.id pci 0x100f
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x1001
++subdevice.name PRO/1000 MT Server Adapter
+
+ vendor.id pci 0x8086
+&device.id pci 0x1010
++device.name 82546EB Gigabit Ethernet Controller (Copper)
+
+ vendor.id pci 0x8086
+&device.id pci 0x1010
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x027c
++subdevice.name PRO/1000 MT Dual Port Network Adapter
+
+ vendor.id pci 0x8086
+&device.id pci 0x1010
+&subvendor.id pci 0x18fb
+&subdevice.id pci 0x7872
++subdevice.name RESlink-X
+
+ vendor.id pci 0x8086
+&device.id pci 0x1010
+&subvendor.id pci 0x4c53
+&subdevice.id pci 0x1080
++subdevice.name CT8 mainboard
+
+ vendor.id pci 0x8086
+&device.id pci 0x1010
+&subvendor.id pci 0x4c53
+&subdevice.id pci 0x10a0
++subdevice.name CA3/CR3 mainboard
+
+ vendor.id pci 0x8086
+&device.id pci 0x1010
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x1011
++subdevice.name PRO/1000 MT Dual Port Server Adapter
+
+ vendor.id pci 0x8086
+&device.id pci 0x1010
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x101a
++subdevice.name PRO/1000 MT Dual Port Network Adapter
+
+ vendor.id pci 0x8086
+&device.id pci 0x1010
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x3424
++subdevice.name SE7501HG2 Mainboard
+
+ vendor.id pci 0x8086
+&device.id pci 0x1011
++device.name 82545EM Gigabit Ethernet Controller (Fiber)
+
+ vendor.id pci 0x8086
+&device.id pci 0x1011
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x0268
++subdevice.name iSeries Gigabit Ethernet Adapter
+
+ vendor.id pci 0x8086
+&device.id pci 0x1011
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x1002
++subdevice.name PRO/1000 MF Server Adapter
+
+ vendor.id pci 0x8086
+&device.id pci 0x1011
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x1003
++subdevice.name PRO/1000 MF Server Adapter (LX)
+
+ vendor.id pci 0x8086
+&device.id pci 0x1012
++device.name 82546EB Gigabit Ethernet Controller (Fiber)
+
+ vendor.id pci 0x8086
+&device.id pci 0x1012
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x1012
++subdevice.name PRO/1000 MF Dual Port Server Adapter
+
+ vendor.id pci 0x8086
+&device.id pci 0x1013
++device.name 82541EI Gigabit Ethernet Controller (Copper)
+
+ vendor.id pci 0x8086
+&device.id pci 0x1013
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x0013
++subdevice.name PRO/1000 MT Network Connection
+
+ vendor.id pci 0x8086
+&device.id pci 0x1013
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x1013
++subdevice.name IBM ThinkCentre Network Card
+
+ vendor.id pci 0x8086
+&device.id pci 0x1013
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x1113
++subdevice.name PRO/1000 MT Desktop Adapter
+
+ vendor.id pci 0x8086
+&device.id pci 0x1014
++device.name 82541ER Gigabit Ethernet Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x1015
++device.name 82540EM Gigabit Ethernet Controller (LOM)
+
+ vendor.id pci 0x8086
+&device.id pci 0x1016
++device.name 82540EP Gigabit Ethernet Controller (LOM)
+
+ vendor.id pci 0x8086
+&device.id pci 0x1016
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x052c
++subdevice.name PRO/1000 MT Mobile Connection
+
+ vendor.id pci 0x8086
+&device.id pci 0x1016
+&subvendor.id pci 0x1179
+&subdevice.id pci 0x0001
++subdevice.name PRO/1000 MT Mobile Connection
+
+ vendor.id pci 0x8086
+&device.id pci 0x1016
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x1016
++subdevice.name PRO/1000 MT Mobile Connection
+
+ vendor.id pci 0x8086
+&device.id pci 0x1017
++device.name 82540EP Gigabit Ethernet Controller (LOM)
+
+ vendor.id pci 0x8086
+&device.id pci 0x1017
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x1017
++subdevice.name PR0/1000 MT Desktop Connection
+
+ vendor.id pci 0x8086
+&device.id pci 0x1018
++device.name 82541EI Gigabit Ethernet Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x1018
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x1018
++subdevice.name PRO/1000 MT Desktop Adapter
+
+ vendor.id pci 0x8086
+&device.id pci 0x1019
++device.name 82547EI Gigabit Ethernet Controller (LOM)
+
+ vendor.id pci 0x8086
+&device.id pci 0x1019
+&subvendor.id pci 0x1458
+&subdevice.id pci 0x1019
++subdevice.name GA-8IPE1000 Pro2 motherboard (865PE)
+
+ vendor.id pci 0x8086
+&device.id pci 0x1019
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x1019
++subdevice.name PRO/1000 CT Desktop Connection
+
+ vendor.id pci 0x8086
+&device.id pci 0x1019
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x301f
++subdevice.name D865PERL mainboard
+
+ vendor.id pci 0x8086
+&device.id pci 0x1019
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x3427
++subdevice.name S875WP1-E mainboard
+
+ vendor.id pci 0x8086
+&device.id pci 0x101d
++device.name 82546EB Gigabit Ethernet Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x101d
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x1000
++subdevice.name PRO/1000 MT Quad Port Server Adapter
+
+ vendor.id pci 0x8086
+&device.id pci 0x101e
++device.name 82540EP Gigabit Ethernet Controller (Mobile)
+
+ vendor.id pci 0x8086
+&device.id pci 0x101e
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x0549
++subdevice.name PRO/1000 MT Mobile Connection
+
+ vendor.id pci 0x8086
+&device.id pci 0x101e
+&subvendor.id pci 0x1179
+&subdevice.id pci 0x0001
++subdevice.name PRO/1000 MT Mobile Connection
+
+ vendor.id pci 0x8086
+&device.id pci 0x101e
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x101e
++subdevice.name PRO/1000 MT Mobile Connection
+
+ vendor.id pci 0x8086
+&device.id pci 0x1026
++device.name 82545GM Gigabit Ethernet Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x1026
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x1000
++subdevice.name PRO/1000 MT Server Connection
+
+ vendor.id pci 0x8086
+&device.id pci 0x1026
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x1001
++subdevice.name PRO/1000 MT Server Adapter
+
+ vendor.id pci 0x8086
+&device.id pci 0x1026
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x1002
++subdevice.name PRO/1000 MT Server Adapter
+
+ vendor.id pci 0x8086
+&device.id pci 0x1026
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x1026
++subdevice.name PRO/1000 MT Server Connection
+
+ vendor.id pci 0x8086
+&device.id pci 0x1027
++device.name 82545GM Gigabit Ethernet Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x1027
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x1001
++subdevice.name PRO/1000 MF Server Adapter(LX)
+
+ vendor.id pci 0x8086
+&device.id pci 0x1027
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x1002
++subdevice.name PRO/1000 MF Server Adapter(LX)
+
+ vendor.id pci 0x8086
+&device.id pci 0x1027
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x1003
++subdevice.name PRO/1000 MF Server Adapter(LX)
+
+ vendor.id pci 0x8086
+&device.id pci 0x1027
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x1027
++subdevice.name PRO/1000 MF Server Adapter
+
+ vendor.id pci 0x8086
+&device.id pci 0x1028
++device.name 82545GM Gigabit Ethernet Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x1028
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x1028
++subdevice.name PRO/1000 MB Server Adapter
+
+ vendor.id pci 0x8086
+&device.id pci 0x1029
++device.name 82559 Ethernet Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x1030
++device.name 82559 InBusiness 10/100
+
+ vendor.id pci 0x8086
+&device.id pci 0x1031
++device.name 82801CAM (ICH3) PRO/100 VE (LOM) Ethernet Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x1031
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x0209
++subdevice.name ThinkPad A/T/X Series
+
+ vendor.id pci 0x8086
+&device.id pci 0x1031
+&subvendor.id pci 0x104d
+&subdevice.id pci 0x80e7
++subdevice.name Vaio PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP
+
+ vendor.id pci 0x8086
+&device.id pci 0x1031
+&subvendor.id pci 0x107b
+&subdevice.id pci 0x5350
++subdevice.name EtherExpress PRO/100 VE
+
+ vendor.id pci 0x8086
+&device.id pci 0x1031
+&subvendor.id pci 0x1179
+&subdevice.id pci 0x0001
++subdevice.name EtherExpress PRO/100 VE
+
+ vendor.id pci 0x8086
+&device.id pci 0x1031
+&subvendor.id pci 0x144d
+&subdevice.id pci 0xc000
++subdevice.name EtherExpress PRO/100 VE
+
+ vendor.id pci 0x8086
+&device.id pci 0x1031
+&subvendor.id pci 0x144d
+&subdevice.id pci 0xc001
++subdevice.name EtherExpress PRO/100 VE
+
+ vendor.id pci 0x8086
+&device.id pci 0x1031
+&subvendor.id pci 0x144d
+&subdevice.id pci 0xc003
++subdevice.name EtherExpress PRO/100 VE
+
+ vendor.id pci 0x8086
+&device.id pci 0x1031
+&subvendor.id pci 0x144d
+&subdevice.id pci 0xc006
++subdevice.name vpr Matrix 170B4
+
+ vendor.id pci 0x8086
+&device.id pci 0x1032
++device.name 82801CAM (ICH3) PRO/100 VE Ethernet Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x1033
++device.name 82801CAM (ICH3) PRO/100 VM (LOM) Ethernet Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x1034
++device.name 82801CAM (ICH3) PRO/100 VM Ethernet Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x1035
++device.name 82801CAM (ICH3)/82562EH (LOM) Ethernet Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x1036
++device.name 82801CAM (ICH3) 82562EH Ethernet Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x1037
++device.name 82801CAM (ICH3) Chipset Ethernet Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x1038
++device.name 82801CAM (ICH3) PRO/100 VM (KM) Ethernet Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x1039
++device.name 82801DB PRO/100 VE (LOM) Ethernet Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x1039
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x0267
++subdevice.name NetVista A30p
+
+ vendor.id pci 0x8086
+&device.id pci 0x103a
++device.name 82801DB PRO/100 VE (CNR) Ethernet Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x103b
++device.name 82801DB PRO/100 VM (LOM) Ethernet Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x103c
++device.name 82801DB PRO/100 VM (CNR) Ethernet Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x103d
++device.name 82801DB PRO/100 VE (MOB) Ethernet Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x103e
++device.name 82801DB PRO/100 VM (MOB) Ethernet Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x1040
++device.name 536EP Data Fax Modem
+
+ vendor.id pci 0x8086
+&device.id pci 0x1040
+&subvendor.id pci 0x16be
+&subdevice.id pci 0x1040
++subdevice.name V.9X DSP Data Fax Modem
+
+ vendor.id pci 0x8086
+&device.id pci 0x1043
++device.name PRO/Wireless LAN 2100 3B Mini PCI Adapter
+
+ vendor.id pci 0x8086
+&device.id pci 0x1043
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x2527
++subdevice.name MIM2000/Centrino
+
+ vendor.id pci 0x8086
+&device.id pci 0x1048
++device.name PRO/10GbE LR Server Adapter
+
+ vendor.id pci 0x8086
+&device.id pci 0x1048
+&subvendor.id pci 0x8086
+&subdevice.id pci 0xa01f
++subdevice.name PRO/10GbE LR Server Adapter
+
+ vendor.id pci 0x8086
+&device.id pci 0x1048
+&subvendor.id pci 0x8086
+&subdevice.id pci 0xa11f
++subdevice.name PRO/10GbE LR Server Adapter
+
+ vendor.id pci 0x8086
+&device.id pci 0x1050
++device.name 82562EZ 10/100 Ethernet Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x1050
+&subvendor.id pci 0x1462
+&subdevice.id pci 0x728c
++subdevice.name 865PE Neo2 (MS-6728)
+
+ vendor.id pci 0x8086
+&device.id pci 0x1050
+&subvendor.id pci 0x1462
+&subdevice.id pci 0x758c
++subdevice.name MS-6758 (875P Neo)
+
+ vendor.id pci 0x8086
+&device.id pci 0x1050
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x3427
++subdevice.name S875WP1-E mainboard
+
+ vendor.id pci 0x8086
+&device.id pci 0x1051
++device.name 82801EB/ER (ICH5/ICH5R) integrated LAN Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x1059
++device.name 82551QM Ethernet Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x1064
++device.name 82562ET/EZ/GT/GZ - PRO/100 VE (LOM) Ethernet Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x1065
++device.name 82562ET/EZ/GT/GZ - PRO/100 VE Ethernet Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x1066
++device.name 82562 EM/EX/GX - PRO/100 VM (LOM) Ethernet Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x1067
++device.name 82562 EM/EX/GX - PRO/100 VM Ethernet Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x1068
++device.name 82562ET/EZ/GT/GZ - PRO/100 VE (LOM) Ethernet Controller Mobile
+
+ vendor.id pci 0x8086
+&device.id pci 0x1069
++device.name 82562 EM/EX/GX - PRO/100 VM (LOM) Ethernet Controller Mobile
+
+ vendor.id pci 0x8086
+&device.id pci 0x106a
++device.name 82562G \t- PRO/100 VE (LOM) Ethernet Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x106b
++device.name 82562G \t- PRO/100 VE Ethernet Controller Mobile
+
+ vendor.id pci 0x8086
+&device.id pci 0x1075
++device.name 82547GI Gigabit Ethernet Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x1075
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x0165
++subdevice.name PowerEdge 750
+
+ vendor.id pci 0x8086
+&device.id pci 0x1075
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x0075
++subdevice.name PRO/1000 CT Network Connection
+
+ vendor.id pci 0x8086
+&device.id pci 0x1075
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x1075
++subdevice.name PRO/1000 CT Network Connection
+
+ vendor.id pci 0x8086
+&device.id pci 0x1076
++device.name 82541GI/PI Gigabit Ethernet Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x1076
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x0165
++subdevice.name PowerEdge 750
+
+ vendor.id pci 0x8086
+&device.id pci 0x1076
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x0076
++subdevice.name PRO/1000 MT Network Connection
+
+ vendor.id pci 0x8086
+&device.id pci 0x1076
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x1076
++subdevice.name PRO/1000 MT Network Connection
+
+ vendor.id pci 0x8086
+&device.id pci 0x1076
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x1176
++subdevice.name PRO/1000 MT Desktop Adapter
+
+ vendor.id pci 0x8086
+&device.id pci 0x1076
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x1276
++subdevice.name PRO/1000 MT Desktop Adapter
+
+ vendor.id pci 0x8086
+&device.id pci 0x1077
++device.name 82541GI Gigabit Ethernet Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x1077
+&subvendor.id pci 0x1179
+&subdevice.id pci 0x0001
++subdevice.name PRO/1000 MT Mobile Connection
+
+ vendor.id pci 0x8086
+&device.id pci 0x1077
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x0077
++subdevice.name PRO/1000 MT Mobile Connection
+
+ vendor.id pci 0x8086
+&device.id pci 0x1077
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x1077
++subdevice.name PRO/1000 MT Mobile Connection
+
+ vendor.id pci 0x8086
+&device.id pci 0x1078
++device.name 82541EI Gigabit Ethernet Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x1078
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x1078
++subdevice.name PRO/1000 MT Network Connection
+
+ vendor.id pci 0x8086
+&device.id pci 0x1079
++device.name 82546GB Gigabit Ethernet Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x1079
+&subvendor.id pci 0x103c
+&subdevice.id pci 0x12a6
++subdevice.name HP Dual Port 1000Base-T [A9900A]
+
+ vendor.id pci 0x8086
+&device.id pci 0x1079
+&subvendor.id pci 0x103c
+&subdevice.id pci 0x12cf
++subdevice.name HP Core Dual Port 1000Base-T [AB352A]
+
+ vendor.id pci 0x8086
+&device.id pci 0x1079
+&subvendor.id pci 0x4c53
+&subdevice.id pci 0x1090
++subdevice.name Cx9 / Vx9 mainboard
+
+ vendor.id pci 0x8086
+&device.id pci 0x1079
+&subvendor.id pci 0x4c53
+&subdevice.id pci 0x10b0
++subdevice.name CL9 mainboard
+
+ vendor.id pci 0x8086
+&device.id pci 0x1079
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x0079
++subdevice.name PRO/1000 MT Dual Port Network Connection
+
+ vendor.id pci 0x8086
+&device.id pci 0x1079
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x1079
++subdevice.name PRO/1000 MT Dual Port Network Connection
+
+ vendor.id pci 0x8086
+&device.id pci 0x1079
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x1179
++subdevice.name PRO/1000 MT Dual Port Network Connection
+
+ vendor.id pci 0x8086
+&device.id pci 0x1079
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x117a
++subdevice.name PRO/1000 MT Dual Port Server Adapter
+
+ vendor.id pci 0x8086
+&device.id pci 0x107a
++device.name 82546GB Gigabit Ethernet Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x107a
+&subvendor.id pci 0x103c
+&subdevice.id pci 0x12a8
++subdevice.name HP Dual Port 1000base-SX [A9899A]
+
+ vendor.id pci 0x8086
+&device.id pci 0x107a
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x107a
++subdevice.name PRO/1000 MF Dual Port Server Adapter
+
+ vendor.id pci 0x8086
+&device.id pci 0x107a
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x127a
++subdevice.name PRO/1000 MF Dual Port Server Adapter
+
+ vendor.id pci 0x8086
+&device.id pci 0x107b
++device.name 82546GB Gigabit Ethernet Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x107b
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x007b
++subdevice.name PRO/1000 MB Dual Port Server Connection
+
+ vendor.id pci 0x8086
+&device.id pci 0x107b
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x107b
++subdevice.name PRO/1000 MB Dual Port Server Connection
+
+ vendor.id pci 0x8086
+&device.id pci 0x1107
++device.name PRO/1000 MF Server Adapter (LX)
+
+ vendor.id pci 0x8086
+&device.id pci 0x1130
++device.name 82815 815 Chipset Host Bridge and Memory Controller Hub
+
+ vendor.id pci 0x8086
+&device.id pci 0x1130
+&subvendor.id pci 0x1025
+&subdevice.id pci 0x1016
++subdevice.name Travelmate 612 TX
+
+ vendor.id pci 0x8086
+&device.id pci 0x1130
+&subvendor.id pci 0x1043
+&subdevice.id pci 0x8027
++subdevice.name TUSL2-C Mainboard
+
+ vendor.id pci 0x8086
+&device.id pci 0x1130
+&subvendor.id pci 0x104d
+&subdevice.id pci 0x80df
++subdevice.name Vaio PCG-FX403
+
+ vendor.id pci 0x8086
+&device.id pci 0x1130
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x4532
++subdevice.name D815EEA2 mainboard
+
+ vendor.id pci 0x8086
+&device.id pci 0x1130
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x4557
++subdevice.name D815EGEW Mainboard
+
+ vendor.id pci 0x8086
+&device.id pci 0x1131
++device.name 82815 815 Chipset AGP Bridge
+
+ vendor.id pci 0x8086
+&device.id pci 0x1132
++device.name 82815 CGC [Chipset Graphics Controller]
+
+ vendor.id pci 0x8086
+&device.id pci 0x1132
+&subvendor.id pci 0x1025
+&subdevice.id pci 0x1016
++subdevice.name Travelmate 612 TX
+
+ vendor.id pci 0x8086
+&device.id pci 0x1132
+&subvendor.id pci 0x104d
+&subdevice.id pci 0x80df
++subdevice.name Vaio PCG-FX403
+
+ vendor.id pci 0x8086
+&device.id pci 0x1132
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x4532
++subdevice.name D815EEA2 Mainboard
+
+ vendor.id pci 0x8086
+&device.id pci 0x1132
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x4557
++subdevice.name D815EGEW Mainboard
+
+ vendor.id pci 0x8086
+&device.id pci 0x1161
++device.name 82806AA PCI64 Hub Advanced Programmable Interrupt Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x1161
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x1161
++subdevice.name 82806AA PCI64 Hub APIC
+
+ vendor.id pci 0x8086
+&device.id pci 0x1162
++device.name Xscale 80200 Big Endian Companion Chip
+
+ vendor.id pci 0x8086
+&device.id pci 0x1200
++device.name Intel IXP1200 Network Processor
+
+ vendor.id pci 0x8086
+&device.id pci 0x1200
+&subvendor.id pci 0x172a
+&subdevice.id pci 0x0000
++subdevice.name AEP SSL Accelerator
+
+ vendor.id pci 0x8086
+&device.id pci 0x1209
++device.name 8255xER/82551IT Fast Ethernet Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x1209
+&subvendor.id pci 0x4c53
+&subdevice.id pci 0x1050
++subdevice.name CT7 mainboard
+
+ vendor.id pci 0x8086
+&device.id pci 0x1209
+&subvendor.id pci 0x4c53
+&subdevice.id pci 0x1051
++subdevice.name CE7 mainboard
+
+ vendor.id pci 0x8086
+&device.id pci 0x1209
+&subvendor.id pci 0x4c53
+&subdevice.id pci 0x1070
++subdevice.name PC6 mainboard
+
+ vendor.id pci 0x8086
+&device.id pci 0x1221
++device.name 82092AA PCI to PCMCIA Bridge
+
+ vendor.id pci 0x8086
+&device.id pci 0x1222
++device.name 82092AA IDE Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x1223
++device.name SAA7116
+
+ vendor.id pci 0x8086
+&device.id pci 0x1225
++device.name 82452KX/GX [Orion]
+
+ vendor.id pci 0x8086
+&device.id pci 0x1226
++device.name 82596 PRO/10 PCI
+
+ vendor.id pci 0x8086
+&device.id pci 0x1227
++device.name 82865 EtherExpress PRO/100A
+
+ vendor.id pci 0x8086
+&device.id pci 0x1228
++device.name 82556 EtherExpress PRO/100 Smart
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
++device.name 82557/8/9 [Ethernet Pro 100]
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0x3001
++subdevice.name 82559 Fast Ethernet LOM with Alert on LAN*
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0x3002
++subdevice.name 82559 Fast Ethernet LOM with Alert on LAN*
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0x3003
++subdevice.name 82559 Fast Ethernet LOM with Alert on LAN*
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0x3004
++subdevice.name 82559 Fast Ethernet LOM with Alert on LAN*
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0x3005
++subdevice.name 82559 Fast Ethernet LOM with Alert on LAN*
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0x3006
++subdevice.name 82559 Fast Ethernet LOM with Alert on LAN*
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0x3007
++subdevice.name 82559 Fast Ethernet LOM with Alert on LAN*
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0xb01e
++subdevice.name Compaq NC3120 Fast Ethernet NIC
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0xb01f
++subdevice.name Compaq NC3122 Fast Ethernet NIC
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0xb02f
++subdevice.name Compaq NC1120 Ethernet NIC
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0xb04a
++subdevice.name Compaq 10/100 TX PCI Intel WOL UTP Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0xb0c6
++subdevice.name Compaq NC3161 Fast Ethernet NIC
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0xb0c7
++subdevice.name Compaq NC3160 Fast Ethernet NIC
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0xb0d7
++subdevice.name Compaq NC3121 Fast Ethernet NIC
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0xb0dd
++subdevice.name Compaq NC3131 Fast Ethernet NIC
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0xb0de
++subdevice.name Compaq NC3132 Fast Ethernet Module
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0xb0e1
++subdevice.name Compaq NC3133 Fast Ethernet Module
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0xb134
++subdevice.name Compaq NC3163 Fast Ethernet NIC
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0xb13c
++subdevice.name Compaq NC3162 Fast Ethernet NIC
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0xb144
++subdevice.name Compaq NC3123 Fast Ethernet NIC
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0xb163
++subdevice.name Compaq NC3134 Fast Ethernet NIC
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0xb164
++subdevice.name Compaq NC3135 Fast Ethernet Upgrade Module
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0xb1a4
++subdevice.name NC7131 Gigabit Server Adapter
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x005c
++subdevice.name 82558B Ethernet Pro 10/100
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x01bc
++subdevice.name 82559 Fast Ethernet LAN On Motherboard
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x01f1
++subdevice.name 10/100 Ethernet Server Adapter
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x01f2
++subdevice.name 10/100 Ethernet Server Adapter
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x0207
++subdevice.name Ethernet Pro/100 S
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x0232
++subdevice.name 10/100 Dual Port Server Adapter
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x023a
++subdevice.name ThinkPad R30
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x105c
++subdevice.name Netfinity 10/100
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x2205
++subdevice.name ThinkPad A22p
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x305c
++subdevice.name 10/100 EtherJet Management Adapter
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x405c
++subdevice.name 10/100 EtherJet Adapter with Alert on LAN
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x505c
++subdevice.name 10/100 EtherJet Secure Management Adapter
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x605c
++subdevice.name 10/100 EtherJet Secure Management Adapter
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x705c
++subdevice.name 10/100 Netfinity 10/100 Ethernet Security Adapter
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x805c
++subdevice.name 10/100 Netfinity 10/100 Ethernet Security Adapter
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x009b
++subdevice.name PowerEdge 2500/2550
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x00ce
++subdevice.name PowerEdge 1400
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x1033
+&subdevice.id pci 0x8000
++subdevice.name PC-9821X-B06
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x1033
+&subdevice.id pci 0x8016
++subdevice.name PK-UG-X006
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x1033
+&subdevice.id pci 0x801f
++subdevice.name PK-UG-X006
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x1033
+&subdevice.id pci 0x8026
++subdevice.name PK-UG-X006
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x1033
+&subdevice.id pci 0x8063
++subdevice.name 82559-based Fast Ethernet Adapter
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x1033
+&subdevice.id pci 0x8064
++subdevice.name 82559-based Fast Ethernet Adapter
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x103c
+&subdevice.id pci 0x10c0
++subdevice.name NetServer 10/100TX
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x103c
+&subdevice.id pci 0x10c3
++subdevice.name NetServer 10/100TX
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x103c
+&subdevice.id pci 0x10ca
++subdevice.name NetServer 10/100TX
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x103c
+&subdevice.id pci 0x10cb
++subdevice.name NetServer 10/100TX
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x103c
+&subdevice.id pci 0x10e3
++subdevice.name NetServer 10/100TX
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x103c
+&subdevice.id pci 0x10e4
++subdevice.name NetServer 10/100TX
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x103c
+&subdevice.id pci 0x1200
++subdevice.name NetServer 10/100TX
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x10c3
+&subdevice.id pci 0x1100
++subdevice.name SmartEther100 SC1100
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x10cf
+&subdevice.id pci 0x1115
++subdevice.name 8255x-based Ethernet Adapter (10/100)
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x10cf
+&subdevice.id pci 0x1143
++subdevice.name 8255x-based Ethernet Adapter (10/100)
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x1179
+&subdevice.id pci 0x0001
++subdevice.name 8255x-based Ethernet Adapter (10/100)
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x1179
+&subdevice.id pci 0x0002
++subdevice.name PCI FastEther LAN on Docker
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x1179
+&subdevice.id pci 0x0003
++subdevice.name 8255x-based Fast Ethernet
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x1259
+&subdevice.id pci 0x2560
++subdevice.name AT-2560 100
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x1259
+&subdevice.id pci 0x2561
++subdevice.name AT-2560 100 FX Ethernet Adapter
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x1266
+&subdevice.id pci 0x0001
++subdevice.name NE10/100 Adapter
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x13e9
+&subdevice.id pci 0x1000
++subdevice.name 6221L-4U
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x144d
+&subdevice.id pci 0x2501
++subdevice.name SEM-2000 MiniPCI LAN Adapter
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x144d
+&subdevice.id pci 0x2502
++subdevice.name SEM-2100IL MiniPCI LAN Adapter
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x1668
+&subdevice.id pci 0x1100
++subdevice.name EtherExpress PRO/100B (TX) (MiniPCI Ethernet+Modem)
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x4c53
+&subdevice.id pci 0x1080
++subdevice.name CT8 mainboard
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x0001
++subdevice.name EtherExpress PRO/100B (TX)
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x0002
++subdevice.name EtherExpress PRO/100B (T4)
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x0003
++subdevice.name EtherExpress PRO/10+
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x0004
++subdevice.name EtherExpress PRO/100 WfM
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x0005
++subdevice.name 82557 10/100
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x0006
++subdevice.name 82557 10/100 with Wake on LAN
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x0007
++subdevice.name 82558 10/100 Adapter
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x0008
++subdevice.name 82558 10/100 with Wake on LAN
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x0009
++subdevice.name EtherExpress PRO/100+
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x000a
++subdevice.name EtherExpress PRO/100+ Management Adapter
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x000b
++subdevice.name EtherExpress PRO/100+
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x000c
++subdevice.name EtherExpress PRO/100+ Management Adapter
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x000d
++subdevice.name EtherExpress PRO/100+ Alert On LAN II* Adapter
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x000e
++subdevice.name EtherExpress PRO/100+ Management Adapter with Alert On LAN*
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x000f
++subdevice.name EtherExpress PRO/100 Desktop Adapter
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x0010
++subdevice.name EtherExpress PRO/100 S Management Adapter
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x0011
++subdevice.name EtherExpress PRO/100 S Management Adapter
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x0012
++subdevice.name EtherExpress PRO/100 S Advanced Management Adapter (D)
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x0013
++subdevice.name EtherExpress PRO/100 S Advanced Management Adapter (E)
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x0030
++subdevice.name EtherExpress PRO/100 Management Adapter with Alert On LAN* GC
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x0031
++subdevice.name EtherExpress PRO/100 Desktop Adapter
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x0040
++subdevice.name EtherExpress PRO/100 S Desktop Adapter
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x0041
++subdevice.name EtherExpress PRO/100 S Desktop Adapter
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x0042
++subdevice.name EtherExpress PRO/100 Desktop Adapter
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x0050
++subdevice.name EtherExpress PRO/100 S Desktop Adapter
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x1009
++subdevice.name EtherExpress PRO/100+ Server Adapter
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x100c
++subdevice.name EtherExpress PRO/100+ Server Adapter (PILA8470B)
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x1012
++subdevice.name EtherExpress PRO/100 S Server Adapter (D)
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x1013
++subdevice.name EtherExpress PRO/100 S Server Adapter (E)
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x1015
++subdevice.name EtherExpress PRO/100 S Dual Port Server Adapter
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x1017
++subdevice.name EtherExpress PRO/100+ Dual Port Server Adapter
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x1030
++subdevice.name EtherExpress PRO/100+ Management Adapter with Alert On LAN* G Server
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x1040
++subdevice.name EtherExpress PRO/100 S Server Adapter
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x1041
++subdevice.name EtherExpress PRO/100 S Server Adapter
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x1042
++subdevice.name EtherExpress PRO/100 Server Adapter
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x1050
++subdevice.name EtherExpress PRO/100 S Server Adapter
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x1051
++subdevice.name EtherExpress PRO/100 Server Adapter
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x1052
++subdevice.name EtherExpress PRO/100 Server Adapter
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x10f0
++subdevice.name EtherExpress PRO/100+ Dual Port Adapter
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x2009
++subdevice.name EtherExpress PRO/100 S Mobile Adapter
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x200d
++subdevice.name EtherExpress PRO/100 Cardbus
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x200e
++subdevice.name EtherExpress PRO/100 LAN+V90 Cardbus Modem
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x200f
++subdevice.name EtherExpress PRO/100 SR Mobile Adapter
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x2010
++subdevice.name EtherExpress PRO/100 S Mobile Combo Adapter
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x2013
++subdevice.name EtherExpress PRO/100 SR Mobile Combo Adapter
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x2016
++subdevice.name EtherExpress PRO/100 S Mobile Adapter
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x2017
++subdevice.name EtherExpress PRO/100 S Combo Mobile Adapter
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x2018
++subdevice.name EtherExpress PRO/100 SR Mobile Adapter
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x2019
++subdevice.name EtherExpress PRO/100 SR Combo Mobile Adapter
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x2101
++subdevice.name EtherExpress PRO/100 P Mobile Adapter
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x2102
++subdevice.name EtherExpress PRO/100 SP Mobile Adapter
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x2103
++subdevice.name EtherExpress PRO/100 SP Mobile Adapter
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x2104
++subdevice.name EtherExpress PRO/100 SP Mobile Adapter
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x2105
++subdevice.name EtherExpress PRO/100 SP Mobile Adapter
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x2106
++subdevice.name EtherExpress PRO/100 P Mobile Adapter
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x2107
++subdevice.name EtherExpress PRO/100 Network Connection
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x2108
++subdevice.name EtherExpress PRO/100 Network Connection
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x2200
++subdevice.name EtherExpress PRO/100 P Mobile Combo Adapter
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x2201
++subdevice.name EtherExpress PRO/100 P Mobile Combo Adapter
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x2202
++subdevice.name EtherExpress PRO/100 SP Mobile Combo Adapter
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x2203
++subdevice.name EtherExpress PRO/100+ MiniPCI
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x2204
++subdevice.name EtherExpress PRO/100+ MiniPCI
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x2205
++subdevice.name EtherExpress PRO/100 SP Mobile Combo Adapter
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x2206
++subdevice.name EtherExpress PRO/100 SP Mobile Combo Adapter
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x2207
++subdevice.name EtherExpress PRO/100 SP Mobile Combo Adapter
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x2208
++subdevice.name EtherExpress PRO/100 P Mobile Combo Adapter
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x2402
++subdevice.name EtherExpress PRO/100+ MiniPCI
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x2407
++subdevice.name EtherExpress PRO/100+ MiniPCI
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x2408
++subdevice.name EtherExpress PRO/100+ MiniPCI
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x2409
++subdevice.name EtherExpress PRO/100+ MiniPCI
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x240f
++subdevice.name EtherExpress PRO/100+ MiniPCI
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x2410
++subdevice.name EtherExpress PRO/100+ MiniPCI
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x2411
++subdevice.name EtherExpress PRO/100+ MiniPCI
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x2412
++subdevice.name EtherExpress PRO/100+ MiniPCI
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x2413
++subdevice.name EtherExpress PRO/100+ MiniPCI
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x3000
++subdevice.name 82559 Fast Ethernet LAN on Motherboard
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x3001
++subdevice.name 82559 Fast Ethernet LOM with Basic Alert on LAN*
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x3002
++subdevice.name 82559 Fast Ethernet LOM with Alert on LAN II*
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x3006
++subdevice.name EtherExpress PRO/100 S Network Connection
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x3007
++subdevice.name EtherExpress PRO/100 S Network Connection
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x3008
++subdevice.name EtherExpress PRO/100 Network Connection
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x3010
++subdevice.name EtherExpress PRO/100 S Network Connection
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x3011
++subdevice.name EtherExpress PRO/100 S Network Connection
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x3012
++subdevice.name EtherExpress PRO/100 Network Connection
+
+ vendor.id pci 0x8086
+&device.id pci 0x1229
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x3411
++subdevice.name SDS2 Mainboard
+
+ vendor.id pci 0x8086
+&device.id pci 0x122d
++device.name 430FX - 82437FX TSC [Triton I]
+
+ vendor.id pci 0x8086
+&device.id pci 0x122e
++device.name 82371FB PIIX ISA [Triton I]
+
+ vendor.id pci 0x8086
+&device.id pci 0x1230
++device.name 82371FB PIIX IDE [Triton I]
+
+ vendor.id pci 0x8086
+&device.id pci 0x1231
++device.name DSVD Modem
+
+ vendor.id pci 0x8086
+&device.id pci 0x1234
++device.name 430MX - 82371MX Mobile PCI I/O IDE Xcelerator (MPIIX)
+
+ vendor.id pci 0x8086
+&device.id pci 0x1235
++device.name 430MX - 82437MX Mob. System Ctrlr (MTSC) & 82438MX Data Path (MTDP)
+
+ vendor.id pci 0x8086
+&device.id pci 0x1237
++device.name 440FX - 82441FX PMC [Natoma]
+
+ vendor.id pci 0x8086
+&device.id pci 0x1239
++device.name 82371FB PIIX IDE Interface
+
+ vendor.id pci 0x8086
+&device.id pci 0x123b
++device.name 82380PB PCI to PCI Docking Bridge
+
+ vendor.id pci 0x8086
+&device.id pci 0x123c
++device.name 82380AB (MISA) Mobile PCI-to-ISA Bridge
+
+ vendor.id pci 0x8086
+&device.id pci 0x123d
++device.name 683053 Programmable Interrupt Device
+
+ vendor.id pci 0x8086
+&device.id pci 0x123e
++device.name 82466GX (IHPC) Integrated Hot-Plug Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x123f
++device.name 82466GX Integrated Hot-Plug Controller (IHPC)
+
+ vendor.id pci 0x8086
+&device.id pci 0x1240
++device.name 82752 (752) AGP Graphics Accelerator
+
+ vendor.id pci 0x8086
+&device.id pci 0x124b
++device.name 82380FB (MPCI2) Mobile Docking Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x1250
++device.name 430HX - 82439HX TXC [Triton II]
+
+ vendor.id pci 0x8086
+&device.id pci 0x1360
++device.name 82806AA PCI64 Hub PCI Bridge
+
+ vendor.id pci 0x8086
+&device.id pci 0x1361
++device.name 82806AA PCI64 Hub Controller (HRes)
+
+ vendor.id pci 0x8086
+&device.id pci 0x1361
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x1361
++subdevice.name 82806AA PCI64 Hub Controller (HRes)
+
+ vendor.id pci 0x8086
+&device.id pci 0x1361
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x8000
++subdevice.name 82806AA PCI64 Hub Controller (HRes)
+
+ vendor.id pci 0x8086
+&device.id pci 0x1460
++device.name 82870P2 P64H2 Hub PCI Bridge
+
+ vendor.id pci 0x8086
+&device.id pci 0x1461
++device.name 82870P2 P64H2 I/OxAPIC
+
+ vendor.id pci 0x8086
+&device.id pci 0x1461
+&subvendor.id pci 0x15d9
+&subdevice.id pci 0x3480
++subdevice.name P4DP6
+
+ vendor.id pci 0x8086
+&device.id pci 0x1461
+&subvendor.id pci 0x4c53
+&subdevice.id pci 0x1090
++subdevice.name Cx9 / Vx9 mainboard
+
+ vendor.id pci 0x8086
+&device.id pci 0x1462
++device.name 82870P2 P64H2 Hot Plug Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x1960
++device.name 80960RP [i960RP Microprocessor]
+
+ vendor.id pci 0x8086
+&device.id pci 0x1960
+&subvendor.id pci 0x101e
+&subdevice.id pci 0x0431
++subdevice.name MegaRAID 431 RAID Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x1960
+&subvendor.id pci 0x101e
+&subdevice.id pci 0x0438
++subdevice.name MegaRAID 438 Ultra2 LVD RAID Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x1960
+&subvendor.id pci 0x101e
+&subdevice.id pci 0x0466
++subdevice.name MegaRAID 466 Express Plus RAID Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x1960
+&subvendor.id pci 0x101e
+&subdevice.id pci 0x0467
++subdevice.name MegaRAID 467 Enterprise 1500 RAID Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x1960
+&subvendor.id pci 0x101e
+&subdevice.id pci 0x0490
++subdevice.name MegaRAID 490 Express 300 RAID Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x1960
+&subvendor.id pci 0x101e
+&subdevice.id pci 0x0762
++subdevice.name MegaRAID 762 Express RAID Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x1960
+&subvendor.id pci 0x101e
+&subdevice.id pci 0x09a0
++subdevice.name PowerEdge Expandable RAID Controller 2/SC
+
+ vendor.id pci 0x8086
+&device.id pci 0x1960
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x0467
++subdevice.name PowerEdge Expandable RAID Controller 2/DC
+
+ vendor.id pci 0x8086
+&device.id pci 0x1960
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x1111
++subdevice.name PowerEdge Expandable RAID Controller 2/SC
+
+ vendor.id pci 0x8086
+&device.id pci 0x1960
+&subvendor.id pci 0x103c
+&subdevice.id pci 0x03a2
++subdevice.name MegaRAID
+
+ vendor.id pci 0x8086
+&device.id pci 0x1960
+&subvendor.id pci 0x103c
+&subdevice.id pci 0x10c6
++subdevice.name MegaRAID 438, HP NetRAID-3Si
+
+ vendor.id pci 0x8086
+&device.id pci 0x1960
+&subvendor.id pci 0x103c
+&subdevice.id pci 0x10c7
++subdevice.name MegaRAID T5, Integrated HP NetRAID
+
+ vendor.id pci 0x8086
+&device.id pci 0x1960
+&subvendor.id pci 0x103c
+&subdevice.id pci 0x10cc
++subdevice.name MegaRAID, Integrated HP NetRAID
+
+ vendor.id pci 0x8086
+&device.id pci 0x1960
+&subvendor.id pci 0x103c
+&subdevice.id pci 0x10cd
++subdevice.name HP NetRAID-1Si
+
+ vendor.id pci 0x8086
+&device.id pci 0x1960
+&subvendor.id pci 0x105a
+&subdevice.id pci 0x0000
++subdevice.name SuperTrak
+
+ vendor.id pci 0x8086
+&device.id pci 0x1960
+&subvendor.id pci 0x105a
+&subdevice.id pci 0x2168
++subdevice.name SuperTrak Pro
+
+ vendor.id pci 0x8086
+&device.id pci 0x1960
+&subvendor.id pci 0x105a
+&subdevice.id pci 0x5168
++subdevice.name SuperTrak66/100
+
+ vendor.id pci 0x8086
+&device.id pci 0x1960
+&subvendor.id pci 0x1111
+&subdevice.id pci 0x1111
++subdevice.name MegaRAID 466, PowerEdge Expandable RAID Controller 2/SC
+
+ vendor.id pci 0x8086
+&device.id pci 0x1960
+&subvendor.id pci 0x1111
+&subdevice.id pci 0x1112
++subdevice.name PowerEdge Expandable RAID Controller 2/SC
+
+ vendor.id pci 0x8086
+&device.id pci 0x1960
+&subvendor.id pci 0x113c
+&subdevice.id pci 0x03a2
++subdevice.name MegaRAID
+
+ vendor.id pci 0x8086
+&device.id pci 0x1960
+&subvendor.id pci 0xe4bf
+&subdevice.id pci 0x1010
++subdevice.name CG1-RADIO
+
+ vendor.id pci 0x8086
+&device.id pci 0x1960
+&subvendor.id pci 0xe4bf
+&subdevice.id pci 0x1020
++subdevice.name CU2-QUARTET
+
+ vendor.id pci 0x8086
+&device.id pci 0x1960
+&subvendor.id pci 0xe4bf
+&subdevice.id pci 0x1040
++subdevice.name CU1-CHORUS
+
+ vendor.id pci 0x8086
+&device.id pci 0x1960
+&subvendor.id pci 0xe4bf
+&subdevice.id pci 0x3100
++subdevice.name CX1-BAND
+
+ vendor.id pci 0x8086
+&device.id pci 0x1962
++device.name 80960RM [i960RM Microprocessor]
+
+ vendor.id pci 0x8086
+&device.id pci 0x1962
+&subvendor.id pci 0x105a
+&subdevice.id pci 0x0000
++subdevice.name SuperTrak SX6000 I2O CPU
+
+ vendor.id pci 0x8086
+&device.id pci 0x1a21
++device.name 82840 840 (Carmel) Chipset Host Bridge (Hub A)
+
+ vendor.id pci 0x8086
+&device.id pci 0x1a23
++device.name 82840 840 (Carmel) Chipset AGP Bridge
+
+ vendor.id pci 0x8086
+&device.id pci 0x1a24
++device.name 82840 840 (Carmel) Chipset PCI Bridge (Hub B)
+
+ vendor.id pci 0x8086
+&device.id pci 0x1a30
++device.name 82845 845 (Brookdale) Chipset Host Bridge
+
+ vendor.id pci 0x8086
+&device.id pci 0x1a30
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x010e
++subdevice.name Optiplex GX240
+
+ vendor.id pci 0x8086
+&device.id pci 0x1a31
++device.name 82845 845 (Brookdale) Chipset AGP Bridge
+
+ vendor.id pci 0x8086
+&device.id pci 0x2410
++device.name 82801AA ISA Bridge (LPC)
+
+ vendor.id pci 0x8086
+&device.id pci 0x2411
++device.name 82801AA IDE
+
+ vendor.id pci 0x8086
+&device.id pci 0x2412
++device.name 82801AA USB
+
+ vendor.id pci 0x8086
+&device.id pci 0x2413
++device.name 82801AA SMBus
+
+ vendor.id pci 0x8086
+&device.id pci 0x2415
++device.name 82801AA AC'97 Audio
+
+ vendor.id pci 0x8086
+&device.id pci 0x2415
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x0095
++subdevice.name Precision Workstation 220 Integrated Digital Audio
+
+ vendor.id pci 0x8086
+&device.id pci 0x2415
+&subvendor.id pci 0x11d4
+&subdevice.id pci 0x0040
++subdevice.name SoundMAX Integrated Digital Audio
+
+ vendor.id pci 0x8086
+&device.id pci 0x2415
+&subvendor.id pci 0x11d4
+&subdevice.id pci 0x0048
++subdevice.name SoundMAX Integrated Digital Audio
+
+ vendor.id pci 0x8086
+&device.id pci 0x2415
+&subvendor.id pci 0x11d4
+&subdevice.id pci 0x5340
++subdevice.name SoundMAX Integrated Digital Audio
+
+ vendor.id pci 0x8086
+&device.id pci 0x2416
++device.name 82801AA AC'97 Modem
+
+ vendor.id pci 0x8086
+&device.id pci 0x2418
++device.name 82801AA PCI Bridge
+
+ vendor.id pci 0x8086
+&device.id pci 0x2420
++device.name 82801AB ISA Bridge (LPC)
+
+ vendor.id pci 0x8086
+&device.id pci 0x2421
++device.name 82801AB IDE
+
+ vendor.id pci 0x8086
+&device.id pci 0x2422
++device.name 82801AB USB
+
+ vendor.id pci 0x8086
+&device.id pci 0x2423
++device.name 82801AB SMBus
+
+ vendor.id pci 0x8086
+&device.id pci 0x2425
++device.name 82801AB AC'97 Audio
+
+ vendor.id pci 0x8086
+&device.id pci 0x2425
+&subvendor.id pci 0x11d4
+&subdevice.id pci 0x0040
++subdevice.name SoundMAX Integrated Digital Audio
+
+ vendor.id pci 0x8086
+&device.id pci 0x2425
+&subvendor.id pci 0x11d4
+&subdevice.id pci 0x0048
++subdevice.name SoundMAX Integrated Digital Audio
+
+ vendor.id pci 0x8086
+&device.id pci 0x2426
++device.name 82801AB AC'97 Modem
+
+ vendor.id pci 0x8086
+&device.id pci 0x2428
++device.name 82801AB PCI Bridge
+
+ vendor.id pci 0x8086
+&device.id pci 0x2440
++device.name 82801BA ISA Bridge (LPC)
+
+ vendor.id pci 0x8086
+&device.id pci 0x2442
++device.name 82801BA/BAM USB (Hub #1)
+
+ vendor.id pci 0x8086
+&device.id pci 0x2442
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x01c6
++subdevice.name Netvista A40/A40p
+
+ vendor.id pci 0x8086
+&device.id pci 0x2442
+&subvendor.id pci 0x1025
+&subdevice.id pci 0x1016
++subdevice.name Travelmate 612 TX
+
+ vendor.id pci 0x8086
+&device.id pci 0x2442
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x010e
++subdevice.name Optiplex GX240
+
+ vendor.id pci 0x8086
+&device.id pci 0x2442
+&subvendor.id pci 0x1043
+&subdevice.id pci 0x8027
++subdevice.name TUSL2-C Mainboard
+
+ vendor.id pci 0x8086
+&device.id pci 0x2442
+&subvendor.id pci 0x104d
+&subdevice.id pci 0x80df
++subdevice.name Vaio PCG-FX403
+
+ vendor.id pci 0x8086
+&device.id pci 0x2442
+&subvendor.id pci 0x147b
+&subdevice.id pci 0x0507
++subdevice.name TH7II-RAID
+
+ vendor.id pci 0x8086
+&device.id pci 0x2442
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x4532
++subdevice.name D815EEA2 mainboard
+
+ vendor.id pci 0x8086
+&device.id pci 0x2442
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x4557
++subdevice.name D815EGEW Mainboard
+
+ vendor.id pci 0x8086
+&device.id pci 0x2443
++device.name 82801BA/BAM SMBus
+
+ vendor.id pci 0x8086
+&device.id pci 0x2443
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x01c6
++subdevice.name Netvista A40/A40p
+
+ vendor.id pci 0x8086
+&device.id pci 0x2443
+&subvendor.id pci 0x1025
+&subdevice.id pci 0x1016
++subdevice.name Travelmate 612 TX
+
+ vendor.id pci 0x8086
+&device.id pci 0x2443
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x010e
++subdevice.name Optiplex GX240
+
+ vendor.id pci 0x8086
+&device.id pci 0x2443
+&subvendor.id pci 0x1043
+&subdevice.id pci 0x8027
++subdevice.name TUSL2-C Mainboard
+
+ vendor.id pci 0x8086
+&device.id pci 0x2443
+&subvendor.id pci 0x104d
+&subdevice.id pci 0x80df
++subdevice.name Vaio PCG-FX403
+
+ vendor.id pci 0x8086
+&device.id pci 0x2443
+&subvendor.id pci 0x147b
+&subdevice.id pci 0x0507
++subdevice.name TH7II-RAID
+
+ vendor.id pci 0x8086
+&device.id pci 0x2443
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x4532
++subdevice.name D815EEA2 mainboard
+
+ vendor.id pci 0x8086
+&device.id pci 0x2443
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x4557
++subdevice.name D815EGEW Mainboard
+
+ vendor.id pci 0x8086
+&device.id pci 0x2444
++device.name 82801BA/BAM USB (Hub #2)
+
+ vendor.id pci 0x8086
+&device.id pci 0x2444
+&subvendor.id pci 0x1025
+&subdevice.id pci 0x1016
++subdevice.name Travelmate 612 TX
+
+ vendor.id pci 0x8086
+&device.id pci 0x2444
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x010e
++subdevice.name Optiplex GX240
+
+ vendor.id pci 0x8086
+&device.id pci 0x2444
+&subvendor.id pci 0x1043
+&subdevice.id pci 0x8027
++subdevice.name TUSL2-C Mainboard
+
+ vendor.id pci 0x8086
+&device.id pci 0x2444
+&subvendor.id pci 0x104d
+&subdevice.id pci 0x80df
++subdevice.name Vaio PCG-FX403
+
+ vendor.id pci 0x8086
+&device.id pci 0x2444
+&subvendor.id pci 0x147b
+&subdevice.id pci 0x0507
++subdevice.name TH7II-RAID
+
+ vendor.id pci 0x8086
+&device.id pci 0x2444
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x4532
++subdevice.name D815EEA2 mainboard
+
+ vendor.id pci 0x8086
+&device.id pci 0x2445
++device.name 82801BA/BAM AC'97 Audio
+
+ vendor.id pci 0x8086
+&device.id pci 0x2445
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x01c6
++subdevice.name Netvista A40/A40p
+
+ vendor.id pci 0x8086
+&device.id pci 0x2445
+&subvendor.id pci 0x1025
+&subdevice.id pci 0x1016
++subdevice.name Travelmate 612 TX
+
+ vendor.id pci 0x8086
+&device.id pci 0x2445
+&subvendor.id pci 0x104d
+&subdevice.id pci 0x80df
++subdevice.name Vaio PCG-FX403
+
+ vendor.id pci 0x8086
+&device.id pci 0x2445
+&subvendor.id pci 0x1462
+&subdevice.id pci 0x3370
++subdevice.name STAC9721 AC
+
+ vendor.id pci 0x8086
+&device.id pci 0x2445
+&subvendor.id pci 0x147b
+&subdevice.id pci 0x0507
++subdevice.name TH7II-RAID
+
+ vendor.id pci 0x8086
+&device.id pci 0x2445
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x4557
++subdevice.name D815EGEW Mainboard
+
+ vendor.id pci 0x8086
+&device.id pci 0x2446
++device.name 82801BA/BAM AC'97 Modem
+
+ vendor.id pci 0x8086
+&device.id pci 0x2446
+&subvendor.id pci 0x1025
+&subdevice.id pci 0x1016
++subdevice.name Travelmate 612 TX
+
+ vendor.id pci 0x8086
+&device.id pci 0x2446
+&subvendor.id pci 0x104d
+&subdevice.id pci 0x80df
++subdevice.name Vaio PCG-FX403
+
+ vendor.id pci 0x8086
+&device.id pci 0x2448
++device.name 82801 Mobile PCI Bridge
+
+ vendor.id pci 0x8086
+&device.id pci 0x2449
++device.name 82801BA/BAM/CA/CAM Ethernet Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x2449
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0x0012
++subdevice.name EtherExpress PRO/100 VM
+
+ vendor.id pci 0x8086
+&device.id pci 0x2449
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0x0091
++subdevice.name EtherExpress PRO/100 VE
+
+ vendor.id pci 0x8086
+&device.id pci 0x2449
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x01ce
++subdevice.name EtherExpress PRO/100 VE
+
+ vendor.id pci 0x8086
+&device.id pci 0x2449
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x01dc
++subdevice.name EtherExpress PRO/100 VE
+
+ vendor.id pci 0x8086
+&device.id pci 0x2449
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x01eb
++subdevice.name EtherExpress PRO/100 VE
+
+ vendor.id pci 0x8086
+&device.id pci 0x2449
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x01ec
++subdevice.name EtherExpress PRO/100 VE
+
+ vendor.id pci 0x8086
+&device.id pci 0x2449
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x0202
++subdevice.name EtherExpress PRO/100 VE
+
+ vendor.id pci 0x8086
+&device.id pci 0x2449
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x0205
++subdevice.name EtherExpress PRO/100 VE
+
+ vendor.id pci 0x8086
+&device.id pci 0x2449
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x0217
++subdevice.name EtherExpress PRO/100 VE
+
+ vendor.id pci 0x8086
+&device.id pci 0x2449
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x0234
++subdevice.name EtherExpress PRO/100 VE
+
+ vendor.id pci 0x8086
+&device.id pci 0x2449
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x023d
++subdevice.name EtherExpress PRO/100 VE
+
+ vendor.id pci 0x8086
+&device.id pci 0x2449
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x0244
++subdevice.name EtherExpress PRO/100 VE
+
+ vendor.id pci 0x8086
+&device.id pci 0x2449
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x0245
++subdevice.name EtherExpress PRO/100 VE
+
+ vendor.id pci 0x8086
+&device.id pci 0x2449
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x0265
++subdevice.name PRO/100 VE Desktop Connection
+
+ vendor.id pci 0x8086
+&device.id pci 0x2449
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x0267
++subdevice.name PRO/100 VE Desktop Connection
+
+ vendor.id pci 0x8086
+&device.id pci 0x2449
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x026a
++subdevice.name PRO/100 VE Desktop Connection
+
+ vendor.id pci 0x8086
+&device.id pci 0x2449
+&subvendor.id pci 0x109f
+&subdevice.id pci 0x315d
++subdevice.name EtherExpress PRO/100 VE
+
+ vendor.id pci 0x8086
+&device.id pci 0x2449
+&subvendor.id pci 0x109f
+&subdevice.id pci 0x3181
++subdevice.name EtherExpress PRO/100 VE
+
+ vendor.id pci 0x8086
+&device.id pci 0x2449
+&subvendor.id pci 0x1179
+&subdevice.id pci 0xff01
++subdevice.name PRO/100 VE Network Connection
+
+ vendor.id pci 0x8086
+&device.id pci 0x2449
+&subvendor.id pci 0x1186
+&subdevice.id pci 0x7801
++subdevice.name EtherExpress PRO/100 VE
+
+ vendor.id pci 0x8086
+&device.id pci 0x2449
+&subvendor.id pci 0x144d
+&subdevice.id pci 0x2602
++subdevice.name HomePNA 1M CNR
+
+ vendor.id pci 0x8086
+&device.id pci 0x2449
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x3010
++subdevice.name EtherExpress PRO/100 VE
+
+ vendor.id pci 0x8086
+&device.id pci 0x2449
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x3011
++subdevice.name EtherExpress PRO/100 VM
+
+ vendor.id pci 0x8086
+&device.id pci 0x2449
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x3012
++subdevice.name 82562EH based Phoneline
+
+ vendor.id pci 0x8086
+&device.id pci 0x2449
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x3013
++subdevice.name EtherExpress PRO/100 VE
+
+ vendor.id pci 0x8086
+&device.id pci 0x2449
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x3014
++subdevice.name EtherExpress PRO/100 VM
+
+ vendor.id pci 0x8086
+&device.id pci 0x2449
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x3015
++subdevice.name 82562EH based Phoneline
+
+ vendor.id pci 0x8086
+&device.id pci 0x2449
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x3016
++subdevice.name EtherExpress PRO/100 P Mobile Combo
+
+ vendor.id pci 0x8086
+&device.id pci 0x2449
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x3017
++subdevice.name EtherExpress PRO/100 P Mobile
+
+ vendor.id pci 0x8086
+&device.id pci 0x2449
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x3018
++subdevice.name EtherExpress PRO/100
+
+ vendor.id pci 0x8086
+&device.id pci 0x244a
++device.name 82801BAM IDE U100
+
+ vendor.id pci 0x8086
+&device.id pci 0x244a
+&subvendor.id pci 0x1025
+&subdevice.id pci 0x1016
++subdevice.name Travelmate 612TX
+
+ vendor.id pci 0x8086
+&device.id pci 0x244a
+&subvendor.id pci 0x104d
+&subdevice.id pci 0x80df
++subdevice.name Vaio PCG-FX403
+
+ vendor.id pci 0x8086
+&device.id pci 0x244b
++device.name 82801BA IDE U100
+
+ vendor.id pci 0x8086
+&device.id pci 0x244b
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x01c6
++subdevice.name Netvista A40/A40p
+
+ vendor.id pci 0x8086
+&device.id pci 0x244b
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x010e
++subdevice.name Optiplex GX240
+
+ vendor.id pci 0x8086
+&device.id pci 0x244b
+&subvendor.id pci 0x1043
+&subdevice.id pci 0x8027
++subdevice.name TUSL2-C Mainboard
+
+ vendor.id pci 0x8086
+&device.id pci 0x244b
+&subvendor.id pci 0x147b
+&subdevice.id pci 0x0507
++subdevice.name TH7II-RAID
+
+ vendor.id pci 0x8086
+&device.id pci 0x244b
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x4532
++subdevice.name D815EEA2 mainboard
+
+ vendor.id pci 0x8086
+&device.id pci 0x244b
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x4557
++subdevice.name D815EGEW Mainboard
+
+ vendor.id pci 0x8086
+&device.id pci 0x244c
++device.name 82801BAM ISA Bridge (LPC)
+
+ vendor.id pci 0x8086
+&device.id pci 0x244e
++device.name 82801 PCI Bridge
+
+ vendor.id pci 0x8086
+&device.id pci 0x244e
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x0267
++subdevice.name NetVista A30p
+
+ vendor.id pci 0x8086
+&device.id pci 0x2450
++device.name 82801E ISA Bridge (LPC)
+
+ vendor.id pci 0x8086
+&device.id pci 0x2452
++device.name 82801E USB
+
+ vendor.id pci 0x8086
+&device.id pci 0x2453
++device.name 82801E SMBus
+
+ vendor.id pci 0x8086
+&device.id pci 0x2459
++device.name 82801E Ethernet Controller 0
+
+ vendor.id pci 0x8086
+&device.id pci 0x245b
++device.name 82801E IDE U100
+
+ vendor.id pci 0x8086
+&device.id pci 0x245d
++device.name 82801E Ethernet Controller 1
+
+ vendor.id pci 0x8086
+&device.id pci 0x245e
++device.name 82801E PCI Bridge
+
+ vendor.id pci 0x8086
+&device.id pci 0x2480
++device.name 82801CA LPC Interface Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x2482
++device.name 82801CA/CAM USB (Hub #1)
+
+ vendor.id pci 0x8086
+&device.id pci 0x2482
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x0220
++subdevice.name ThinkPad A/T/X Series
+
+ vendor.id pci 0x8086
+&device.id pci 0x2482
+&subvendor.id pci 0x104d
+&subdevice.id pci 0x80e7
++subdevice.name VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP
+
+ vendor.id pci 0x8086
+&device.id pci 0x2482
+&subvendor.id pci 0x15d9
+&subdevice.id pci 0x3480
++subdevice.name P4DP6
+
+ vendor.id pci 0x8086
+&device.id pci 0x2482
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x1958
++subdevice.name vpr Matrix 170B4
+
+ vendor.id pci 0x8086
+&device.id pci 0x2482
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x3424
++subdevice.name SE7501HG2 Mainboard
+
+ vendor.id pci 0x8086
+&device.id pci 0x2482
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x4541
++subdevice.name Latitude C640
+
+ vendor.id pci 0x8086
+&device.id pci 0x2483
++device.name 82801CA/CAM SMBus Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x2483
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x0220
++subdevice.name ThinkPad A/T/X Series
+
+ vendor.id pci 0x8086
+&device.id pci 0x2483
+&subvendor.id pci 0x104d
+&subdevice.id pci 0x80e7
++subdevice.name VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP
+
+ vendor.id pci 0x8086
+&device.id pci 0x2483
+&subvendor.id pci 0x15d9
+&subdevice.id pci 0x3480
++subdevice.name P4DP6
+
+ vendor.id pci 0x8086
+&device.id pci 0x2483
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x1958
++subdevice.name vpr Matrix 170B4
+
+ vendor.id pci 0x8086
+&device.id pci 0x2484
++device.name 82801CA/CAM USB (Hub #2)
+
+ vendor.id pci 0x8086
+&device.id pci 0x2484
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x0220
++subdevice.name ThinkPad A/T/X Series
+
+ vendor.id pci 0x8086
+&device.id pci 0x2484
+&subvendor.id pci 0x104d
+&subdevice.id pci 0x80e7
++subdevice.name VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP
+
+ vendor.id pci 0x8086
+&device.id pci 0x2484
+&subvendor.id pci 0x15d9
+&subdevice.id pci 0x3480
++subdevice.name P4DP6
+
+ vendor.id pci 0x8086
+&device.id pci 0x2484
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x1958
++subdevice.name vpr Matrix 170B4
+
+ vendor.id pci 0x8086
+&device.id pci 0x2485
++device.name 82801CA/CAM AC'97 Audio Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x2485
+&subvendor.id pci 0x1013
+&subdevice.id pci 0x5959
++subdevice.name Crystal WMD Audio Codec
+
+ vendor.id pci 0x8086
+&device.id pci 0x2485
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x0222
++subdevice.name ThinkPad T23 (2647-4MG) or A30/A30p (2652/2653)
+
+ vendor.id pci 0x8086
+&device.id pci 0x2485
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x0508
++subdevice.name ThinkPad T30
+
+ vendor.id pci 0x8086
+&device.id pci 0x2485
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x051c
++subdevice.name ThinkPad A/T/X Series
+
+ vendor.id pci 0x8086
+&device.id pci 0x2485
+&subvendor.id pci 0x104d
+&subdevice.id pci 0x80e7
++subdevice.name VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP
+
+ vendor.id pci 0x8086
+&device.id pci 0x2485
+&subvendor.id pci 0x144d
+&subdevice.id pci 0xc006
++subdevice.name vpr Matrix 170B4
+
+ vendor.id pci 0x8086
+&device.id pci 0x2486
++device.name 82801CA/CAM AC'97 Modem Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x2486
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x0223
++subdevice.name ThinkPad A/T/X Series
+
+ vendor.id pci 0x8086
+&device.id pci 0x2486
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x0503
++subdevice.name ThinkPad R31 2656BBG
+
+ vendor.id pci 0x8086
+&device.id pci 0x2486
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x051a
++subdevice.name ThinkPad A/T/X Series
+
+ vendor.id pci 0x8086
+&device.id pci 0x2486
+&subvendor.id pci 0x101f
+&subdevice.id pci 0x1025
++subdevice.name Acer 620 Series
+
+ vendor.id pci 0x8086
+&device.id pci 0x2486
+&subvendor.id pci 0x104d
+&subdevice.id pci 0x80e7
++subdevice.name VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP
+
+ vendor.id pci 0x8086
+&device.id pci 0x2486
+&subvendor.id pci 0x1179
+&subdevice.id pci 0x0001
++subdevice.name Toshiba Satellite 1110 Z15 internal Modem
+
+ vendor.id pci 0x8086
+&device.id pci 0x2486
+&subvendor.id pci 0x134d
+&subdevice.id pci 0x4c21
++subdevice.name Dell modem (Inspiron 2100, Latitude C640)
+
+ vendor.id pci 0x8086
+&device.id pci 0x2486
+&subvendor.id pci 0x144d
+&subdevice.id pci 0x2115
++subdevice.name vpr Matrix 170B4 internal modem
+
+ vendor.id pci 0x8086
+&device.id pci 0x2486
+&subvendor.id pci 0x14f1
+&subdevice.id pci 0x5421
++subdevice.name MD56ORD V.92 MDC Modem
+
+ vendor.id pci 0x8086
+&device.id pci 0x2487
++device.name 82801CA/CAM USB (Hub #3)
+
+ vendor.id pci 0x8086
+&device.id pci 0x2487
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x0220
++subdevice.name ThinkPad A/T/X Series
+
+ vendor.id pci 0x8086
+&device.id pci 0x2487
+&subvendor.id pci 0x104d
+&subdevice.id pci 0x80e7
++subdevice.name VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP
+
+ vendor.id pci 0x8086
+&device.id pci 0x2487
+&subvendor.id pci 0x15d9
+&subdevice.id pci 0x3480
++subdevice.name P4DP6
+
+ vendor.id pci 0x8086
+&device.id pci 0x2487
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x1958
++subdevice.name vpr Matrix 170B4
+
+ vendor.id pci 0x8086
+&device.id pci 0x248a
++device.name 82801CAM IDE U100
+
+ vendor.id pci 0x8086
+&device.id pci 0x248a
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x0220
++subdevice.name ThinkPad A/T/X Series
+
+ vendor.id pci 0x8086
+&device.id pci 0x248a
+&subvendor.id pci 0x104d
+&subdevice.id pci 0x80e7
++subdevice.name VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP
+
+ vendor.id pci 0x8086
+&device.id pci 0x248a
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x1958
++subdevice.name vpr Matrix 170B4
+
+ vendor.id pci 0x8086
+&device.id pci 0x248a
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x4541
++subdevice.name Latitude C640
+
+ vendor.id pci 0x8086
+&device.id pci 0x248b
++device.name 82801CA Ultra ATA Storage Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x248b
+&subvendor.id pci 0x15d9
+&subdevice.id pci 0x3480
++subdevice.name P4DP6
+
+ vendor.id pci 0x8086
+&device.id pci 0x248c
++device.name 82801CAM ISA Bridge (LPC)
+
+ vendor.id pci 0x8086
+&device.id pci 0x24c0
++device.name 82801DB/DBL (ICH4/ICH4-L) LPC Interface Bridge
+
+ vendor.id pci 0x8086
+&device.id pci 0x24c0
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x0267
++subdevice.name NetVista A30p
+
+ vendor.id pci 0x8086
+&device.id pci 0x24c0
+&subvendor.id pci 0x1462
+&subdevice.id pci 0x5800
++subdevice.name 845PE Max (MS-6580)
+
+ vendor.id pci 0x8086
+&device.id pci 0x24c1
++device.name 82801DBL (ICH4-L) IDE Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x24c2
++device.name 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) USB UHCI Controller #1
+
+ vendor.id pci 0x8086
+&device.id pci 0x24c2
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x0267
++subdevice.name NetVista A30p
+
+ vendor.id pci 0x8086
+&device.id pci 0x24c2
+&subvendor.id pci 0x1025
+&subdevice.id pci 0x005a
++subdevice.name TravelMate 290
+
+ vendor.id pci 0x8086
+&device.id pci 0x24c2
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x0126
++subdevice.name Optiplex GX260
+
+ vendor.id pci 0x8086
+&device.id pci 0x24c2
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x0163
++subdevice.name Latitude D505
+
+ vendor.id pci 0x8086
+&device.id pci 0x24c2
+&subvendor.id pci 0x103c
+&subdevice.id pci 0x0890
++subdevice.name NC6000 laptop
+
+ vendor.id pci 0x8086
+&device.id pci 0x24c2
+&subvendor.id pci 0x1071
+&subdevice.id pci 0x8160
++subdevice.name MIM2000
+
+ vendor.id pci 0x8086
+&device.id pci 0x24c2
+&subvendor.id pci 0x1462
+&subdevice.id pci 0x5800
++subdevice.name 845PE Max (MS-6580)
+
+ vendor.id pci 0x8086
+&device.id pci 0x24c2
+&subvendor.id pci 0x1509
+&subdevice.id pci 0x2990
++subdevice.name Averatec 5110H laptop
+
+ vendor.id pci 0x8086
+&device.id pci 0x24c2
+&subvendor.id pci 0x4c53
+&subdevice.id pci 0x1090
++subdevice.name Cx9 / Vx9 mainboard
+
+ vendor.id pci 0x8086
+&device.id pci 0x24c3
++device.name 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) SMBus Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x24c3
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x0267
++subdevice.name NetVista A30p
+
+ vendor.id pci 0x8086
+&device.id pci 0x24c3
+&subvendor.id pci 0x1025
+&subdevice.id pci 0x005a
++subdevice.name TravelMate 290
+
+ vendor.id pci 0x8086
+&device.id pci 0x24c3
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x0126
++subdevice.name Optiplex GX260
+
+ vendor.id pci 0x8086
+&device.id pci 0x24c3
+&subvendor.id pci 0x103c
+&subdevice.id pci 0x0890
++subdevice.name NC6000 laptop
+
+ vendor.id pci 0x8086
+&device.id pci 0x24c3
+&subvendor.id pci 0x1071
+&subdevice.id pci 0x8160
++subdevice.name MIM2000
+
+ vendor.id pci 0x8086
+&device.id pci 0x24c3
+&subvendor.id pci 0x1458
+&subdevice.id pci 0x24c2
++subdevice.name GA-8PE667 Ultra
+
+ vendor.id pci 0x8086
+&device.id pci 0x24c3
+&subvendor.id pci 0x1462
+&subdevice.id pci 0x5800
++subdevice.name 845PE Max (MS-6580)
+
+ vendor.id pci 0x8086
+&device.id pci 0x24c3
+&subvendor.id pci 0x4c53
+&subdevice.id pci 0x1090
++subdevice.name Cx9 / Vx9 mainboard
+
+ vendor.id pci 0x8086
+&device.id pci 0x24c4
++device.name 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) USB UHCI Controller #2
+
+ vendor.id pci 0x8086
+&device.id pci 0x24c4
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x0267
++subdevice.name NetVista A30p
+
+ vendor.id pci 0x8086
+&device.id pci 0x24c4
+&subvendor.id pci 0x1025
+&subdevice.id pci 0x005a
++subdevice.name TravelMate 290
+
+ vendor.id pci 0x8086
+&device.id pci 0x24c4
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x0126
++subdevice.name Optiplex GX260
+
+ vendor.id pci 0x8086
+&device.id pci 0x24c4
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x0163
++subdevice.name Latitude D505
+
+ vendor.id pci 0x8086
+&device.id pci 0x24c4
+&subvendor.id pci 0x103c
+&subdevice.id pci 0x0890
++subdevice.name NC6000 laptop
+
+ vendor.id pci 0x8086
+&device.id pci 0x24c4
+&subvendor.id pci 0x1071
+&subdevice.id pci 0x8160
++subdevice.name MIM2000
+
+ vendor.id pci 0x8086
+&device.id pci 0x24c4
+&subvendor.id pci 0x1462
+&subdevice.id pci 0x5800
++subdevice.name 845PE Max (MS-6580)
+
+ vendor.id pci 0x8086
+&device.id pci 0x24c4
+&subvendor.id pci 0x1509
+&subdevice.id pci 0x2990
++subdevice.name Averatec 5110H
+
+ vendor.id pci 0x8086
+&device.id pci 0x24c4
+&subvendor.id pci 0x4c53
+&subdevice.id pci 0x1090
++subdevice.name Cx9 / Vx9 mainboard
+
+ vendor.id pci 0x8086
+&device.id pci 0x24c5
++device.name 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) AC'97 Audio Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x24c5
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0x00b8
++subdevice.name Analog Devices Inc. codec [SoundMAX]
+
+ vendor.id pci 0x8086
+&device.id pci 0x24c5
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x0267
++subdevice.name NetVista A30p
+
+ vendor.id pci 0x8086
+&device.id pci 0x24c5
+&subvendor.id pci 0x1025
+&subdevice.id pci 0x005a
++subdevice.name TravelMate 290
+
+ vendor.id pci 0x8086
+&device.id pci 0x24c5
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x0163
++subdevice.name Latitude D505
+
+ vendor.id pci 0x8086
+&device.id pci 0x24c5
+&subvendor.id pci 0x103c
+&subdevice.id pci 0x0890
++subdevice.name NC6000 laptop
+
+ vendor.id pci 0x8086
+&device.id pci 0x24c5
+&subvendor.id pci 0x1071
+&subdevice.id pci 0x8160
++subdevice.name MIM2000
+
+ vendor.id pci 0x8086
+&device.id pci 0x24c5
+&subvendor.id pci 0x1458
+&subdevice.id pci 0xa002
++subdevice.name GA-8PE667 Ultra
+
+ vendor.id pci 0x8086
+&device.id pci 0x24c5
+&subvendor.id pci 0x1462
+&subdevice.id pci 0x5800
++subdevice.name 845PE Max (MS-6580)
+
+ vendor.id pci 0x8086
+&device.id pci 0x24c6
++device.name 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) AC'97 Modem Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x24c6
+&subvendor.id pci 0x1025
+&subdevice.id pci 0x005a
++subdevice.name TravelMate 290
+
+ vendor.id pci 0x8086
+&device.id pci 0x24c6
+&subvendor.id pci 0x103c
+&subdevice.id pci 0x0890
++subdevice.name NC6000 laptop
+
+ vendor.id pci 0x8086
+&device.id pci 0x24c6
+&subvendor.id pci 0x1071
+&subdevice.id pci 0x8160
++subdevice.name MIM2000
+
+ vendor.id pci 0x8086
+&device.id pci 0x24c7
++device.name 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) USB UHCI Controller #3
+
+ vendor.id pci 0x8086
+&device.id pci 0x24c7
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x0267
++subdevice.name NetVista A30p
+
+ vendor.id pci 0x8086
+&device.id pci 0x24c7
+&subvendor.id pci 0x1025
+&subdevice.id pci 0x005a
++subdevice.name TravelMate 290
+
+ vendor.id pci 0x8086
+&device.id pci 0x24c7
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x0126
++subdevice.name Optiplex GX260
+
+ vendor.id pci 0x8086
+&device.id pci 0x24c7
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x0163
++subdevice.name Latitude D505
+
+ vendor.id pci 0x8086
+&device.id pci 0x24c7
+&subvendor.id pci 0x103c
+&subdevice.id pci 0x0890
++subdevice.name NC6000 laptop
+
+ vendor.id pci 0x8086
+&device.id pci 0x24c7
+&subvendor.id pci 0x1071
+&subdevice.id pci 0x8160
++subdevice.name MIM2000
+
+ vendor.id pci 0x8086
+&device.id pci 0x24c7
+&subvendor.id pci 0x1462
+&subdevice.id pci 0x5800
++subdevice.name 845PE Max (MS-6580)
+
+ vendor.id pci 0x8086
+&device.id pci 0x24c7
+&subvendor.id pci 0x1509
+&subdevice.id pci 0x2990
++subdevice.name Averatec 5110H
+
+ vendor.id pci 0x8086
+&device.id pci 0x24c7
+&subvendor.id pci 0x4c53
+&subdevice.id pci 0x1090
++subdevice.name Cx9 / Vx9 mainboard
+
+ vendor.id pci 0x8086
+&device.id pci 0x24ca
++device.name 82801DBM (ICH4-M) IDE Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x24ca
+&subvendor.id pci 0x1025
+&subdevice.id pci 0x005a
++subdevice.name TravelMate 290
+
+ vendor.id pci 0x8086
+&device.id pci 0x24ca
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x0163
++subdevice.name Latitude D505
+
+ vendor.id pci 0x8086
+&device.id pci 0x24ca
+&subvendor.id pci 0x103c
+&subdevice.id pci 0x0890
++subdevice.name NC6000 laptop
+
+ vendor.id pci 0x8086
+&device.id pci 0x24ca
+&subvendor.id pci 0x1071
+&subdevice.id pci 0x8160
++subdevice.name MIM2000
+
+ vendor.id pci 0x8086
+&device.id pci 0x24cb
++device.name 82801DB (ICH4) IDE Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x24cb
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x0267
++subdevice.name NetVista A30p
+
+ vendor.id pci 0x8086
+&device.id pci 0x24cb
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x0126
++subdevice.name Optiplex GX260
+
+ vendor.id pci 0x8086
+&device.id pci 0x24cb
+&subvendor.id pci 0x1458
+&subdevice.id pci 0x24c2
++subdevice.name GA-8PE667 Ultra
+
+ vendor.id pci 0x8086
+&device.id pci 0x24cb
+&subvendor.id pci 0x1462
+&subdevice.id pci 0x5800
++subdevice.name 845PE Max (MS-6580)
+
+ vendor.id pci 0x8086
+&device.id pci 0x24cb
+&subvendor.id pci 0x4c53
+&subdevice.id pci 0x1090
++subdevice.name Cx9 / Vx9 mainboard
+
+ vendor.id pci 0x8086
+&device.id pci 0x24cc
++device.name 82801DBM (ICH4-M) LPC Interface Bridge
+
+ vendor.id pci 0x8086
+&device.id pci 0x24cd
++device.name 82801DB/DBM (ICH4/ICH4-M) USB2 EHCI Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x24cd
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x0267
++subdevice.name NetVista A30p
+
+ vendor.id pci 0x8086
+&device.id pci 0x24cd
+&subvendor.id pci 0x1025
+&subdevice.id pci 0x005a
++subdevice.name TravelMate 290
+
+ vendor.id pci 0x8086
+&device.id pci 0x24cd
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x0126
++subdevice.name Optiplex GX260
+
+ vendor.id pci 0x8086
+&device.id pci 0x24cd
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x0163
++subdevice.name Latitude D505
+
+ vendor.id pci 0x8086
+&device.id pci 0x24cd
+&subvendor.id pci 0x103c
+&subdevice.id pci 0x0890
++subdevice.name NC6000 laptop
+
+ vendor.id pci 0x8086
+&device.id pci 0x24cd
+&subvendor.id pci 0x1071
+&subdevice.id pci 0x8160
++subdevice.name MIM2000
+
+ vendor.id pci 0x8086
+&device.id pci 0x24cd
+&subvendor.id pci 0x1462
+&subdevice.id pci 0x3981
++subdevice.name 845PE Max (MS-6580)
+
+ vendor.id pci 0x8086
+&device.id pci 0x24cd
+&subvendor.id pci 0x1509
+&subdevice.id pci 0x1968
++subdevice.name Averatec 5110H
+
+ vendor.id pci 0x8086
+&device.id pci 0x24cd
+&subvendor.id pci 0x4c53
+&subdevice.id pci 0x1090
++subdevice.name Cx9 / Vx9 mainboard
+
+ vendor.id pci 0x8086
+&device.id pci 0x24d0
++device.name 82801EB/ER (ICH5/ICH5R) LPC Interface Bridge
+
+ vendor.id pci 0x8086
+&device.id pci 0x24d1
++device.name 82801EB (ICH5) SATA Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x24d1
+&subvendor.id pci 0x103c
+&subdevice.id pci 0x12bc
++subdevice.name d530 CMT (DG746A)
+
+ vendor.id pci 0x8086
+&device.id pci 0x24d1
+&subvendor.id pci 0x1458
+&subdevice.id pci 0x24d1
++subdevice.name GA-8IPE1000 Pro2 motherboard (865PE)
+
+ vendor.id pci 0x8086
+&device.id pci 0x24d1
+&subvendor.id pci 0x1462
+&subdevice.id pci 0x7280
++subdevice.name 865PE Neo2 (MS-6728)
+
+ vendor.id pci 0x8086
+&device.id pci 0x24d1
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x3427
++subdevice.name S875WP1-E mainboard
+
+ vendor.id pci 0x8086
+&device.id pci 0x24d1
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x524c
++subdevice.name D865PERL mainboard
+
+ vendor.id pci 0x8086
+&device.id pci 0x24d2
++device.name 82801EB/ER (ICH5/ICH5R) USB UHCI Controller #1
+
+ vendor.id pci 0x8086
+&device.id pci 0x24d2
+&subvendor.id pci 0x103c
+&subdevice.id pci 0x12bc
++subdevice.name d530 CMT (DG746A)
+
+ vendor.id pci 0x8086
+&device.id pci 0x24d2
+&subvendor.id pci 0x1043
+&subdevice.id pci 0x80a6
++subdevice.name P4P800 Mainboard
+
+ vendor.id pci 0x8086
+&device.id pci 0x24d2
+&subvendor.id pci 0x1458
+&subdevice.id pci 0x24d2
++subdevice.name GA-8KNXP motherboard (875P)
+
+ vendor.id pci 0x8086
+&device.id pci 0x24d2
+&subvendor.id pci 0x1462
+&subdevice.id pci 0x7280
++subdevice.name 865PE Neo2 (MS-6728)
+
+ vendor.id pci 0x8086
+&device.id pci 0x24d2
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x3427
++subdevice.name S875WP1-E mainboard
+
+ vendor.id pci 0x8086
+&device.id pci 0x24d2
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x524c
++subdevice.name D865PERL mainboard
+
+ vendor.id pci 0x8086
+&device.id pci 0x24d3
++device.name 82801EB/ER (ICH5/ICH5R) SMBus Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x24d3
+&subvendor.id pci 0x1043
+&subdevice.id pci 0x80a6
++subdevice.name P4P800 Mainboard
+
+ vendor.id pci 0x8086
+&device.id pci 0x24d3
+&subvendor.id pci 0x1458
+&subdevice.id pci 0x24d2
++subdevice.name GA-8IPE1000 Pro2 motherboard (865PE)
+
+ vendor.id pci 0x8086
+&device.id pci 0x24d3
+&subvendor.id pci 0x1462
+&subdevice.id pci 0x7280
++subdevice.name 865PE Neo2 (MS-6728)
+
+ vendor.id pci 0x8086
+&device.id pci 0x24d3
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x3427
++subdevice.name S875WP1-E mainboard
+
+ vendor.id pci 0x8086
+&device.id pci 0x24d3
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x524c
++subdevice.name D865PERL mainboard
+
+ vendor.id pci 0x8086
+&device.id pci 0x24d4
++device.name 82801EB/ER (ICH5/ICH5R) USB UHCI Controller #2
+
+ vendor.id pci 0x8086
+&device.id pci 0x24d4
+&subvendor.id pci 0x103c
+&subdevice.id pci 0x12bc
++subdevice.name d530 CMT (DG746A)
+
+ vendor.id pci 0x8086
+&device.id pci 0x24d4
+&subvendor.id pci 0x1043
+&subdevice.id pci 0x80a6
++subdevice.name P4P800 Mainboard
+
+ vendor.id pci 0x8086
+&device.id pci 0x24d4
+&subvendor.id pci 0x1458
+&subdevice.id pci 0x24d2
++subdevice.name GA-8IPE1000 Pro2 motherboard (865PE)
+
+ vendor.id pci 0x8086
+&device.id pci 0x24d4
+&subvendor.id pci 0x1462
+&subdevice.id pci 0x7280
++subdevice.name 865PE Neo2 (MS-6728)
+
+ vendor.id pci 0x8086
+&device.id pci 0x24d4
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x3427
++subdevice.name S875WP1-E mainboard
+
+ vendor.id pci 0x8086
+&device.id pci 0x24d4
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x524c
++subdevice.name D865PERL mainboard
+
+ vendor.id pci 0x8086
+&device.id pci 0x24d5
++device.name 82801EB/ER (ICH5/ICH5R) AC'97 Audio Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x24d5
+&subvendor.id pci 0x103c
+&subdevice.id pci 0x12bc
++subdevice.name Analog Devices codec [SoundMAX Integrated Digital Audio]
+
+ vendor.id pci 0x8086
+&device.id pci 0x24d5
+&subvendor.id pci 0x1043
+&subdevice.id pci 0x80f3
++subdevice.name P4P800 Mainboard
+
+ vendor.id pci 0x8086
+&device.id pci 0x24d5
+&subvendor.id pci 0x1458
+&subdevice.id pci 0xa002
++subdevice.name GA-8KNXP motherboard (875P)
+
+ vendor.id pci 0x8086
+&device.id pci 0x24d5
+&subvendor.id pci 0x1462
+&subdevice.id pci 0x7280
++subdevice.name 865PE Neo2 (MS-6728)
+
+ vendor.id pci 0x8086
+&device.id pci 0x24d5
+&subvendor.id pci 0x8086
+&subdevice.id pci 0xa000
++subdevice.name D865PERL mainboard
+
+ vendor.id pci 0x8086
+&device.id pci 0x24d6
++device.name 82801EB/ER (ICH5/ICH5R) AC'97 Modem Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x24d7
++device.name 82801EB/ER (ICH5/ICH5R) USB UHCI #3
+
+ vendor.id pci 0x8086
+&device.id pci 0x24d7
+&subvendor.id pci 0x103c
+&subdevice.id pci 0x12bc
++subdevice.name d530 CMT (DG746A)
+
+ vendor.id pci 0x8086
+&device.id pci 0x24d7
+&subvendor.id pci 0x1043
+&subdevice.id pci 0x80a6
++subdevice.name P4P800 Mainboard
+
+ vendor.id pci 0x8086
+&device.id pci 0x24d7
+&subvendor.id pci 0x1458
+&subdevice.id pci 0x24d2
++subdevice.name GA-8IPE1000 Pro2 motherboard (865PE)
+
+ vendor.id pci 0x8086
+&device.id pci 0x24d7
+&subvendor.id pci 0x1462
+&subdevice.id pci 0x7280
++subdevice.name 865PE Neo2 (MS-6728)
+
+ vendor.id pci 0x8086
+&device.id pci 0x24d7
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x3427
++subdevice.name S875WP1-E mainboard
+
+ vendor.id pci 0x8086
+&device.id pci 0x24d7
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x524c
++subdevice.name D865PERL mainboard
+
+ vendor.id pci 0x8086
+&device.id pci 0x24db
++device.name 82801EB/ER (ICH5/ICH5R) IDE Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x24db
+&subvendor.id pci 0x103c
+&subdevice.id pci 0x12bc
++subdevice.name d530 CMT (DG746A)
+
+ vendor.id pci 0x8086
+&device.id pci 0x24db
+&subvendor.id pci 0x1043
+&subdevice.id pci 0x80a6
++subdevice.name P4P800 Mainboard
+
+ vendor.id pci 0x8086
+&device.id pci 0x24db
+&subvendor.id pci 0x1458
+&subdevice.id pci 0x24d2
++subdevice.name GA-8IPE1000 Pro2 motherboard (865PE)
+
+ vendor.id pci 0x8086
+&device.id pci 0x24db
+&subvendor.id pci 0x1462
+&subdevice.id pci 0x7280
++subdevice.name 865PE Neo2 (MS-6728)
+
+ vendor.id pci 0x8086
+&device.id pci 0x24db
+&subvendor.id pci 0x1462
+&subdevice.id pci 0x7580
++subdevice.name MSI 875P
+
+ vendor.id pci 0x8086
+&device.id pci 0x24db
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x3427
++subdevice.name S875WP1-E mainboard
+
+ vendor.id pci 0x8086
+&device.id pci 0x24db
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x524c
++subdevice.name D865PERL mainboard
+
+ vendor.id pci 0x8086
+&device.id pci 0x24dc
++device.name 82801EB (ICH5) LPC Interface Bridge
+
+ vendor.id pci 0x8086
+&device.id pci 0x24dd
++device.name 82801EB/ER (ICH5/ICH5R) USB2 EHCI Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x24dd
+&subvendor.id pci 0x103c
+&subdevice.id pci 0x12bc
++subdevice.name d530 CMT (DG746A)
+
+ vendor.id pci 0x8086
+&device.id pci 0x24dd
+&subvendor.id pci 0x1043
+&subdevice.id pci 0x80a6
++subdevice.name P4P800 Mainboard
+
+ vendor.id pci 0x8086
+&device.id pci 0x24dd
+&subvendor.id pci 0x1458
+&subdevice.id pci 0x5006
++subdevice.name GA-8IPE1000 Pro2 motherboard (865PE)
+
+ vendor.id pci 0x8086
+&device.id pci 0x24dd
+&subvendor.id pci 0x1462
+&subdevice.id pci 0x7280
++subdevice.name 865PE Neo2 (MS-6728)
+
+ vendor.id pci 0x8086
+&device.id pci 0x24dd
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x3427
++subdevice.name S875WP1-E mainboard
+
+ vendor.id pci 0x8086
+&device.id pci 0x24dd
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x524c
++subdevice.name D865PERL mainboard
+
+ vendor.id pci 0x8086
+&device.id pci 0x24de
++device.name 82801EB/ER (ICH5/ICH5R) USB UHCI Controller #4
+
+ vendor.id pci 0x8086
+&device.id pci 0x24de
+&subvendor.id pci 0x1043
+&subdevice.id pci 0x80a6
++subdevice.name P4P800 Mainboard
+
+ vendor.id pci 0x8086
+&device.id pci 0x24de
+&subvendor.id pci 0x1458
+&subdevice.id pci 0x24d2
++subdevice.name GA-8IPE1000 Pro2 motherboard (865PE)
+
+ vendor.id pci 0x8086
+&device.id pci 0x24de
+&subvendor.id pci 0x1462
+&subdevice.id pci 0x7280
++subdevice.name 865PE Neo2 (MS-6728)
+
+ vendor.id pci 0x8086
+&device.id pci 0x24de
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x3427
++subdevice.name S875WP1-E mainboard
+
+ vendor.id pci 0x8086
+&device.id pci 0x24de
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x524c
++subdevice.name D865PERL mainboard
+
+ vendor.id pci 0x8086
+&device.id pci 0x24df
++device.name 82801ER (ICH5R) SATA Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x2500
++device.name 82820 820 (Camino) Chipset Host Bridge (MCH)
+
+ vendor.id pci 0x8086
+&device.id pci 0x2500
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x0095
++subdevice.name Precision Workstation 220 Chipset
+
+ vendor.id pci 0x8086
+&device.id pci 0x2500
+&subvendor.id pci 0x1043
+&subdevice.id pci 0x801c
++subdevice.name P3C-2000 system chipset
+
+ vendor.id pci 0x8086
+&device.id pci 0x2501
++device.name 82820 820 (Camino) Chipset Host Bridge (MCH)
+
+ vendor.id pci 0x8086
+&device.id pci 0x2501
+&subvendor.id pci 0x1043
+&subdevice.id pci 0x801c
++subdevice.name P3C-2000 system chipset
+
+ vendor.id pci 0x8086
+&device.id pci 0x250b
++device.name 82820 820 (Camino) Chipset Host Bridge
+
+ vendor.id pci 0x8086
+&device.id pci 0x250f
++device.name 82820 820 (Camino) Chipset AGP Bridge
+
+ vendor.id pci 0x8086
+&device.id pci 0x2520
++device.name 82805AA MTH Memory Translator Hub
+
+ vendor.id pci 0x8086
+&device.id pci 0x2521
++device.name 82804AA MRH-S Memory Repeater Hub for SDRAM
+
+ vendor.id pci 0x8086
+&device.id pci 0x2530
++device.name 82850 850 (Tehama) Chipset Host Bridge (MCH)
+
+ vendor.id pci 0x8086
+&device.id pci 0x2530
+&subvendor.id pci 0x147b
+&subdevice.id pci 0x0507
++subdevice.name TH7II-RAID
+
+ vendor.id pci 0x8086
+&device.id pci 0x2531
++device.name 82860 860 (Wombat) Chipset Host Bridge (MCH)
+
+ vendor.id pci 0x8086
+&device.id pci 0x2532
++device.name 82850 850 (Tehama) Chipset AGP Bridge
+
+ vendor.id pci 0x8086
+&device.id pci 0x2533
++device.name 82860 860 (Wombat) Chipset AGP Bridge
+
+ vendor.id pci 0x8086
+&device.id pci 0x2534
++device.name 82860 860 (Wombat) Chipset PCI Bridge
+
+ vendor.id pci 0x8086
+&device.id pci 0x2540
++device.name E7500 Memory Controller Hub
+
+ vendor.id pci 0x8086
+&device.id pci 0x2540
+&subvendor.id pci 0x15d9
+&subdevice.id pci 0x3480
++subdevice.name P4DP6
+
+ vendor.id pci 0x8086
+&device.id pci 0x2541
++device.name E7500/E7501 Host RASUM Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x2541
+&subvendor.id pci 0x15d9
+&subdevice.id pci 0x3480
++subdevice.name P4DP6
+
+ vendor.id pci 0x8086
+&device.id pci 0x2541
+&subvendor.id pci 0x4c53
+&subdevice.id pci 0x1090
++subdevice.name Cx9 / Vx9 mainboard
+
+ vendor.id pci 0x8086
+&device.id pci 0x2541
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x3424
++subdevice.name SE7501HG2 Mainboard
+
+ vendor.id pci 0x8086
+&device.id pci 0x2543
++device.name E7500/E7501 Hub Interface B PCI-to-PCI Bridge
+
+ vendor.id pci 0x8086
+&device.id pci 0x2544
++device.name E7500/E7501 Hub Interface B RASUM Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x2544
+&subvendor.id pci 0x4c53
+&subdevice.id pci 0x1090
++subdevice.name Cx9 / Vx9 mainboard
+
+ vendor.id pci 0x8086
+&device.id pci 0x2545
++device.name E7500/E7501 Hub Interface C PCI-to-PCI Bridge
+
+ vendor.id pci 0x8086
+&device.id pci 0x2546
++device.name E7500/E7501 Hub Interface C RASUM Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x2547
++device.name E7500/E7501 Hub Interface D PCI-to-PCI Bridge
+
+ vendor.id pci 0x8086
+&device.id pci 0x2548
++device.name E7500/E7501 Hub Interface D RASUM Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x254c
++device.name E7501 Memory Controller Hub
+
+ vendor.id pci 0x8086
+&device.id pci 0x254c
+&subvendor.id pci 0x4c53
+&subdevice.id pci 0x1090
++subdevice.name Cx9 / Vx9 mainboard
+
+ vendor.id pci 0x8086
+&device.id pci 0x254c
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x3424
++subdevice.name SE7501HG2 Mainboard
+
+ vendor.id pci 0x8086
+&device.id pci 0x2550
++device.name E7505 Memory Controller Hub
+
+ vendor.id pci 0x8086
+&device.id pci 0x2551
++device.name E7505/E7205 Series RAS Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x2552
++device.name E7505/E7205 PCI-to-AGP Bridge
+
+ vendor.id pci 0x8086
+&device.id pci 0x2553
++device.name E7505 Hub Interface B PCI-to-PCI Bridge
+
+ vendor.id pci 0x8086
+&device.id pci 0x2554
++device.name E7505 Hub Interface B PCI-to-PCI Bridge RAS Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x255d
++device.name E7205 Memory Controller Hub
+
+ vendor.id pci 0x8086
+&device.id pci 0x2560
++device.name 82845G/GL[Brookdale-G]/GE/PE DRAM Controller/Host-Hub Interface
+
+ vendor.id pci 0x8086
+&device.id pci 0x2560
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x0126
++subdevice.name Optiplex GX260
+
+ vendor.id pci 0x8086
+&device.id pci 0x2560
+&subvendor.id pci 0x1458
+&subdevice.id pci 0x2560
++subdevice.name GA-8PE667 Ultra
+
+ vendor.id pci 0x8086
+&device.id pci 0x2560
+&subvendor.id pci 0x1462
+&subdevice.id pci 0x5800
++subdevice.name 845PE Max (MS-6580)
+
+ vendor.id pci 0x8086
+&device.id pci 0x2561
++device.name 82845G/GL[Brookdale-G]/GE/PE Host-to-AGP Bridge
+
+ vendor.id pci 0x8086
+&device.id pci 0x2562
++device.name 82845G/GL[Brookdale-G]/GE Chipset Integrated Graphics Device
+
+ vendor.id pci 0x8086
+&device.id pci 0x2562
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x0267
++subdevice.name NetVista A30p
+
+ vendor.id pci 0x8086
+&device.id pci 0x2570
++device.name 82865G/PE/P DRAM Controller/Host-Hub Interface
+
+ vendor.id pci 0x8086
+&device.id pci 0x2570
+&subvendor.id pci 0x1043
+&subdevice.id pci 0x80f2
++subdevice.name P4P800 Mainboard
+
+ vendor.id pci 0x8086
+&device.id pci 0x2570
+&subvendor.id pci 0x1458
+&subdevice.id pci 0x2570
++subdevice.name GA-8IPE1000 Pro2 motherboard (865PE)
+
+ vendor.id pci 0x8086
+&device.id pci 0x2571
++device.name 82865G/PE/P PCI to AGP Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x2572
++device.name 82865G Integrated Graphics Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x2573
++device.name 82865G/PE/P PCI to CSA Bridge
+
+ vendor.id pci 0x8086
+&device.id pci 0x2576
++device.name 82865G/PE/P Processor to I/O Memory Interface
+
+ vendor.id pci 0x8086
+&device.id pci 0x2578
++device.name 82875P/E7210 Memory Controller Hub
+
+ vendor.id pci 0x8086
+&device.id pci 0x2578
+&subvendor.id pci 0x1458
+&subdevice.id pci 0x2578
++subdevice.name GA-8KNXP motherboard (875P)
+
+ vendor.id pci 0x8086
+&device.id pci 0x2578
+&subvendor.id pci 0x1462
+&subdevice.id pci 0x7580
++subdevice.name MS-6758 (875P Neo)
+
+ vendor.id pci 0x8086
+&device.id pci 0x2578
+&subvendor.id pci 0x15d9
+&subdevice.id pci 0x4580
++subdevice.name Super Micro Computer Inc. P4SCE
+
+ vendor.id pci 0x8086
+&device.id pci 0x2579
++device.name 82875P Processor to AGP Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x257b
++device.name 82875P/E7210 Processor to PCI to CSA Bridge
+
+ vendor.id pci 0x8086
+&device.id pci 0x257e
++device.name 82875P/E7210 Processor to I/O Memory Interface
+
+ vendor.id pci 0x8086
+&device.id pci 0x2580
++device.name 915G/P/GV Processor to I/O Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x2581
++device.name 915G/P/GV PCI Express Root Port
+
+ vendor.id pci 0x8086
+&device.id pci 0x2582
++device.name 82915G/GV/910GL Express Chipset Family Graphics Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x2582
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x1079
++subdevice.name Optiplex GX280
+
+ vendor.id pci 0x8086
+&device.id pci 0x2584
++device.name 925X/XE Memory Controller Hub
+
+ vendor.id pci 0x8086
+&device.id pci 0x2585
++device.name 925X/XE PCI Express Root Port
+
+ vendor.id pci 0x8086
+&device.id pci 0x2588
++device.name E7220/E7221 Memory Controller Hub
+
+ vendor.id pci 0x8086
+&device.id pci 0x2589
++device.name E7220/E7221 PCI Express Root Port
+
+ vendor.id pci 0x8086
+&device.id pci 0x258a
++device.name E7221 Integrated Graphics Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x2590
++device.name Mobile 915GM/PM/GMS/910GML Express Processor to DRAM Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x2591
++device.name Mobile 915GM/PM Express PCI Express Root Port
+
+ vendor.id pci 0x8086
+&device.id pci 0x2592
++device.name Mobile 915GM/GMS/910GML Express Graphics Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x25a1
++device.name 6300ESB LPC Interface Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x25a2
++device.name 6300ESB PATA Storage Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x25a2
+&subvendor.id pci 0x4c53
+&subdevice.id pci 0x10b0
++subdevice.name CL9 mainboard
+
+ vendor.id pci 0x8086
+&device.id pci 0x25a3
++device.name 6300ESB SATA Storage Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x25a3
+&subvendor.id pci 0x4c53
+&subdevice.id pci 0x10b0
++subdevice.name CL9 mainboard
+
+ vendor.id pci 0x8086
+&device.id pci 0x25a4
++device.name 6300ESB SMBus Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x25a4
+&subvendor.id pci 0x4c53
+&subdevice.id pci 0x10b0
++subdevice.name CL9 mainboard
+
+ vendor.id pci 0x8086
+&device.id pci 0x25a6
++device.name 6300ESB AC'97 Audio Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x25a6
+&subvendor.id pci 0x4c53
+&subdevice.id pci 0x10b0
++subdevice.name CL9 mainboard
+
+ vendor.id pci 0x8086
+&device.id pci 0x25a7
++device.name 6300ESB AC'97 Modem Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x25a9
++device.name 6300ESB USB Universal Host Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x25a9
+&subvendor.id pci 0x4c53
+&subdevice.id pci 0x10b0
++subdevice.name CL9 mainboard
+
+ vendor.id pci 0x8086
+&device.id pci 0x25aa
++device.name 6300ESB USB Universal Host Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x25aa
+&subvendor.id pci 0x4c53
+&subdevice.id pci 0x10b0
++subdevice.name CL9 mainboard
+
+ vendor.id pci 0x8086
+&device.id pci 0x25ab
++device.name 6300ESB Watchdog Timer
+
+ vendor.id pci 0x8086
+&device.id pci 0x25ab
+&subvendor.id pci 0x4c53
+&subdevice.id pci 0x10b0
++subdevice.name CL9 mainboard
+
+ vendor.id pci 0x8086
+&device.id pci 0x25ac
++device.name 6300ESB I/O Advanced Programmable Interrupt Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x25ac
+&subvendor.id pci 0x4c53
+&subdevice.id pci 0x10b0
++subdevice.name CL9 mainboard
+
+ vendor.id pci 0x8086
+&device.id pci 0x25ad
++device.name 6300ESB USB2 Enhanced Host Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x25ae
++device.name 6300ESB 64-bit PCI-X Bridge
+
+ vendor.id pci 0x8086
+&device.id pci 0x25b0
++device.name 6300ESB SATA RAID Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x2600
++device.name Server Hub Interface
+
+ vendor.id pci 0x8086
+&device.id pci 0x2601
++device.name Server Hub PCI Express x4 Port D
+
+ vendor.id pci 0x8086
+&device.id pci 0x2602
++device.name Server Hub PCI Express x4 Port C0
+
+ vendor.id pci 0x8086
+&device.id pci 0x2603
++device.name Server Hub PCI Express x4 Port C1
+
+ vendor.id pci 0x8086
+&device.id pci 0x2604
++device.name Server Hub PCI Express x4 Port B0
+
+ vendor.id pci 0x8086
+&device.id pci 0x2605
++device.name Server Hub PCI Express x4 Port B1
+
+ vendor.id pci 0x8086
+&device.id pci 0x2606
++device.name Server Hub PCI Express x4 Port A0
+
+ vendor.id pci 0x8086
+&device.id pci 0x2607
++device.name Server Hub PCI Express x4 Port A1
+
+ vendor.id pci 0x8086
+&device.id pci 0x2608
++device.name Server Hub PCI Express x8 Port C
+
+ vendor.id pci 0x8086
+&device.id pci 0x2609
++device.name Server Hub PCI Express x8 Port B
+
+ vendor.id pci 0x8086
+&device.id pci 0x260a
++device.name Server Hub PCI Express x8 Port A
+
+ vendor.id pci 0x8086
+&device.id pci 0x260c
++device.name Server Hub IMI Registers
+
+ vendor.id pci 0x8086
+&device.id pci 0x2610
++device.name Server Hub System Bus, Boot, and Interrupt Registers
+
+ vendor.id pci 0x8086
+&device.id pci 0x2611
++device.name Server Hub Address Mapping Registers
+
+ vendor.id pci 0x8086
+&device.id pci 0x2612
++device.name Server Hub RAS Registers
+
+ vendor.id pci 0x8086
+&device.id pci 0x2613
++device.name Server Hub Reserved Registers
+
+ vendor.id pci 0x8086
+&device.id pci 0x2614
++device.name Server Hub Reserved Registers
+
+ vendor.id pci 0x8086
+&device.id pci 0x2615
++device.name Server Hub Miscellaneous Registers
+
+ vendor.id pci 0x8086
+&device.id pci 0x2617
++device.name Server Hub Reserved Registers
+
+ vendor.id pci 0x8086
+&device.id pci 0x2618
++device.name Server Hub Reserved Registers
+
+ vendor.id pci 0x8086
+&device.id pci 0x2619
++device.name Server Hub Reserved Registers
+
+ vendor.id pci 0x8086
+&device.id pci 0x261a
++device.name Server Hub Reserved Registers
+
+ vendor.id pci 0x8086
+&device.id pci 0x261b
++device.name Server Hub Reserved Registers
+
+ vendor.id pci 0x8086
+&device.id pci 0x261c
++device.name Server Hub Reserved Registers
+
+ vendor.id pci 0x8086
+&device.id pci 0x261d
++device.name Server Hub Reserved Registers
+
+ vendor.id pci 0x8086
+&device.id pci 0x261e
++device.name Server Hub Reserved Registers
+
+ vendor.id pci 0x8086
+&device.id pci 0x2620
++device.name External Memory Bridge
+
+ vendor.id pci 0x8086
+&device.id pci 0x2621
++device.name External Memory Bridge Control Registers
+
+ vendor.id pci 0x8086
+&device.id pci 0x2622
++device.name External Memory Bridge Memory Interleaving Registers
+
+ vendor.id pci 0x8086
+&device.id pci 0x2623
++device.name External Memory Bridge DDR Initialization and Calibration
+
+ vendor.id pci 0x8086
+&device.id pci 0x2624
++device.name External Memory Bridge Reserved Registers
+
+ vendor.id pci 0x8086
+&device.id pci 0x2625
++device.name External Memory Bridge Reserved Registers
+
+ vendor.id pci 0x8086
+&device.id pci 0x2626
++device.name External Memory Bridge Reserved Registers
+
+ vendor.id pci 0x8086
+&device.id pci 0x2627
++device.name External Memory Bridge Reserved Registers
+
+ vendor.id pci 0x8086
+&device.id pci 0x2640
++device.name 82801FB/FR (ICH6/ICH6R) LPC Interface Bridge
+
+ vendor.id pci 0x8086
+&device.id pci 0x2641
++device.name 82801FBM (ICH6M) LPC Interface Bridge
+
+ vendor.id pci 0x8086
+&device.id pci 0x2642
++device.name 82801FW/FRW (ICH6W/ICH6RW) LPC Interface Bridge
+
+ vendor.id pci 0x8086
+&device.id pci 0x2651
++device.name 82801FB/FW (ICH6/ICH6W) SATA Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x2651
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x0179
++subdevice.name Optiplex GX280
+
+ vendor.id pci 0x8086
+&device.id pci 0x2652
++device.name 82801FR/FRW (ICH6R/ICH6RW) SATA Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x2653
++device.name 82801FBM (ICH6M) SATA Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x2658
++device.name 82801FB/FBM/FR/FW/FRW (ICH6 Family) USB UHCI #1
+
+ vendor.id pci 0x8086
+&device.id pci 0x2658
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x0179
++subdevice.name Optiplex GX280
+
+ vendor.id pci 0x8086
+&device.id pci 0x2659
++device.name 82801FB/FBM/FR/FW/FRW (ICH6 Family) USB UHCI #2
+
+ vendor.id pci 0x8086
+&device.id pci 0x2659
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x0179
++subdevice.name Optiplex GX280
+
+ vendor.id pci 0x8086
+&device.id pci 0x265a
++device.name 82801FB/FBM/FR/FW/FRW (ICH6 Family) USB UHCI #3
+
+ vendor.id pci 0x8086
+&device.id pci 0x265a
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x0179
++subdevice.name Optiplex GX280
+
+ vendor.id pci 0x8086
+&device.id pci 0x265b
++device.name 82801FB/FBM/FR/FW/FRW (ICH6 Family) USB UHCI #4
+
+ vendor.id pci 0x8086
+&device.id pci 0x265b
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x0179
++subdevice.name Optiplex GX280
+
+ vendor.id pci 0x8086
+&device.id pci 0x265c
++device.name 82801FB/FBM/FR/FW/FRW (ICH6 Family) USB2 EHCI Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x265c
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x0179
++subdevice.name Optiplex GX280
+
+ vendor.id pci 0x8086
+&device.id pci 0x2660
++device.name 82801FB/FBM/FR/FW/FRW (ICH6 Family) PCI Express Port 1
+
+ vendor.id pci 0x8086
+&device.id pci 0x2662
++device.name 82801FB/FBM/FR/FW/FRW (ICH6 Family) PCI Express Port 2
+
+ vendor.id pci 0x8086
+&device.id pci 0x2664
++device.name 82801FB/FBM/FR/FW/FRW (ICH6 Family) PCI Express Port 3
+
+ vendor.id pci 0x8086
+&device.id pci 0x2666
++device.name 82801FB/FBM/FR/FW/FRW (ICH6 Family) PCI Express Port 4
+
+ vendor.id pci 0x8086
+&device.id pci 0x2668
++device.name 82801FB/FBM/FR/FW/FRW (ICH6 Family) High Definition Audio Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x266a
++device.name 82801FB/FBM/FR/FW/FRW (ICH6 Family) SMBus Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x266a
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x0179
++subdevice.name Optiplex GX280
+
+ vendor.id pci 0x8086
+&device.id pci 0x266c
++device.name 82801FB/FBM/FR/FW/FRW (ICH6 Family) LAN Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x266d
++device.name 82801FB/FBM/FR/FW/FRW (ICH6 Family) AC'97 Modem Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x266e
++device.name 82801FB/FBM/FR/FW/FRW (ICH6 Family) AC'97 Audio Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x266e
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x0179
++subdevice.name Optiplex GX280
+
+ vendor.id pci 0x8086
+&device.id pci 0x266f
++device.name 82801FB/FBM/FR/FW/FRW (ICH6 Family) IDE Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x2770
++device.name Memory Controller Hub
+
+ vendor.id pci 0x8086
+&device.id pci 0x2771
++device.name PCI Express Graphics Port
+
+ vendor.id pci 0x8086
+&device.id pci 0x2772
++device.name Integrated Graphics Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x2774
++device.name Workstation Memory Controller Hub
+
+ vendor.id pci 0x8086
+&device.id pci 0x2775
++device.name PCI Express Graphics Port
+
+ vendor.id pci 0x8086
+&device.id pci 0x2776
++device.name Integrated Graphics Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x2778
++device.name Server Memory Controller Hub
+
+ vendor.id pci 0x8086
+&device.id pci 0x2779
++device.name PCI Express Root Port
+
+ vendor.id pci 0x8086
+&device.id pci 0x2782
++device.name 82915G Express Chipset Family Graphics Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x2792
++device.name Mobile 915GM/GMS/910GML Express Graphics Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x27b1
++device.name Mobile I/O Controller Hub LPC
+
+ vendor.id pci 0x8086
+&device.id pci 0x27b8
++device.name I/O Controller Hub LPC
+
+ vendor.id pci 0x8086
+&device.id pci 0x27c0
++device.name I/O Controller Hub SATA cc=IDE
+
+ vendor.id pci 0x8086
+&device.id pci 0x27c1
++device.name I/O Controller Hub SATA cc=AHCI
+
+ vendor.id pci 0x8086
+&device.id pci 0x27c2
++device.name I/O Controller Hub SATA cc=RAID
+
+ vendor.id pci 0x8086
+&device.id pci 0x27c3
++device.name I/O Controller Hub SATA cc=RAID
+
+ vendor.id pci 0x8086
+&device.id pci 0x27c4
++device.name Mobile I/O Controller Hub SATA cc=IDE
+
+ vendor.id pci 0x8086
+&device.id pci 0x27c5
++device.name Mobile I/O Controller Hub SATA cc=AHCI
+
+ vendor.id pci 0x8086
+&device.id pci 0x27c8
++device.name I/O Controller Hub UHCI USB #1
+
+ vendor.id pci 0x8086
+&device.id pci 0x27c9
++device.name I/O Controller Hub UHCI USB #2
+
+ vendor.id pci 0x8086
+&device.id pci 0x27ca
++device.name I/O Controller Hub UHCI USB #3
+
+ vendor.id pci 0x8086
+&device.id pci 0x27cb
++device.name I/O Controller Hub UHCI USB #4
+
+ vendor.id pci 0x8086
+&device.id pci 0x27cc
++device.name I/O Controller Hub EHCI USB
+
+ vendor.id pci 0x8086
+&device.id pci 0x27d0
++device.name I/O Controller Hub PCI Express Port 1
+
+ vendor.id pci 0x8086
+&device.id pci 0x27d2
++device.name I/O Controller Hub PCI Express Port 2
+
+ vendor.id pci 0x8086
+&device.id pci 0x27d4
++device.name I/O Controller Hub PCI Express Port 3
+
+ vendor.id pci 0x8086
+&device.id pci 0x27d6
++device.name I/O Controller Hub PCI Express Port 4
+
+ vendor.id pci 0x8086
+&device.id pci 0x27d8
++device.name I/O Controller Hub High Definition Audio
+
+ vendor.id pci 0x8086
+&device.id pci 0x27da
++device.name I/O Controller Hub SMBus
+
+ vendor.id pci 0x8086
+&device.id pci 0x27dc
++device.name I/O Controller Hub LAN
+
+ vendor.id pci 0x8086
+&device.id pci 0x27dd
++device.name I/O Controller Hub AC'97 Modem
+
+ vendor.id pci 0x8086
+&device.id pci 0x27de
++device.name I/O Controller Hub AC'97 Audio
+
+ vendor.id pci 0x8086
+&device.id pci 0x27df
++device.name I/O Controller Hub PATA
+
+ vendor.id pci 0x8086
+&device.id pci 0x27e0
++device.name I/O Controller Hub PCI Express Port 5
+
+ vendor.id pci 0x8086
+&device.id pci 0x27e2
++device.name I/O Controller Hub PCI Express Port 6
+
+ vendor.id pci 0x8086
+&device.id pci 0x3092
++device.name Integrated RAID
+
+ vendor.id pci 0x8086
+&device.id pci 0x3200
++device.name GD31244 PCI-X SATA HBA
+
+ vendor.id pci 0x8086
+&device.id pci 0x3340
++device.name 82855PM Processor to I/O Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x3340
+&subvendor.id pci 0x1025
+&subdevice.id pci 0x005a
++subdevice.name TravelMate 290
+
+ vendor.id pci 0x8086
+&device.id pci 0x3340
+&subvendor.id pci 0x103c
+&subdevice.id pci 0x0890
++subdevice.name NC6000 laptop
+
+ vendor.id pci 0x8086
+&device.id pci 0x3341
++device.name 82855PM Processor to AGP Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x3575
++device.name 82830 830 Chipset Host Bridge
+
+ vendor.id pci 0x8086
+&device.id pci 0x3575
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x021d
++subdevice.name ThinkPad A/T/X Series
+
+ vendor.id pci 0x8086
+&device.id pci 0x3575
+&subvendor.id pci 0x104d
+&subdevice.id pci 0x80e7
++subdevice.name VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP
+
+ vendor.id pci 0x8086
+&device.id pci 0x3576
++device.name 82830 830 Chipset AGP Bridge
+
+ vendor.id pci 0x8086
+&device.id pci 0x3577
++device.name 82830 CGC [Chipset Graphics Controller]
+
+ vendor.id pci 0x8086
+&device.id pci 0x3577
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x0513
++subdevice.name ThinkPad A/T/X Series
+
+ vendor.id pci 0x8086
+&device.id pci 0x3578
++device.name 82830 830 Chipset Host Bridge
+
+ vendor.id pci 0x8086
+&device.id pci 0x3580
++device.name 82852/82855 GM/GME/PM/GMV Processor to I/O Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x3580
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x0163
++subdevice.name Latitude D505
+
+ vendor.id pci 0x8086
+&device.id pci 0x3580
+&subvendor.id pci 0x4c53
+&subdevice.id pci 0x10b0
++subdevice.name CL9 mainboard
+
+ vendor.id pci 0x8086
+&device.id pci 0x3581
++device.name 82852/82855 GM/GME/PM/GMV Processor to AGP Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x3582
++device.name 82852/855GM Integrated Graphics Device
+
+ vendor.id pci 0x8086
+&device.id pci 0x3582
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x0163
++subdevice.name Latitude D505
+
+ vendor.id pci 0x8086
+&device.id pci 0x3582
+&subvendor.id pci 0x4c53
+&subdevice.id pci 0x10b0
++subdevice.name CL9 mainboard
+
+ vendor.id pci 0x8086
+&device.id pci 0x3584
++device.name 82852/82855 GM/GME/PM/GMV Processor to I/O Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x3584
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x0163
++subdevice.name Latitude D505
+
+ vendor.id pci 0x8086
+&device.id pci 0x3584
+&subvendor.id pci 0x4c53
+&subdevice.id pci 0x10b0
++subdevice.name CL9 mainboard
+
+ vendor.id pci 0x8086
+&device.id pci 0x3585
++device.name 82852/82855 GM/GME/PM/GMV Processor to I/O Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x3585
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x0163
++subdevice.name Latitude D505
+
+ vendor.id pci 0x8086
+&device.id pci 0x3585
+&subvendor.id pci 0x4c53
+&subdevice.id pci 0x10b0
++subdevice.name CL9 mainboard
+
+ vendor.id pci 0x8086
+&device.id pci 0x3590
++device.name E7520 Memory Controller Hub
+
+ vendor.id pci 0x8086
+&device.id pci 0x3591
++device.name E7525/E7520 Error Reporting Registers
+
+ vendor.id pci 0x8086
+&device.id pci 0x3592
++device.name E7320 Memory Controller Hub
+
+ vendor.id pci 0x8086
+&device.id pci 0x3593
++device.name E7320 Error Reporting Registers
+
+ vendor.id pci 0x8086
+&device.id pci 0x3594
++device.name E7520 DMA Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x3595
++device.name E7525/E7520/E7320 PCI Express Port A
+
+ vendor.id pci 0x8086
+&device.id pci 0x3596
++device.name E7525/E7520/E7320 PCI Express Port A1
+
+ vendor.id pci 0x8086
+&device.id pci 0x3597
++device.name E7525/E7520 PCI Express Port B
+
+ vendor.id pci 0x8086
+&device.id pci 0x3598
++device.name E7520 PCI Express Port B1
+
+ vendor.id pci 0x8086
+&device.id pci 0x3599
++device.name E7520 PCI Express Port C
+
+ vendor.id pci 0x8086
+&device.id pci 0x359a
++device.name E7520 PCI Express Port C1
+
+ vendor.id pci 0x8086
+&device.id pci 0x359b
++device.name E7525/E7520/E7320 Extended Configuration Registers
+
+ vendor.id pci 0x8086
+&device.id pci 0x359e
++device.name E7525 Memory Controller Hub
+
+ vendor.id pci 0x8086
+&device.id pci 0x4220
++device.name PRO/Wireless 2200BG
+
+ vendor.id pci 0x8086
+&device.id pci 0x4223
++device.name PRO/Wireless 2915ABG MiniPCI Adapter
+
+ vendor.id pci 0x8086
+&device.id pci 0x5200
++device.name EtherExpress PRO/100 Intelligent Server
+
+ vendor.id pci 0x8086
+&device.id pci 0x5201
++device.name EtherExpress PRO/100 Intelligent Server
+
+ vendor.id pci 0x8086
+&device.id pci 0x5201
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x0001
++subdevice.name EtherExpress PRO/100 Server Ethernet Adapter
+
+ vendor.id pci 0x8086
+&device.id pci 0x530d
++device.name 80310 IOP [IO Processor]
+
+ vendor.id pci 0x8086
+&device.id pci 0x7000
++device.name 82371SB PIIX3 ISA [Natoma/Triton II]
+
+ vendor.id pci 0x8086
+&device.id pci 0x7010
++device.name 82371SB PIIX3 IDE [Natoma/Triton II]
+
+ vendor.id pci 0x8086
+&device.id pci 0x7020
++device.name 82371SB PIIX3 USB [Natoma/Triton II]
+
+ vendor.id pci 0x8086
+&device.id pci 0x7030
++device.name 430VX - 82437VX TVX [Triton VX]
+
+ vendor.id pci 0x8086
+&device.id pci 0x7050
++device.name Intel Intercast Video Capture Card
+
+ vendor.id pci 0x8086
+&device.id pci 0x7100
++device.name 430TX - 82439TX MTXC
+
+ vendor.id pci 0x8086
+&device.id pci 0x7110
++device.name 82371AB/EB/MB PIIX4 ISA
+
+ vendor.id pci 0x8086
+&device.id pci 0x7110
+&subvendor.id pci 0x15ad
+&subdevice.id pci 0x1976
++subdevice.name virtualHW v3
+
+ vendor.id pci 0x8086
+&device.id pci 0x7111
++device.name 82371AB/EB/MB PIIX4 IDE
+
+ vendor.id pci 0x8086
+&device.id pci 0x7111
+&subvendor.id pci 0x15ad
+&subdevice.id pci 0x1976
++subdevice.name virtualHW v3
+
+ vendor.id pci 0x8086
+&device.id pci 0x7112
++device.name 82371AB/EB/MB PIIX4 USB
+
+ vendor.id pci 0x8086
+&device.id pci 0x7112
+&subvendor.id pci 0x15ad
+&subdevice.id pci 0x1976
++subdevice.name virtualHW v3
+
+ vendor.id pci 0x8086
+&device.id pci 0x7113
++device.name 82371AB/EB/MB PIIX4 ACPI
+
+ vendor.id pci 0x8086
+&device.id pci 0x7113
+&subvendor.id pci 0x15ad
+&subdevice.id pci 0x1976
++subdevice.name virtualHW v3
+
+ vendor.id pci 0x8086
+&device.id pci 0x7120
++device.name 82810 GMCH [Graphics Memory Controller Hub]
+
+ vendor.id pci 0x8086
+&device.id pci 0x7120
+&subvendor.id pci 0x4c53
+&subdevice.id pci 0x1040
++subdevice.name CL7 mainboard
+
+ vendor.id pci 0x8086
+&device.id pci 0x7120
+&subvendor.id pci 0x4c53
+&subdevice.id pci 0x1060
++subdevice.name PC7 mainboard
+
+ vendor.id pci 0x8086
+&device.id pci 0x7121
++device.name 82810 CGC [Chipset Graphics Controller]
+
+ vendor.id pci 0x8086
+&device.id pci 0x7121
+&subvendor.id pci 0x4c53
+&subdevice.id pci 0x1040
++subdevice.name CL7 mainboard
+
+ vendor.id pci 0x8086
+&device.id pci 0x7121
+&subvendor.id pci 0x4c53
+&subdevice.id pci 0x1060
++subdevice.name PC7 mainboard
+
+ vendor.id pci 0x8086
+&device.id pci 0x7121
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x4341
++subdevice.name Cayman (CA810) Mainboard
+
+ vendor.id pci 0x8086
+&device.id pci 0x7122
++device.name 82810 DC-100 GMCH [Graphics Memory Controller Hub]
+
+ vendor.id pci 0x8086
+&device.id pci 0x7123
++device.name 82810 DC-100 CGC [Chipset Graphics Controller]
+
+ vendor.id pci 0x8086
+&device.id pci 0x7124
++device.name 82810E DC-133 GMCH [Graphics Memory Controller Hub]
+
+ vendor.id pci 0x8086
+&device.id pci 0x7125
++device.name 82810E DC-133 CGC [Chipset Graphics Controller]
+
+ vendor.id pci 0x8086
+&device.id pci 0x7126
++device.name 82810 DC-133 System and Graphics Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x7128
++device.name 82810-M DC-100 System and Graphics Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x712a
++device.name 82810-M DC-133 System and Graphics Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x7180
++device.name 440LX/EX - 82443LX/EX Host bridge
+
+ vendor.id pci 0x8086
+&device.id pci 0x7181
++device.name 440LX/EX - 82443LX/EX AGP bridge
+
+ vendor.id pci 0x8086
+&device.id pci 0x7190
++device.name 440BX/ZX/DX - 82443BX/ZX/DX Host bridge
+
+ vendor.id pci 0x8086
+&device.id pci 0x7190
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0x0500
++subdevice.name Armada 1750 Laptop System Chipset
+
+ vendor.id pci 0x8086
+&device.id pci 0x7190
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0xb110
++subdevice.name Armada M700/E500
+
+ vendor.id pci 0x8086
+&device.id pci 0x7190
+&subvendor.id pci 0x1179
+&subdevice.id pci 0x0001
++subdevice.name Toshiba Tecra 8100 Laptop System Chipset
+
+ vendor.id pci 0x8086
+&device.id pci 0x7190
+&subvendor.id pci 0x15ad
+&subdevice.id pci 0x1976
++subdevice.name virtualHW v3
+
+ vendor.id pci 0x8086
+&device.id pci 0x7190
+&subvendor.id pci 0x4c53
+&subdevice.id pci 0x1050
++subdevice.name CT7 mainboard
+
+ vendor.id pci 0x8086
+&device.id pci 0x7190
+&subvendor.id pci 0x4c53
+&subdevice.id pci 0x1051
++subdevice.name CE7 mainboard
+
+ vendor.id pci 0x8086
+&device.id pci 0x7191
++device.name 440BX/ZX/DX - 82443BX/ZX/DX AGP bridge
+
+ vendor.id pci 0x8086
+&device.id pci 0x7192
++device.name 440BX/ZX/DX - 82443BX/ZX/DX Host bridge (AGP disabled)
+
+ vendor.id pci 0x8086
+&device.id pci 0x7192
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0x0460
++subdevice.name Armada 1700 Laptop System Chipset
+
+ vendor.id pci 0x8086
+&device.id pci 0x7192
+&subvendor.id pci 0x4c53
+&subdevice.id pci 0x1000
++subdevice.name CC7/CR7/CP7/VC7/VP7/VR7 mainboard
+
+ vendor.id pci 0x8086
+&device.id pci 0x7194
++device.name 82440MX Host Bridge
+
+ vendor.id pci 0x8086
+&device.id pci 0x7194
+&subvendor.id pci 0x1033
+&subdevice.id pci 0x0000
++subdevice.name Versa Note Vxi
+
+ vendor.id pci 0x8086
+&device.id pci 0x7194
+&subvendor.id pci 0x4c53
+&subdevice.id pci 0x10a0
++subdevice.name CA3/CR3 mainboard
+
+ vendor.id pci 0x8086
+&device.id pci 0x7195
++device.name 82440MX AC'97 Audio Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x7195
+&subvendor.id pci 0x1033
+&subdevice.id pci 0x80cc
++subdevice.name Versa Note VXi
+
+ vendor.id pci 0x8086
+&device.id pci 0x7195
+&subvendor.id pci 0x10cf
+&subdevice.id pci 0x1099
++subdevice.name QSound_SigmaTel Stac97 PCI Audio
+
+ vendor.id pci 0x8086
+&device.id pci 0x7195
+&subvendor.id pci 0x11d4
+&subdevice.id pci 0x0040
++subdevice.name SoundMAX Integrated Digital Audio
+
+ vendor.id pci 0x8086
+&device.id pci 0x7195
+&subvendor.id pci 0x11d4
+&subdevice.id pci 0x0048
++subdevice.name SoundMAX Integrated Digital Audio
+
+ vendor.id pci 0x8086
+&device.id pci 0x7196
++device.name 82440MX AC'97 Modem Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x7198
++device.name 82440MX ISA Bridge
+
+ vendor.id pci 0x8086
+&device.id pci 0x7199
++device.name 82440MX EIDE Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x719a
++device.name 82440MX USB Universal Host Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x719b
++device.name 82440MX Power Management Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x71a0
++device.name 440GX - 82443GX Host bridge
+
+ vendor.id pci 0x8086
+&device.id pci 0x71a0
+&subvendor.id pci 0x4c53
+&subdevice.id pci 0x1050
++subdevice.name CT7 mainboard
+
+ vendor.id pci 0x8086
+&device.id pci 0x71a0
+&subvendor.id pci 0x4c53
+&subdevice.id pci 0x1051
++subdevice.name CE7 mainboard
+
+ vendor.id pci 0x8086
+&device.id pci 0x71a1
++device.name 440GX - 82443GX AGP bridge
+
+ vendor.id pci 0x8086
+&device.id pci 0x71a2
++device.name 440GX - 82443GX Host bridge (AGP disabled)
+
+ vendor.id pci 0x8086
+&device.id pci 0x71a2
+&subvendor.id pci 0x4c53
+&subdevice.id pci 0x1000
++subdevice.name CC7/CR7/CP7/VC7/VP7/VR7 mainboard
+
+ vendor.id pci 0x8086
+&device.id pci 0x7600
++device.name 82372FB PIIX5 ISA
+
+ vendor.id pci 0x8086
+&device.id pci 0x7601
++device.name 82372FB PIIX5 IDE
+
+ vendor.id pci 0x8086
+&device.id pci 0x7602
++device.name 82372FB PIIX5 USB
+
+ vendor.id pci 0x8086
+&device.id pci 0x7603
++device.name 82372FB PIIX5 SMBus
+
+ vendor.id pci 0x8086
+&device.id pci 0x7800
++device.name 82740 (i740) AGP Graphics Accelerator
+
+ vendor.id pci 0x8086
+&device.id pci 0x7800
+&subvendor.id pci 0x003d
+&subdevice.id pci 0x0008
++subdevice.name Starfighter AGP
+
+ vendor.id pci 0x8086
+&device.id pci 0x7800
+&subvendor.id pci 0x003d
+&subdevice.id pci 0x000b
++subdevice.name Starfighter AGP
+
+ vendor.id pci 0x8086
+&device.id pci 0x7800
+&subvendor.id pci 0x1092
+&subdevice.id pci 0x0100
++subdevice.name Stealth II G460
+
+ vendor.id pci 0x8086
+&device.id pci 0x7800
+&subvendor.id pci 0x10b4
+&subdevice.id pci 0x201a
++subdevice.name Lightspeed 740
+
+ vendor.id pci 0x8086
+&device.id pci 0x7800
+&subvendor.id pci 0x10b4
+&subdevice.id pci 0x202f
++subdevice.name Lightspeed 740
+
+ vendor.id pci 0x8086
+&device.id pci 0x7800
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x0000
++subdevice.name Terminator 2x/i
+
+ vendor.id pci 0x8086
+&device.id pci 0x7800
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x0100
++subdevice.name Intel740 Graphics Accelerator
+
+ vendor.id pci 0x8086
+&device.id pci 0x84c4
++device.name 450KX/GX [Orion] - 82454KX/GX PCI bridge
+
+ vendor.id pci 0x8086
+&device.id pci 0x84c5
++device.name 450KX/GX [Orion] - 82453KX/GX Memory controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x84ca
++device.name 450NX - 82451NX Memory & I/O Controller
+
+ vendor.id pci 0x8086
+&device.id pci 0x84cb
++device.name 450NX - 82454NX/84460GX PCI Expander Bridge
+
+ vendor.id pci 0x8086
+&device.id pci 0x84e0
++device.name 460GX - 84460GX System Address Controller (SAC)
+
+ vendor.id pci 0x8086
+&device.id pci 0x84e1
++device.name 460GX - 84460GX System Data Controller (SDC)
+
+ vendor.id pci 0x8086
+&device.id pci 0x84e2
++device.name 460GX - 84460GX AGP Bridge (GXB function 2)
+
+ vendor.id pci 0x8086
+&device.id pci 0x84e3
++device.name 460GX - 84460GX Memory Address Controller (MAC)
+
+ vendor.id pci 0x8086
+&device.id pci 0x84e4
++device.name 460GX - 84460GX Memory Data Controller (MDC)
+
+ vendor.id pci 0x8086
+&device.id pci 0x84e6
++device.name 460GX - 82466GX Wide and fast PCI eXpander Bridge (WXB)
+
+ vendor.id pci 0x8086
+&device.id pci 0x84ea
++device.name 460GX - 84460GX AGP Bridge (GXB function 1)
+
+ vendor.id pci 0x8086
+&device.id pci 0x8500
++device.name IXP4XX - Intel Network Processor family. IXP420, IXP421, IXP422, IXP425 and IXC1100
+
+ vendor.id pci 0x8086
+&device.id pci 0x9000
++device.name IXP2000 Family Network Processor
+
+ vendor.id pci 0x8086
+&device.id pci 0x9001
++device.name IXP2400 Network Processor
+
+ vendor.id pci 0x8086
+&device.id pci 0x9004
++device.name IXP2800 Network Processor
+
+ vendor.id pci 0x8086
+&device.id pci 0x9621
++device.name Integrated RAID
+
+ vendor.id pci 0x8086
+&device.id pci 0x9622
++device.name Integrated RAID
+
+ vendor.id pci 0x8086
+&device.id pci 0x9641
++device.name Integrated RAID
+
+ vendor.id pci 0x8086
+&device.id pci 0x96a1
++device.name Integrated RAID
+
+ vendor.id pci 0x8086
+&device.id pci 0xa01f
++device.name PRO/10GbE LR Server Adapter
+
+ vendor.id pci 0x8086
+&device.id pci 0xa11f
++device.name PRO/10GbE LR Server Adapter
+
+ vendor.id pci 0x8086
+&device.id pci 0xb152
++device.name 21152 PCI-to-PCI Bridge
+
+ vendor.id pci 0x8086
+&device.id pci 0xb154
++device.name 21154 PCI-to-PCI Bridge
+
+ vendor.id pci 0x8086
+&device.id pci 0xb555
++device.name 21555 Non transparent PCI-to-PCI Bridge
+
+ vendor.id pci 0x8086
+&device.id pci 0xb555
+&subvendor.id pci 0x12d9
+&subdevice.id pci 0x000a
++subdevice.name PCI VoIP Gateway
+
+ vendor.id pci 0x8086
+&device.id pci 0xb555
+&subvendor.id pci 0x4c53
+&subdevice.id pci 0x1050
++subdevice.name CT7 mainboard
+
+ vendor.id pci 0x8086
+&device.id pci 0xb555
+&subvendor.id pci 0x4c53
+&subdevice.id pci 0x1051
++subdevice.name CE7 mainboard
+
+ vendor.id pci 0x8086
+&device.id pci 0xb555
+&subvendor.id pci 0xe4bf
+&subdevice.id pci 0x1000
++subdevice.name CC8-1-BLUES
+
+ vendor.id pci 0x8086
+&device.id pci 0xffff
++device.name 450NX/GX [Orion] - 82453KX/GX Memory controller [BUG]
+
+ vendor.id pci 0x8401
++vendor.name TRENDware International Inc.
+
+ vendor.id pci 0x8800
++vendor.name Trigem Computer Inc.
+
+ vendor.id pci 0x8800
+&device.id pci 0x2008
++device.name Video assistent component
+
+ vendor.id pci 0x8866
++vendor.name T-Square Design Inc.
+
+ vendor.id pci 0x8888
++vendor.name Silicon Magic
+
+ vendor.id pci 0x8c4a
++vendor.name Winbond
+
+ vendor.id pci 0x8c4a
+&device.id pci 0x1980
++device.name W89C940 misprogrammed [ne2k]
+
+ vendor.id pci 0x8e0e
++vendor.name Computone Corporation
+
+ vendor.id pci 0x8e2e
++vendor.name KTI
+
+ vendor.id pci 0x8e2e
+&device.id pci 0x3000
++device.name ET32P2
+
+ vendor.id pci 0x9004
++vendor.name Adaptec
+
+ vendor.id pci 0x9004
+&device.id pci 0x0078
++device.name AHA-2940U_CN
+
+ vendor.id pci 0x9004
+&device.id pci 0x1078
++device.name AIC-7810
+
+ vendor.id pci 0x9004
+&device.id pci 0x1160
++device.name AIC-1160 [Family Fibre Channel Adapter]
+
+ vendor.id pci 0x9004
+&device.id pci 0x2178
++device.name AIC-7821
+
+ vendor.id pci 0x9004
+&device.id pci 0x3860
++device.name AHA-2930CU
+
+ vendor.id pci 0x9004
+&device.id pci 0x3b78
++device.name AHA-4844W/4844UW
+
+ vendor.id pci 0x9004
+&device.id pci 0x5075
++device.name AIC-755x
+
+ vendor.id pci 0x9004
+&device.id pci 0x5078
++device.name AHA-7850
+
+ vendor.id pci 0x9004
+&device.id pci 0x5078
+&subvendor.id pci 0x9004
+&subdevice.id pci 0x7850
++subdevice.name AHA-2904/Integrated AIC-7850
+
+ vendor.id pci 0x9004
+&device.id pci 0x5175
++device.name AIC-755x
+
+ vendor.id pci 0x9004
+&device.id pci 0x5178
++device.name AIC-7851
+
+ vendor.id pci 0x9004
+&device.id pci 0x5275
++device.name AIC-755x
+
+ vendor.id pci 0x9004
+&device.id pci 0x5278
++device.name AIC-7852
+
+ vendor.id pci 0x9004
+&device.id pci 0x5375
++device.name AIC-755x
+
+ vendor.id pci 0x9004
+&device.id pci 0x5378
++device.name AIC-7850
+
+ vendor.id pci 0x9004
+&device.id pci 0x5475
++device.name AIC-755x
+
+ vendor.id pci 0x9004
+&device.id pci 0x5478
++device.name AIC-7850
+
+ vendor.id pci 0x9004
+&device.id pci 0x5575
++device.name AVA-2930
+
+ vendor.id pci 0x9004
+&device.id pci 0x5578
++device.name AIC-7855
+
+ vendor.id pci 0x9004
+&device.id pci 0x5647
++device.name ANA-7711 TCP Offload Engine
+
+ vendor.id pci 0x9004
+&device.id pci 0x5647
+&subvendor.id pci 0x9004
+&subdevice.id pci 0x7710
++subdevice.name ANA-7711F TCP Offload Engine - Optical
+
+ vendor.id pci 0x9004
+&device.id pci 0x5647
+&subvendor.id pci 0x9004
+&subdevice.id pci 0x7711
++subdevice.name ANA-7711LP TCP Offload Engine - Copper
+
+ vendor.id pci 0x9004
+&device.id pci 0x5675
++device.name AIC-755x
+
+ vendor.id pci 0x9004
+&device.id pci 0x5678
++device.name AIC-7856
+
+ vendor.id pci 0x9004
+&device.id pci 0x5775
++device.name AIC-755x
+
+ vendor.id pci 0x9004
+&device.id pci 0x5778
++device.name AIC-7850
+
+ vendor.id pci 0x9004
+&device.id pci 0x5800
++device.name AIC-5800
+
+ vendor.id pci 0x9004
+&device.id pci 0x5900
++device.name ANA-5910/5930/5940 ATM155 & 25 LAN Adapter
+
+ vendor.id pci 0x9004
+&device.id pci 0x5905
++device.name ANA-5910A/5930A/5940A ATM Adapter
+
+ vendor.id pci 0x9004
+&device.id pci 0x6038
++device.name AIC-3860
+
+ vendor.id pci 0x9004
+&device.id pci 0x6075
++device.name AIC-1480 / APA-1480
+
+ vendor.id pci 0x9004
+&device.id pci 0x6075
+&subvendor.id pci 0x9004
+&subdevice.id pci 0x7560
++subdevice.name AIC-1480 / APA-1480 Cardbus
+
+ vendor.id pci 0x9004
+&device.id pci 0x6078
++device.name AIC-7860
+
+ vendor.id pci 0x9004
+&device.id pci 0x6178
++device.name AIC-7861
+
+ vendor.id pci 0x9004
+&device.id pci 0x6178
+&subvendor.id pci 0x9004
+&subdevice.id pci 0x7861
++subdevice.name AHA-2940AU Single
+
+ vendor.id pci 0x9004
+&device.id pci 0x6278
++device.name AIC-7860
+
+ vendor.id pci 0x9004
+&device.id pci 0x6378
++device.name AIC-7860
+
+ vendor.id pci 0x9004
+&device.id pci 0x6478
++device.name AIC-786x
+
+ vendor.id pci 0x9004
+&device.id pci 0x6578
++device.name AIC-786x
+
+ vendor.id pci 0x9004
+&device.id pci 0x6678
++device.name AIC-786x
+
+ vendor.id pci 0x9004
+&device.id pci 0x6778
++device.name AIC-786x
+
+ vendor.id pci 0x9004
+&device.id pci 0x6915
++device.name ANA620xx/ANA69011A
+
+ vendor.id pci 0x9004
+&device.id pci 0x6915
+&subvendor.id pci 0x9004
+&subdevice.id pci 0x0008
++subdevice.name ANA69011A/TX 10/100
+
+ vendor.id pci 0x9004
+&device.id pci 0x6915
+&subvendor.id pci 0x9004
+&subdevice.id pci 0x0009
++subdevice.name ANA69011A/TX 10/100
+
+ vendor.id pci 0x9004
+&device.id pci 0x6915
+&subvendor.id pci 0x9004
+&subdevice.id pci 0x0010
++subdevice.name ANA62022 2-port 10/100
+
+ vendor.id pci 0x9004
+&device.id pci 0x6915
+&subvendor.id pci 0x9004
+&subdevice.id pci 0x0018
++subdevice.name ANA62044 4-port 10/100
+
+ vendor.id pci 0x9004
+&device.id pci 0x6915
+&subvendor.id pci 0x9004
+&subdevice.id pci 0x0019
++subdevice.name ANA62044 4-port 10/100
+
+ vendor.id pci 0x9004
+&device.id pci 0x6915
+&subvendor.id pci 0x9004
+&subdevice.id pci 0x0020
++subdevice.name ANA62022 2-port 10/100
+
+ vendor.id pci 0x9004
+&device.id pci 0x6915
+&subvendor.id pci 0x9004
+&subdevice.id pci 0x0028
++subdevice.name ANA69011A/TX 10/100
+
+ vendor.id pci 0x9004
+&device.id pci 0x6915
+&subvendor.id pci 0x9004
+&subdevice.id pci 0x8008
++subdevice.name ANA69011A/TX 64 bit 10/100
+
+ vendor.id pci 0x9004
+&device.id pci 0x6915
+&subvendor.id pci 0x9004
+&subdevice.id pci 0x8009
++subdevice.name ANA69011A/TX 64 bit 10/100
+
+ vendor.id pci 0x9004
+&device.id pci 0x6915
+&subvendor.id pci 0x9004
+&subdevice.id pci 0x8010
++subdevice.name ANA62022 2-port 64 bit 10/100
+
+ vendor.id pci 0x9004
+&device.id pci 0x6915
+&subvendor.id pci 0x9004
+&subdevice.id pci 0x8018
++subdevice.name ANA62044 4-port 64 bit 10/100
+
+ vendor.id pci 0x9004
+&device.id pci 0x6915
+&subvendor.id pci 0x9004
+&subdevice.id pci 0x8019
++subdevice.name ANA62044 4-port 64 bit 10/100
+
+ vendor.id pci 0x9004
+&device.id pci 0x6915
+&subvendor.id pci 0x9004
+&subdevice.id pci 0x8020
++subdevice.name ANA62022 2-port 64 bit 10/100
+
+ vendor.id pci 0x9004
+&device.id pci 0x6915
+&subvendor.id pci 0x9004
+&subdevice.id pci 0x8028
++subdevice.name ANA69011A/TX 64 bit 10/100
+
+ vendor.id pci 0x9004
+&device.id pci 0x7078
++device.name AHA-294x / AIC-7870
+
+ vendor.id pci 0x9004
+&device.id pci 0x7178
++device.name AHA-2940/2940W / AIC-7871
+
+ vendor.id pci 0x9004
+&device.id pci 0x7278
++device.name AHA-3940/3940W / AIC-7872
+
+ vendor.id pci 0x9004
+&device.id pci 0x7378
++device.name AHA-3985 / AIC-7873
+
+ vendor.id pci 0x9004
+&device.id pci 0x7478
++device.name AHA-2944/2944W / AIC-7874
+
+ vendor.id pci 0x9004
+&device.id pci 0x7578
++device.name AHA-3944/3944W / AIC-7875
+
+ vendor.id pci 0x9004
+&device.id pci 0x7678
++device.name AHA-4944W/UW / AIC-7876
+
+ vendor.id pci 0x9004
+&device.id pci 0x7710
++device.name ANA-7711F Network Accelerator Card (NAC) - Optical
+
+ vendor.id pci 0x9004
+&device.id pci 0x7711
++device.name ANA-7711C Network Accelerator Card (NAC) - Copper
+
+ vendor.id pci 0x9004
+&device.id pci 0x7778
++device.name AIC-787x
+
+ vendor.id pci 0x9004
+&device.id pci 0x7810
++device.name AIC-7810
+
+ vendor.id pci 0x9004
+&device.id pci 0x7815
++device.name AIC-7815 RAID+Memory Controller IC
+
+ vendor.id pci 0x9004
+&device.id pci 0x7815
+&subvendor.id pci 0x9004
+&subdevice.id pci 0x7815
++subdevice.name ARO-1130U2 RAID Controller
+
+ vendor.id pci 0x9004
+&device.id pci 0x7815
+&subvendor.id pci 0x9004
+&subdevice.id pci 0x7840
++subdevice.name AIC-7815 RAID+Memory Controller IC
+
+ vendor.id pci 0x9004
+&device.id pci 0x7850
++device.name AIC-7850
+
+ vendor.id pci 0x9004
+&device.id pci 0x7855
++device.name AHA-2930
+
+ vendor.id pci 0x9004
+&device.id pci 0x7860
++device.name AIC-7860
+
+ vendor.id pci 0x9004
+&device.id pci 0x7870
++device.name AIC-7870
+
+ vendor.id pci 0x9004
+&device.id pci 0x7871
++device.name AHA-2940
+
+ vendor.id pci 0x9004
+&device.id pci 0x7872
++device.name AHA-3940
+
+ vendor.id pci 0x9004
+&device.id pci 0x7873
++device.name AHA-3980
+
+ vendor.id pci 0x9004
+&device.id pci 0x7874
++device.name AHA-2944
+
+ vendor.id pci 0x9004
+&device.id pci 0x7880
++device.name AIC-7880P
+
+ vendor.id pci 0x9004
+&device.id pci 0x7890
++device.name AIC-7890
+
+ vendor.id pci 0x9004
+&device.id pci 0x7891
++device.name AIC-789x
+
+ vendor.id pci 0x9004
+&device.id pci 0x7892
++device.name AIC-789x
+
+ vendor.id pci 0x9004
+&device.id pci 0x7893
++device.name AIC-789x
+
+ vendor.id pci 0x9004
+&device.id pci 0x7894
++device.name AIC-789x
+
+ vendor.id pci 0x9004
+&device.id pci 0x7895
++device.name AHA-2940U/UW / AHA-39xx / AIC-7895
+
+ vendor.id pci 0x9004
+&device.id pci 0x7895
+&subvendor.id pci 0x9004
+&subdevice.id pci 0x7890
++subdevice.name AHA-2940U/2940UW Dual AHA-394xAU/AUW/AUWD AIC-7895B
+
+ vendor.id pci 0x9004
+&device.id pci 0x7895
+&subvendor.id pci 0x9004
+&subdevice.id pci 0x7891
++subdevice.name AHA-2940U/2940UW Dual
+
+ vendor.id pci 0x9004
+&device.id pci 0x7895
+&subvendor.id pci 0x9004
+&subdevice.id pci 0x7892
++subdevice.name AHA-3940AU/AUW/AUWD/UWD
+
+ vendor.id pci 0x9004
+&device.id pci 0x7895
+&subvendor.id pci 0x9004
+&subdevice.id pci 0x7894
++subdevice.name AHA-3944AUWD
+
+ vendor.id pci 0x9004
+&device.id pci 0x7895
+&subvendor.id pci 0x9004
+&subdevice.id pci 0x7895
++subdevice.name AHA-2940U/2940UW Dual AHA-394xAU/AUW/AUWD AIC-7895B
+
+ vendor.id pci 0x9004
+&device.id pci 0x7895
+&subvendor.id pci 0x9004
+&subdevice.id pci 0x7896
++subdevice.name AHA-2940U/2940UW Dual AHA-394xAU/AUW/AUWD AIC-7895B
+
+ vendor.id pci 0x9004
+&device.id pci 0x7895
+&subvendor.id pci 0x9004
+&subdevice.id pci 0x7897
++subdevice.name AHA-2940U/2940UW Dual AHA-394xAU/AUW/AUWD AIC-7895B
+
+ vendor.id pci 0x9004
+&device.id pci 0x7896
++device.name AIC-789x
+
+ vendor.id pci 0x9004
+&device.id pci 0x7897
++device.name AIC-789x
+
+ vendor.id pci 0x9004
+&device.id pci 0x8078
++device.name AIC-7880U
+
+ vendor.id pci 0x9004
+&device.id pci 0x8078
+&subvendor.id pci 0x9004
+&subdevice.id pci 0x7880
++subdevice.name AIC-7880P Ultra/Ultra Wide SCSI Chipset
+
+ vendor.id pci 0x9004
+&device.id pci 0x8178
++device.name AHA-2940U/UW/D / AIC-7881U
+
+ vendor.id pci 0x9004
+&device.id pci 0x8178
+&subvendor.id pci 0x9004
+&subdevice.id pci 0x7881
++subdevice.name AHA-2940UW SCSI Host Adapter
+
+ vendor.id pci 0x9004
+&device.id pci 0x8278
++device.name AHA-3940U/UW/UWD / AIC-7882U
+
+ vendor.id pci 0x9004
+&device.id pci 0x8378
++device.name AHA-3940U/UW / AIC-7883U
+
+ vendor.id pci 0x9004
+&device.id pci 0x8478
++device.name AHA-2944UW / AIC-7884U
+
+ vendor.id pci 0x9004
+&device.id pci 0x8578
++device.name AHA-3944U/UWD / AIC-7885
+
+ vendor.id pci 0x9004
+&device.id pci 0x8678
++device.name AHA-4944UW / AIC-7886
+
+ vendor.id pci 0x9004
+&device.id pci 0x8778
++device.name AHA-2940UW Pro / AIC-788x
+
+ vendor.id pci 0x9004
+&device.id pci 0x8778
+&subvendor.id pci 0x9004
+&subdevice.id pci 0x7887
++subdevice.name 2940UW Pro Ultra-Wide SCSI Controller
+
+ vendor.id pci 0x9004
+&device.id pci 0x8878
++device.name AHA-2930UW / AIC-7888
+
+ vendor.id pci 0x9004
+&device.id pci 0x8878
+&subvendor.id pci 0x9004
+&subdevice.id pci 0x7888
++subdevice.name AHA-2930UW SCSI Controller
+
+ vendor.id pci 0x9004
+&device.id pci 0x8b78
++device.name ABA-1030
+
+ vendor.id pci 0x9004
+&device.id pci 0xec78
++device.name AHA-4944W/UW
+
+ vendor.id pci 0x9005
++vendor.name Adaptec
+
+ vendor.id pci 0x9005
+&device.id pci 0x0010
++device.name AHA-2940U2/U2W
+
+ vendor.id pci 0x9005
+&device.id pci 0x0010
+&subvendor.id pci 0x9005
+&subdevice.id pci 0x2180
++subdevice.name AHA-2940U2 SCSI Controller
+
+ vendor.id pci 0x9005
+&device.id pci 0x0010
+&subvendor.id pci 0x9005
+&subdevice.id pci 0x8100
++subdevice.name AHA-2940U2B SCSI Controller
+
+ vendor.id pci 0x9005
+&device.id pci 0x0010
+&subvendor.id pci 0x9005
+&subdevice.id pci 0xa100
++subdevice.name AHA-2940U2B SCSI Controller
+
+ vendor.id pci 0x9005
+&device.id pci 0x0010
+&subvendor.id pci 0x9005
+&subdevice.id pci 0xa180
++subdevice.name AHA-2940U2W SCSI Controller
+
+ vendor.id pci 0x9005
+&device.id pci 0x0010
+&subvendor.id pci 0x9005
+&subdevice.id pci 0xe100
++subdevice.name AHA-2950U2B SCSI Controller
+
+ vendor.id pci 0x9005
+&device.id pci 0x0011
++device.name AHA-2930U2
+
+ vendor.id pci 0x9005
+&device.id pci 0x0013
++device.name 78902
+
+ vendor.id pci 0x9005
+&device.id pci 0x0013
+&subvendor.id pci 0x9005
+&subdevice.id pci 0x0003
++subdevice.name AAA-131U2 Array1000 1 Channel RAID Controller
+
+ vendor.id pci 0x9005
+&device.id pci 0x0013
+&subvendor.id pci 0x9005
+&subdevice.id pci 0x000f
++subdevice.name AIC7890_ARO
+
+ vendor.id pci 0x9005
+&device.id pci 0x001f
++device.name AHA-2940U2/U2W / 7890/7891
+
+ vendor.id pci 0x9005
+&device.id pci 0x001f
+&subvendor.id pci 0x9005
+&subdevice.id pci 0x000f
++subdevice.name 2940U2W SCSI Controller
+
+ vendor.id pci 0x9005
+&device.id pci 0x001f
+&subvendor.id pci 0x9005
+&subdevice.id pci 0xa180
++subdevice.name 2940U2W SCSI Controller
+
+ vendor.id pci 0x9005
+&device.id pci 0x0020
++device.name AIC-7890
+
+ vendor.id pci 0x9005
+&device.id pci 0x002f
++device.name AIC-7890
+
+ vendor.id pci 0x9005
+&device.id pci 0x0030
++device.name AIC-7890
+
+ vendor.id pci 0x9005
+&device.id pci 0x003f
++device.name AIC-7890
+
+ vendor.id pci 0x9005
+&device.id pci 0x0050
++device.name AHA-3940U2x/395U2x
+
+ vendor.id pci 0x9005
+&device.id pci 0x0050
+&subvendor.id pci 0x9005
+&subdevice.id pci 0xf500
++subdevice.name AHA-3950U2B
+
+ vendor.id pci 0x9005
+&device.id pci 0x0050
+&subvendor.id pci 0x9005
+&subdevice.id pci 0xffff
++subdevice.name AHA-3950U2B
+
+ vendor.id pci 0x9005
+&device.id pci 0x0051
++device.name AHA-3950U2D
+
+ vendor.id pci 0x9005
+&device.id pci 0x0051
+&subvendor.id pci 0x9005
+&subdevice.id pci 0xb500
++subdevice.name AHA-3950U2D
+
+ vendor.id pci 0x9005
+&device.id pci 0x0053
++device.name AIC-7896 SCSI Controller
+
+ vendor.id pci 0x9005
+&device.id pci 0x0053
+&subvendor.id pci 0x9005
+&subdevice.id pci 0xffff
++subdevice.name AIC-7896 SCSI Controller mainboard implementation
+
+ vendor.id pci 0x9005
+&device.id pci 0x005f
++device.name AIC-7896U2/7897U2
+
+ vendor.id pci 0x9005
+&device.id pci 0x0080
++device.name AIC-7892A U160/m
+
+ vendor.id pci 0x9005
+&device.id pci 0x0080
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0xe2a0
++subdevice.name Compaq 64-Bit/66MHz Wide Ultra3 SCSI Adapter
+
+ vendor.id pci 0x9005
+&device.id pci 0x0080
+&subvendor.id pci 0x9005
+&subdevice.id pci 0x6220
++subdevice.name AHA-29160C
+
+ vendor.id pci 0x9005
+&device.id pci 0x0080
+&subvendor.id pci 0x9005
+&subdevice.id pci 0x62a0
++subdevice.name 29160N Ultra160 SCSI Controller
+
+ vendor.id pci 0x9005
+&device.id pci 0x0080
+&subvendor.id pci 0x9005
+&subdevice.id pci 0xe220
++subdevice.name 29160LP Low Profile Ultra160 SCSI Controller
+
+ vendor.id pci 0x9005
+&device.id pci 0x0080
+&subvendor.id pci 0x9005
+&subdevice.id pci 0xe2a0
++subdevice.name 29160 Ultra160 SCSI Controller
+
+ vendor.id pci 0x9005
+&device.id pci 0x0081
++device.name AIC-7892B U160/m
+
+ vendor.id pci 0x9005
+&device.id pci 0x0081
+&subvendor.id pci 0x9005
+&subdevice.id pci 0x62a1
++subdevice.name 19160 Ultra160 SCSI Controller
+
+ vendor.id pci 0x9005
+&device.id pci 0x0083
++device.name AIC-7892D U160/m
+
+ vendor.id pci 0x9005
+&device.id pci 0x008f
++device.name AIC-7892P U160/m
+
+ vendor.id pci 0x9005
+&device.id pci 0x008f
+&subvendor.id pci 0x1179
+&subdevice.id pci 0x0001
++subdevice.name Magnia Z310
+
+ vendor.id pci 0x9005
+&device.id pci 0x008f
+&subvendor.id pci 0x15d9
+&subdevice.id pci 0x9005
++subdevice.name Onboard SCSI Host Adapter
+
+ vendor.id pci 0x9005
+&device.id pci 0x00c0
++device.name AHA-3960D / AIC-7899A U160/m
+
+ vendor.id pci 0x9005
+&device.id pci 0x00c0
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0xf620
++subdevice.name Compaq 64-Bit/66MHz Dual Channel Wide Ultra3 SCSI Adapter
+
+ vendor.id pci 0x9005
+&device.id pci 0x00c0
+&subvendor.id pci 0x9005
+&subdevice.id pci 0xf620
++subdevice.name AHA-3960D U160/m
+
+ vendor.id pci 0x9005
+&device.id pci 0x00c1
++device.name AIC-7899B U160/m
+
+ vendor.id pci 0x9005
+&device.id pci 0x00c3
++device.name AIC-7899D U160/m
+
+ vendor.id pci 0x9005
+&device.id pci 0x00c5
++device.name RAID subsystem HBA
+
+ vendor.id pci 0x9005
+&device.id pci 0x00c5
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x00c5
++subdevice.name PowerEdge 2400,2500,2550,4400
+
+ vendor.id pci 0x9005
+&device.id pci 0x00cf
++device.name AIC-7899P U160/m
+
+ vendor.id pci 0x9005
+&device.id pci 0x00cf
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x00ce
++subdevice.name PowerEdge 1400
+
+ vendor.id pci 0x9005
+&device.id pci 0x00cf
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x00d1
++subdevice.name PowerEdge 2550
+
+ vendor.id pci 0x9005
+&device.id pci 0x00cf
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x00d9
++subdevice.name PowerEdge 2500
+
+ vendor.id pci 0x9005
+&device.id pci 0x00cf
+&subvendor.id pci 0x10f1
+&subdevice.id pci 0x2462
++subdevice.name Thunder K7 S2462
+
+ vendor.id pci 0x9005
+&device.id pci 0x00cf
+&subvendor.id pci 0x15d9
+&subdevice.id pci 0x9005
++subdevice.name Onboard SCSI Host Adapter
+
+ vendor.id pci 0x9005
+&device.id pci 0x00cf
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x3411
++subdevice.name SDS2 Mainboard
+
+ vendor.id pci 0x9005
+&device.id pci 0x0250
++device.name ServeRAID Controller
+
+ vendor.id pci 0x9005
+&device.id pci 0x0250
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x0279
++subdevice.name ServeRAID-xx
+
+ vendor.id pci 0x9005
+&device.id pci 0x0250
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x028c
++subdevice.name ServeRAID-xx
+
+ vendor.id pci 0x9005
+&device.id pci 0x0279
++device.name ServeRAID 6M
+
+ vendor.id pci 0x9005
+&device.id pci 0x0283
++device.name AAC-RAID
+
+ vendor.id pci 0x9005
+&device.id pci 0x0283
+&subvendor.id pci 0x9005
+&subdevice.id pci 0x0283
++subdevice.name Catapult
+
+ vendor.id pci 0x9005
+&device.id pci 0x0284
++device.name AAC-RAID
+
+ vendor.id pci 0x9005
+&device.id pci 0x0284
+&subvendor.id pci 0x9005
+&subdevice.id pci 0x0284
++subdevice.name Tomcat
+
+ vendor.id pci 0x9005
+&device.id pci 0x0285
++device.name AAC-RAID
+
+ vendor.id pci 0x9005
+&device.id pci 0x0285
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0x0295
++subdevice.name SATA 6Ch (Bearcat)
+
+ vendor.id pci 0x9005
+&device.id pci 0x0285
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x0287
++subdevice.name PowerEdge Expandable RAID Controller 320/DC
+
+ vendor.id pci 0x9005
+&device.id pci 0x0285
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x0291
++subdevice.name CERC SATA RAID 2 PCI SATA 6ch (DellCorsair)
+
+ vendor.id pci 0x9005
+&device.id pci 0x0285
+&subvendor.id pci 0x17aa
+&subdevice.id pci 0x0286
++subdevice.name Legend S220 (Legend Crusader)
+
+ vendor.id pci 0x9005
+&device.id pci 0x0285
+&subvendor.id pci 0x17aa
+&subdevice.id pci 0x0287
++subdevice.name Legend S230 (Legend Vulcan)
+
+ vendor.id pci 0x9005
+&device.id pci 0x0285
+&subvendor.id pci 0x9005
+&subdevice.id pci 0x0285
++subdevice.name 2200S (Vulcan)
+
+ vendor.id pci 0x9005
+&device.id pci 0x0285
+&subvendor.id pci 0x9005
+&subdevice.id pci 0x0286
++subdevice.name 2120S (Crusader)
+
+ vendor.id pci 0x9005
+&device.id pci 0x0285
+&subvendor.id pci 0x9005
+&subdevice.id pci 0x0287
++subdevice.name 2200S (Vulcan-2m)
+
+ vendor.id pci 0x9005
+&device.id pci 0x0285
+&subvendor.id pci 0x9005
+&subdevice.id pci 0x0288
++subdevice.name 3230S (Harrier)
+
+ vendor.id pci 0x9005
+&device.id pci 0x0285
+&subvendor.id pci 0x9005
+&subdevice.id pci 0x0289
++subdevice.name 3240S (Tornado)
+
+ vendor.id pci 0x9005
+&device.id pci 0x0285
+&subvendor.id pci 0x9005
+&subdevice.id pci 0x028a
++subdevice.name ASR-2020S PCI-X ZCR (Skyhawk)
+
+ vendor.id pci 0x9005
+&device.id pci 0x0285
+&subvendor.id pci 0x9005
+&subdevice.id pci 0x028b
++subdevice.name ASR-2020S SO-DIMM PCI-X ZCR (Terminator)
+
+ vendor.id pci 0x9005
+&device.id pci 0x0285
+&subvendor.id pci 0x9005
+&subdevice.id pci 0x0290
++subdevice.name AAR-2410SA PCI SATA 4ch (Jaguar II)
+
+ vendor.id pci 0x9005
+&device.id pci 0x0285
+&subvendor.id pci 0x9005
+&subdevice.id pci 0x0292
++subdevice.name AAR-2810SA PCI SATA 8ch (Corsair-8)
+
+ vendor.id pci 0x9005
+&device.id pci 0x0285
+&subvendor.id pci 0x9005
+&subdevice.id pci 0x0293
++subdevice.name AAR-21610SA PCI SATA 16ch (Corsair-16)
+
+ vendor.id pci 0x9005
+&device.id pci 0x0285
+&subvendor.id pci 0x9005
+&subdevice.id pci 0x0294
++subdevice.name ESD SO-DIMM PCI-X SATA ZCR (Prowler)
+
+ vendor.id pci 0x9005
+&device.id pci 0x0286
++device.name AAC-RAID (Rocket)
+
+ vendor.id pci 0x9005
+&device.id pci 0x0286
+&subvendor.id pci 0x9005
+&subdevice.id pci 0x028c
++subdevice.name ASR-2230S + ASR-2230SLP PCI-X (Lancer)
+
+ vendor.id pci 0x9005
+&device.id pci 0x8000
++device.name ASC-29320A U320
+
+ vendor.id pci 0x9005
+&device.id pci 0x800f
++device.name AIC-7901 U320
+
+ vendor.id pci 0x9005
+&device.id pci 0x8010
++device.name ASC-39320 U320
+
+ vendor.id pci 0x9005
+&device.id pci 0x8011
++device.name ASC-32320D U320
+
+ vendor.id pci 0x9005
+&device.id pci 0x8011
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0x00ac
++subdevice.name ASC-39320D U320
+
+ vendor.id pci 0x9005
+&device.id pci 0x8011
+&subvendor.id pci 0x9005
+&subdevice.id pci 0x0041
++subdevice.name ASC-39320D U320
+
+ vendor.id pci 0x9005
+&device.id pci 0x8012
++device.name ASC-29320 U320
+
+ vendor.id pci 0x9005
+&device.id pci 0x8013
++device.name ASC-29320B U320
+
+ vendor.id pci 0x9005
+&device.id pci 0x8014
++device.name ASC-29320LP U320
+
+ vendor.id pci 0x9005
+&device.id pci 0x8015
++device.name ASC-39320B U320
+
+ vendor.id pci 0x9005
+&device.id pci 0x8016
++device.name ASC-39320A U320
+
+ vendor.id pci 0x9005
+&device.id pci 0x8017
++device.name ASC-29320ALP U320
+
+ vendor.id pci 0x9005
+&device.id pci 0x801c
++device.name ASC-39320D U320
+
+ vendor.id pci 0x9005
+&device.id pci 0x801d
++device.name AIC-7902B U320
+
+ vendor.id pci 0x9005
+&device.id pci 0x801e
++device.name AIC-7901A U320
+
+ vendor.id pci 0x9005
+&device.id pci 0x801f
++device.name AIC-7902 U320
+
+ vendor.id pci 0x9005
+&device.id pci 0x8080
++device.name ASC-29320A U320 w/HostRAID
+
+ vendor.id pci 0x9005
+&device.id pci 0x808f
++device.name AIC-7901 U320 w/HostRAID
+
+ vendor.id pci 0x9005
+&device.id pci 0x8090
++device.name ASC-39320 U320 w/HostRAID
+
+ vendor.id pci 0x9005
+&device.id pci 0x8091
++device.name ASC-39320D U320 w/HostRAID
+
+ vendor.id pci 0x9005
+&device.id pci 0x8092
++device.name ASC-29320 U320 w/HostRAID
+
+ vendor.id pci 0x9005
+&device.id pci 0x8093
++device.name ASC-29320B U320 w/HostRAID
+
+ vendor.id pci 0x9005
+&device.id pci 0x8094
++device.name ASC-29320LP U320 w/HostRAID
+
+ vendor.id pci 0x9005
+&device.id pci 0x8095
++device.name ASC-39320(B) U320 w/HostRAID
+
+ vendor.id pci 0x9005
+&device.id pci 0x8096
++device.name ASC-39320A U320 w/HostRAID
+
+ vendor.id pci 0x9005
+&device.id pci 0x8097
++device.name ASC-29320ALP U320 w/HostRAID
+
+ vendor.id pci 0x9005
+&device.id pci 0x809c
++device.name ASC-39320D(B) U320 w/HostRAID
+
+ vendor.id pci 0x9005
+&device.id pci 0x809d
++device.name AIC-7902(B) U320 w/HostRAID
+
+ vendor.id pci 0x9005
+&device.id pci 0x809e
++device.name AIC-7901A U320 w/HostRAID
+
+ vendor.id pci 0x9005
+&device.id pci 0x809f
++device.name AIC-7902 U320 w/HostRAID
+
+ vendor.id pci 0x907f
++vendor.name Atronics
+
+ vendor.id pci 0x907f
+&device.id pci 0x2015
++device.name IDE-2015PL
+
+ vendor.id pci 0x919a
++vendor.name Gigapixel Corp
+
+ vendor.id pci 0x9412
++vendor.name Holtek
+
+ vendor.id pci 0x9412
+&device.id pci 0x6565
++device.name 6565
+
+ vendor.id pci 0x9699
++vendor.name Omni Media Technology Inc
+
+ vendor.id pci 0x9699
+&device.id pci 0x6565
++device.name 6565
+
+ vendor.id pci 0x9710
++vendor.name NetMos Technology
+
+ vendor.id pci 0x9710
+&device.id pci 0x7780
++device.name USB IRDA-port
+
+ vendor.id pci 0x9710
+&device.id pci 0x9815
++device.name PCI 9815 Multi-I/O Controller
+
+ vendor.id pci 0x9710
+&device.id pci 0x9815
+&subvendor.id pci 0x1000
+&subdevice.id pci 0x0020
++subdevice.name 2P0S (2 port parallel adaptor)
+
+ vendor.id pci 0x9710
+&device.id pci 0x9835
++device.name PCI 9835 Multi-I/O Controller
+
+ vendor.id pci 0x9710
+&device.id pci 0x9835
+&subvendor.id pci 0x1000
+&subdevice.id pci 0x0002
++subdevice.name 2S (16C550 UART)
+
+ vendor.id pci 0x9710
+&device.id pci 0x9835
+&subvendor.id pci 0x1000
+&subdevice.id pci 0x0012
++subdevice.name 1P2S
+
+ vendor.id pci 0x9710
+&device.id pci 0x9845
++device.name PCI 9845 Multi-I/O Controller
+
+ vendor.id pci 0x9710
+&device.id pci 0x9845
+&subvendor.id pci 0x1000
+&subdevice.id pci 0x0004
++subdevice.name 0P4S (4 port 16550A serial card)
+
+ vendor.id pci 0x9710
+&device.id pci 0x9845
+&subvendor.id pci 0x1000
+&subdevice.id pci 0x0006
++subdevice.name 0P6S (6 port 16550a serial card)
+
+ vendor.id pci 0x9710
+&device.id pci 0x9855
++device.name PCI 9855 Multi-I/O Controller
+
+ vendor.id pci 0x9710
+&device.id pci 0x9855
+&subvendor.id pci 0x1000
+&subdevice.id pci 0x0014
++subdevice.name 1P4S
+
+ vendor.id pci 0x9902
++vendor.name Stargen Inc.
+
+ vendor.id pci 0x9902
+&device.id pci 0x0001
++device.name SG2010 PCI over Starfabric Bridge
+
+ vendor.id pci 0x9902
+&device.id pci 0x0002
++device.name SG2010 PCI to Starfabric Gateway
+
+ vendor.id pci 0x9902
+&device.id pci 0x0003
++device.name SG1010 Starfabric Switch and PCI Bridge
+
+ vendor.id pci 0xa0a0
++vendor.name AOPEN Inc.
+
+ vendor.id pci 0xa0f1
++vendor.name UNISYS Corporation
+
+ vendor.id pci 0xa200
++vendor.name NEC Corporation
+
+ vendor.id pci 0xa259
++vendor.name Hewlett Packard
+
+ vendor.id pci 0xa25b
++vendor.name Hewlett Packard GmbH PL24-MKT
+
+ vendor.id pci 0xa304
++vendor.name Sony
+
+ vendor.id pci 0xa727
++vendor.name 3Com Corporation
+
+ vendor.id pci 0xa727
+&device.id pci 0x0013
++device.name 3CRPAG175 Wireless PC Card
+
+ vendor.id pci 0xaa42
++vendor.name Scitex Digital Video
+
+ vendor.id pci 0xac1e
++vendor.name Digital Receiver Technology Inc
+
+ vendor.id pci 0xac3d
++vendor.name Actuality Systems
+
+ vendor.id pci 0xaecb
++vendor.name Adrienne Electronics Corporation
+
+ vendor.id pci 0xb1b3
++vendor.name Shiva Europe Limited
+
+ vendor.id pci 0xbd11
++vendor.name Pinnacle Systems, Inc. (Wrong ID)
+
+ vendor.id pci 0xc001
++vendor.name TSI Telsys
+
+ vendor.id pci 0xc0a9
++vendor.name Micron/Crucial Technology
+
+ vendor.id pci 0xc0de
++vendor.name Motorola
+
+ vendor.id pci 0xc0fe
++vendor.name Motion Engineering, Inc.
+
+ vendor.id pci 0xca50
++vendor.name Varian Australia Pty Ltd
+
+ vendor.id pci 0xcafe
++vendor.name Chrysalis-ITS
+
+ vendor.id pci 0xcccc
++vendor.name Catapult Communications
+
+ vendor.id pci 0xcddd
++vendor.name Tyzx, Inc.
+
+ vendor.id pci 0xcddd
+&device.id pci 0x0101
++device.name DeepSea 1 High Speed Stereo Vision Frame Grabber
+
+ vendor.id pci 0xcddd
+&device.id pci 0x0200
++device.name DeepSea 2 High Speed Stereo Vision Frame Grabber
+
+ vendor.id pci 0xd4d4
++vendor.name Dy4 Systems Inc
+
+ vendor.id pci 0xd4d4
+&device.id pci 0x0601
++device.name PCI Mezzanine Card
+
+ vendor.id pci 0xd531
++vendor.name I+ME ACTIA GmbH
+
+ vendor.id pci 0xd84d
++vendor.name Exsys
+
+ vendor.id pci 0xdead
++vendor.name Indigita Corporation
+
+ vendor.id pci 0xe000
++vendor.name Winbond
+
+ vendor.id pci 0xe000
+&device.id pci 0xe000
++device.name W89C940
+
+ vendor.id pci 0xe159
++vendor.name Tiger Jet Network Inc.
+
+ vendor.id pci 0xe159
+&device.id pci 0x0001
++device.name Tiger3XX Modem/ISDN interface
+
+ vendor.id pci 0xe159
+&device.id pci 0x0001
+&subvendor.id pci 0x0059
+&subdevice.id pci 0x0001
++subdevice.name 128k ISDN-S/T Adapter
+
+ vendor.id pci 0xe159
+&device.id pci 0x0001
+&subvendor.id pci 0x0059
+&subdevice.id pci 0x0003
++subdevice.name 128k ISDN-U Adapter
+
+ vendor.id pci 0xe159
+&device.id pci 0x0002
++device.name Tiger100APC ISDN chipset
+
+ vendor.id pci 0xe4bf
++vendor.name EKF Elektronik GmbH
+
+ vendor.id pci 0xe55e
++vendor.name Essence Technology, Inc.
+
+ vendor.id pci 0xea01
++vendor.name Eagle Technology
+
+ vendor.id pci 0xea60
++vendor.name RME
+
+ vendor.id pci 0xea60
+&device.id pci 0x9896
++device.name Digi32
+
+ vendor.id pci 0xea60
+&device.id pci 0x9897
++device.name Digi32 Pro
+
+ vendor.id pci 0xea60
+&device.id pci 0x9898
++device.name Digi32/8
+
+ vendor.id pci 0xeabb
++vendor.name Aashima Technology B.V.
+
+ vendor.id pci 0xeace
++vendor.name Endace Measurement Systems, Ltd
+
+ vendor.id pci 0xeace
+&device.id pci 0x3100
++device.name DAG 3.10 OC-3/OC-12
+
+ vendor.id pci 0xeace
+&device.id pci 0x3200
++device.name DAG 3.2x OC-3/OC-12
+
+ vendor.id pci 0xeace
+&device.id pci 0x320e
++device.name DAG 3.2E Fast Ethernet
+
+ vendor.id pci 0xeace
+&device.id pci 0x340e
++device.name DAG 3.4E Fast Ethernet
+
+ vendor.id pci 0xeace
+&device.id pci 0x341e
++device.name DAG 3.41E Fast Ethernet
+
+ vendor.id pci 0xeace
+&device.id pci 0x3500
++device.name DAG 3.5 OC-3/OC-12
+
+ vendor.id pci 0xeace
+&device.id pci 0x351c
++device.name DAG 3.5ECM Fast Ethernet
+
+ vendor.id pci 0xeace
+&device.id pci 0x4100
++device.name DAG 4.10 OC-48
+
+ vendor.id pci 0xeace
+&device.id pci 0x4110
++device.name DAG 4.11 OC-48
+
+ vendor.id pci 0xeace
+&device.id pci 0x4220
++device.name DAG 4.2 OC-48
+
+ vendor.id pci 0xeace
+&device.id pci 0x422e
++device.name DAG 4.2E Dual Gigabit Ethernet
+
+ vendor.id pci 0xec80
++vendor.name Belkin Corporation
+
+ vendor.id pci 0xec80
+&device.id pci 0xec00
++device.name F5D6000
+
+ vendor.id pci 0xecc0
++vendor.name Echo Digital Audio Corporation
+
+ vendor.id pci 0xecc0
+&device.id pci 0x0050
++device.name Gina24_301
+
+ vendor.id pci 0xecc0
+&device.id pci 0x0051
++device.name Gina24_361
+
+ vendor.id pci 0xecc0
+&device.id pci 0x0060
++device.name Layla24
+
+ vendor.id pci 0xecc0
+&device.id pci 0x0070
++device.name Mona_301_80
+
+ vendor.id pci 0xecc0
+&device.id pci 0x0071
++device.name Mona_301_66
+
+ vendor.id pci 0xecc0
+&device.id pci 0x0072
++device.name Mona_361
+
+ vendor.id pci 0xecc0
+&device.id pci 0x0080
++device.name Mia
+
+ vendor.id pci 0xedd8
++vendor.name ARK Logic Inc
+
+ vendor.id pci 0xedd8
+&device.id pci 0xa091
++device.name 1000PV [Stingray]
+
+ vendor.id pci 0xedd8
+&device.id pci 0xa099
++device.name 2000PV [Stingray]
+
+ vendor.id pci 0xedd8
+&device.id pci 0xa0a1
++device.name 2000MT
+
+ vendor.id pci 0xedd8
+&device.id pci 0xa0a9
++device.name 2000MI
+
+ vendor.id pci 0xf1d0
++vendor.name AJA Video
+
+ vendor.id pci 0xf1d0
+&device.id pci 0xcafe
++device.name KONA SD SMPTE 259M I/O
+
+ vendor.id pci 0xf1d0
+&device.id pci 0xefac
++device.name KONA SD SMPTE 259M I/O
+
+ vendor.id pci 0xf1d0
+&device.id pci 0xfacd
++device.name KONA HD SMPTE 292M I/O
+
+ vendor.id pci 0xfa57
++vendor.name Interagon AS
+
+ vendor.id pci 0xfa57
+&device.id pci 0x0001
++device.name PMC [Pattern Matching Chip]
+
+ vendor.id pci 0xfebd
++vendor.name Ultraview Corp.
+
+ vendor.id pci 0xfeda
++vendor.name Broadcom Inc (nee Epigram)
+
+ vendor.id pci 0xfeda
+&device.id pci 0xa0fa
++device.name BCM4210 iLine10 HomePNA 2.0
+
+ vendor.id pci 0xfeda
+&device.id pci 0xa10e
++device.name BCM4230 iLine10 HomePNA 2.0
+
+ vendor.id pci 0xfede
++vendor.name Fedetec Inc.
+
+ vendor.id pci 0xfede
+&device.id pci 0x0003
++device.name TABIC PCI v3
+
+ vendor.id pci 0xfffe
++vendor.name VMWare Inc
+
+ vendor.id pci 0xfffe
+&device.id pci 0x0405
++device.name Virtual SVGA 4.0
+
+ vendor.id pci 0xfffe
+&device.id pci 0x0710
++device.name Virtual SVGA
+
+ vendor.id pci 0xffff
++vendor.name Illegal Vendor ID
+
+ baseclass.id 0x000
++baseclass.name Unclassified device
+
+ baseclass.id 0x000
+&subclass.id 0x00
++subclass.name Non-VGA unclassified device
+
+ baseclass.id 0x000
+&subclass.id 0x01
++subclass.name VGA compatible unclassified device
+
+ baseclass.id 0x001
++baseclass.name Mass storage controller
+
+ baseclass.id 0x001
+&subclass.id 0x00
++subclass.name SCSI storage controller
+
+ baseclass.id 0x001
+&subclass.id 0x01
++subclass.name IDE interface
+
+ baseclass.id 0x001
+&subclass.id 0x02
++subclass.name Floppy disk controller
+
+ baseclass.id 0x001
+&subclass.id 0x03
++subclass.name IPI bus controller
+
+ baseclass.id 0x001
+&subclass.id 0x04
++subclass.name RAID bus controller
+
+ baseclass.id 0x001
+&subclass.id 0x80
++subclass.name Unknown mass storage controller
+
+ baseclass.id 0x002
++baseclass.name Network controller
+
+ baseclass.id 0x002
+&subclass.id 0x00
++subclass.name Ethernet controller
+
+ baseclass.id 0x002
+&subclass.id 0x01
++subclass.name Token ring network controller
+
+ baseclass.id 0x002
+&subclass.id 0x02
++subclass.name FDDI network controller
+
+ baseclass.id 0x002
+&subclass.id 0x03
++subclass.name ATM network controller
+
+ baseclass.id 0x002
+&subclass.id 0x04
++subclass.name ISDN controller
+
+ baseclass.id 0x002
+&subclass.id 0x80
++subclass.name Network controller
+
+ baseclass.id 0x003
++baseclass.name Display controller
+
+ baseclass.id 0x003
+&subclass.id 0x00
++subclass.name VGA compatible controller
+
+ baseclass.id 0x003
+&subclass.id 0x00
+&progif.id 0x00
++progif.name VGA
+
+ baseclass.id 0x003
+&subclass.id 0x00
+&progif.id 0x01
++progif.name 8514
+
+ baseclass.id 0x003
+&subclass.id 0x01
++subclass.name XGA compatible controller
+
+ baseclass.id 0x003
+&subclass.id 0x02
++subclass.name 3D controller
+
+ baseclass.id 0x003
+&subclass.id 0x80
++subclass.name Display controller
+
+ baseclass.id 0x004
++baseclass.name Multimedia controller
+
+ baseclass.id 0x004
+&subclass.id 0x00
++subclass.name Multimedia video controller
+
+ baseclass.id 0x004
+&subclass.id 0x01
++subclass.name Multimedia audio controller
+
+ baseclass.id 0x004
+&subclass.id 0x02
++subclass.name Computer telephony device
+
+ baseclass.id 0x004
+&subclass.id 0x80
++subclass.name Multimedia controller
+
+ baseclass.id 0x005
++baseclass.name Memory controller
+
+ baseclass.id 0x005
+&subclass.id 0x00
++subclass.name RAM memory
+
+ baseclass.id 0x005
+&subclass.id 0x01
++subclass.name FLASH memory
+
+ baseclass.id 0x005
+&subclass.id 0x80
++subclass.name Memory controller
+
+ baseclass.id 0x006
++baseclass.name Bridge
+
+ baseclass.id 0x006
+&subclass.id 0x00
++subclass.name Host bridge
+
+ baseclass.id 0x006
+&subclass.id 0x01
++subclass.name ISA bridge
+
+ baseclass.id 0x006
+&subclass.id 0x02
++subclass.name EISA bridge
+
+ baseclass.id 0x006
+&subclass.id 0x03
++subclass.name MicroChannel bridge
+
+ baseclass.id 0x006
+&subclass.id 0x04
++subclass.name PCI bridge
+
+ baseclass.id 0x006
+&subclass.id 0x04
+&progif.id 0x00
++progif.name Normal decode
+
+ baseclass.id 0x006
+&subclass.id 0x04
+&progif.id 0x01
++progif.name Subtractive decode
+
+ baseclass.id 0x006
+&subclass.id 0x05
++subclass.name PCMCIA bridge
+
+ baseclass.id 0x006
+&subclass.id 0x06
++subclass.name NuBus bridge
+
+ baseclass.id 0x006
+&subclass.id 0x07
++subclass.name CardBus bridge
+
+ baseclass.id 0x006
+&subclass.id 0x08
++subclass.name RACEway bridge
+
+ baseclass.id 0x006
+&subclass.id 0x08
+&progif.id 0x00
++progif.name Transparent mode
+
+ baseclass.id 0x006
+&subclass.id 0x08
+&progif.id 0x01
++progif.name Endpoint mode
+
+ baseclass.id 0x006
+&subclass.id 0x09
++subclass.name Semi-transparent PCI-to-PCI bridge
+
+ baseclass.id 0x006
+&subclass.id 0x09
+&progif.id 0x40
++progif.name Primary bus towards host CPU
+
+ baseclass.id 0x006
+&subclass.id 0x09
+&progif.id 0x80
++progif.name Secondary bus towards host CPU
+
+ baseclass.id 0x006
+&subclass.id 0x0a
++subclass.name InfiniBand to PCI host bridge
+
+ baseclass.id 0x006
+&subclass.id 0x80
++subclass.name Bridge
+
+ baseclass.id 0x007
++baseclass.name Communication controller
+
+ baseclass.id 0x007
+&subclass.id 0x00
++subclass.name Serial controller
+
+ baseclass.id 0x007
+&subclass.id 0x00
+&progif.id 0x00
++progif.name 8250
+
+ baseclass.id 0x007
+&subclass.id 0x00
+&progif.id 0x01
++progif.name 16450
+
+ baseclass.id 0x007
+&subclass.id 0x00
+&progif.id 0x02
++progif.name 16550
+
+ baseclass.id 0x007
+&subclass.id 0x00
+&progif.id 0x03
++progif.name 16650
+
+ baseclass.id 0x007
+&subclass.id 0x00
+&progif.id 0x04
++progif.name 16750
+
+ baseclass.id 0x007
+&subclass.id 0x00
+&progif.id 0x05
++progif.name 16850
+
+ baseclass.id 0x007
+&subclass.id 0x00
+&progif.id 0x06
++progif.name 16950
+
+ baseclass.id 0x007
+&subclass.id 0x01
++subclass.name Parallel controller
+
+ baseclass.id 0x007
+&subclass.id 0x01
+&progif.id 0x00
++progif.name SPP
+
+ baseclass.id 0x007
+&subclass.id 0x01
+&progif.id 0x01
++progif.name BiDir
+
+ baseclass.id 0x007
+&subclass.id 0x01
+&progif.id 0x02
++progif.name ECP
+
+ baseclass.id 0x007
+&subclass.id 0x01
+&progif.id 0x03
++progif.name IEEE1284
+
+ baseclass.id 0x007
+&subclass.id 0x01
+&progif.id 0xfe
++progif.name IEEE1284 Target
+
+ baseclass.id 0x007
+&subclass.id 0x02
++subclass.name Multiport serial controller
+
+ baseclass.id 0x007
+&subclass.id 0x03
++subclass.name Modem
+
+ baseclass.id 0x007
+&subclass.id 0x03
+&progif.id 0x00
++progif.name Generic
+
+ baseclass.id 0x007
+&subclass.id 0x03
+&progif.id 0x01
++progif.name Hayes/16450
+
+ baseclass.id 0x007
+&subclass.id 0x03
+&progif.id 0x02
++progif.name Hayes/16550
+
+ baseclass.id 0x007
+&subclass.id 0x03
+&progif.id 0x03
++progif.name Hayes/16650
+
+ baseclass.id 0x007
+&subclass.id 0x03
+&progif.id 0x04
++progif.name Hayes/16750
+
+ baseclass.id 0x007
+&subclass.id 0x80
++subclass.name Communication controller
+
+ baseclass.id 0x008
++baseclass.name Generic system peripheral
+
+ baseclass.id 0x008
+&subclass.id 0x00
++subclass.name PIC
+
+ baseclass.id 0x008
+&subclass.id 0x00
+&progif.id 0x00
++progif.name 8259
+
+ baseclass.id 0x008
+&subclass.id 0x00
+&progif.id 0x01
++progif.name ISA PIC
+
+ baseclass.id 0x008
+&subclass.id 0x00
+&progif.id 0x02
++progif.name EISA PIC
+
+ baseclass.id 0x008
+&subclass.id 0x00
+&progif.id 0x10
++progif.name IO-APIC
+
+ baseclass.id 0x008
+&subclass.id 0x00
+&progif.id 0x20
++progif.name IO(X)-APIC
+
+ baseclass.id 0x008
+&subclass.id 0x01
++subclass.name DMA controller
+
+ baseclass.id 0x008
+&subclass.id 0x01
+&progif.id 0x00
++progif.name 8237
+
+ baseclass.id 0x008
+&subclass.id 0x01
+&progif.id 0x01
++progif.name ISA DMA
+
+ baseclass.id 0x008
+&subclass.id 0x01
+&progif.id 0x02
++progif.name EISA DMA
+
+ baseclass.id 0x008
+&subclass.id 0x02
++subclass.name Timer
+
+ baseclass.id 0x008
+&subclass.id 0x02
+&progif.id 0x00
++progif.name 8254
+
+ baseclass.id 0x008
+&subclass.id 0x02
+&progif.id 0x01
++progif.name ISA Timer
+
+ baseclass.id 0x008
+&subclass.id 0x02
+&progif.id 0x02
++progif.name EISA Timers
+
+ baseclass.id 0x008
+&subclass.id 0x03
++subclass.name RTC
+
+ baseclass.id 0x008
+&subclass.id 0x03
+&progif.id 0x00
++progif.name Generic
+
+ baseclass.id 0x008
+&subclass.id 0x03
+&progif.id 0x01
++progif.name ISA RTC
+
+ baseclass.id 0x008
+&subclass.id 0x04
++subclass.name PCI Hot-plug controller
+
+ baseclass.id 0x008
+&subclass.id 0x80
++subclass.name System peripheral
+
+ baseclass.id 0x009
++baseclass.name Input device controller
+
+ baseclass.id 0x009
+&subclass.id 0x00
++subclass.name Keyboard controller
+
+ baseclass.id 0x009
+&subclass.id 0x01
++subclass.name Digitizer Pen
+
+ baseclass.id 0x009
+&subclass.id 0x02
++subclass.name Mouse controller
+
+ baseclass.id 0x009
+&subclass.id 0x03
++subclass.name Scanner controller
+
+ baseclass.id 0x009
+&subclass.id 0x04
++subclass.name Gameport controller
+
+ baseclass.id 0x009
+&subclass.id 0x04
+&progif.id 0x00
++progif.name Generic
+
+ baseclass.id 0x009
+&subclass.id 0x04
+&progif.id 0x10
++progif.name Extended
+
+ baseclass.id 0x009
+&subclass.id 0x80
++subclass.name Input device controller
+
+ baseclass.id 0x00a
++baseclass.name Docking station
+
+ baseclass.id 0x00a
+&subclass.id 0x00
++subclass.name Generic Docking Station
+
+ baseclass.id 0x00a
+&subclass.id 0x80
++subclass.name Docking Station
+
+ baseclass.id 0x00b
++baseclass.name Processor
+
+ baseclass.id 0x00b
+&subclass.id 0x00
++subclass.name 386
+
+ baseclass.id 0x00b
+&subclass.id 0x01
++subclass.name 486
+
+ baseclass.id 0x00b
+&subclass.id 0x02
++subclass.name Pentium
+
+ baseclass.id 0x00b
+&subclass.id 0x10
++subclass.name Alpha
+
+ baseclass.id 0x00b
+&subclass.id 0x20
++subclass.name Power PC
+
+ baseclass.id 0x00b
+&subclass.id 0x30
++subclass.name MIPS
+
+ baseclass.id 0x00b
+&subclass.id 0x40
++subclass.name Co-processor
+
+ baseclass.id 0x00c
++baseclass.name Serial bus controller
+
+ baseclass.id 0x00c
+&subclass.id 0x00
++subclass.name FireWire (IEEE 1394)
+
+ baseclass.id 0x00c
+&subclass.id 0x00
+&progif.id 0x00
++progif.name Generic
+
+ baseclass.id 0x00c
+&subclass.id 0x00
+&progif.id 0x10
++progif.name OHCI
+
+ baseclass.id 0x00c
+&subclass.id 0x01
++subclass.name ACCESS Bus
+
+ baseclass.id 0x00c
+&subclass.id 0x02
++subclass.name SSA
+
+ baseclass.id 0x00c
+&subclass.id 0x03
++subclass.name USB Controller
+
+ baseclass.id 0x00c
+&subclass.id 0x03
+&progif.id 0x00
++progif.name UHCI
+
+ baseclass.id 0x00c
+&subclass.id 0x03
+&progif.id 0x10
++progif.name OHCI
+
+ baseclass.id 0x00c
+&subclass.id 0x03
+&progif.id 0x20
++progif.name EHCI
+
+ baseclass.id 0x00c
+&subclass.id 0x03
+&progif.id 0x80
++progif.name Unspecified
+
+ baseclass.id 0x00c
+&subclass.id 0x03
+&progif.id 0xfe
++progif.name USB Device
+
+ baseclass.id 0x00c
+&subclass.id 0x04
++subclass.name Fibre Channel
+
+ baseclass.id 0x00c
+&subclass.id 0x05
++subclass.name SMBus
+
+ baseclass.id 0x00c
+&subclass.id 0x06
++subclass.name InfiniBand
+
+ baseclass.id 0x00d
++baseclass.name Wireless controller
+
+ baseclass.id 0x00d
+&subclass.id 0x00
++subclass.name IRDA controller
+
+ baseclass.id 0x00d
+&subclass.id 0x01
++subclass.name Consumer IR controller
+
+ baseclass.id 0x00d
+&subclass.id 0x10
++subclass.name RF controller
+
+ baseclass.id 0x00d
+&subclass.id 0x80
++subclass.name Wireless controller
+
+ baseclass.id 0x00e
++baseclass.name Intelligent controller
+
+ baseclass.id 0x00e
+&subclass.id 0x00
++subclass.name I2O
+
+ baseclass.id 0x00f
++baseclass.name Satellite communications controller
+
+ baseclass.id 0x00f
+&subclass.id 0x00
++subclass.name Satellite TV controller
+
+ baseclass.id 0x00f
+&subclass.id 0x01
++subclass.name Satellite audio communication controller
+
+ baseclass.id 0x00f
+&subclass.id 0x03
++subclass.name Satellite voice communication controller
+
+ baseclass.id 0x00f
+&subclass.id 0x04
++subclass.name Satellite data communication controller
+
+ baseclass.id 0x010
++baseclass.name Encryption controller
+
+ baseclass.id 0x010
+&subclass.id 0x00
++subclass.name Network and computing encryption device
+
+ baseclass.id 0x010
+&subclass.id 0x10
++subclass.name Entertainment encryption device
+
+ baseclass.id 0x010
+&subclass.id 0x80
++subclass.name Encryption controller
+
+ baseclass.id 0x011
++baseclass.name Signal processing controller
+
+ baseclass.id 0x011
+&subclass.id 0x00
++subclass.name DPIO module
+
+ baseclass.id 0x011
+&subclass.id 0x01
++subclass.name Performance counters
+
+ baseclass.id 0x011
+&subclass.id 0x10
++subclass.name Communication synchronizer
+
+ baseclass.id 0x011
+&subclass.id 0x80
++subclass.name Signal processing controller
+
--- /dev/null
+ vendor.id pcmcia 0x0004
+&device.id pcmcia 0x0004
++baseclass.id 0x002
++subclass.id 0x00
++driver.module.modprobe fmvj18x_cs
+
+ vendor.id pcmcia 0x000b
+&device.id pcmcia 0x7100
+|vendor.id pcmcia 0x0101
+&device.id pcmcia 0x0777
+|vendor.id pcmcia 0x0126
+&device.id pcmcia 0x8000
+|vendor.id pcmcia 0x0250
+&device.id pcmcia 0x0002
+|vendor.id pcmcia 0x0274
+&device.id pcmcia 0x1612
+|vendor.id pcmcia 0x02d2
+&device.id pcmcia 0x0001
+|vendor.id pcmcia 0x50c2
+&device.id pcmcia 0x0001
+|vendor.id pcmcia 0xc00f
+&device.id pcmcia 0x0000
++driver.module.modprobe hostap_cs
+
+ vendor.id pcmcia 0x000b
+&device.id pcmcia 0x7300
+|vendor.id pcmcia 0x0138
+&device.id pcmcia 0x0002
+|vendor.id pcmcia 0x0156
+&device.id pcmcia 0x0002
+|vendor.id pcmcia 0x0274
+&device.id pcmcia 0x1613
+|vendor.id pcmcia 0x028a
+&device.id pcmcia 0x0002
+|vendor.id pcmcia 0xc250
+&device.id pcmcia 0x0002
++driver.module.modprobe hostap_cs
++driver.module.modprobe orinoco_cs
+
+ vendor.id pcmcia 0x0032
+&device.id pcmcia 0x0704
+|vendor.id pcmcia 0x00a4
+&device.id pcmcia 0x002d
+|vendor.id pcmcia 0x2080
+&device.id pcmcia 0x0001
++driver.module.modprobe ide-cs
+
+ vendor.id pcmcia 0x0057
+&device.id pcmcia 0x1004
+|vendor.id pcmcia 0x0104
+&device.id pcmcia 0x000d
+|vendor.id pcmcia 0x0104
+&device.id pcmcia 0x0075
+|vendor.id pcmcia 0x0104
+&device.id pcmcia 0x0145
+|vendor.id pcmcia 0x0149
+&device.id pcmcia 0x0230
+|vendor.id pcmcia 0x0149
+&device.id pcmcia 0x4530
+|vendor.id pcmcia 0x0186
+&device.id pcmcia 0x0110
+|vendor.id pcmcia 0x01bf
+&device.id pcmcia 0x2216
+|vendor.id pcmcia 0x01bf
+&device.id pcmcia 0x2328
+|vendor.id pcmcia 0x01bf
+&device.id pcmcia 0x8041
+|vendor.id pcmcia 0x0213
+&device.id pcmcia 0x2452
+|vendor.id pcmcia 0x026f
+&device.id pcmcia 0x0300
+|vendor.id pcmcia 0x026f
+&device.id pcmcia 0x0307
+|vendor.id pcmcia 0x026f
+&device.id pcmcia 0x030a
+|vendor.id pcmcia 0x0274
+&device.id pcmcia 0x1103
+|vendor.id pcmcia 0x0274
+&device.id pcmcia 0x1121
+|vendor.id pcmcia 0xc00f
+&device.id pcmcia 0x0002
++baseclass.id 0x002
++subclass.id 0x00
++driver.module.modprobe pcnet_cs
+
+ vendor.id pcmcia 0x0089
+&device.id pcmcia 0x0001
+|vendor.id pcmcia 0x01eb
+&device.id pcmcia 0x080a
+|vendor.id pcmcia 0x0261
+&device.id pcmcia 0x0002
+|vendor.id pcmcia 0x0268
+&device.id pcmcia 0x0001
+|vendor.id pcmcia 0x026f
+&device.id pcmcia 0x0305
+|vendor.id pcmcia 0x028a
+&device.id pcmcia 0x0673
+|vendor.id pcmcia 0x02aa
+&device.id pcmcia 0x0002
+|vendor.id pcmcia 0x02ac
+&device.id pcmcia 0x0002
+|vendor.id pcmcia 0x14ea
+&device.id pcmcia 0xb001
+|vendor.id pcmcia 0x50c2
+&device.id pcmcia 0x7300
+|vendor.id pcmcia 0x9005
+&device.id pcmcia 0x0021
++driver.module.modprobe orinoco_cs
+
+# tulip_cb
+ vendor.id pcmcia 0x0089
+&device.id pcmcia 0x0102
+|vendor.id pcmcia 0x0089
+&device.id pcmcia 0x0113
+|vendor.id pcmcia 0x00a4
+&device.id pcmcia 0x0113
+|vendor.id pcmcia 0x0105
+&device.id pcmcia 0x0500
+|vendor.id pcmcia 0x0149
+&device.id pcmcia 0x0231
+|vendor.id pcmcia 0x0149
+&device.id pcmcia 0xc2ab
+|vendor.id pcmcia 0x0186
+&device.id pcmcia 0x0101
+|vendor.id pcmcia 0x01bf
+&device.id pcmcia 0x2220
+|vendor.id pcmcia 0x01bf
+&device.id pcmcia 0x2225
+|vendor.id pcmcia 0x01bf
+&device.id pcmcia 0x2227
+|vendor.id pcmcia 0x01bf
+&device.id pcmcia 0x8036
+|vendor.id pcmcia 0x01da
+&device.id pcmcia 0x0081
+|vendor.id pcmcia 0x01da
+&device.id pcmcia 0x0090
+|vendor.id pcmcia 0x021b
+&device.id pcmcia 0x0510
+|vendor.id pcmcia 0x022d
+&device.id pcmcia 0x2103
+|vendor.id pcmcia 0x02ac
+&device.id pcmcia 0x1012
+|vendor.id pcmcia 0x13d1
+&device.id pcmcia 0xab02+0x0002
+|vendor.id pcmcia 0x50c7
+&device.id pcmcia 0xcafe
+|vendor.id pcmcia 0x9513
+&device.id pcmcia 0x0081
+|vendor.id pcmcia 0xe815
+&device.id pcmcia 0x0081
++baseclass.id 0x002
++subclass.id 0x00
+
+# eepro100_cb
+ vendor.id pcmcia 0x0089
+&device.id pcmcia 0x0103
++baseclass.id 0x002
++subclass.id 0x00
+
+ vendor.id pcmcia 0x0089
+&device.id pcmcia 0x0301
+|vendor.id pcmcia 0x0101
+&device.id pcmcia 0x0039
+|vendor.id pcmcia 0x0104
+&device.id pcmcia 0x0006
+|vendor.id pcmcia 0x0105
+&device.id pcmcia 0x410a
+|vendor.id pcmcia 0x010b
+&device.id pcmcia 0x0d50+0x0004
+|vendor.id pcmcia 0x010b
+&device.id pcmcia 0xd180
+|vendor.id pcmcia 0x0137
+&device.id pcmcia 0x000e
+|vendor.id pcmcia 0x0137
+&device.id pcmcia 0x001b
+|vendor.id pcmcia 0x0137
+&device.id pcmcia 0x0025
+|vendor.id pcmcia 0x0137
+&device.id pcmcia 0x0045
+|vendor.id pcmcia 0x0137
+&device.id pcmcia 0x0052
+|vendor.id pcmcia 0x018a
+&device.id pcmcia 0x0001
++baseclass.id 0x002
++subclass.id 0x00
++driver.module.modprobe serial_cs
+
+# eepro100_cb
+ vendor.id pcmcia 0x0089
+&device.id pcmcia 0x1103
++baseclass.id 0x002
++subclass.id 0x00
+
+# tulip_cb
+ vendor.id pcmcia 0x00a4
+&device.id pcmcia 0x0103
++baseclass.id 0x002
++subclass.id 0x00
+
+ vendor.id pcmcia 0x0101
+&device.id pcmcia 0x0035
+|vendor.id pcmcia 0x0101
+&device.id pcmcia 0x003d
+|vendor.id pcmcia 0x0101
+&device.id pcmcia 0x0562
++baseclass.id 0x002
++subclass.id 0x00
++driver.module.modprobe 3c589_cs
+
+ vendor.id pcmcia 0x0101
+&device.id pcmcia 0x0556
++baseclass.id 0x002
++subclass.id 0x00
++driver.module.modprobe 3c574_cs
+
+ vendor.id pcmcia 0x0101
+&device.id pcmcia 0x0574
++baseclass.id 0x002
++subclass.id 0x00
++driver.module.modprobe 3c574_cs
+
+ vendor.id pcmcia 0x0101
+&device.id pcmcia 0x0589
++baseclass.id 0x002
++subclass.id 0x00
++driver.module.modprobe 3c589_cs
+
+ vendor.id pcmcia 0x0101
+&device.id pcmcia 0x0620
+|vendor.id pcmcia 0x0101
+&device.id pcmcia 0x0696
+|vendor.id pcmcia 0x01bf
+&device.id pcmcia 0x3302
+|vendor.id pcmcia 0x01bf
+&device.id pcmcia 0xb301
+|vendor.id pcmcia 0xd601
+&device.id pcmcia 0x0007
++driver.module.modprobe atmel_cs
+
+ vendor.id pcmcia 0x0104
+&device.id pcmcia 0x0070
++baseclass.id 0x002
++subclass.id 0x00
++driver.module.modprobe serial_cs
+
+ vendor.id pcmcia 0x0105
+&device.id pcmcia 0x0007
+|vendor.id pcmcia 0x015f
+&device.id pcmcia 0x0005
+|vendor.id pcmcia 0x015f
+&device.id pcmcia 0x0007
+|vendor.id pcmcia 0x015f
+&device.id pcmcia 0x000a
++driver.module.modprobe airo_cs
+
+ vendor.id pcmcia 0x0137
+&device.id pcmcia 0x0003
++driver.module.modprobe parport_cs
+
+# epic_cb
+ vendor.id pcmcia 0x0140
+&device.id pcmcia 0x000f
+|vendor.id pcmcia 0x0140
+&device.id pcmcia 0x0012
+|vendor.id pcmcia 0x016c
+&device.id pcmcia 0x0021
++baseclass.id 0x002
++subclass.id 0x00
+
+# epic_cb
+ vendor.id pcmcia 0x0140
+&device.id pcmcia 0x0011
++baseclass.id 0x002
++subclass.id 0x00
+
+ vendor.id pcmcia 0x0149
+&device.id pcmcia 0xc1ab
++baseclass.id 0x002
++subclass.id 0x00
++driver.module.modprobe axnet_cs
++driver.module.modprobe pcnet_cs
+
+ vendor.id pcmcia 0x016c
+&device.id pcmcia 0x0020
++baseclass.id 0x002
++subclass.id 0x00
++driver.module.modprobe smc91c92_cs
+
+ vendor.id pcmcia 0x016c
+&device.id pcmcia 0x0023
+|vendor.id pcmcia 0x0186
+&device.id pcmcia 0x0100
++baseclass.id 0x002
++subclass.id 0x00
++driver.module.modprobe smc91c92_cs
+
+ vendor.id pcmcia 0x0175
+&device.id pcmcia 0x0000
++baseclass.id 0x002
++subclass.id 0x00
++driver.module.modprobe pcnet_cs
+
+ vendor.id pcmcia 0x018a
+&device.id pcmcia 0x0301
+|vendor.id pcmcia 0x026f
+&device.id pcmcia 0x0301
+|vendor.id pcmcia 0x026f
+&device.id pcmcia 0x0303
+|vendor.id pcmcia 0x026f
+&device.id pcmcia 0x0309
+|vendor.id pcmcia 0x0274
+&device.id pcmcia 0x1106
+|vendor.id pcmcia 0x8a01
+&device.id pcmcia 0xc1ab
++baseclass.id 0x002
++subclass.id 0x00
++driver.module.modprobe axnet_cs
+
+ vendor.id pcmcia 0x01a6
+&device.id pcmcia 0x0000
++driver.module.modprobe ray_cs
+
+ vendor.id pcmcia 0x01bf
+&device.id pcmcia 0x010a
++baseclass.id 0x002
++subclass.id 0x00
++driver.module.modprobe xirc2ps_cs
+
+ vendor.id pcmcia 0x020c
+&device.id pcmcia 0x0103
++driver.module.modprobe sedl_cs
+
+ vendor.id pcmcia 0x021b
+&device.id pcmcia 0x0202
++baseclass.id 0x002
++subclass.id 0x00
++driver.module.modprobe pcnet_cs
++driver.module.modprobe axnet_cs
+
+ vendor.id pcmcia 0xd601
+&device.id pcmcia 0x0002
+|vendor.id pcmcia 0xd601
+&device.id pcmcia 0x0005
++driver.module.modprobe hostap_cs
++driver.module.modprobe orinoco_cs
+
--- /dev/null
+# modules.alias
+# tg3 vs. bcm5700: #34486, #36992, #38647
+ vendor.id pci 0x14e4
+&device.id pci 0x1644+0x0006
+|vendor.id pci 0x14e4
+&device.id pci 0x1653+0x0002
+|vendor.id pci 0x14e4
+&device.id pci 0x165d+0x0002
+|vendor.id pci 0x14e4
+&device.id pci 0x166e
+|vendor.id pci 0x14e4
+&device.id pci 0x1696
+|vendor.id pci 0x14e4
+&device.id pci 0x169c
+|vendor.id pci 0x14e4
+&device.id pci 0x16a6+0x0003
+|vendor.id pci 0x14e4
+&device.id pci 0x16c6+0x0002
+|vendor.id pci 0x14e4
+&device.id pci 0x170d+0x0002
++driver.module.modprobe bcm5700
++driver.module.modprobe tg3
+
--- /dev/null
+# special s390 hardware
+ vendor.id special 0x6001
++vendor.name IBM
+
+ vendor.id special 0x6001
+&device.id special 0x1731
+&subdevice.id special 0x1732
+&detail.ccw.data.cu_model 1
++device.name OSA Express Network card
++baseclass.id 2
++subclass.id 0x86
++driver.module.modprobe qeth
+
+ vendor.id special 0x6001
+&device.id special 0x1731
+&subdevice.id special 0x1732
+&detail.ccw.data.cu_model 3
++device.name zFCP controller
++baseclass.id 1
++subclass.id 0
++driver.module.modprobe zfcp
+
+ vendor.id special 0x6001
+&device.id special 0x1731
+&subdevice.id special 0x1732
+&detail.ccw.data.cu_model 5
++device.name Hipersocket
++baseclass.id 2
++subclass.id 0x87
++driver.module.modprobe qeth
+
+ vendor.id special 0x6001
+&device.id special 0x2540
+&baseclass.id 0x10c
++device.name z/VM Virtual Card Reader
+
+ vendor.id special 0x6001
+&device.id special 0x2540
+&baseclass.id 0x109
++device.name z/VM Virtual Card Punch
+
+ vendor.id special 0x6001
+&device.id special 0x2701
++device.name 2701 Data Adapter
+
+ vendor.id special 0x6001
+&device.id special 0x3890
++device.name Document Processor
+
+ vendor.id special 0x6001
+&device.id special 0x3250
++device.name 3250 Display
+
+ vendor.id special 0x6001
+&device.id special 0x3178
+|device.id special 0x3179
+|device.id special 0x3180
+|device.id special 0x3190
+|device.id special 0x3270
+|device.id special 0x3277
+|device.id special 0x3278
+|device.id special 0x3279
+|device.id special 0x3290
++device.name 3270-Family Display
++baseclass.id 0x108
++subclass.id 1
+
+ vendor.id special 0x6001
+&device.id special 0x3203
+|device.id special 0x3211
+|device.id special 0x3262
+|device.id special 0x4245
+|device.id special 0x4248
+|device.id special 0x6562
++device.name Impact Printer
++baseclass.id 0x109
+
+ vendor.id special 0x6001
+&device.id special 0x3203
+&detail.ccw.data.cu_model 5
++device.name z/VM Virtual Printer
++baseclass.id 0x109
+
+ vendor.id special 0x6001
+&device.id special 0x3215
++device.name 3215 Display
++baseclass.id 0x108
++subclass.id 1
+
+ vendor.id special 0x6001
+&device.id special 0x3990
+&subdevice.id special 0x3390
+|subdevice.id special 0x3380
+|subdevice.id special 0x3350
+|subdevice.id special 0x3330
+|subdevice.id special 0x3375
+|subdevice.id special 0x3851
++device.name DASD
++baseclass.id 0x106
++subclass.id 0
++progif.id 1
++driver.module.modprobe dasd_eckd_mod
+
+ vendor.id special 0x6001
+&device.id special 0x2105
+&subdevice.id special 0x3390
+|subdevice.id special 0x3380
++device.name DASD
++baseclass.id 0x106
++subclass.id 0
++progif.id 1
++driver.module.modprobe dasd_eckd_mod
+
+ vendor.id special 0x6001
+&device.id special 0x3880
+&subdevice.id special 0x3390
++device.name DASD
++baseclass.id 0x106
++subclass.id 0
++progif.id 1
++driver.module.modprobe dasd_eckd_mod
+
+ vendor.id special 0x6001
+&device.id special 0x3880
+&subdevice.id special 0x3370
++device.name DASD
++baseclass.id 0x106
++subclass.id 0
++progif.id 2
++driver.module.modprobe dasd_fba_mod
+
+ vendor.id special 0x6001
+&device.id special 0x9343
+&subdevice.id special 0x9345
++device.name DASD
++baseclass.id 0x106
++subclass.id 0
++progif.id 1
++driver.module.modprobe dasd_eckd_mod
+
+ vendor.id special 0x6001
+&device.id special 0x6310
+&subdevice.id special 0x9336
++device.name DASD
++baseclass.id 0x106
++subclass.id 0
++progif.id 2
++driver.module.modprobe dasd_fba_mod
+
+ vendor.id special 0x6001
+&device.id special 0x2107
+|device.id special 0x1750
++device.name DASD
++baseclass.id 0x106
++subclass.id 0
++progif.id 1
++driver.module.modprobe dasd_eckd_mod
+
+ vendor.id special 0x6001
+&device.id special 0x3705
+&device.id special 0x3725
+&device.id special 0x3745
++device.name 37x5 Line Adapter
+
+ vendor.id special 0x6001
+&device.id special 0x3286
+&device.id special 0x3287
+&device.id special 0x3288
+&device.id special 0x3289
++device.name 328x Display Printer
+
+ vendor.id special 0x6001
+&device.id special 0x3420
++device.name 3420 Tape Drive
++baseclass.id 0x106
++subclass.id 1
++driver.module.modprobe tape_34xx
+
+ vendor.id special 0x6001
+&device.id special 0x3422
++device.name 3422 Tape Drive
++baseclass.id 0x106
++subclass.id 1
++driver.module.modprobe tape_34xx
+
+ vendor.id special 0x6001
+&device.id special 0x3480
++device.name 3480 Tape Drive
++baseclass.id 0x106
++subclass.id 1
++driver.module.modprobe tape_34xx
+
+ vendor.id special 0x6001
+&device.id special 0x3490
++device.name 3490 Tape Drive
++baseclass.id 0x106
++subclass.id 1
++driver.module.modprobe tape_34xx
+
+ vendor.id special 0x6001
+&device.id special 0x3505
++device.name 3505 Card Reader
+
+ vendor.id special 0x6001
+&device.id special 0x3525
++device.name 3525 Card Punch
+
+ vendor.id special 0x6001
+&device.id special 0x3800
++device.name 3800 Printer
++baseclass.id 0x109
+
+ vendor.id special 0x6001
+&device.id special 0x3820
++device.name 3820 Printer
++baseclass.id 0x109
+
+ vendor.id special 0x6001
+&device.id special 0x5080
++device.name 5080 Graphics Display
+
+ vendor.id special 0x6001
+&device.id special 0x9032
+|device.id special 0x9033
++device.name 903x ES Connection Director
+
+ vendor.id special 0x6001
+&device.id special 0x0001
++device.name Token ring card
+
+ vendor.id special 0x6001
+&device.id special 0x3088
+&detail.ccw.data.cu_model 8
++device.name parallel CTC Adapter
++baseclass.id 2
++subclass.id 0x88
++driver.module.modprobe ctc
+
+ vendor.id special 0x6001
+&device.id special 0x3088
+&detail.ccw.data.cu_model 0x1f
++device.name ESCON Adapter
++baseclass.id 2
++subclass.id 0x8f
++driver.module.modprobe ctc
+
+ vendor.id special 0x6001
+&device.id special 0x3088
+&detail.ccw.data.cu_model 0x1e
++device.name FICON Adapter
++baseclass.id 2
++subclass.id 0x8e
+
+ vendor.id special 0x6001
+&device.id special 0x3088
+&detail.ccw.data.cu_model 1
++device.name P/390
++baseclass.id 2
++subclass.id 0x89
+
+ vendor.id special 0x6001
+&device.id special 0x3088
+&detail.ccw.data.cu_model 0x60
++device.name OSA2 Adapter
++baseclass.id 2
++subclass.id 0x89
++driver.module.modprobe lcs
+
+ vendor.id special 0x6001
+&device.id special 0x0005
++device.name IUCV
++baseclass.id 2
++subclass.id 0x90
++driver.module.modprobe netiucv
--- /dev/null
+# usb scanner
+
+ vendor.id usb 0x03f0
++vendor.name HP
+
+ vendor.id usb 0x03f0
+&device.id usb 0x0101
++device.name 4100C
+
+ vendor.id usb 0x03f0
+&device.id usb 0x0101+0x0002
+|vendor.id usb 0x03f0
+&device.id usb 0x0105
+|vendor.id usb 0x03f0
+&device.id usb 0x0201
+|vendor.id usb 0x03f0
+&device.id usb 0x0205
+|vendor.id usb 0x03f0
+&device.id usb 0x0305
+|vendor.id usb 0x03f0
+&device.id usb 0x0401
+|vendor.id usb 0x03f0
+&device.id usb 0x0405
+|vendor.id usb 0x03f0
+&device.id usb 0x0505
+|vendor.id usb 0x03f0
+&device.id usb 0x0601
+|vendor.id usb 0x03f0
+&device.id usb 0x0605
+|vendor.id usb 0x03f0
+&device.id usb 0x0701
+|vendor.id usb 0x03f0
+&device.id usb 0x0705
+|vendor.id usb 0x03f0
+&device.id usb 0x0801
+|vendor.id usb 0x03f0
+&device.id usb 0x0805
+|vendor.id usb 0x03f0
+&device.id usb 0x0901
+|vendor.id usb 0x03f0
+&device.id usb 0x0a01
+|vendor.id usb 0x03f0
+&device.id usb 0x1005
+|vendor.id usb 0x03f0
+&device.id usb 0x1105
+|vendor.id usb 0x03f0
+&device.id usb 0x1205
+|vendor.id usb 0x03f0
+&device.id usb 0x1305
+|vendor.id usb 0x03f0
+&device.id usb 0x1411
+|vendor.id usb 0x03f0
+&device.id usb 0x2005
+|vendor.id usb 0x03f0
+&device.id usb 0x2205
+|vendor.id usb 0x03f0
+&device.id usb 0x2f11
+|vendor.id usb 0x0400
+&device.id usb 0x1000+0x0002
+|vendor.id usb 0x043d
+&device.id usb 0x002d
+|vendor.id usb 0x043d
+&device.id usb 0x003d
+|vendor.id usb 0x0458
+&device.id usb 0x2001
+|vendor.id usb 0x0458
+&device.id usb 0x2007+0x0003
+|vendor.id usb 0x0458
+&device.id usb 0x2011
+|vendor.id usb 0x0458
+&device.id usb 0x2013
+|vendor.id usb 0x0458
+&device.id usb 0x2015+0x0002
+|vendor.id usb 0x0458
+&device.id usb 0x2018
+|vendor.id usb 0x0458
+&device.id usb 0x201b
+|vendor.id usb 0x0461
+&device.id usb 0x0300+0x0004
+|vendor.id usb 0x0461
+&device.id usb 0x0340+0x0002
+|vendor.id usb 0x0461
+&device.id usb 0x0345+0x0003
+|vendor.id usb 0x0461
+&device.id usb 0x0360+0x0002
+|vendor.id usb 0x0461
+&device.id usb 0x0364
+|vendor.id usb 0x0461
+&device.id usb 0x0371
+|vendor.id usb 0x0461
+&device.id usb 0x0377
+|vendor.id usb 0x0461
+&device.id usb 0x0380+0x0004
+|vendor.id usb 0x0475
+&device.id usb 0x0210
+|vendor.id usb 0x049f
+&device.id usb 0x001a
+|vendor.id usb 0x049f
+&device.id usb 0x0021
+|vendor.id usb 0x04a5
+&device.id usb 0x1a20
+|vendor.id usb 0x04a5
+&device.id usb 0x1a2a
+|vendor.id usb 0x04a5
+&device.id usb 0x2022
+|vendor.id usb 0x04a5
+&device.id usb 0x2040
+|vendor.id usb 0x04a5
+&device.id usb 0x2060
+|vendor.id usb 0x04a5
+&device.id usb 0x207e
+|vendor.id usb 0x04a5
+&device.id usb 0x20b0
+|vendor.id usb 0x04a5
+&device.id usb 0x20be
+|vendor.id usb 0x04a5
+&device.id usb 0x20c0
+|vendor.id usb 0x04a5
+&device.id usb 0x20de
+|vendor.id usb 0x04a5
+&device.id usb 0x20fc
+|vendor.id usb 0x04a5
+&device.id usb 0x20fe
+|vendor.id usb 0x04a7
+&device.id usb 0x0211
+|vendor.id usb 0x04a7
+&device.id usb 0x0221
+|vendor.id usb 0x04a7
+&device.id usb 0x0224
+|vendor.id usb 0x04a7
+&device.id usb 0x0226
+|vendor.id usb 0x04a7
+&device.id usb 0x0229
+|vendor.id usb 0x04a7
+&device.id usb 0x022c
+|vendor.id usb 0x04a7
+&device.id usb 0x0231
+|vendor.id usb 0x04a7
+&device.id usb 0x0311
+|vendor.id usb 0x04a7
+&device.id usb 0x0321
+|vendor.id usb 0x04a7
+&device.id usb 0x0331
+|vendor.id usb 0x04a9
+&device.id usb 0x2201+0x0002
+|vendor.id usb 0x04a9
+&device.id usb 0x2204+0x0005
+|vendor.id usb 0x04a9
+&device.id usb 0x220a+0x0007
+|vendor.id usb 0x04a9
+&device.id usb 0x2212+0x0002
+|vendor.id usb 0x04a9
+&device.id usb 0x2215
+|vendor.id usb 0x04a9
+&device.id usb 0x3042
+|vendor.id usb 0x04b0
+&device.id usb 0x4000
+|vendor.id usb 0x04b8
+&device.id usb 0x0101+0x0007
+|vendor.id usb 0x04b8
+&device.id usb 0x0109+0x0004
+|vendor.id usb 0x04b8
+&device.id usb 0x010e+0x0003
+|vendor.id usb 0x04b8
+&device.id usb 0x0112
+|vendor.id usb 0x04b8
+&device.id usb 0x0114
+|vendor.id usb 0x04b8
+&device.id usb 0x011b+0x0005
+|vendor.id usb 0x04b8
+&device.id usb 0x0801+0x0002
+|vendor.id usb 0x04c5
+&device.id usb 0x1029
+|vendor.id usb 0x04c5
+&device.id usb 0x1041+0x0002
+|vendor.id usb 0x04f9
+&device.id usb 0x010f
+|vendor.id usb 0x04f9
+&device.id usb 0x0111
+|vendor.id usb 0x055f
+&device.id usb 0x0001+0x0003
+|vendor.id usb 0x055f
+&device.id usb 0x0006+0x0003
+|vendor.id usb 0x055f
+&device.id usb 0x0010
+|vendor.id usb 0x055f
+&device.id usb 0x0210
+|vendor.id usb 0x055f
+&device.id usb 0x0218+0x0002
+|vendor.id usb 0x055f
+&device.id usb 0x021c+0x0003
+|vendor.id usb 0x055f
+&device.id usb 0x0400+0x0002
+|vendor.id usb 0x055f
+&device.id usb 0x0409
+|vendor.id usb 0x055f
+&device.id usb 0x0873
+|vendor.id usb 0x055f
+&device.id usb 0x1000
+|vendor.id usb 0x05cb
+&device.id usb 0x1483
+|vendor.id usb 0x05d8
+&device.id usb 0x4001+0x0004
+|vendor.id usb 0x05d8
+&device.id usb 0x4006
+|vendor.id usb 0x05d8
+&device.id usb 0x4009
+|vendor.id usb 0x05da
+&device.id usb 0x0099+0x0002
+|vendor.id usb 0x05da
+&device.id usb 0x00b6
+|vendor.id usb 0x05da
+&device.id usb 0x20a7
+|vendor.id usb 0x05da
+&device.id usb 0x20c9
+|vendor.id usb 0x05da
+&device.id usb 0x30ce+0x0002
+|vendor.id usb 0x05da
+&device.id usb 0x30d4
+|vendor.id usb 0x05da
+&device.id usb 0x30d8
+|vendor.id usb 0x05da
+&device.id usb 0x40b3
+|vendor.id usb 0x05da
+&device.id usb 0x40b8
+|vendor.id usb 0x05da
+&device.id usb 0x40ca+0x0002
+|vendor.id usb 0x05da
+&device.id usb 0x40dd
+|vendor.id usb 0x05da
+&device.id usb 0x40ff
+|vendor.id usb 0x05e3
+&device.id usb 0x0120
+|vendor.id usb 0x0638
+&device.id usb 0x0268
+|vendor.id usb 0x0638
+&device.id usb 0x026a
+|vendor.id usb 0x0638
+&device.id usb 0x0a10
+|vendor.id usb 0x0638
+&device.id usb 0x0a13
+|vendor.id usb 0x0638
+&device.id usb 0x0a16
+|vendor.id usb 0x0638
+&device.id usb 0x0a18
+|vendor.id usb 0x0638
+&device.id usb 0x0a20
+|vendor.id usb 0x0638
+&device.id usb 0x0a23+0x0002
+|vendor.id usb 0x0681
+&device.id usb 0x0005
+|vendor.id usb 0x0681
+&device.id usb 0x0010
+|vendor.id usb 0x0686
+&device.id usb 0x4004
+|vendor.id usb 0x0686
+&device.id usb 0x400d
+|vendor.id usb 0x06bd
+&device.id usb 0x0001+0x0002
+|vendor.id usb 0x06bd
+&device.id usb 0x0100
+|vendor.id usb 0x06bd
+&device.id usb 0x2061
+|vendor.id usb 0x06bd
+&device.id usb 0x208d
+|vendor.id usb 0x06bd
+&device.id usb 0x208f
+|vendor.id usb 0x06bd
+&device.id usb 0x2091
+|vendor.id usb 0x06bd
+&device.id usb 0x2093
+|vendor.id usb 0x06bd
+&device.id usb 0x2095
+|vendor.id usb 0x06bd
+&device.id usb 0x2097
+|vendor.id usb 0x06bd
+&device.id usb 0x20fd
+|vendor.id usb 0x06bd
+&device.id usb 0x20ff
+|vendor.id usb 0x06dc
+&device.id usb 0x0014
+|vendor.id usb 0x07b3
+&device.id usb 0x0001
+|vendor.id usb 0x07b3
+&device.id usb 0x0005
+|vendor.id usb 0x07b3
+&device.id usb 0x0007
+|vendor.id usb 0x07b3
+&device.id usb 0x000f+0x0009
+|vendor.id usb 0x07b3
+&device.id usb 0x0400+0x0002
+|vendor.id usb 0x07b3
+&device.id usb 0x0403
+|vendor.id usb 0x07b3
+&device.id usb 0x0413
+|vendor.id usb 0x0a82
+&device.id usb 0x4600
+|vendor.id usb 0x1606
+&device.id usb 0x0010
+|vendor.id usb 0x1606
+&device.id usb 0x0030
+|vendor.id usb 0x1606
+&device.id usb 0x0060
+|vendor.id usb 0x1606
+&device.id usb 0x0070
+|vendor.id usb 0x1606
+&device.id usb 0x0130
+|vendor.id usb 0x1606
+&device.id usb 0x0160
+|vendor.id usb 0x1606
+&device.id usb 0x0230
++baseclass.id 0x10c
++subclass.id 0x00
+
+ vendor.id usb 0x03f0
+&device.id usb 0x0102
++device.name PhotoSmart S20
+
+ vendor.id usb 0x03f0
+&device.id usb 0x0105
++device.name 4200C
+
+ vendor.id usb 0x03f0
+&device.id usb 0x0201
++device.name 6200C
+
+ vendor.id usb 0x03f0
+&device.id usb 0x0205
++device.name 3300C
+
+ vendor.id usb 0x03f0
+&device.id usb 0x0305
++device.name 4300C
+
+ vendor.id usb 0x03f0
+&device.id usb 0x0401
++device.name 5200C
+
+ vendor.id usb 0x03f0
+&device.id usb 0x0405
++device.name 3400C
+
+ vendor.id usb 0x03f0
+&device.id usb 0x0601
++device.name 6300C
+
+ vendor.id usb 0x03f0
+&device.id usb 0x0605
++device.name 2200C
+
+ vendor.id usb 0x0400
++vendor.name National Semiconductor
+
+ vendor.id usb 0x0400
+&device.id usb 0x1000
++device.name BearPaw 1200
+
+ vendor.id usb 0x0400
+&device.id usb 0x1001
++device.name BearPaw 2400
+
+ vendor.id usb 0x0458
++vendor.name KYE Systems
+
+ vendor.id usb 0x0458
+&device.id usb 0x2001
++device.name Genius ColorPage-Vivid Pro
+
+ vendor.id usb 0x0458
+&device.id usb 0x2007
++device.name ColorPage HR6 V2
+
+ vendor.id usb 0x0458
+&device.id usb 0x2008
++device.name Unknown 2008
+
+ vendor.id usb 0x0458
+&device.id usb 0x2009
++device.name Unknown 2009
+
+ vendor.id usb 0x0458
+&device.id usb 0x2013
++device.name Unknown 2013
+
+ vendor.id usb 0x0458
+&device.id usb 0x2015
++device.name Unknown 2015
+
+ vendor.id usb 0x0458
+&device.id usb 0x2016
++device.name Unknown 2016
+
+ vendor.id usb 0x0461
++vendor.name Colorado
+
+ vendor.id usb 0x0461
+&device.id usb 0x0034
++baseclass.id 0x10c
++subclass.id 0x00
++device.name USB 9600
+
+ vendor.id usb 0x0461
+&device.id usb 0x0300
+|vendor.id usb 0x0461
+&device.id usb 0x0302
++device.name G2-300
+
+ vendor.id usb 0x0461
+&device.id usb 0x0301
+|vendor.id usb 0x0461
+&device.id usb 0x0303
++device.name G2E-300
+
+ vendor.id usb 0x0461
+&device.id usb 0x0341
++device.name 600U
+
+ vendor.id usb 0x0461
+&device.id usb 0x0346
++device.name 6136u
+
+ vendor.id usb 0x0461
+&device.id usb 0x0361
+|vendor.id usb 0x0638
+&device.id usb 0x0268
++device.name 1200U
+
+ vendor.id usb 0x0461
+&device.id usb 0x0380
+|vendor.id usb 0x0461
+&device.id usb 0x0382
++device.name G2-600
+
+ vendor.id usb 0x0461
+&device.id usb 0x0381
++device.name ReadyScan 636i
+
+ vendor.id usb 0x0461
+&device.id usb 0x0383
++device.name G2E-600
+
+ vendor.id usb 0x04a5
++vendor.name Acer
+
+ vendor.id usb 0x04a5
+&device.id usb 0x1a20
++device.name Prisa Acerscan 310U
+
+ vendor.id usb 0x04a5
+&device.id usb 0x1a2a
+|vendor.id usb 0x04a5
+&device.id usb 0x2040
+|vendor.id usb 0x04a5
+&device.id usb 0x2060
++device.name Prisa Acerscan 620U
+
+ vendor.id usb 0x04a5
+&device.id usb 0x2022
++device.name Vuego Scan Brisa 340U
+
+ vendor.id usb 0x04a5
+&device.id usb 0x207e
++device.name Prisa Acerscan 640BU
+
+ vendor.id usb 0x04a5
+&device.id usb 0x20b0
++device.name S2W 3300U/4300U
+
+ vendor.id usb 0x04a5
+&device.id usb 0x20be
++device.name Prisa Acerscan 640BT
+
+ vendor.id usb 0x04a5
+&device.id usb 0x20c0
++device.name Prisa Acerscan 1240UT
+
+ vendor.id usb 0x04a5
+&device.id usb 0x20de
++device.name S2W 3300U
+
+ vendor.id usb 0x04a7
++vendor.name Visioneer
+
+ vendor.id usb 0x04a7
+&device.id usb 0x0211
++device.name OneTouch 7600 USB
+
+ vendor.id usb 0x04a7
+&device.id usb 0x0221
++device.name OneTouch 5300 USB
+
+ vendor.id usb 0x04a7
+&device.id usb 0x0231
++device.name 6100 USB
+
+ vendor.id usb 0x04a7
+&device.id usb 0x0311
++device.name 6200 EPP/USB
+
+ vendor.id usb 0x04a7
+&device.id usb 0x0321
++device.name OneTouch 8100 EPP/USB
+
+ vendor.id usb 0x04a7
+&device.id usb 0x0331
++device.name OneTouch 8600 EPP/USB
+
+ vendor.id usb 0x04a9
++vendor.name Canon
+
+ vendor.id usb 0x04a9
+&device.id usb 0x2202
++device.name FB620U
+
+ vendor.id usb 0x04a9
+&device.id usb 0x2207
++device.name 1220U
+
+ vendor.id usb 0x04a9
+&device.id usb 0x220b
++device.name D646U
+
+ vendor.id usb 0x04b0
++vendor.name Nikon
+
+ vendor.id usb 0x04b0
+&device.id usb 0x4000
++device.name Coolscan IV
+
+ vendor.id usb 0x04b8
++vendor.name Epson
+
+ vendor.id usb 0x04b8
+&device.id usb 0x0101
++device.name Perfection 636U
+
+ vendor.id usb 0x04b8
+&device.id usb 0x0103
++device.name Perfection 610
+
+ vendor.id usb 0x04b8
+&device.id usb 0x0104
++device.name Perfection 1200U
+
+ vendor.id usb 0x04b8
+&device.id usb 0x0106
++device.name Stylus Scan 2500
+
+ vendor.id usb 0x04b8
+&device.id usb 0x0107
++device.name Expression 1600
+
+ vendor.id usb 0x04b8
+&device.id usb 0x010a
++device.name Perfection 1640SU
+
+ vendor.id usb 0x04b8
+&device.id usb 0x010b
++device.name Perfection 1240U
+
+ vendor.id usb 0x04b8
+&device.id usb 0x010c
++device.name Perfection 640
+
+ vendor.id usb 0x04b8
+&device.id usb 0x010e
++device.name Expression 1680
+
+ vendor.id usb 0x04b8
+&device.id usb 0x0110
++device.name Perfection 1650
+
+ vendor.id usb 0x04b8
+&device.id usb 0x0112
++device.name Perfection 2450
+
+ vendor.id usb 0x04b8
+&device.id usb 0x011f
++device.name Perfection 1670
+
+ vendor.id usb 0x04ce
++vendor.name ScanLogic
+
+ vendor.id usb 0x04ce
+&device.id usb 0x0300
+|vendor.id usb 0x05da
+&device.id usb 0x0094
+|vendor.id usb 0x05da
+&device.id usb 0x00a0
++baseclass.id 0x10c
++subclass.id 0x00
++device.name Phantom 336CX
+
+ vendor.id usb 0x055f
++vendor.name Mustek
+
+ vendor.id usb 0x055f
+&device.id usb 0x0001
++device.name 1200 CU
+
+ vendor.id usb 0x055f
+&device.id usb 0x0002
++device.name 600 CU
+
+ vendor.id usb 0x055f
+&device.id usb 0x0003
++device.name 1200 USB
+
+ vendor.id usb 0x055f
+&device.id usb 0x0006
++device.name 1200 UB
+
+ vendor.id usb 0x055f
+&device.id usb 0x0008
++device.name 1200 CU Plus
+
+ vendor.id usb 0x055f
+&device.id usb 0x0873
++device.name 600 USB
+
+ vendor.id usb 0x05d8
++vendor.name Lifetec
+
+ vendor.id usb 0x05d8
+&device.id usb 0x4002
++device.name LT9385
+
+ vendor.id usb 0x05da
++vendor.name Microtek
+
+ vendor.id usb 0x05da
+&device.id usb 0x0099
++device.name ScanMaker X6
+
+ vendor.id usb 0x05da
+&device.id usb 0x009a
++device.name Phantom C6
+
+ vendor.id usb 0x05da
+&device.id usb 0x00a3
+|vendor.id usb 0x05da
+&device.id usb 0x80a3
++baseclass.id 0x10c
++subclass.id 0x00
++device.name ScanMaker V6USL
+
+ vendor.id usb 0x05da
+&device.id usb 0x80ac
++baseclass.id 0x10c
++subclass.id 0x00
++device.name ScanMaker V6UL
+
+ vendor.id usb 0x0638
++vendor.name iVina
+
+ vendor.id usb 0x06bd
++vendor.name Agfa
+
+ vendor.id usb 0x06bd
+&device.id usb 0x0001
++device.name SnapScan 1212U
+
+ vendor.id usb 0x06bd
+&device.id usb 0x0002
++device.name SnapScan 1236U
+
+ vendor.id usb 0x06bd
+&device.id usb 0x0100
++device.name SnapScan Touch
+
+ vendor.id usb 0x06bd
+&device.id usb 0x2061
++device.name SnapScan 1212U?
+
+ vendor.id usb 0x06bd
+&device.id usb 0x208d
++device.name SnapScan e40
+
+ vendor.id usb 0x06bd
+&device.id usb 0x2091
++device.name SnapScan e20
+
+ vendor.id usb 0x06bd
+&device.id usb 0x2095
++device.name SnapScan e25
+
+ vendor.id usb 0x06bd
+&device.id usb 0x2097
++device.name SnapScan e26
+
+ vendor.id usb 0x07b3
++vendor.name Plustek
+
+ vendor.id usb 0x07b3
+&device.id usb 0x0011
++device.name OpticPro UT24
+
+ vendor.id usb 0x07b3
+&device.id usb 0x0017
++device.name OpticPro UT12
+
+ vendor.id usb 0x0ff5
++vendor.name Mustek?
+
+ vendor.id usb 0x0ff5
+&device.id usb 0x0010
++baseclass.id 0x10c
++subclass.id 0x00
++device.name BearPaw 1200F
+
+ vendor.id usb 0x1606
++vendor.name UMAX
+
+ vendor.id usb 0x1606
+&device.id usb 0x0002
++baseclass.id 0x10c
++subclass.id 0x00
++device.name Astra 1236U
+
+ vendor.id usb 0x1606
+&device.id usb 0x0010
++device.name Astra 1220U
+
+ vendor.id usb 0x1606
+&device.id usb 0x0030
++device.name Astra 2000U
+
+ vendor.id usb 0x1606
+&device.id usb 0x0130
++device.name Astra 2100U
+
+ vendor.id usb 0x1606
+&device.id usb 0x0230
++device.name Astra 2200U
+
+
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+# hp officejet
+ vendor.id usb 0x03f0
+&device.id usb 0x2811
+|vendor.id usb 0x03f0
+&device.id usb 0x2911
+|vendor.id usb 0x03f0
+&device.id usb 0x2a11
+|vendor.id usb 0x03f0
+&device.id usb 0x2d11
++requires hp-officeJet
+
+
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+# 45074
+ vendor.id usb 0x04b8
+&device.id usb 0x0805
++baseclass.id 0x10c
++subclass.id 0x00
++device.name Stylus CX6400
+
+ vendor.id usb 0x04b8
+&device.id usb 0x0806
++baseclass.id 0x10c
++subclass.id 0x00
++device.name Stylus Photo RX600
+
+ vendor.id usb 0x04b8
+&device.id usb 0x0807
++baseclass.id 0x10c
++subclass.id 0x00
++device.name Stylus Photo RX500
+
+ vendor.id usb 0x04b8
+&device.id usb 0x0808
++baseclass.id 0x10c
++subclass.id 0x00
++device.name Stylus CX5400
+
--- /dev/null
+# sound cards
+
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+# module info from kernel/sound/*.ko
+
+ vendor.id ADS
+&device.id eisa 0x7150
+|vendor.id ADS
+&device.id eisa 0x7181
+|vendor.id AZT
+&device.id eisa 0x1022
+|vendor.id LWC
+&device.id eisa 0x1061
+|vendor.id MDK
+&device.id eisa 0x1605
+|vendor.id SMM
+&device.id eisa 0x7180
+|vendor.id TER
+&device.id eisa 0x1112
+|vendor.id TER
+&device.id eisa 0x1411
++driver.module.modprobe snd-ad1816a
+
+ vendor.id ADV
+&device.id eisa 0x550a
++driver.module.modprobe snd-interwave-stb
++driver.module.modprobe snd-interwave
+
+ vendor.id ADV
+&device.id eisa 0x55ff
+|vendor.id CDC
+&device.id eisa 0x1111
+|vendor.id DXP
+&device.id eisa 0x3201
+|vendor.id GRV
+&device.id eisa 0x0001
+|vendor.id STB
+&device.id eisa 0x011a
++driver.module.modprobe snd-interwave
+
+ vendor.id ALS
+&device.id eisa 0x0001
+|vendor.id ALS
+&device.id eisa 0x0110
+|vendor.id ALS
+&device.id eisa 0x0120
+|vendor.id ALS
+&device.id eisa 0x0200
+|vendor.id RTL
+&device.id eisa 0x3000
++driver.module.modprobe snd-als100
+
+ vendor.id ALS
+&device.id eisa 0x0007
+|vendor.id RWB
+&device.id eisa 0x1688
++driver.module.modprobe snd-dt019x
+
+ vendor.id AZT
+&device.id eisa 0x1008
+|vendor.id AZT
+&device.id eisa 0x2320
+|vendor.id AZT
+&device.id eisa 0x3000
+|vendor.id AZT
+&device.id eisa 0x3002
+|vendor.id AZT
+&device.id eisa 0x3005
+|vendor.id AZT
+&device.id eisa 0x3011
++driver.module.modprobe snd-azt2320
+
+ vendor.id CMI
+&device.id eisa 0x0001
++driver.module.modprobe snd-cmi8330
+
+ vendor.id CSC
+&device.id eisa 0x0000
+|vendor.id CSC
+&device.id eisa 0x0100
+|vendor.id GIM
+&device.id eisa 0x0100
++driver.module.modprobe cs4232
+
+ vendor.id CSC
+&device.id eisa 0x0225
+|vendor.id CSC
+&device.id eisa 0x0437
+|vendor.id CSC
+&device.id eisa 0x0735
+|vendor.id CSC
+&device.id eisa 0x0b35+0x0002
+|vendor.id CSC
+&device.id eisa 0x1335
+|vendor.id CSC
+&device.id eisa 0x1425
+|vendor.id CSC
+&device.id eisa 0x1525
+|vendor.id CSC
+&device.id eisa 0x1e37
+|vendor.id CSC
+&device.id eisa 0x4237
+|vendor.id CSC
+&device.id eisa 0x4336
+|vendor.id CSC
+&device.id eisa 0x4536
+|vendor.id CSC
+&device.id eisa 0x4625
+|vendor.id CSC
+&device.id eisa 0x4637
+|vendor.id CSC
+&device.id eisa 0x4837
+|vendor.id CSC
+&device.id eisa 0x6835+0x0002
+|vendor.id CSC
+&device.id eisa 0x7537
+|vendor.id CSC
+&device.id eisa 0x8025
+|vendor.id CSC
+&device.id eisa 0x8037
+|vendor.id CSC
+&device.id eisa 0x9836+0x0002
+|vendor.id CSC
+&device.id eisa 0xa836
+|vendor.id CSC
+&device.id eisa 0xc835
+|vendor.id CSC
+&device.id eisa 0xd925
+|vendor.id CSC
+&device.id eisa 0xd937
+|vendor.id CSC
+&device.id eisa 0xe825
+|vendor.id CSC
+&device.id eisa 0xe835+0x0002
+|vendor.id CSC
+&device.id eisa 0xe936
+|vendor.id CSC
+&device.id eisa 0xf235
+|vendor.id CSC
+&device.id eisa 0xf238
++driver.module.modprobe snd-cs4236
+
+ vendor.id CSC
+&device.id eisa 0x0d32
+|vendor.id CSC
+&device.id eisa 0x1a32
+|vendor.id CSC
+&device.id eisa 0x4232
+|vendor.id CSC
+&device.id eisa 0xf032
++driver.module.modprobe snd-cs4232
+
+ vendor.id CSC
+&device.id eisa 0x4236
++driver.module.modprobe snd-cs4232
++driver.module.modprobe snd-cs4236
+
+ vendor.id CSC
+&device.id eisa 0x7532
+|vendor.id CSC
+&device.id eisa 0x7632
++driver.module.modprobe snd-cs4232
++driver.module.modprobe snd-wavefront
+
+ vendor.id CTL
+&device.id eisa 0x0024+0x0009
+|vendor.id CTL
+&device.id eisa 0x0051
+|vendor.id CTL
+&device.id eisa 0x0070
+|vendor.id CTL
+&device.id eisa 0x0080
+|vendor.id CTL
+&device.id eisa 0x0086
+|vendor.id CTL
+&device.id eisa 0x00f0
++driver.module.modprobe snd-sb16
+
+ vendor.id CTL
+&device.id eisa 0x0035
+|vendor.id CTL
+&device.id eisa 0x0039
+|vendor.id CTL
+&device.id eisa 0x0042+0x0007
+|vendor.id CTL
+&device.id eisa 0x0054
+|vendor.id CTL
+&device.id eisa 0x009a
+|vendor.id CTL
+&device.id eisa 0x009c+0x0004
+|vendor.id CTL
+&device.id eisa 0x00b2
+|vendor.id CTL
+&device.id eisa 0x00c1
+|vendor.id CTL
+&device.id eisa 0x00c3
+|vendor.id CTL
+&device.id eisa 0x00c5
+|vendor.id CTL
+&device.id eisa 0x00c7
+|vendor.id CTL
+&device.id eisa 0x00e4
+|vendor.id CTL
+&device.id eisa 0x00e9
+|vendor.id CTL
+&device.id eisa 0x00ed
++driver.module.modprobe snd-sbawe
+
+ vendor.id ENS
+&device.id eisa 0x3081
++driver.module.modprobe snd-sscape
+
+ vendor.id ESS
+&device.id eisa 0x0003
+|vendor.id ESS
+&device.id eisa 0x1868+0x0002
+|vendor.id ESS
+&device.id eisa 0x1878+0x0002
++driver.module.modprobe snd-es18xx
+
+ vendor.id ESS
+&device.id eisa 0x0968
++driver.module.modprobe snd-es968
+
+ vendor.id NMX
+&device.id eisa 0x2200
+|vendor.id YMH
+&device.id eisa 0x0020
+|vendor.id YMH
+&device.id eisa 0x0030
+|vendor.id YMH
+&device.id eisa 0x0800+0x0002
++driver.module.modprobe snd-opl3sa2
+
+ vendor.id OPT
+&device.id eisa 0x0924+0x0002
++driver.module.modprobe snd-opti92x-cs4231
++driver.module.modprobe snd-opti92x-ad1848
+
+ vendor.id OPT
+&device.id eisa 0x0931
++driver.module.modprobe snd-opti93x
+
+ vendor.id YMH
+&device.id eisa 0x0021
++driver.module.modprobe opl3sa2
+
+ vendor.id usb 0x041e
+&device.id usb 0x3010
+|vendor.id usb 0x0499
+&device.id usb 0x1000+0x000b
+|vendor.id usb 0x0499
+&device.id usb 0x100e+0x0008
+|vendor.id usb 0x0499
+&device.id usb 0x1017+0x0006
+|vendor.id usb 0x0499
+&device.id usb 0x101e
+|vendor.id usb 0x0499
+&device.id usb 0x1020+0x000c
+|vendor.id usb 0x0499
+&device.id usb 0x102e
+|vendor.id usb 0x0499
+&device.id usb 0x1030+0x000d
+|vendor.id usb 0x0499
+&device.id usb 0x2000+0x0003
+|vendor.id usb 0x0499
+&device.id usb 0x5000+0x0009
+|vendor.id usb 0x0499
+&device.id usb 0x500a+0x0003
+|vendor.id usb 0x0499
+&device.id usb 0x7000
+|vendor.id usb 0x0499
+&device.id usb 0x7010
+|vendor.id usb 0x0582
+&device.id usb 0x0000
+|vendor.id usb 0x0582
+&device.id usb 0x0002+0x0004
+|vendor.id usb 0x0582
+&device.id usb 0x0007+0x0003
+|vendor.id usb 0x0582
+&device.id usb 0x000b+0x0002
+|vendor.id usb 0x0582
+&device.id usb 0x0010
+|vendor.id usb 0x0582
+&device.id usb 0x0012
+|vendor.id usb 0x0582
+&device.id usb 0x0014
+|vendor.id usb 0x0582
+&device.id usb 0x0016
+|vendor.id usb 0x0582
+&device.id usb 0x001b
+|vendor.id usb 0x0582
+&device.id usb 0x001d
+|vendor.id usb 0x0582
+&device.id usb 0x0023
+|vendor.id usb 0x0582
+&device.id usb 0x0025
+|vendor.id usb 0x0582
+&device.id usb 0x0027
+|vendor.id usb 0x0582
+&device.id usb 0x0029
+|vendor.id usb 0x0582
+&device.id usb 0x002b
+|vendor.id usb 0x0582
+&device.id usb 0x002d
+|vendor.id usb 0x0582
+&device.id usb 0x002f
+|vendor.id usb 0x0582
+&device.id usb 0x0033
+|vendor.id usb 0x0582
+&device.id usb 0x0037
+|vendor.id usb 0x0582
+&device.id usb 0x003b
+|vendor.id usb 0x0582
+&device.id usb 0x0040
+|vendor.id usb 0x0582
+&device.id usb 0x0044
+|vendor.id usb 0x0582
+&device.id usb 0x0048
+|vendor.id usb 0x0582
+&device.id usb 0x004d
+|vendor.id usb 0x0582
+&device.id usb 0x0050
+|vendor.id usb 0x0582
+&device.id usb 0x0052
+|vendor.id usb 0x0582
+&device.id usb 0x0065
+|vendor.id usb 0x0763
+&device.id usb 0x1002
+|vendor.id usb 0x0763
+&device.id usb 0x1011
+|vendor.id usb 0x0763
+&device.id usb 0x1015
+|vendor.id usb 0x0763
+&device.id usb 0x1021
+|vendor.id usb 0x0763
+&device.id usb 0x1033
+|vendor.id usb 0x0763
+&device.id usb 0x1041
+|vendor.id usb 0x0763
+&device.id usb 0x2001
+|vendor.id usb 0x0763
+&device.id usb 0x2003
+|vendor.id usb 0x0763
+&device.id usb 0x2008
+|vendor.id usb 0x0763
+&device.id usb 0x200d
+|vendor.id usb 0x07fd
+&device.id usb 0x0001
+|vendor.id usb 0x0ccd
+&device.id usb 0x0013
++driver.module.modprobe snd-usb-audio
+
+ vendor.id usb 0x1604
+&device.id usb 0x8001
+|vendor.id usb 0x1604
+&device.id usb 0x8005
+|vendor.id usb 0x1604
+&device.id usb 0x8007
++driver.module.modprobe snd-usb-usx2y
+
+
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+# ppc audio
+ vendor.id special 0x0401
+&device.id special 0x0010+0x0004
++driver.module.modprobe dmasound
+
+# ppc audio
+ vendor.id special 0x0402
+&device.id special 0x0014
++driver.module.modprobe cs4232
+
+# AMD7930
+ vendor.id special 0x4001
+&device.id special 0x2001
++driver.module.modprobe amd7930
+
+# CS4231
+ vendor.id special 0x4001
+&device.id special 0x2002+0x0002
++driver.module.modprobe cs4231
+
+# SS10/SS20 DBRI
+ vendor.id special 0x4001
+&device.id special 0x2004
++driver.module.modprobe dbri
+
--- /dev/null
+# special ids
+
+
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+# adb devices
+
+ vendor.id special 0x0100
++vendor.name Apple
+
+ vendor.id special 0x0100
+&device.id special 0x0201
++device.name ADB Keyboard 1
+
+ vendor.id special 0x0100
+&device.id special 0x0203
++device.name ADB Keyboard 3
+
+ vendor.id special 0x0100
+&device.id special 0x0302
++device.name ADB Mouse
+
+
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+# generic mice
+
+ vendor.id special 0x0200
++vendor.name Unknown
+
+ vendor.id special 0x0200
+&device.id special 0x0001
++device.name Generic USB Mouse
+
+ vendor.id special 0x0200
+&device.id special 0x0002
++device.name Generic PS/2 Mouse
+
+ vendor.id special 0x0200
+&device.id special 0x0003
++device.name MS-Compatible Serial Mouse
+
+ vendor.id special 0x0200
+&device.id special 0x0004
++device.name Intelli/Wheel Mouse
+
+ vendor.id special 0x0200
+&device.id special 0x0005
++device.name Intelli/Wheel Mouse
+
+ vendor.id special 0x0200
+&device.id special 0x0006
++device.name Touch Pad
+
+
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+# pc keyboards
+# ids > 1 are keyboard ids as read via keyboard id command
+
+ vendor.id special 0x0201
++vendor.name Unknown
+
+ vendor.id special 0x0201
+&device.id special 0x0000
++device.name PC Keyboard
+
+ vendor.id special 0x0201
+&device.id special 0x0001
++device.name PS/2 Keyboard
+
+ vendor.id special 0x0201
+&device.id special 0x0002
++device.name UML Keyboard
+
+ vendor.id special 0x0201
+&device.id special 0x41ab
++device.name MF2 Keyboard
+
+ vendor.id special 0x0202
++vendor.name Sun Microsystems
+
+ vendor.id special 0x0202
+&device.id special 0x0000
++device.name Sun Mouse
+
+ vendor.id special 0x0202
+&device.id special 0x0002
++device.name Type-2 Keyboard
+
+ vendor.id special 0x0202
+&device.id special 0x0003
++device.name Type-3 Keyboard
+
+ vendor.id special 0x0202
+&device.id special 0x0004
++device.name Type-4 Keyboard
+
+ vendor.id special 0x0202
+&device.id special 0x0005
++device.name Type-5 Keyboard
+
+ vendor.id special 0x0202
+&device.id special 0x0005
+&subvendor.id special 0x0202
+&subdevice.id special 0x0001
++subdevice.name Type-5 Unix Keyboard
+
+ vendor.id special 0x0202
+&device.id special 0x0005
+&subvendor.id special 0x0202
+&subdevice.id special 0x0002
++subdevice.name Type-5 Euro Keyboard
+
+ vendor.id special 0x0203
++vendor.name Unknown
+
+ vendor.id special 0x0203
+&device.id special 0x0000
++device.name Serial Console
+
+
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+# Mac colors
+
+ vendor.id special 0x0300
+&device.id special 0x0001
++device.name Blueberry
+
+ vendor.id special 0x0300
+&device.id special 0x0004
++device.name Lime
+
+ vendor.id special 0x0300
+&device.id special 0x0005
++device.name Tangerine
+
+ vendor.id special 0x0300
+&device.id special 0x0007
++device.name Black
+
+ vendor.id special 0x0300
+&device.id special 0x0008
++device.name Snow
+
+ vendor.id special 0x0300
+&device.id special 0x00ff
++device.name Graphite
+
+# Strawberry, Grape, Ruby, Indigo, Sage
+
+
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+# special ppc hardware; ids shared with special 0x0402
+
+ vendor.id special 0x0401
++vendor.name Apple
+
+ vendor.id special 0x0401
+&device.id special 0x0010
++device.name Integrated Sound (awacs)
+
+ vendor.id special 0x0401
+&device.id special 0x0011
++device.name Integrated Sound (screamer)
+
+ vendor.id special 0x0401
+&device.id special 0x0012
++device.name Integrated Sound (burgundy)
+
+ vendor.id special 0x0401
+&device.id special 0x0013
++device.name Integrated Sound (daca)
+
+ vendor.id special 0x0401
+&device.id special 0x0020
++device.name MACE Ethernet Controller
+
+ vendor.id special 0x0401
+&device.id special 0x0021
++device.name BMAC Ethernet Controller
+
+ vendor.id special 0x0401
+&device.id special 0x0022
++device.name BMAC+ Ethernet Controller
+
+ vendor.id special 0x0401
+&device.id special 0x0030
++device.name MESH SCSI Controller
+
+ vendor.id special 0x0401
+&device.id special 0x0031
++device.name 53c94 SCSI Controller
+
+ vendor.id special 0x0401
+&device.id special 0x0040
++device.name Super Woz Integrated Machine 3
+
+ vendor.id special 0x0401
+&device.id special 0x1000
++device.name 21" Monitor
+
+ vendor.id special 0x0401
+&device.id special 0x1114
++device.name Portrait Monitor
+
+ vendor.id special 0x0401
+&device.id special 0x1221
++device.name 12" Monitor
+
+ vendor.id special 0x0401
+&device.id special 0x1331
++device.name 21" Monitor
+
+ vendor.id special 0x0401
+&device.id special 0x1334
++device.name 21" Monitor (mono)
+
+ vendor.id special 0x0401
+&device.id special 0x1335
++device.name 21" Monitor (mono)
+
+ vendor.id special 0x0401
+&device.id special 0x140a
++device.name NTSC Monitor
+
+ vendor.id special 0x0401
+&device.id special 0x151e
++device.name Portrait Monitor
+
+ vendor.id special 0x0401
+&device.id special 0x1603
++device.name 16" Monitor
+
+ vendor.id special 0x0401
+&device.id special 0x160b
++device.name 19" Monitor
+
+ vendor.id special 0x0401
+&device.id special 0x1623
++device.name 21" Monitor
+
+ vendor.id special 0x0401
+&device.id special 0x162b
++device.name 14" Monitor
+
+ vendor.id special 0x0401
+&device.id special 0x1700
++device.name PAL Monitor
+
+ vendor.id special 0x0401
+&device.id special 0x1714
++device.name NTSC Monitor
+
+ vendor.id special 0x0401
+&device.id special 0x1717
++device.name VGA Monitor
+
+ vendor.id special 0x0401
+&device.id special 0x172d
++device.name 16" Monitor
+
+ vendor.id special 0x0401
+&device.id special 0x1730
++device.name PAL Monitor
+
+ vendor.id special 0x0401
+&device.id special 0x173a
++device.name 19" Monitor
+
+ vendor.id special 0x0401
+&device.id special 0x173f
++device.name Unknown Monitor
+
+ vendor.id special 0x0401
+&device.id special 0x2000
++device.name 800x600 LCD
+
+ vendor.id special 0x0401
+&device.id special 0x2001
++device.name 1024x768 LCD
+
+ vendor.id special 0x0401
+&device.id special 0x3000
++device.name Valkyrie
+
+ vendor.id special 0x0401
+&device.id special 0x3001
++device.name Platinum
+
+
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+# chrp hardware; ids shared with special 0x0401
+
+ vendor.id special 0x0402
++vendor.name IBM
+
+ vendor.id special 0x0402
+&device.id special 0x0014
++device.name CS4236B
+
+
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+# parport zip controller
+
+ vendor.id special 0x1800
++vendor.name Iomega
+
+ vendor.id special 0x1800
+&device.id special 0x0001
++device.name MatchMaker
+
+ vendor.id special 0x1800
+&device.id special 0x0002
++device.name PPA3
+
+
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+# modem
+
+ vendor.id special 0x2000
++vendor.name Unknown
+
+ vendor.id special 0x2000
+&device.id special 0x0001
++baseclass.id 0x102
++subclass.id 0x00
++device.name AT Modem
+
+ vendor.id special 0x2001
++vendor.name U.S. Robotics, Inc.
+
+ vendor.id special 0x2001
+&device.id special 0x0001
++baseclass.id 0x102
++subclass.id 0x00
++device.name USRobotics Sportster Vi 33600 Faxmodem
+
+ vendor.id special 0x2002
++vendor.name 3Com U.S. Robotics, Inc.
+
+ vendor.id special 0x2002
+&device.id special 0x0001
++baseclass.id 0x102
++subclass.id 0x00
++device.name 3Com U.S. Robotics ISDN Pro TA
+
+ vendor.id special 0x2003
++vendor.name ZyXEL
+
+ vendor.id special 0x2003
+&device.id special 0x0001
++baseclass.id 0x102
++subclass.id 0x00
++device.name U1496C
+
+ vendor.id special 0x2004
++vendor.name Zoom Telephonics, Inc.
+
+ vendor.id special 0x2004
+&device.id special 0x0001
++baseclass.id 0x102
++subclass.id 0x00
++device.name Zoom FaxModem V.34X Plus Model 2836
+
+
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+# isa isdn cards
+
+ vendor.id special 0x3000
++vendor.name Unknown
+
+ vendor.id special 0x3001
++vendor.name Teles
+
+ vendor.id special 0x3001
+&device.id special 0x0100
++device.name Teles 16.0
+
+ vendor.id special 0x3001
+&device.id special 0x0101
++device.name Teles 16.0 AB
+
+ vendor.id special 0x3003
++vendor.name Teles
+
+ vendor.id special 0x3003
+&device.id special 0x0300
++device.name Teles 16.3
+
+ vendor.id special 0x3003
+&device.id special 0x0301
++device.name Teles 16.3 AB Video
+
+ vendor.id special 0x3005
++vendor.name AVM
+
+ vendor.id special 0x3005
+&device.id special 0x0500
++device.name AVM A1 or Fritz!Classic
+
+ vendor.id special 0x3006
++vendor.name Elsa
+
+ vendor.id special 0x3006
+&device.id special 0x0601
++device.name Elsa ML PC
+
+ vendor.id special 0x3006
+&device.id special 0x0602
++device.name Elsa ML PCC-8
+
+ vendor.id special 0x3006
+&device.id special 0x0603
++device.name Elsa ML PCC-16
+
+ vendor.id special 0x3006
+&device.id special 0x0604
++device.name Elsa ML PCF
+
+ vendor.id special 0x3006
+&device.id special 0x0605
++device.name Elsa ML PCF-Pro
+
+
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+# sbus cards
+
+ vendor.id special 0x4001
++vendor.name Sun Microsystems
+
+
+# Grafik cards
+ vendor.id special 0x4001
+&device.id special 0x0001
++device.name Sun|Monochrome (bwtwo)
+
+ vendor.id special 0x4001
+&device.id special 0x0002
++device.name Sun|Color3 (cgthree)
+
+ vendor.id special 0x4001
+&device.id special 0x0003
++device.name Sun|CG8/RasterOps (cgeight)
+
+ vendor.id special 0x4001
+&device.id special 0x0004
++device.name Sun|GS (cgtwelve)
+
+ vendor.id special 0x4001
+&device.id special 0x0005
++device.name Sun|Graphics Tower (gt)
+
+ vendor.id special 0x4001
+&device.id special 0x0006
++device.name Quantum 3D MGXplus with 4M VRAM (mgx)
+
+ vendor.id special 0x4001
+&device.id special 0x0007
++device.name Quantum 3D MGXplus (mgx)
+
+ vendor.id special 0x4001
+&device.id special 0x0008
++device.name Sun|Double width GX (cgsix)
+
+ vendor.id special 0x4001
+&device.id special 0x0009
++device.name Sun|Single width GX (cgsix)
+
+ vendor.id special 0x4001
+&device.id special 0x000a
++device.name Sun|Turbo GX with 1M VSIMM (cgsix)
+
+ vendor.id special 0x4001
+&device.id special 0x000b
++device.name Sun|Turbo GX Plus (cgsix)
+
+ vendor.id special 0x4001
+&device.id special 0x000c
++device.name Sun|Turbo GX (cgsix)
+
+ vendor.id special 0x4001
+&device.id special 0x000d
++device.name Sun|Unknown GX (cgsix)
+
+ vendor.id special 0x4001
+&device.id special 0x000e
++device.name Sun|SX with 4M VSIMM (cgfourteen)
+
+ vendor.id special 0x4001
+&device.id special 0x000f
++device.name Sun|SX with 8M VSIMM (cgfourteen)
+
+ vendor.id special 0x4001
+&device.id special 0x0010
++device.name Sun|SX (cgfourteen)
+
+ vendor.id special 0x4001
+&device.id special 0x0011
++device.name Sun|ZX or Turbo ZX (leo)
+
+ vendor.id special 0x4001
+&device.id special 0x0012
++device.name Sun|Turbo ZX (leo)
+
+ vendor.id special 0x4001
+&device.id special 0x0013
++device.name Sun|TCX (8bit)
+
+ vendor.id special 0x4001
+&device.id special 0x0014
++device.name Sun|TCX (S24)
+
+ vendor.id special 0x4001
+&device.id special 0x0015
++device.name Sun|Elite3D-M6 Horizontal (afb)
+
+ vendor.id special 0x4001
+&device.id special 0x0016
++device.name Sun|Elite3D (afb)
+
+ vendor.id special 0x4001
+&device.id special 0x0017
++device.name Sun|FFB 67MHz Creator (ffb)
+
+ vendor.id special 0x4001
+&device.id special 0x0018
++device.name Sun|FFB 67MHz Creator 3D (ffb)
+
+ vendor.id special 0x4001
+&device.id special 0x0019
++device.name Sun|FFB 75MHz Creator 3D (ffb)
+
+ vendor.id special 0x4001
+&device.id special 0x001a
++device.name Sun|FFB2 Vertical Creator (ffb)
+
+ vendor.id special 0x4001
+&device.id special 0x001b
++device.name Sun|FFB2 Vertical Creator 3D (ffb)
+
+ vendor.id special 0x4001
+&device.id special 0x001c
++device.name Sun|FFB2+ Vertical Creator (ffb)
+
+ vendor.id special 0x4001
+&device.id special 0x001d
++device.name Sun|FFB2+ Vertical Creator 3D (ffb)
+
+ vendor.id special 0x4001
+&device.id special 0x001e
++device.name Sun|FFB2 Horizontal Creator (ffb)
+
+ vendor.id special 0x4001
+&device.id special 0x001f
++device.name Sun|FFB2 Horizontal Creator 3D (ffb)
+
+ vendor.id special 0x4001
+&device.id special 0x0020
++device.name Sun|FFB [unknown type] (ffb)
+
+ vendor.id special 0x4001
+&device.id special 0x1001
++device.name Sun Enhanced SCSI Processor (ESP)
+
+ vendor.id special 0x4001
+&device.id special 0x1002
++device.name Sun Swift (ESP)
+
+ vendor.id special 0x4001
+&device.id special 0x1003
++device.name Performance Technologies ISP
+
+ vendor.id special 0x4001
+&device.id special 0x1004
++device.name QLogic ISP
+
+ vendor.id special 0x4001
+&device.id special 0x1101
++device.name Sun SPARCStorage Array (fc4)
+
+ vendor.id special 0x4001
+&device.id special 0x1102
++device.name Sun Enterprise Network Array (fc4)
+
+
+# audio chips
+ vendor.id special 0x4001
+&device.id special 0x2001
++device.name AMD7930
+
+ vendor.id special 0x4001
+&device.id special 0x2002
++device.name CS4231 EB2 DMA
+
+ vendor.id special 0x4001
+&device.id special 0x2003
++device.name CS4231 APC DMA
+
+ vendor.id special 0x4001
+&device.id special 0x2004
++device.name SS10/SS20 DBRI
+
+
+# Network cards
+ vendor.id special 0x4001
+&device.id special 0x3001
++device.name Sun Happy Meal Ethernet
+
+ vendor.id special 0x4001
+&device.id special 0x3002
++device.name Sun Lance Ethernet
+
+ vendor.id special 0x4001
+&device.id special 0x3003
++device.name Sun Quad Ethernet
+
+ vendor.id special 0x4001
+&device.id special 0x3004
++device.name MyriCOM MyriNET Gigabit Ethernet
+
+
+# iSeries network
+ vendor.id special 0x6001
+&device.id special 0x1000
++driver.module.modprobe iseries_veth
+
+# IBM vscsi
+ vendor.id special 0x6001
+&device.id special 0x1001
++driver.module.modprobe ibmvscsic
+
+
+# IBM veth
+ vendor.id special 0x6001
+&device.id special 0x1002
++driver.module.modprobe ibmveth
+
+
+# UML veth
+ vendor.id special 0x6010
++vendor.name UML
+
+
+# internal: usb scanner driver list
+ vendor.id special 0xf000
+&device.id special 0x0001
++driver.module.modprobe usbscanner
++driver.module.modprobe microtek
+
+
+# internal: special notebook packages
+# see int.c::int_system()
+ vendor.id special 0xf001
+&device.id special 0x0001
++device.name IBM Notebook
++requires tpctl|tpconfig|tpb|configure-thinkpad
+
+ vendor.id special 0xf001
+&device.id special 0x0002
++device.name Toshiba Notebook
++requires toshutils|fnfx
+
+ vendor.id special 0xf001
+&device.id special 0x0003
++device.name Sony Notebook
++requires spicctrl
+
+ vendor.id special 0xf001
+&device.id special 0x0004
++device.name HP Notebook
++driver.module.modprobe thermal|fan
+
+
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+# altix things
+
+ vendor.id special 0x4002
++vendor.name SGI
+
+# look at net.c if module name changes
+ vendor.id special 0x4002
+&device.id special 0x0001
++device.name Cross Partition Network adapter
++driver.module.modprobe xpnet
+
--- /dev/null
+# storage controller
+
+
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+# scsi controller
+
+# modinfo
+ vendor.id pci 0x1000
+&device.id pci 0x0001+0x0006
+|vendor.id pci 0x1000
+&device.id pci 0x000a+0x0004
+|vendor.id pci 0x1000
+&device.id pci 0x000f+0x0002
+|vendor.id pci 0x1000
+&device.id pci 0x0012+0x0002
+|vendor.id pci 0x1000
+&device.id pci 0x0020+0x0002
+|vendor.id pci 0x1000
+&device.id pci 0x008f
++driver.module.modprobe sym53c8xx
+
+# message/fusion/
+ vendor.id pci 0x1000
+&device.id pci 0x0030
+|vendor.id pci 0x1000
+&device.id pci 0x0621+0x0002
+|vendor.id pci 0x1000
+&device.id pci 0x0624
+|vendor.id pci 0x1000
+&device.id pci 0x0626
+|vendor.id pci 0x1000
+&device.id pci 0x0628
++driver.module.modprobe mptscsih
+
+ vendor.id pci 0x1014
+&device.id pci 0x0096
++driver.module.modprobe ibmsis
+
+# modinfo
+ vendor.id pci 0x1000
+&device.id pci 0x0407
+|vendor.id pci 0x1000
+&device.id pci 0x1960
+|vendor.id pci 0x101e
+&device.id pci 0x1960
+|vendor.id pci 0x101e
+&device.id pci 0x9010
+|vendor.id pci 0x101e
+&device.id pci 0x9060
+|vendor.id pci 0x1028
+&device.id pci 0x000e+0x0002
+|vendor.id pci 0x8086
+&device.id pci 0x1960
++driver.module.modprobe megaraid
+
+# modinfo
+ vendor.id pci 0x1000
+&device.id pci 0x0407
+&subvendor.id pci 0x1000
+&subdevice.id pci 0x0530+0x0003
+|vendor.id pci 0x1000
+&device.id pci 0x0407
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x0531
+|vendor.id pci 0x1000
+&device.id pci 0x0407
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x0530
+|vendor.id pci 0x1000
+&device.id pci 0x0407
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x0532
+|vendor.id pci 0x1000
+&device.id pci 0x0408
+&subvendor.id pci 0x1000
+&subdevice.id pci 0x0001+0x0002
+|vendor.id pci 0x1000
+&device.id pci 0x0408
+&subvendor.id pci 0x1025
+&subdevice.id pci 0x004d
+|vendor.id pci 0x1000
+&device.id pci 0x0408
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x0001+0x0002
+|vendor.id pci 0x1000
+&device.id pci 0x0408
+&subvendor.id pci 0x1734
+&subdevice.id pci 0x1065
+|vendor.id pci 0x1000
+&device.id pci 0x0408
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x0002
+|vendor.id pci 0x1000
+&device.id pci 0x0408
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x3431
+|vendor.id pci 0x1000
+&device.id pci 0x0408
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x3499
+|vendor.id pci 0x1000
+&device.id pci 0x0409
+&subvendor.id pci 0x1000
+&subdevice.id pci 0x3004
+|vendor.id pci 0x1000
+&device.id pci 0x0409
+&subvendor.id pci 0x1000
+&subdevice.id pci 0x3008
+|vendor.id pci 0x1000
+&device.id pci 0x0409
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x3008
+|vendor.id pci 0x1000
+&device.id pci 0x1960
+&subvendor.id pci 0x1000
+&subdevice.id pci 0x0518
+|vendor.id pci 0x1000
+&device.id pci 0x1960
+&subvendor.id pci 0x1000
+&subdevice.id pci 0x0520
+|vendor.id pci 0x1000
+&device.id pci 0x1960
+&subvendor.id pci 0x1000
+&subdevice.id pci 0x0522+0x0002
+|vendor.id pci 0x1000
+&device.id pci 0x1960
+&subvendor.id pci 0x1000
+&subdevice.id pci 0x4523
+|vendor.id pci 0x1000
+&device.id pci 0x1960
+&subvendor.id pci 0x1000
+&subdevice.id pci 0xa520
+|vendor.id pci 0x1000
+&device.id pci 0x1960
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x0518
+|vendor.id pci 0x1000
+&device.id pci 0x1960
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x0520
+|vendor.id pci 0x1000
+&device.id pci 0x1960
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x0520
+|vendor.id pci 0x1000
+&device.id pci 0x1960
+&subvendor.id pci 0x8086
+&subdevice.id pci 0x0523
+|vendor.id pci 0x101e
+&device.id pci 0x1960
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x0471
+|vendor.id pci 0x101e
+&device.id pci 0x1960
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x0475
+|vendor.id pci 0x101e
+&device.id pci 0x1960
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x0493
+|vendor.id pci 0x1028
+&device.id pci 0x000e
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x0123
+|vendor.id pci 0x1028
+&device.id pci 0x000f
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x014a
+|vendor.id pci 0x1028
+&device.id pci 0x0013
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x016c+0x0005
++driver.module.modprobe megaraid_mbox
+
+# override qla1280 info (#26325)
+ vendor.id pci 0x1077
+&device.id pci 0x1216
+&subvendor.id pci 0x101e
+&subdevice.id pci 0x8493
+|vendor.id pci 0x1077
+&device.id pci 0x1216
+&subvendor.id pci 0x101e
+&subdevice.id pci 0x8471
++driver.module.modprobe megaraid
+
+# modinfo
+ vendor.id pci 0x1022
+&device.id pci 0x2020
++driver.module.modprobe tmscsim
+
+# scsi/fdomain.c
+ vendor.id pci 0x1036
+&device.id pci 0x0000
++driver.module.modprobe fdomain
+
+# scsi/eata_dma.c
+ vendor.id pci 0x1044
+&device.id pci 0xa400
++driver.module.modprobe eata
+
+# scsi/dpti.c
+ baseclass.id 0x00e
+&subclass.id 0x00
+&vendor.id pci 0x1044
+&device.id pci 0xa501
+|baseclass.id 0x00e
+&subclass.id 0x00
+&vendor.id pci 0x1044
+&device.id pci 0xa511
++driver.module.modprobe dpt_i2o
+
+# scsi/BusLogic.c
+ vendor.id pci 0x104b
+&device.id pci 0x0140
+|vendor.id pci 0x104b
+&device.id pci 0x1040
+|vendor.id pci 0x104b
+&device.id pci 0x8130
++driver.module.modprobe BusLogic
+
+# scsi/qla1280.c
+ vendor.id pci 0x1077
+&device.id pci 0x1016
+|vendor.id pci 0x1077
+&device.id pci 0x1080
+|vendor.id pci 0x1077
+&device.id pci 0x1216
+|vendor.id pci 0x1077
+&device.id pci 0x1240
+|vendor.id pci 0x1077
+&device.id pci 0x1280
++driver.module.modprobe qla1280
+
+# scsi/qlogicisp.c
+ vendor.id pci 0x1077
+&device.id pci 0x1020
++driver.module.modprobe qlogicisp
+
+# scsi/qlogicfc.c
+ vendor.id pci 0x1077
+&device.id pci 0x2100
++driver.module.modprobe qlogicfc
+
+ vendor.id pci 0x1077
+&device.id pci 0x2200
++driver.module.modprobe qla2200
++driver.module.modprobe qlogicfc
+
+ vendor.id pci 0x1077
+&device.id pci 0x2300
+|vendor.id pci 0x1077
+&device.id pci 0x2312
++driver.module.modprobe qla2300
+
+# scsi/inia100.c
+ vendor.id pci 0x1101
+&device.id pci 0x0002
+|vendor.id pci 0x1101
+&device.id pci 0x1060
++driver.module.modprobe a100u2w
+
+# scsi/ini9100u.c
+ vendor.id pci 0x1101
+&device.id pci 0x9400+0x0002
+|vendor.id pci 0x1101
+&device.id pci 0x9500
+|vendor.id pci 0x134a
+&device.id pci 0x0002
++driver.module.modprobe initio
+
+# scsi/gdth.c
+ vendor.id pci 0x1119
+&device.id pci 0x0000+0x000e
+|vendor.id pci 0x1119
+&device.id pci 0x0100+0x0300
+|vendor.id pci 0x8086
+&device.id pci 0x0600
++driver.module.modprobe gdth
+
+# scsi/atp870u.c
+ vendor.id pci 0x1191
+&device.id pci 0x8002
+|vendor.id pci 0x1191
+&device.id pci 0x8010
+|vendor.id pci 0x1191
+&device.id pci 0x8020
+|vendor.id pci 0x1191
+&device.id pci 0x8030
+|vendor.id pci 0x1191
+&device.id pci 0x8040
+|vendor.id pci 0x1191
+&device.id pci 0x8050
+|vendor.id pci 0x1191
+&device.id pci 0x8060
++driver.module.modprobe atp870u
+
+# scsi/pci2220i.c
+ vendor.id pci 0x1256
+&device.id pci 0x4401
++driver.module.modprobe pci2220i
+
+# scsi/pci2000.c
+ vendor.id pci 0x1256
+&device.id pci 0x5201
++driver.module.modprobe pci2000
+
+# scsi/dmx3191d.c
+ vendor.id pci 0x134a
+&device.id pci 0x0001
++driver.module.modprobe dmx3191d
+
+# scsi/3w-xxxx.c
+ vendor.id pci 0x13c1
+&device.id pci 0x1000+0x0002
++driver.module.modprobe 3w-xxxx
+
+# modules.alias
+ vendor.id pci 0x1de1
+&device.id pci 0x0391
++driver.module.modprobe dc395x
+
+# scsi/aic7xxx/{aic7xxx_pci.c,aic79xx_pci.c}
+ vendor.id pci 0x9004
+&device.id pci 0x0078
+|vendor.id pci 0x9004
+&device.id pci 0x1078
+|vendor.id pci 0x9004
+&device.id pci 0x2178
+|vendor.id pci 0x9004
+&device.id pci 0x3860
+|vendor.id pci 0x9004
+&device.id pci 0x5078
+|vendor.id pci 0x9004
+&device.id pci 0x5578
+|vendor.id pci 0x9004
+&device.id pci 0x6038
+|vendor.id pci 0x9004
+&device.id pci 0x6075
+|vendor.id pci 0x9004
+&device.id pci 0x6078
+|vendor.id pci 0x9004
+&device.id pci 0x6178
+|vendor.id pci 0x9004
+&device.id pci 0x7078
+|vendor.id pci 0x9004
+&device.id pci 0x7178
+&subvendor.id pci 0x0000
+&subdevice.id pci 0x0000
+|vendor.id pci 0x9004
+&device.id pci 0x7278
+&subvendor.id pci 0x0000
+&subdevice.id pci 0x0000
+|vendor.id pci 0x9004
+&device.id pci 0x7378
+&subvendor.id pci 0x0000
+&subdevice.id pci 0x0000
+|vendor.id pci 0x9004
+&device.id pci 0x7478
+&subvendor.id pci 0x0000
+&subdevice.id pci 0x0000
+|vendor.id pci 0x9004
+&device.id pci 0x7578
+&subvendor.id pci 0x0000
+&subdevice.id pci 0x0000
+|vendor.id pci 0x9004
+&device.id pci 0x7678
+&subvendor.id pci 0x0000
+&subdevice.id pci 0x0000
+|vendor.id pci 0x9004
+&device.id pci 0x7815
+|vendor.id pci 0x9004
+&device.id pci 0x7890+0x0010
+&subvendor.id pci 0x9004
+&subdevice.id pci 0x7893
+|vendor.id pci 0x9004
+&device.id pci 0x7895
+|vendor.id pci 0x9004
+&device.id pci 0x8078
+|vendor.id pci 0x9004
+&device.id pci 0x8178
+|vendor.id pci 0x9004
+&device.id pci 0x8278
+|vendor.id pci 0x9004
+&device.id pci 0x8378
+|vendor.id pci 0x9004
+&device.id pci 0x8478
+|vendor.id pci 0x9004
+&device.id pci 0x8578
+|vendor.id pci 0x9004
+&device.id pci 0x8678
+|vendor.id pci 0x9004
+&device.id pci 0x8778
+|vendor.id pci 0x9004
+&device.id pci 0x8878
+|vendor.id pci 0x9005
+&device.id pci 0x0010+0x0010
+|vendor.id pci 0x9005
+&device.id pci 0x0050+0x0010
+|vendor.id pci 0x9005
+&device.id pci 0x0080+0x0010
+|vendor.id pci 0x9005
+&device.id pci 0x00c0+0x0010
++driver.module.modprobe aic7xxx
+
+ vendor.id pci 0x9005
+&device.id pci 0x8000+0x0020
++driver.module.modprobe aic79xx
+
+# scsi/aha152x.c
+ vendor.id ADP
+&device.id eisa 0x1505
++driver.module.modprobe aha152x
++driver.module.config options aha152x aha152x=<io0>,<irq0>
++driver.module.insmod aha152x aha152x=<io0>,<irq0>
+
+# scsi/mesh.c
+ vendor.id special 0x0401
+&device.id special 0x0030
++driver.module.modprobe mesh
+
+# scsi/mac53c94.c
+ vendor.id special 0x0401
+&device.id special 0x0031
++driver.module.modprobe mac53c94
+
+# iomega zip
+ vendor.id special 0x1800
+&device.id special 0x0001
++driver.module.modprobe imm
+
+# iomega zip
+ vendor.id special 0x1800
+&device.id special 0x0002
++driver.module.modprobe ppa
+
+# scsi/qlogicpti.c
+ vendor.id special 0x4001
+&device.id special 0x1003+0x0002
++driver.module.modprobe qlogicpti
+
+
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+# block devices (RAID, ...)
+
+# modules.alias
+ vendor.id pci 0x1011
+&device.id pci 0x1065
+&subvendor.id pci 0x1069
+&subdevice.id pci 0x0020
+|vendor.id pci 0x1069
+&device.id pci 0x0001+0x0002
+|vendor.id pci 0x1069
+&device.id pci 0x0010
+|vendor.id pci 0x1069
+&device.id pci 0x0050
+|vendor.id pci 0x1069
+&device.id pci 0xba56
++driver.module.modprobe DAC960
++baseclass.id 0x001
++subclass.id 0x04
+
+# pcimap
+ vendor.id pci 0x0e11
+&device.id pci 0xae10
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0x4030+0x0005
+|vendor.id pci 0x1000
+&device.id pci 0x0010
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0x4040
+|vendor.id pci 0x1000
+&device.id pci 0x0010
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0x4048
+|vendor.id pci 0x1011
+&device.id pci 0x0046
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0x4050+0x0002
+|vendor.id pci 0x1011
+&device.id pci 0x0046
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0x4058
++driver.module.modprobe cpqarray
+
+# pcimap
+ vendor.id pci 0x0e11
+&device.id pci 0x0046
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0x409a+0x0004
+|vendor.id pci 0x0e11
+&device.id pci 0xb060
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0x4070
+|vendor.id pci 0x0e11
+&device.id pci 0xb178
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0x4080
+|vendor.id pci 0x0e11
+&device.id pci 0xb178
+&subvendor.id pci 0x0e11
+&subdevice.id pci 0x4082+0x0002
++driver.module.modprobe cciss
+
+# block/swim3.c
+ vendor.id special 0x0401
+&device.id special 0x0040
++driver.module.modprobe swim3
+
+ baseclass.id 0x00e
+&subclass.id 0x00+2
++driver.module.insmod i2o_pci|i2o_core|i2o_config|i2o_block
+
+# scsi/aacraid/linit.c
+ vendor.id pci 0x1028
+&device.id pci 0x0001
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x0001
+|vendor.id pci 0x1028
+&device.id pci 0x0002
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x0002
+|vendor.id pci 0x1028
+&device.id pci 0x0003
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x0003
+|vendor.id pci 0x1028
+&device.id pci 0x0004
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x00d0
+|vendor.id pci 0x1028
+&device.id pci 0x0002
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x00d1
+|vendor.id pci 0x1028
+&device.id pci 0x0002
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x00d9
+|vendor.id pci 0x1028
+&device.id pci 0x000a
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x0106
+|vendor.id pci 0x1028
+&device.id pci 0x000a
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x011b
+|vendor.id pci 0x1028
+&device.id pci 0x000a
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x0121
+|vendor.id pci 0x9005
+&device.id pci 0x0283
+&subvendor.id pci 0x9005
+&subdevice.id pci 0x0283
+|vendor.id pci 0x9005
+&device.id pci 0x0284
+&subvendor.id pci 0x9005
+&subdevice.id pci 0x0284
+|vendor.id pci 0x9005
+&device.id pci 0x0285
+&subvendor.id pci 0x9005
+&subdevice.id pci 0x0286
+|vendor.id pci 0x9005
+&device.id pci 0x0285
+&subvendor.id pci 0x9005
+&subdevice.id pci 0x0285
+|vendor.id pci 0x9005
+&device.id pci 0x0285
+&subvendor.id pci 0x9005
+&subdevice.id pci 0x0287
+|vendor.id pci 0x9005
+&device.id pci 0x0285
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x0287
+|vendor.id pci 0x1011
+&device.id pci 0x0046
+&subvendor.id pci 0x9005
+&subdevice.id pci 0x0364+2
+|vendor.id pci 0x1011
+&device.id pci 0x0046
+&subvendor.id pci 0x9005
+&subdevice.id pci 0x1364
+|vendor.id pci 0x1011
+&device.id pci 0x0046
+&subvendor.id pci 0x103c
+&subdevice.id pci 0x10c2
++driver.module.modprobe aacraid
+
+# modules.alias sata_*
+ baseclass.id 0x001
+&subclass.id 0x06
+&progif.id 0x00
+&vendor.id pci 0x1725
+&device.id pci 0x7174
+|baseclass.id 0x001
+&subclass.id 0x06
+&progif.id 0x00
+&vendor.id pci 0x8086
+&device.id pci 0x3200
++driver.module.modprobe sata_vsc
+
+ vendor.id pci 0x1039
+&device.id pci 0x0180+0x0002
++driver.module.modprobe sata_sis
+
+ vendor.id pci 0x105a
+&device.id pci 0x3318+0x0002
+|vendor.id pci 0x105a
+&device.id pci 0x3371
+|vendor.id pci 0x105a
+&device.id pci 0x3373
+|vendor.id pci 0x105a
+&device.id pci 0x3375+0x0002
++driver.module.modprobe sata_promise
+
+ vendor.id pci 0x105a
+&device.id pci 0x6622
++driver.module.modprobe sata_sx4
+
+ vendor.id pci 0x1095
+&device.id pci 0x0240
+|vendor.id pci 0x1095
+&device.id pci 0x3112
+|vendor.id pci 0x1095
+&device.id pci 0x3114
+|vendor.id pci 0x1095
+&device.id pci 0x3512
++driver.module.modprobe sata_sil
+
+ vendor.id pci 0x10de
+&device.id pci 0x0036
+|vendor.id pci 0x10de
+&device.id pci 0x003e
+|vendor.id pci 0x10de
+&device.id pci 0x0054+0x0002
+|vendor.id pci 0x10de
+&device.id pci 0x008e
+|vendor.id pci 0x10de
+&device.id pci 0x00e3
+|vendor.id pci 0x10de
+&device.id pci 0x00ee
++driver.module.modprobe sata_nv
+
+ vendor.id pci 0x1106
+&device.id pci 0x3149
++driver.module.modprobe sata_via
+
+ vendor.id pci 0x1166
+&device.id pci 0x0240
++driver.module.modprobe sata_svw
+
+# modules.alias, #38628
+ baseclass.id 0x00b
+&subclass.id 0x40
+&progif.id 0x00
+&vendor.id pci 0x10a9
+&device.id pci 0x100a
++driver.module.modprobe sgiioc4
++baseclass.id 0x001
+
+
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+# usb controller
+
+ baseclass.id 0x00c
+&subclass.id 0x03
+&progif.id 0x00
++driver.module.modprobe uhci-hcd
+
+ baseclass.id 0x00c
+&subclass.id 0x03
+&progif.id 0x10
++driver.module.modprobe ohci-hcd
+
+ baseclass.id 0x00c
+&subclass.id 0x03
+&progif.id 0x20
++driver.module.modprobe ehci-hcd
+
+ baseclass.id 0x00c
+&subclass.id 0x00
+&progif.id 0x10
++driver.module.modprobe ohci1394
+
+ vendor.id pci 0x104c
+&device.id pci 0x8000
++driver.module.modprobe pcilynx
+
+
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+# Compaq Virtual Management Device
+
+# make it a floppy
+ baseclass.id 0x106
+&vendor.id usb 0x049f
+&device.id usb 0x0040
++subclass.id 0x03
--- /dev/null
+# video/tv cards
+
+
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+# media/video/buz.c
+
+ vendor.id pci 0x11de
+&device.id pci 0x6057
++driver.module.modprobe buz
+
+
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+# media/video/zr36120.c
+# (framegrabber)
+ vendor.id pci 0x11de
+&device.id pci 0x6120
++driver.module.modprobe zr36120
+
+
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+# media/video/bttv-cards.c, kernel 2.4.7
+
+ vendor.id pci 0x109e
++vendor.name Brooktree Corporation
+
+ vendor.id pci 0x109e
+&device.id pci 0x036e
++device.name Bt878
+
+ vendor.id pci 0x109e
+&device.id pci 0x036f
++device.name Bt879
+
+ vendor.id pci 0x109e
+&device.id pci 0x0350+0x0002
+|vendor.id pci 0x109e
+&device.id pci 0x036e+0x0002
++baseclass.id 0x112
++subclass.id 0x00
++driver.module.modprobe bttv
+
+ vendor.id pci 0x109e
+&device.id pci 0x036e
+&subvendor.id pci 0x107d
+&subdevice.id pci 0x6606
+|vendor.id pci 0x109e
+&device.id pci 0x036e
+&subvendor.id pci 0x6606
+&subdevice.id pci 0x217d
+|vendor.id pci 0x109e
+&device.id pci 0x036f
+&subvendor.id pci 0x107d
+&subdevice.id pci 0x6606
+|vendor.id pci 0x109e
+&device.id pci 0x036f
+&subvendor.id pci 0x6606
+&subdevice.id pci 0x217d
++subdevice.name Leadtek WinFast TV 2000
++baseclass.id 0x112
++subclass.id 0x00
++driver.module.modprobe bttv
+
+ vendor.id pci 0x109e
+&device.id pci 0x036e
+&subvendor.id pci 0x11bd
+&subdevice.id pci 0x0012
+|vendor.id pci 0x109e
+&device.id pci 0x036e
+&subvendor.id pci 0xbd11
+&subdevice.id pci 0x1200
+|vendor.id pci 0x109e
+&device.id pci 0x036f
+&subvendor.id pci 0x11bd
+&subdevice.id pci 0x0012
+|vendor.id pci 0x109e
+&device.id pci 0x036f
+&subvendor.id pci 0xbd11
+&subdevice.id pci 0x1200
++subdevice.name Pinnacle PCTV
++baseclass.id 0x112
++subclass.id 0x00
++driver.module.modprobe bttv
+
+ vendor.id pci 0x109e
+&device.id pci 0x036e
+&subvendor.id pci 0x1461
+&subdevice.id pci 0x0001
+|vendor.id pci 0x109e
+&device.id pci 0x036e
+&subvendor.id pci 0x1461
+&subdevice.id pci 0x0003
+|vendor.id pci 0x109e
+&device.id pci 0x036f
+&subvendor.id pci 0x1461
+&subdevice.id pci 0x0001
+|vendor.id pci 0x109e
+&device.id pci 0x036f
+&subvendor.id pci 0x1461
+&subdevice.id pci 0x0003
++subdevice.name AVerMedia TVPhone98
++baseclass.id 0x112
++subclass.id 0x00
++driver.module.modprobe bttv
+
+ vendor.id pci 0x109e
+&device.id pci 0x036e
+&subvendor.id pci 0x153b
+&subdevice.id pci 0x1117+0x0004
+|vendor.id pci 0x109e
+&device.id pci 0x036e
+&subvendor.id pci 0x153b
+&subdevice.id pci 0x1134
+|vendor.id pci 0x109e
+&device.id pci 0x036f
+&subvendor.id pci 0x153b
+&subdevice.id pci 0x1117+0x0004
+|vendor.id pci 0x109e
+&device.id pci 0x036f
+&subvendor.id pci 0x153b
+&subdevice.id pci 0x1134
++subdevice.name Terratec TValue
++baseclass.id 0x112
++subclass.id 0x00
++driver.module.modprobe bttv
+
+ vendor.id pci 0x109e
+&device.id pci 0x036e
+&subvendor.id pci 0x15b0
+&subdevice.id pci 0x400d
+|vendor.id pci 0x109e
+&device.id pci 0x036e
+&subvendor.id pci 0x15b0
+&subdevice.id pci 0x4010
+|vendor.id pci 0x109e
+&device.id pci 0x036f
+&subvendor.id pci 0x15b0
+&subdevice.id pci 0x400d
+|vendor.id pci 0x109e
+&device.id pci 0x036f
+&subvendor.id pci 0x15b0
+&subdevice.id pci 0x4010
++subdevice.name Zoltrix Genie TV / Radio
++baseclass.id 0x112
++subclass.id 0x00
++driver.module.modprobe bttv
+
+ vendor.id pci 0x109e
+&device.id pci 0x036e+0x0002
+&subvendor.id pci 0x0070
+&subdevice.id pci 0x13eb
++subdevice.name Hauppauge WinTV
++baseclass.id 0x112
++subclass.id 0x00
++driver.module.modprobe bttv
+
+ vendor.id pci 0x109e
+&device.id pci 0x036e+0x0002
+&subvendor.id pci 0x0070
+&subdevice.id pci 0x3900
++subdevice.name Hauppauge WinTV-D
++baseclass.id 0x112
++subclass.id 0x00
++driver.module.modprobe bttv
+
+ vendor.id pci 0x109e
+&device.id pci 0x036e+0x0002
+&subvendor.id pci 0x0070
+&subdevice.id pci 0x4500
++subdevice.name Hauppauge WinTV/PVR
++baseclass.id 0x112
++subclass.id 0x00
++driver.module.modprobe bttv
+
+ vendor.id pci 0x109e
+&device.id pci 0x036e+0x0002
+&subvendor.id pci 0x0070
+&subdevice.id pci 0xff00
++subdevice.name Osprey-100
++baseclass.id 0x112
++subclass.id 0x00
++driver.module.modprobe bttv
+
+ vendor.id pci 0x109e
+&device.id pci 0x036e+0x0002
+&subvendor.id pci 0x0070
+&subdevice.id pci 0xff01
++subdevice.name Osprey-200
++baseclass.id 0x112
++subclass.id 0x00
++driver.module.modprobe bttv
+
+ vendor.id pci 0x109e
+&device.id pci 0x036e+0x0002
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x0001
++subdevice.name ATI TV Wonder
++baseclass.id 0x112
++subclass.id 0x00
++driver.module.modprobe bttv
+
+ vendor.id pci 0x109e
+&device.id pci 0x036e+0x0002
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x0003
++subdevice.name ATI TV Wonder/VE
++baseclass.id 0x112
++subclass.id 0x00
++driver.module.modprobe bttv
+
+ vendor.id pci 0x109e
+&device.id pci 0x036e+0x0002
+&subvendor.id pci 0x10b4
+&subdevice.id pci 0x2636
++subdevice.name STB TV PCI FM, P/N 6000704
++baseclass.id 0x112
++subclass.id 0x00
++driver.module.modprobe bttv
+
+ vendor.id pci 0x109e
+&device.id pci 0x036e+0x0002
+&subvendor.id pci 0x10fc
+&subdevice.id pci 0x4020
++subdevice.name I-O Data Co. GV-BCV3/PCI
++baseclass.id 0x112
++subclass.id 0x00
++driver.module.modprobe bttv
+
+ vendor.id pci 0x109e
+&device.id pci 0x036e+0x0002
+&subvendor.id pci 0x10fc
+&subdevice.id pci 0x4050
++subdevice.name I-O Data Co. GV-BCV4/PCI
++baseclass.id 0x112
++subclass.id 0x00
++driver.module.modprobe bttv
+
+ vendor.id pci 0x109e
+&device.id pci 0x036e+0x0002
+&subvendor.id pci 0x121a
+&subdevice.id pci 0x3000
++subdevice.name VoodooTV 200
++baseclass.id 0x112
++subclass.id 0x00
++driver.module.modprobe bttv
+
+ vendor.id pci 0x109e
+&device.id pci 0x036e+0x0002
+&subvendor.id pci 0x144f
+&subdevice.id pci 0x3000
++subdevice.name TView 99 (CPH063)
++baseclass.id 0x112
++subclass.id 0x00
++driver.module.modprobe bttv
+
+ vendor.id pci 0x109e
+&device.id pci 0x036e+0x0002
+&subvendor.id pci 0x144f
+&subdevice.id pci 0x3002
++subdevice.name Askey Magic TView
++baseclass.id 0x112
++subclass.id 0x00
++driver.module.modprobe bttv
+
+ vendor.id pci 0x109e
+&device.id pci 0x036e+0x0002
+&subvendor.id pci 0x1461
+&subdevice.id pci 0x0002
++subdevice.name AVermedia TVCapture 98
++baseclass.id 0x112
++subclass.id 0x00
++driver.module.modprobe bttv
+
+ vendor.id pci 0x109e
+&device.id pci 0x036e+0x0002
+&subvendor.id pci 0x1461
+&subdevice.id pci 0x0004
++subdevice.name AVerMedia TVCapture 98
++baseclass.id 0x112
++subclass.id 0x00
++driver.module.modprobe bttv
+
+ vendor.id pci 0x109e
+&device.id pci 0x036e+0x0002
+&subvendor.id pci 0x14c7
+&subdevice.id pci 0x0101
++subdevice.name Modular Technology PCTV
++baseclass.id 0x112
++subclass.id 0x00
++driver.module.modprobe bttv
+
+ vendor.id pci 0x109e
+&device.id pci 0x036e+0x0002
+&subvendor.id pci 0x14ff
+&subdevice.id pci 0x3000
++subdevice.name TView 99 (CPH061)
++baseclass.id 0x112
++subclass.id 0x00
++driver.module.modprobe bttv
+
+ vendor.id pci 0x109e
+&device.id pci 0x036e+0x0002
+&subvendor.id pci 0x14ff
+&subdevice.id pci 0x3002
++subdevice.name Phoebe TV Master
++baseclass.id 0x112
++subclass.id 0x00
++driver.module.modprobe bttv
+
+ vendor.id pci 0x109e
+&device.id pci 0x036e+0x0002
+&subvendor.id pci 0x153b
+&subdevice.id pci 0x1123
++subdevice.name Terratec TV Radio+
++baseclass.id 0x112
++subclass.id 0x00
++driver.module.modprobe bttv
+
+ vendor.id pci 0x109e
+&device.id pci 0x036e+0x0002
+&subvendor.id pci 0x153b
+&subdevice.id pci 0x1127
++subdevice.name Terratec TV+
++baseclass.id 0x112
++subclass.id 0x00
++driver.module.modprobe bttv
+
+ vendor.id pci 0x109e
+&device.id pci 0x036e+0x0002
+&subvendor.id pci 0x153b
+&subdevice.id pci 0x1135
++subdevice.name Terratec TValue Radio
++baseclass.id 0x112
++subclass.id 0x00
++driver.module.modprobe bttv
+
+ vendor.id pci 0x109e
+&device.id pci 0x036e+0x0002
+&subvendor.id pci 0x15b0
+&subdevice.id pci 0x400a
++subdevice.name Zoltrix Genie TV
++baseclass.id 0x112
++subclass.id 0x00
++driver.module.modprobe bttv
+
+ vendor.id pci 0x109e
+&device.id pci 0x036e+0x0002
+&subvendor.id pci 0x15cb
+&subdevice.id pci 0x0101
++subdevice.name AG GMV1
++baseclass.id 0x112
++subclass.id 0x00
++driver.module.modprobe bttv
+
+ vendor.id pci 0x109e
+&device.id pci 0x036e+0x0002
+&subvendor.id pci 0x1851
+&subdevice.id pci 0x1850
++subdevice.name Chronos Video Shuttle II
++baseclass.id 0x112
++subclass.id 0x00
++driver.module.modprobe bttv
+
+ vendor.id pci 0x109e
+&device.id pci 0x036e+0x0002
+&subvendor.id pci 0x1851
+&subdevice.id pci 0x1851
++subdevice.name CyberMail AV
++baseclass.id 0x112
++subclass.id 0x00
++driver.module.modprobe bttv
+
+ vendor.id pci 0x109e
+&device.id pci 0x036e+0x0002
+&subvendor.id pci 0x1852
+&subdevice.id pci 0x1852
++subdevice.name Typhoon TView TV/FM Tuner
++baseclass.id 0x112
++subclass.id 0x00
++driver.module.modprobe bttv
+
+ vendor.id pci 0x109e
+&device.id pci 0x036e+0x0002
+&subvendor.id pci 0x2636
+&subdevice.id pci 0x10b4
++subdevice.name STB ???
++baseclass.id 0x112
++subclass.id 0x00
++driver.module.modprobe bttv
+
+
+ vendor.id pci 0x14f1
+&device.id pci 0x8800
++baseclass.id 0x112
++subclass.id 0x00
++driver.module.modprobe cx8800
+
+
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+ vendor.id pci 0x1131
+&device.id pci 0x7130
+|vendor.id pci 0x1131
+&device.id pci 0x7133
+|vendor.id pci 0x1131
+&device.id pci 0x7134
+|vendor.id pci 0x1131
+&device.id pci 0x7135
++baseclass.id 0x112
++subclass.id 0x00
++driver.module.modprobe saa7134
+
+ vendor.id pci 0x1131
+&device.id pci 0x7134
+&subvendor.id pci 0x1131
+&subdevice.id pci 0x2001
++subdevice.name Proteus Pro [philips reference design]
+
+ vendor.id pci 0x1131
+&device.id pci 0x7134
+&subvendor.id pci 0x1131
+&subdevice.id pci 0x6752
++subdevice.name EMPRESS
+
+ vendor.id pci 0x1131
+&device.id pci 0x7134
+&subvendor.id pci 0x1131
+&subdevice.id pci 0x4e85
++subdevice.name SKNet Monster TV
+
+ vendor.id pci 0x1131
+&device.id pci 0x7134
+&subvendor.id pci 0x153b
+&subdevice.id pci 0x1142
++subdevice.name Terratec Cinergy 400 TV
+
--- /dev/null
+# info from usbutils
+
+
+ vendor.id usb 0x0386
++vendor.name LTS
+
+ vendor.id usb 0x0386
+&device.id usb 0x0001
++device.name PSX for USB Converter
+
+ vendor.id usb 0x03e8
++vendor.name AOX Inc.
+
+ vendor.id usb 0x03e8
+&device.id usb 0x0004
++device.name SE401 WebCam
+
+ vendor.id usb 0x03e8
+&device.id usb 0x0008
++device.name 101 Ethernet [klsi]
+
+ vendor.id usb 0x03e9
++vendor.name Thesys Microelectronics
+
+ vendor.id usb 0x03ea
++vendor.name Data Broadcasting Corp.
+
+ vendor.id usb 0x03eb
++vendor.name Atmel Corp.
+
+ vendor.id usb 0x03eb
+&device.id usb 0x3301
++device.name 4-port Hub
+
+ vendor.id usb 0x03eb
+&device.id usb 0x3312
++device.name 4-port Hub
+
+ vendor.id usb 0x03eb
+&device.id usb 0x7603
++device.name AT76c503a D-Link DWL-120
+
+ vendor.id usb 0x03ec
++vendor.name Iwatsu America Inc.
+
+ vendor.id usb 0x03ed
++vendor.name Mitel Corp.
+
+ vendor.id usb 0x03ee
++vendor.name Mitsumi
+
+ vendor.id usb 0x03ee
+&device.id usb 0x0000
++device.name CD-R/RW Drive
+
+ vendor.id usb 0x03f0
++vendor.name Hewlett-Packard
+
+ vendor.id usb 0x03f0
+&device.id usb 0x0004
++device.name DeskJet 895c
+
+ vendor.id usb 0x03f0
+&device.id usb 0x0101
++device.name ScanJet 4100c
+
+ vendor.id usb 0x03f0
+&device.id usb 0x0102
++device.name PhotoSmart S20
+
+ vendor.id usb 0x03f0
+&device.id usb 0x0104
++device.name DeskJet 880c/970c
+
+ vendor.id usb 0x03f0
+&device.id usb 0x0105
++device.name ScanJet 4200c
+
+ vendor.id usb 0x03f0
+&device.id usb 0x0107
++device.name CD-Writer Plus
+
+ vendor.id usb 0x03f0
+&device.id usb 0x010c
++device.name Multimedia Keyboard Hub
+
+ vendor.id usb 0x03f0
+&device.id usb 0x0111
++device.name G55xi Printer/Scanner/Copier
+
+ vendor.id usb 0x03f0
+&device.id usb 0x011c
++device.name hn210w 802.11b Wireless Ethernet
+
+ vendor.id usb 0x03f0
+&device.id usb 0x0201
++device.name ScanJet 6200c
+
+ vendor.id usb 0x03f0
+&device.id usb 0x0202
++device.name PhotoSmart S20
+
+ vendor.id usb 0x03f0
+&device.id usb 0x0204
++device.name DeskJet 815c
+
+ vendor.id usb 0x03f0
+&device.id usb 0x0205
++device.name ScanJet 3300c
+
+ vendor.id usb 0x03f0
+&device.id usb 0x0207
++device.name CD-Writer Plus 8200e
+
+ vendor.id usb 0x03f0
+&device.id usb 0x020c
++device.name Multimedia Keyboard
+
+ vendor.id usb 0x03f0
+&device.id usb 0x0304
++device.name DeskJet 810c/812c
+
+ vendor.id usb 0x03f0
+&device.id usb 0x0311
++device.name OfficeJet G85xi
+
+ vendor.id usb 0x03f0
+&device.id usb 0x0317
++device.name LaserJet 1200
+
+ vendor.id usb 0x03f0
+&device.id usb 0x0401
++device.name ScanJet 5200c
+
+ vendor.id usb 0x03f0
+&device.id usb 0x0404
++device.name DeskJet 830c/832c
+
+ vendor.id usb 0x03f0
+&device.id usb 0x0405
++device.name ScanJet 3400cse
+
+ vendor.id usb 0x03f0
+&device.id usb 0x0504
++device.name DeskJet 885c
+
+ vendor.id usb 0x03f0
+&device.id usb 0x0601
++device.name ScanJet 6300c
+
+ vendor.id usb 0x03f0
+&device.id usb 0x0604
++device.name DeskJet 840c
+
+ vendor.id usb 0x03f0
+&device.id usb 0x0605
++device.name ScanJet 2200c
+
+ vendor.id usb 0x03f0
+&device.id usb 0x0701
++device.name ScanJet 5300c/5370c
+
+ vendor.id usb 0x03f0
+&device.id usb 0x0705
++device.name ScanJet 4400c
+
+ vendor.id usb 0x03f0
+&device.id usb 0x0804
++device.name DeskJet 816c
+
+ vendor.id usb 0x03f0
+&device.id usb 0x1004
++device.name DeskJet 970c/970cse
+
+ vendor.id usb 0x03f0
+&device.id usb 0x1104
++device.name Deskjet 959C
+
+ vendor.id usb 0x03f0
+&device.id usb 0x1105
++device.name ScanJet 5470c
+
+ vendor.id usb 0x03f0
+&device.id usb 0x1151
++device.name 750xi Printer/Scanner/Copier
+
+ vendor.id usb 0x03f0
+&device.id usb 0x1204
++device.name DeskJet 930c
+
+ vendor.id usb 0x03f0
+&device.id usb 0x2004
++device.name DeskJet 640c
+
+ vendor.id usb 0x03f0
+&device.id usb 0x3102
++device.name PhotoSmart P1100 Printer w/ Card Reader
+
+ vendor.id usb 0x03f0
+&device.id usb 0x4102
++device.name PhotoSmart 618 Camera
+
+ vendor.id usb 0x03f0
+&device.id usb 0x6202
++device.name PhotoSmart 215 Camera
+
+ vendor.id usb 0x03f0
+&device.id usb 0x6302
++device.name PhotoSmart 318/612 Camera
+
+ vendor.id usb 0x03f0
+&device.id usb 0xefbe
++device.name NEC Picty900
+
+ vendor.id usb 0x03f0
+&device.id usb 0xbef4
++device.name NEC Picty760
+
+ vendor.id usb 0x03f0
+&device.id usb 0xf0be
++device.name NEC Picty920
+
+ vendor.id usb 0x03f0
+&device.id usb 0xf1be
++device.name NEC Picty800
+
+ vendor.id usb 0x03f1
++vendor.name Genoa Technology
+
+ vendor.id usb 0x03f2
++vendor.name Oak Technology, Inc.
+
+ vendor.id usb 0x03f3
++vendor.name Adaptec, Inc.
+
+ vendor.id usb 0x03f4
++vendor.name Diebold, Inc.
+
+ vendor.id usb 0x03f5
++vendor.name Siemens Electromechanical
+
+ vendor.id usb 0x03f8
++vendor.name Epson Imaging Technology Center
+
+ vendor.id usb 0x03f9
++vendor.name KeyTronic Corp.
+
+ vendor.id usb 0x03fb
++vendor.name OPTi Inc.
+
+ vendor.id usb 0x03fc
++vendor.name Elitegroup Computer Systems
+
+ vendor.id usb 0x03fd
++vendor.name Xilinx Inc.
+
+ vendor.id usb 0x03fe
++vendor.name Farallon Comunications
+
+ vendor.id usb 0x0400
++vendor.name National Semiconductor
+
+ vendor.id usb 0x0400
+&device.id usb 0x1000
++device.name BearPaw 1200 Scanner
+
+ vendor.id usb 0x0400
+&device.id usb 0x1001
++device.name BearPaw 2400 Scanner
+
+ vendor.id usb 0x0401
++vendor.name National Registry Inc.
+
+ vendor.id usb 0x0402
++vendor.name Acer Labs Inc.
+
+ vendor.id usb 0x0403
++vendor.name Future Technology Devices
+
+ vendor.id usb 0x0403
+&device.id usb 0x0000
++device.name H4SMK 7 Port Hub
+
+ vendor.id usb 0x0403
+&device.id usb 0x8070
++device.name 7 Port Hub
+
+ vendor.id usb 0x0403
+&device.id usb 0x8040
++device.name 4 Port Hub
+
+ vendor.id usb 0x0403
+&device.id usb 0x8370
++device.name 7 Port Hub
+
+ vendor.id usb 0x0403
+&device.id usb 0x8371
++device.name PS/2 Keyboard And Mouse
+
+ vendor.id usb 0x0403
+&device.id usb 0x8372
++device.name FT8U100AX Serial Port
+
+ vendor.id usb 0x0404
++vendor.name NCR Corp.
+
+ vendor.id usb 0x0405
++vendor.name inSilicon
+
+ vendor.id usb 0x0406
++vendor.name Fujitsu-ICL Computers
+
+ vendor.id usb 0x0407
++vendor.name Fujitsu Personal Systems, Inc.
+
+ vendor.id usb 0x0408
++vendor.name Quanta Computer Inc.
+
+ vendor.id usb 0x0409
++vendor.name NEC Systems
+
+ vendor.id usb 0x0409
+&device.id usb 0x0012
++device.name ATerm IT75DSU ISDN TA
+
+ vendor.id usb 0x0409
+&device.id usb 0x0014
++device.name Japanese Keyboard
+
+ vendor.id usb 0x0409
+&device.id usb 0x0027
++device.name MultiSync Monitor
+
+ vendor.id usb 0x0409
+&device.id usb 0x0058
++device.name USB2.0 Hub Controller
+
+ vendor.id usb 0x0409
+&device.id usb 0x55aa
++device.name Hub
+
+ vendor.id usb 0x0409
+&device.id usb 0x55ab
++device.name Hub [iMac kbd]
+
+ vendor.id usb 0x0409
+&device.id usb 0xefbe
++device.name P!cty 900 [HP DJ]
+
+ vendor.id usb 0x0409
+&device.id usb 0xf0be
++device.name P!cty 920 [HP DJ 812c]
+
+ vendor.id usb 0x040a
++vendor.name Kodak Co.
+
+ vendor.id usb 0x040a
+&device.id usb 0x0001
++device.name DVC-323
+
+ vendor.id usb 0x040a
+&device.id usb 0x0002
++device.name DVC-325
+
+ vendor.id usb 0x040a
+&device.id usb 0x0100
++device.name DC-220
+
+ vendor.id usb 0x040a
+&device.id usb 0x0110
++device.name DC-260
+
+ vendor.id usb 0x040a
+&device.id usb 0x0111
++device.name DC-265
+
+ vendor.id usb 0x040a
+&device.id usb 0x0112
++device.name DC-290
+
+ vendor.id usb 0x040a
+&device.id usb 0x0120
++device.name DC-240
+
+ vendor.id usb 0x040a
+&device.id usb 0x0121
++device.name DC-240 (PTP firmware)
+
+ vendor.id usb 0x040a
+&device.id usb 0x0130
++device.name DC-280
+
+ vendor.id usb 0x040a
+&device.id usb 0x0131
++device.name DC-5000
+
+ vendor.id usb 0x040a
+&device.id usb 0x0132
++device.name DC-3400
+
+ vendor.id usb 0x040a
+&device.id usb 0x0140
++device.name DC-4800
+
+ vendor.id usb 0x040a
+&device.id usb 0x0300
++device.name EZ-200
+
+ vendor.id usb 0x040a
+&device.id usb 0x0400
++device.name MC3
+
+ vendor.id usb 0x040b
++vendor.name Weltrend Semiconductor
+
+ vendor.id usb 0x040c
++vendor.name VTech Computers Ltd.
+
+ vendor.id usb 0x040d
++vendor.name VIA Technologies, Inc.
+
+ vendor.id usb 0x040e
++vendor.name MCCI
+
+ vendor.id usb 0x040f
++vendor.name Echo Speech Corp.
+
+ vendor.id usb 0x0411
++vendor.name Melco, Inc.
+
+ vendor.id usb 0x0411
+&device.id usb 0x0001
++device.name LUA-TX Ethernet [pegasus]
+
+ vendor.id usb 0x0412
++vendor.name Award Software International
+
+ vendor.id usb 0x0413
++vendor.name Leadtek Research Inc.
+
+ vendor.id usb 0x0414
++vendor.name Giga-Byte Technology Co., Ltd.
+
+ vendor.id usb 0x0416
++vendor.name Winbond Electronics Corp.
+
+ vendor.id usb 0x0416
+&device.id usb 0x0961
++device.name AVL Flash Card Reader
+
+ vendor.id usb 0x0416
+&device.id usb 0x5518
++device.name Hub
+
+ vendor.id usb 0x0416
+&device.id usb 0x551a
++device.name PC Sync Keypad
+
+ vendor.id usb 0x0416
+&device.id usb 0x551b
++device.name PC Async Keypad
+
+ vendor.id usb 0x0416
+&device.id usb 0x551c
++device.name Sync Tenkey
+
+ vendor.id usb 0x0416
+&device.id usb 0x551d
++device.name Async Tenkey
+
+ vendor.id usb 0x0416
+&device.id usb 0x551e
++device.name Keyboard
+
+ vendor.id usb 0x0416
+&device.id usb 0x551f
++device.name Keyboard w/ Sys and Media
+
+ vendor.id usb 0x0416
+&device.id usb 0x5521
++device.name Keyboard
+
+ vendor.id usb 0x0416
+&device.id usb 0x6481
++device.name 16-bit Scanner
+
+ vendor.id usb 0x0417
++vendor.name Symbios Logic
+
+ vendor.id usb 0x0418
++vendor.name AST Research
+
+ vendor.id usb 0x0419
++vendor.name Samsung Info. Systems America Inc.
+
+ vendor.id usb 0x041a
++vendor.name Phoenix Technologies, Ltd.
+
+ vendor.id usb 0x041b
++vendor.name d'TV
+
+ vendor.id usb 0x041d
++vendor.name S3, Inc.
+
+ vendor.id usb 0x041e
++vendor.name Creative Labs
+
+ vendor.id usb 0x041e
+&device.id usb 0x1002
++device.name Nomad II MP3 Player
+
+ vendor.id usb 0x041e
+&device.id usb 0x1003
++device.name Blaster GamePad Cobra
+
+ vendor.id usb 0x041e
+&device.id usb 0x1050
++device.name GamePad Cobra
+
+ vendor.id usb 0x041e
+&device.id usb 0x4003
++device.name VideoBlaster WebCam Go Plus [W9967CF]
+
+ vendor.id usb 0x041e
+&device.id usb 0x4004
++device.name Nomad II MG MP3 Player
+
+ vendor.id usb 0x041e
+&device.id usb 0x400a
++device.name PC-Cam 300
+
+ vendor.id usb 0x041e
+&device.id usb 0x400b
++device.name PC-Cam 600
+
+ vendor.id usb 0x041e
+&device.id usb 0x400c
++device.name WebCam 5 [pwc]
+
+ vendor.id usb 0x041f
++vendor.name LCS Telegraphics
+
+ vendor.id usb 0x0420
++vendor.name Chips and Technologies
+
+ vendor.id usb 0x0421
++vendor.name Nokia Mobile Phones
+
+ vendor.id usb 0x0422
++vendor.name ADI Systems Inc.
+
+ vendor.id usb 0x0423
++vendor.name Computer Access Technology Corp.
+
+ vendor.id usb 0x0423
+&device.id usb 0x000a
++device.name NetMate Ethernet
+
+ vendor.id usb 0x0423
+&device.id usb 0x000c
++device.name NetMate2 Ethernet
+
+ vendor.id usb 0x0423
+&device.id usb 0x000d
++device.name USB Chief Analyzer
+
+ vendor.id usb 0x0423
+&device.id usb 0x1237
++device.name Andromeda Hub
+
+ vendor.id usb 0x0424
++vendor.name Standard Microsystems Corp.
+
+ vendor.id usb 0x0425
++vendor.name Motorola Semiconductors HK, Ltd.
+
+ vendor.id usb 0x0426
++vendor.name Integrated Device Technology
+
+ vendor.id usb 0x0427
++vendor.name Motorola Electronics Taiwan Ltd.
+
+ vendor.id usb 0x0428
++vendor.name Advanced Gravis Computer Tech. Ltd.
+
+ vendor.id usb 0x0428
+&device.id usb 0x4001
++device.name GamePad Pro
+
+ vendor.id usb 0x0429
++vendor.name Cirrus Logic
+
+ vendor.id usb 0x042a
++vendor.name Ericsson Austrian, AG
+
+ vendor.id usb 0x042b
++vendor.name Intel Corp.
+
+ vendor.id usb 0x042c
++vendor.name Innovative Semiconductors, Inc.
+
+ vendor.id usb 0x042d
++vendor.name Micronics
+
+ vendor.id usb 0x042e
++vendor.name Acer, Inc.
+
+ vendor.id usb 0x042f
++vendor.name Molex, Inc.
+
+ vendor.id usb 0x0430
++vendor.name Sun Microsystems
+
+ vendor.id usb 0x0430
+&device.id usb 0x0005
++device.name Type 6 Keyboard
+
+ vendor.id usb 0x0430
+&device.id usb 0x0100
++device.name 3-button Mouse
+
+ vendor.id usb 0x0431
++vendor.name Itac Systems, Inc.
+
+ vendor.id usb 0x0432
++vendor.name Unisys Corp.
+
+ vendor.id usb 0x0433
++vendor.name Alps Electric Inc.
+
+ vendor.id usb 0x0433
+&device.id usb 0x1101
++device.name IBM Game Controller
+
+ vendor.id usb 0x0434
++vendor.name Samsung Info. Systems America Inc.
+
+ vendor.id usb 0x0435
++vendor.name Hyundai Electronics America
+
+ vendor.id usb 0x0436
++vendor.name Taugagreining HF
+
+ vendor.id usb 0x0437
++vendor.name Framatome Connectors USA
+
+ vendor.id usb 0x0438
++vendor.name Advanced Micro Devices
+
+ vendor.id usb 0x0439
++vendor.name Voice Technologies Group
+
+ vendor.id usb 0x043d
++vendor.name Lexmark International Inc.
+
+ vendor.id usb 0x043d
+&device.id usb 0x0002
++device.name Optra E310 Printer
+
+ vendor.id usb 0x043d
+&device.id usb 0x0009
++device.name Optra S2450 Printer
+
+ vendor.id usb 0x043d
+&device.id usb 0x000c
++device.name Optra E312 Printer
+
+ vendor.id usb 0x043d
+&device.id usb 0x0017
++device.name Z32 printer
+
+ vendor.id usb 0x043d
+&device.id usb 0x0018
++device.name Z52 Printer
+
+ vendor.id usb 0x043d
+&device.id usb 0x0020
++device.name Z51 Printer
+
+ vendor.id usb 0x043d
+&device.id usb 0x003d
++device.name X83 Scan/Print/Copy
+
+ vendor.id usb 0x043e
++vendor.name LG Electronics USA Inc.
+
+ vendor.id usb 0x043e
+&device.id usb 0x42bd
++device.name Flatron 795FT Plus Monitor
+
+ vendor.id usb 0x043e
+&device.id usb 0x7001
++device.name MF-PD100 Soul Digital MP3 Player
+
+ vendor.id usb 0x043e
+&device.id usb 0x8484
++device.name LPC-U30 Webcam II
+
+ vendor.id usb 0x043e
+&device.id usb 0x8585
++device.name LPC-UC35 Webcam
+
+ vendor.id usb 0x043f
++vendor.name RadiSys Corp.
+
+ vendor.id usb 0x0440
++vendor.name Eizo Nanao Corp.
+
+ vendor.id usb 0x0441
++vendor.name Winbond Systems Lab.
+
+ vendor.id usb 0x0441
+&device.id usb 0x1456
++device.name Hub
+
+ vendor.id usb 0x0442
++vendor.name Ericsson Inc.
+
+ vendor.id usb 0x0443
++vendor.name Gateway 2000
+
+ vendor.id usb 0x0445
++vendor.name Lucent Technologies
+
+ vendor.id usb 0x0446
++vendor.name NMB Technologies, Inc.
+
+ vendor.id usb 0x0447
++vendor.name Momentum Microsystems
+
+ vendor.id usb 0x044a
++vendor.name Shamrock Tech. Co., Ltd.
+
+ vendor.id usb 0x044b
++vendor.name WSI
+
+ vendor.id usb 0x044c
++vendor.name CCL/ITRI
+
+ vendor.id usb 0x044d
++vendor.name Siemens Nixdorf
+
+ vendor.id usb 0x044e
++vendor.name Alps Electric Co.
+
+ vendor.id usb 0x044e
+&device.id usb 0x2002
++device.name MD-5500 Printer
+
+ vendor.id usb 0x044f
++vendor.name ThrustMaster, Inc.
+
+ vendor.id usb 0x044f
+&device.id usb 0xa0a3
++device.name Fusion Digital GamePad
+
+ vendor.id usb 0x044f
+&device.id usb 0xb300
++device.name Firestorm Dual Power
+
+ vendor.id usb 0x0450
++vendor.name DFI Inc.
+
+ vendor.id usb 0x0451
++vendor.name Texas Instruments
+
+ vendor.id usb 0x0451
+&device.id usb 0x1428
++device.name Hub
+
+ vendor.id usb 0x0451
+&device.id usb 0x1446
++device.name TUSB2040/2070 Hub
+
+ vendor.id usb 0x0451
+&device.id usb 0x2036
++device.name TUSB2036 Hub
+
+ vendor.id usb 0x0451
+&device.id usb 0x2046
++device.name TUSB2046 Hub
+
+ vendor.id usb 0x0451
+&device.id usb 0x2077
++device.name TUSB2077 Hub
+
+ vendor.id usb 0x0451
+&device.id usb 0xe001
++device.name GraphLink
+
+ vendor.id usb 0x0452
++vendor.name Mitsubishi Electronics America, Inc.
+
+ vendor.id usb 0x0453
++vendor.name CMD Technology
+
+ vendor.id usb 0x0454
++vendor.name Vobis Microcomputer AG
+
+ vendor.id usb 0x0455
++vendor.name Telematics International, Inc.
+
+ vendor.id usb 0x0456
++vendor.name Analog Devices, Inc.
+
+ vendor.id usb 0x0457
++vendor.name Silicon Integrated Systems Corp.
+
+ vendor.id usb 0x0458
++vendor.name KYE Systems Corp.(Mouse Systems)
+
+ vendor.id usb 0x0458
+&device.id usb 0x0001
++device.name Mouse
+
+ vendor.id usb 0x0458
+&device.id usb 0x0002
++device.name Genius NetMouse Pro
+
+ vendor.id usb 0x0458
+&device.id usb 0x0003
++device.name Genius NetScroll+
+
+ vendor.id usb 0x0458
+&device.id usb 0x0100
++device.name EasyPen Tablet
+
+ vendor.id usb 0x0458
+&device.id usb 0x0101
++device.name CueCat
+
+ vendor.id usb 0x0458
+&device.id usb 0x1003
++device.name Genius VideoCam
+
+ vendor.id usb 0x0458
+&device.id usb 0x1004
++device.name Flight2000 F-23 Joystick
+
+ vendor.id usb 0x0458
+&device.id usb 0x2001
++device.name ColorPage-Vivid Pro Scanner
+
+ vendor.id usb 0x0459
++vendor.name Adobe Systems, Inc.
+
+ vendor.id usb 0x045a
++vendor.name Diamond Multimedia Systems
+
+ vendor.id usb 0x045a
+&device.id usb 0x0b4a
++device.name SupraMax 2890 56K Modem [Lucent Atlas]
+
+ vendor.id usb 0x045a
+&device.id usb 0x0b68
++device.name SupraMax 56K Modem
+
+ vendor.id usb 0x045b
++vendor.name Hitachi, Ltd.
+
+ vendor.id usb 0x045d
++vendor.name Nortel Networks
+
+ vendor.id usb 0x045e
++vendor.name Microsoft Corp.
+
+ vendor.id usb 0x045e
+&device.id usb 0x0008
++device.name SideWinder Precision Pro
+
+ vendor.id usb 0x045e
+&device.id usb 0x0009
++device.name IntelliMouse
+
+ vendor.id usb 0x045e
+&device.id usb 0x000b
++device.name Natural Keyboard Elite
+
+ vendor.id usb 0x045e
+&device.id usb 0x0014
++device.name Digital Sound System 80
+
+ vendor.id usb 0x045e
+&device.id usb 0x001a
++device.name SideWinder Precision Racing Wheel
+
+ vendor.id usb 0x045e
+&device.id usb 0x001b
++device.name SideWinder Force Feedback 2 Joystick
+
+ vendor.id usb 0x045e
+&device.id usb 0x001d
++device.name Natural Keyboard Pro
+
+ vendor.id usb 0x045e
+&device.id usb 0x001e
++device.name IntelliMouse Explorer
+
+ vendor.id usb 0x045e
+&device.id usb 0x0024
++device.name Trackball Explorer
+
+ vendor.id usb 0x045e
+&device.id usb 0x0025
++device.name IntelliEye Mouse
+
+ vendor.id usb 0x045e
+&device.id usb 0x0026
++device.name SideWinder GamePad Pro
+
+ vendor.id usb 0x045e
+&device.id usb 0x0027
++device.name SideWinder PnP GamePad
+
+ vendor.id usb 0x045e
+&device.id usb 0x0028
++device.name SideWinder Dual Strike
+
+ vendor.id usb 0x045e
+&device.id usb 0x0029
++device.name IntelliMouse Optical
+
+ vendor.id usb 0x045e
+&device.id usb 0x002b
++device.name Internet Keyboard Pro
+
+ vendor.id usb 0x045e
+&device.id usb 0x0034
++device.name SideWinder Force Feedback Wheel
+
+ vendor.id usb 0x045e
+&device.id usb 0x0033
++device.name Sidewinder Strategic Commander
+
+ vendor.id usb 0x045e
+&device.id usb 0x0038
++device.name SideWinder Precision 2
+
+ vendor.id usb 0x045e
+&device.id usb 0x0039
++device.name IntelliMouse Optical
+
+ vendor.id usb 0x045e
+&device.id usb 0x003b
++device.name SideWinder Game Voice
+
+ vendor.id usb 0x045e
+&device.id usb 0x003c
++device.name SideWinder Joystick
+
+ vendor.id usb 0x045e
+&device.id usb 0x0040
++device.name Wheel Mouse Optical
+
+ vendor.id usb 0x0460
++vendor.name Ace Cad Enterprise Co., Ltd.
+
+ vendor.id usb 0x0461
++vendor.name Primax Electronics
+
+ vendor.id usb 0x0461
+&device.id usb 0x0300
++device.name G2-300 Scanner
+
+ vendor.id usb 0x0461
+&device.id usb 0x0301
++device.name G2E-300 Scanner
+
+ vendor.id usb 0x0461
+&device.id usb 0x0302
++device.name G2-300 #2 Scanner
+
+ vendor.id usb 0x0461
+&device.id usb 0x0303
++device.name G2E-300 #2 Scanner
+
+ vendor.id usb 0x0461
+&device.id usb 0x0340
++device.name Colorado 9600 Scanner
+
+ vendor.id usb 0x0461
+&device.id usb 0x0341
++device.name Colorado 600u Scanner
+
+ vendor.id usb 0x0461
+&device.id usb 0x0346
++device.name Memorex Maxx 6136u Scanner
+
+ vendor.id usb 0x0461
+&device.id usb 0x0347
++device.name Visioneer 4400 Scanner
+
+ vendor.id usb 0x0461
+&device.id usb 0x0360
++device.name Colorado 19200 Scanner
+
+ vendor.id usb 0x0461
+&device.id usb 0x0361
++device.name Colorado 1200u Scanner
+
+ vendor.id usb 0x0461
+&device.id usb 0x0380
++device.name G2-600 Scanner
+
+ vendor.id usb 0x0461
+&device.id usb 0x0381
++device.name ReadyScan 636i Scanner
+
+ vendor.id usb 0x0461
+&device.id usb 0x0382
++device.name G2-600 #2 Scanner
+
+ vendor.id usb 0x0461
+&device.id usb 0x0383
++device.name G2E-600 Scanner
+
+ vendor.id usb 0x0461
+&device.id usb 0x0813
++device.name IBM UltraPort Camera
+
+ vendor.id usb 0x0461
+&device.id usb 0x081a
++device.name Fujifilm IX-30 Camera
+
+ vendor.id usb 0x0461
+&device.id usb 0x4d01
++device.name Comfort Keyboard
+
+ vendor.id usb 0x0461
+&device.id usb 0x4d02
++device.name Mouse-in-a-Box
+
+ vendor.id usb 0x0461
+&device.id usb 0x4d03
++device.name Kensington Mouse-in-a-box
+
+ vendor.id usb 0x0461
+&device.id usb 0x4d04
++device.name Mouse
+
+ vendor.id usb 0x0463
++vendor.name MGE UPS Systems
+
+ vendor.id usb 0x0463
+&device.id usb 0xffff
++device.name Ellipse UPS
+
+ vendor.id usb 0x0464
++vendor.name AMP Incorporated
+
+ vendor.id usb 0x0467
++vendor.name AT&T Paradyne
+
+ vendor.id usb 0x0468
++vendor.name Wieson Electronic Co., Ltd.
+
+ vendor.id usb 0x046a
++vendor.name Cherry Mikroschalter GmbH
+
+ vendor.id usb 0x046a
+&device.id usb 0x0001
++device.name My3000 Keyboard
+
+ vendor.id usb 0x046a
+&device.id usb 0x0003
++device.name My3000 Hub
+
+ vendor.id usb 0x046b
++vendor.name American Megatrends
+
+ vendor.id usb 0x046c
++vendor.name Toshiba Corp., Digital Media Equipment
+
+ vendor.id usb 0x046d
++vendor.name Logitech Inc.
+
+ vendor.id usb 0x046d
+&device.id usb 0x0203
++device.name M2452 Keyboard
+
+ vendor.id usb 0x046d
+&device.id usb 0x0301
++device.name M4848 Mouse
+
+ vendor.id usb 0x046d
+&device.id usb 0x0401
++device.name HP PageScan
+
+ vendor.id usb 0x046d
+&device.id usb 0x0402
++device.name NEC PageScan
+
+ vendor.id usb 0x046d
+&device.id usb 0x040f
++device.name Logitech/Storm PageScan
+
+ vendor.id usb 0x046d
+&device.id usb 0x0801
++device.name QuickCam Home
+
+ vendor.id usb 0x046d
+&device.id usb 0x0810
++device.name QuickCam Pro
+
+ vendor.id usb 0x046d
+&device.id usb 0x0840
++device.name QuickCam Express
+
+ vendor.id usb 0x046d
+&device.id usb 0x0850
++device.name QuickCam Web
+
+ vendor.id usb 0x046d
+&device.id usb 0x0870
++device.name QuickCam Express
+
+ vendor.id usb 0x046d
+&device.id usb 0x08b0
++device.name QuickCam 3000 Pro [pwc]
+
+ vendor.id usb 0x046d
+&device.id usb 0x0900
++device.name ClickSmart 310
+
+ vendor.id usb 0x046d
+&device.id usb 0x0901
++device.name ClickSmart 510
+
+ vendor.id usb 0x046d
+&device.id usb 0x0950
++device.name Pocket Camera
+
+ vendor.id usb 0x046d
+&device.id usb 0xc000
++device.name N43 [Pilot Mouse]
+
+ vendor.id usb 0x046d
+&device.id usb 0xc001
++device.name N48/M-BB48 [FirstMouse Plus]
+
+ vendor.id usb 0x046d
+&device.id usb 0xc002
++device.name M-BA47 [MouseMan Plus]
+
+ vendor.id usb 0x046d
+&device.id usb 0xc004
++device.name WingMan Gaming Mouse
+
+ vendor.id usb 0x046d
+&device.id usb 0xc00b
++device.name MouseMan Wheel
+
+ vendor.id usb 0x046d
+&device.id usb 0xc00c
++device.name Optical Wheel Mouse
+
+ vendor.id usb 0x046d
+&device.id usb 0xc00e
++device.name Optical Mouse
+
+ vendor.id usb 0x046d
+&device.id usb 0xc012
++device.name Optical Mouse
+
+ vendor.id usb 0x046d
+&device.id usb 0xc030
++device.name iFeel Mouse
+
+ vendor.id usb 0x046d
+&device.id usb 0xc032
++device.name MouseMan iFeel
+
+ vendor.id usb 0x046d
+&device.id usb 0xc202
++device.name WingMan Formula
+
+ vendor.id usb 0x046d
+&device.id usb 0xc207
++device.name WingMan Extreme Digital 3D
+
+ vendor.id usb 0x046d
+&device.id usb 0xc208
++device.name WingMan Gamepad Extreme
+
+ vendor.id usb 0x046d
+&device.id usb 0xc209
++device.name WingMan Gamepad
+
+ vendor.id usb 0x046d
+&device.id usb 0xc20a
++device.name WingMan RumblePad
+
+ vendor.id usb 0x046d
+&device.id usb 0xc20c
++device.name WingMan Precision
+
+ vendor.id usb 0x046d
+&device.id usb 0xc281
++device.name WingMan Force
+
+ vendor.id usb 0x046d
+&device.id usb 0xc283
++device.name WingMan Force 3D
+
+ vendor.id usb 0x046d
+&device.id usb 0xc285
++device.name WingMan Strike Force 3D
+
+ vendor.id usb 0x046d
+&device.id usb 0xc291
++device.name WingMan Formula Force
+
+ vendor.id usb 0x046d
+&device.id usb 0xc295
++device.name Momo Force Steering Wheel
+
+ vendor.id usb 0x046d
+&device.id usb 0xc2a0
++device.name Wingman Force Feedback Mouse
+
+ vendor.id usb 0x046d
+&device.id usb 0xc308
++device.name Internet Navigator Keyboard
+
+ vendor.id usb 0x046d
+&device.id usb 0xc401
++device.name TrackMan Marble Wheel
+
+ vendor.id usb 0x046d
+&device.id usb 0xc501
++device.name Cordless Mouse Receiver
+
+ vendor.id usb 0x046d
+&device.id usb 0xc503
++device.name Cordless Mouse+Keyboard Receiver
+
+ vendor.id usb 0x046d
+&device.id usb 0xc504
++device.name Cordless Mouse+Keyboard Receiver
+
+ vendor.id usb 0x046d
+&device.id usb 0xd001
++device.name QuickCam Pro
+
+ vendor.id usb 0x046e
++vendor.name Behavior Tech. Computer
+
+ vendor.id usb 0x046e
+&device.id usb 0x6782
++device.name BTC 7932 mouse+keyboard
+
+ vendor.id usb 0x046f
++vendor.name Crystal Semiconductor
+
+ vendor.id usb 0x0471
++vendor.name Philips
+
+ vendor.id usb 0x0471
+&device.id usb 0x0101
++device.name DSS350 Digital Speaker System
+
+ vendor.id usb 0x0471
+&device.id usb 0x0104
++device.name DSS330 Digital Speaker System [uda1321]
+
+ vendor.id usb 0x0471
+&device.id usb 0x0201
++device.name Hub
+
+ vendor.id usb 0x0471
+&device.id usb 0x0222
++device.name Creative Nomad Jukebox
+
+ vendor.id usb 0x0471
+&device.id usb 0x0302
++device.name PCA645VC WebCam [pwc]
+
+ vendor.id usb 0x0471
+&device.id usb 0x0303
++device.name PCA646VC WebCam [pwc]
+
+ vendor.id usb 0x0471
+&device.id usb 0x0304
++device.name Askey VC010 WebCam [pwc]
+
+ vendor.id usb 0x0471
+&device.id usb 0x0307
++device.name PCVC675K WebCam [pwc]
+
+ vendor.id usb 0x0471
+&device.id usb 0x0308
++device.name PCVC680K WebCam [pwc]
+
+ vendor.id usb 0x0471
+&device.id usb 0x030c
++device.name PCVC690K WebCam [pwc]
+
+ vendor.id usb 0x0471
+&device.id usb 0x0310
++device.name PCVC730K WebCam [pwc]
+
+ vendor.id usb 0x0471
+&device.id usb 0x0311
++device.name PCVC740K ToUcam Pro [pwc]
+
+ vendor.id usb 0x0471
+&device.id usb 0x0312
++device.name PCVC750K WebCam [pwc]
+
+ vendor.id usb 0x0471
+&device.id usb 0x0471
++device.name Digital Speaker System
+
+ vendor.id usb 0x0471
+&device.id usb 0x0601
++device.name OVU1020 IR Dongle (Kbd+Mouse)
+
+ vendor.id usb 0x0471
+&device.id usb 0x0701
++device.name 150P1 TFT Display
+
+ vendor.id usb 0x0471
+&device.id usb 0x1801
++device.name Diva MP3 player
+
+ vendor.id usb 0x0472
++vendor.name Chicony
+
+ vendor.id usb 0x0472
+&device.id usb 0x0065
++device.name PFU-65 Keyboard
+
+ vendor.id usb 0x0473
++vendor.name Sanyo Information Business Co., Ltd.
+
+ vendor.id usb 0x0474
++vendor.name Sanyo Electric Co. Ltd.
+
+ vendor.id usb 0x0475
++vendor.name Relisys/Teco Information System
+
+ vendor.id usb 0x0476
++vendor.name AESP
+
+ vendor.id usb 0x0477
++vendor.name Seagate Technology
+
+ vendor.id usb 0x0478
++vendor.name Connectix Corp.
+
+ vendor.id usb 0x0478
+&device.id usb 0x0001
++device.name QuickCam
+
+ vendor.id usb 0x0478
+&device.id usb 0x0002
++device.name QuickClip
+
+ vendor.id usb 0x0479
++vendor.name Advanced Peripheral Laboratories
+
+ vendor.id usb 0x047a
++vendor.name USAR Systems
+
+ vendor.id usb 0x047b
++vendor.name Silitek Corp.
+
+ vendor.id usb 0x047b
+&device.id usb 0x0002
++device.name Keyboard and Mouse
+
+ vendor.id usb 0x047b
+&device.id usb 0x0101
++device.name BlueTooth Keyboard and Mouse
+
+ vendor.id usb 0x047b
+&device.id usb 0x1002
++device.name HP ScanJet 4300c Parallel Port
+
+ vendor.id usb 0x047c
++vendor.name Dell Computer Corp.
+
+ vendor.id usb 0x047d
++vendor.name Kensington
+
+ vendor.id usb 0x047d
+&device.id usb 0x1003
++device.name Orbit TrackBall
+
+ vendor.id usb 0x047d
+&device.id usb 0x1005
++device.name TurboBall
+
+ vendor.id usb 0x047d
+&device.id usb 0x5002
++device.name VideoCam CABO II
+
+ vendor.id usb 0x047d
+&device.id usb 0x5003
++device.name VideoCam
+
+ vendor.id usb 0x047d
+&device.id usb 0x4006
++device.name Gravis Eliminator AfterShock
+
+ vendor.id usb 0x047d
+&device.id usb 0x4005
++device.name Gravis Eliminator GamePad Pro
+
+ vendor.id usb 0x047d
+&device.id usb 0x4008
++device.name Gravis Destroyer TiltPad
+
+ vendor.id usb 0x047e
++vendor.name Agere (Lucent)
+
+ vendor.id usb 0x047e
+&device.id usb 0x1001
++device.name USS720 Parallel Port
+
+ vendor.id usb 0x047e
+&device.id usb 0xf101
++device.name Atlas Modem
+
+ vendor.id usb 0x047f
++vendor.name Plantronics, Inc.
+
+ vendor.id usb 0x0480
++vendor.name Toshiba America Info. Systems, Inc.
+
+ vendor.id usb 0x0481
++vendor.name Zenith Data Systems
+
+ vendor.id usb 0x0482
++vendor.name Kyocera Electronics, Inc.
+
+ vendor.id usb 0x0483
++vendor.name SGS Thomson Microelectronics
+
+ vendor.id usb 0x0483
+&device.id usb 0x7554
++device.name 56k SoftModem
+
+ vendor.id usb 0x0484
++vendor.name Specialix
+
+ vendor.id usb 0x0485
++vendor.name Nokia Monitors
+
+ vendor.id usb 0x0486
++vendor.name ASUS Computers Inc.
+
+ vendor.id usb 0x0487
++vendor.name Stewart Connector
+
+ vendor.id usb 0x0488
++vendor.name Cirque Corp.
+
+ vendor.id usb 0x0489
++vendor.name Foxconn / Hon Hai
+
+ vendor.id usb 0x0489
+&device.id usb 0x0502
++device.name SmartMedia Card Reader Firmware Loader
+
+ vendor.id usb 0x0489
+&device.id usb 0x0503
++device.name SmartMedia Card Reader
+
+ vendor.id usb 0x048a
++vendor.name S-MOS Systems, Inc.
+
+ vendor.id usb 0x048c
++vendor.name Alps Electric Ireland Ltd.
+
+ vendor.id usb 0x048d
++vendor.name Integrated Technology Express
+
+ vendor.id usb 0x048f
++vendor.name Eicon Tech.
+
+ vendor.id usb 0x0490
++vendor.name United Microelectronics Corp.
+
+ vendor.id usb 0x0491
++vendor.name Capetronic
+
+ vendor.id usb 0x0492
++vendor.name Samsung SemiConductor, Inc.
+
+ vendor.id usb 0x0493
++vendor.name MAG Technology Co., Ltd.
+
+ vendor.id usb 0x0495
++vendor.name ESS Technology, Inc.
+
+ vendor.id usb 0x0496
++vendor.name Micron Electronics
+
+ vendor.id usb 0x0497
++vendor.name Smile International
+
+ vendor.id usb 0x0498
++vendor.name Capetronic (Kaohsiung) Corp.
+
+ vendor.id usb 0x0499
++vendor.name Yamaha Corp.
+
+ vendor.id usb 0x0499
+&device.id usb 0x6001
++device.name CRW2200UX Lightspeed 2 External CD-RW Drive
+
+ vendor.id usb 0x049a
++vendor.name Gandalf Technologies Ltd.
+
+ vendor.id usb 0x049b
++vendor.name Curtis Computer Products
+
+ vendor.id usb 0x049c
++vendor.name Acer Advanced Labs, Inc.
+
+ vendor.id usb 0x049c
+&device.id usb 0x0002
++device.name Keyboard (???)
+
+ vendor.id usb 0x049d
++vendor.name VLSI Technology
+
+ vendor.id usb 0x049f
++vendor.name Compaq Computer Corp.
+
+ vendor.id usb 0x049f
+&device.id usb 0x0003
++device.name iPAQ PocketPC
+
+ vendor.id usb 0x049f
+&device.id usb 0x000e
++device.name Internet Keyboard
+
+ vendor.id usb 0x049f
+&device.id usb 0x0018
++device.name PA-1/PA-2 MP3 Player
+
+ vendor.id usb 0x049f
+&device.id usb 0x0033
++device.name Evo N600c Builtin Wireless Ethernet [orinoco]
+
+ vendor.id usb 0x049f
+&device.id usb 0x505a
++device.name SA-11x0 based Linux Device, or Itsy (experimental)
+
+ vendor.id usb 0x049f
+&device.id usb 0x8511
++device.name iPAQ Networking 10/100 Ethernet [pegasus2]
+
+ vendor.id usb 0x04a0
++vendor.name Digital Equipment Corp.
+
+ vendor.id usb 0x04a1
++vendor.name SystemSoft Corp.
+
+ vendor.id usb 0x04a2
++vendor.name FirePower Systems
+
+ vendor.id usb 0x04a3
++vendor.name Trident Microsystems Inc.
+
+ vendor.id usb 0x04a4
++vendor.name Hitachi, Ltd.
+
+ vendor.id usb 0x04a5
++vendor.name Acer Peripherals Inc.
+
+ vendor.id usb 0x04a5
+&device.id usb 0x0001
++device.name Keyboard
+
+ vendor.id usb 0x04a5
+&device.id usb 0x12a6
++device.name AcerScan C310U
+
+ vendor.id usb 0x04a5
+&device.id usb 0x1a20
++device.name Prisa 310U
+
+ vendor.id usb 0x04a5
+&device.id usb 0x1a2a
++device.name Prisa 620U
+
+ vendor.id usb 0x04a5
+&device.id usb 0x2022
++device.name Prisa 320U/340U
+
+ vendor.id usb 0x04a5
+&device.id usb 0x2040
++device.name Prisa 620UT
+
+ vendor.id usb 0x04a5
+&device.id usb 0x2060
++device.name Prisa 620U+/640U
+
+ vendor.id usb 0x04a5
+&device.id usb 0x207e
++device.name Prisa 640BU
+
+ vendor.id usb 0x04a5
+&device.id usb 0x20b0
++device.name S2W 3300U/4300U
+
+ vendor.id usb 0x04a5
+&device.id usb 0x20be
++device.name Prisa 640BT
+
+ vendor.id usb 0x04a5
+&device.id usb 0x20c0
++device.name Prisa 1240UT
+
+ vendor.id usb 0x04a5
+&device.id usb 0x20de
++device.name S2W 4300U+
+
+ vendor.id usb 0x04a5
+&device.id usb 0x20fe
++device.name SW2 5300U
+
+ vendor.id usb 0x04a5
+&device.id usb 0x9213
++device.name Kbd Hub
+
+ vendor.id usb 0x04a6
++vendor.name Nokia Display Products
+
+ vendor.id usb 0x04a7
++vendor.name Visioneer
+
+ vendor.id usb 0x04a7
+&device.id usb 0x0211
++device.name OneTouch 7600 Scanner
+
+ vendor.id usb 0x04a7
+&device.id usb 0x0221
++device.name OneTouch 5300 Scanner
+
+ vendor.id usb 0x04a7
+&device.id usb 0x0224
++device.name Microtek Scanport 3000
+
+ vendor.id usb 0x04a7
+&device.id usb 0x0231
++device.name 6100 Scanner
+
+ vendor.id usb 0x04a7
+&device.id usb 0x0311
++device.name 6200 EPP/USB Scanner
+
+ vendor.id usb 0x04a7
+&device.id usb 0x0321
++device.name OneTouch 8100 EPP/USB Scanner
+
+ vendor.id usb 0x04a7
+&device.id usb 0x0331
++device.name OneTouch 8600 EPP/USB Scanner
+
+ vendor.id usb 0x04a8
++vendor.name Multivideo Labs, Inc.
+
+ vendor.id usb 0x04a9
++vendor.name Canon Inc.
+
+ vendor.id usb 0x04a9
+&device.id usb 0x1051
++device.name BJC-3000 Color Printer
+
+ vendor.id usb 0x04a9
+&device.id usb 0x1056
++device.name BJC-2110 Color Printer
+
+ vendor.id usb 0x04a9
+&device.id usb 0x105b
++device.name S600 Printer
+
+ vendor.id usb 0x04a9
+&device.id usb 0x105d
++device.name S450 Printer
+
+ vendor.id usb 0x04a9
+&device.id usb 0x1062
++device.name S500 Printer
+
+ vendor.id usb 0x04a9
+&device.id usb 0x1064
++device.name S300 Printer
+
+ vendor.id usb 0x04a9
+&device.id usb 0x2204
++device.name CanoScan FB630U
+
+ vendor.id usb 0x04a9
+&device.id usb 0x2205
++device.name CanoScan FB1210U
+
+ vendor.id usb 0x04a9
+&device.id usb 0x2206
++device.name CanoScan N650U
+
+ vendor.id usb 0x04a9
+&device.id usb 0x2207
++device.name CanoScan 1220U
+
+ vendor.id usb 0x04a9
+&device.id usb 0x2208
++device.name CanoScan D660U
+
+ vendor.id usb 0x04a9
+&device.id usb 0x220d
++device.name CanoScan N670U
+
+ vendor.id usb 0x04a9
+&device.id usb 0x3041
++device.name PowerShot S10
+
+ vendor.id usb 0x04a9
+&device.id usb 0x3043
++device.name PowerShot S20
+
+ vendor.id usb 0x04a9
+&device.id usb 0x3045
++device.name PowerShot S100
+
+ vendor.id usb 0x04a9
+&device.id usb 0x3047
++device.name Digital IXUS
+
+ vendor.id usb 0x04a9
+&device.id usb 0x3048
++device.name PowerShot G1
+
+ vendor.id usb 0x04a9
+&device.id usb 0x3049
++device.name PowerShot Pro90 IS
+
+ vendor.id usb 0x04a9
+&device.id usb 0x304b
++device.name IXY Digital 300
+
+ vendor.id usb 0x04a9
+&device.id usb 0x304e
++device.name PowerShot A20
+
+ vendor.id usb 0x04a9
+&device.id usb 0x304f
++device.name PowerShot A10
+
+ vendor.id usb 0x04a9
+&device.id usb 0x3056
++device.name PowerShot S40
+
+ vendor.id usb 0x04a9
+&device.id usb 0x3058
++device.name PowerShot A40
+
+ vendor.id usb 0x04aa
++vendor.name DaeWoo Telecom, Ltd.
+
+ vendor.id usb 0x04ab
++vendor.name Chromatic Research
+
+ vendor.id usb 0x04ac
++vendor.name Micro Audiometrics Corp.
+
+ vendor.id usb 0x04ad
++vendor.name Dooin Electronics
+
+ vendor.id usb 0x04af
++vendor.name Winnov L.P.
+
+ vendor.id usb 0x04b0
++vendor.name Nikon Corp.
+
+ vendor.id usb 0x04b0
+&device.id usb 0x0102
++device.name Coolpix 990
+
+ vendor.id usb 0x04b0
+&device.id usb 0x0103
++device.name Coolpix 880
+
+ vendor.id usb 0x04b0
+&device.id usb 0x0104
++device.name Coolpix 995
+
+ vendor.id usb 0x04b0
+&device.id usb 0x0106
++device.name Coolpix 775
+
+ vendor.id usb 0x04b0
+&device.id usb 0x0107
++device.name Coolpix 5000
+
+ vendor.id usb 0x04b1
++vendor.name Pan International
+
+ vendor.id usb 0x04b3
++vendor.name IBM Corp.
+
+ vendor.id usb 0x04b3
+&device.id usb 0x3004
++device.name Media Access Pro Keyboard
+
+ vendor.id usb 0x04b3
+&device.id usb 0x3100
++device.name NetVista Mouse
+
+ vendor.id usb 0x04b3
+&device.id usb 0x4427
++device.name Portable CD ROM
+
+ vendor.id usb 0x04b3
+&device.id usb 0x4525
++device.name Double sided CRT
+
+ vendor.id usb 0x04b3
+&device.id usb 0x4550
++device.name NVRAM (128 KB)
+
+ vendor.id usb 0x04b3
+&device.id usb 0x4554
++device.name Cash Drawer
+
+ vendor.id usb 0x04b3
+&device.id usb 0x4580
++device.name Hub w/ NVRAM
+
+ vendor.id usb 0x04b3
+&device.id usb 0x4581
++device.name 4800-2xx Hub w/ Cash Drawer
+
+ vendor.id usb 0x04b3
+&device.id usb 0x4604
++device.name Keyboard w/ Card Reader
+
+ vendor.id usb 0x04b3
+&device.id usb 0x4671
++device.name 4820 LCD w/ MSR/KB
+
+ vendor.id usb 0x04b4
++vendor.name Cypress Semiconductor
+
+ vendor.id usb 0x04b4
+&device.id usb 0x0000
++device.name Dacal DC-101 CD Library
+
+ vendor.id usb 0x04b4
+&device.id usb 0x0001
++device.name Mouse
+
+ vendor.id usb 0x04b4
+&device.id usb 0x0002
++device.name CY7C63x0x Thermometer
+
+ vendor.id usb 0x04b4
+&device.id usb 0x1002
++device.name CY7C63001 R100 FM Radio
+
+ vendor.id usb 0x04b4
+&device.id usb 0x8613
++device.name CY7C68013 EZ-USB FX2 USB 2.0 Development Kit
+
+ vendor.id usb 0x04b4
+&device.id usb 0xd5d5
++device.name CY7C63x0x Zoltrix Z-Boxer GamePad
+
+ vendor.id usb 0x04b5
++vendor.name ROHM LSI Systems, Inc.
+
+ vendor.id usb 0x04b6
++vendor.name Hint Corp.
+
+ vendor.id usb 0x04b7
++vendor.name Compal Electronics, Inc.
+
+ vendor.id usb 0x04b8
++vendor.name Seiko Epson Corp.
+
+ vendor.id usb 0x04b8
+&device.id usb 0x0001
++device.name Stylus Color 740 / Photo 750
+
+ vendor.id usb 0x04b8
+&device.id usb 0x0002
++device.name ISD Smart Cable for Mac
+
+ vendor.id usb 0x04b8
+&device.id usb 0x0003
++device.name ISD Smart Cable
+
+ vendor.id usb 0x04b8
+&device.id usb 0x0005
++device.name Stylus Printer
+
+ vendor.id usb 0x04b8
+&device.id usb 0x0101
++device.name Perfection 636
+
+ vendor.id usb 0x04b8
+&device.id usb 0x0103
++device.name Perfection 610
+
+ vendor.id usb 0x04b8
+&device.id usb 0x0104
++device.name Perfection 1200
+
+ vendor.id usb 0x04b8
+&device.id usb 0x0106
++device.name Stylus Scan 2500
+
+ vendor.id usb 0x04b8
+&device.id usb 0x0107
++device.name Expression 1600U
+
+ vendor.id usb 0x04b8
+&device.id usb 0x010a
++device.name Perfection 1640SU
+
+ vendor.id usb 0x04b8
+&device.id usb 0x010b
++device.name Perfection 1240
+
+ vendor.id usb 0x04b8
+&device.id usb 0x010c
++device.name Perfection 640
+
+ vendor.id usb 0x04b8
+&device.id usb 0x010f
++device.name Perfection 1250
+
+ vendor.id usb 0x04b8
+&device.id usb 0x0110
++device.name Perfection 1650
+
+ vendor.id usb 0x04b8
+&device.id usb 0x0202
++device.name Receipt Printer M129C
+
+ vendor.id usb 0x04b8
+&device.id usb 0x0601
++device.name Stylus Photo 875DC Card Reader
+
+ vendor.id usb 0x04b8
+&device.id usb 0x0602
++device.name Stylus Photo 895 Card Reader
+
+ vendor.id usb 0x04b9
++vendor.name Rainbow Technologies, Inc.
+
+ vendor.id usb 0x04b9
+&device.id usb 0x1000
++device.name iKey 1000 Token
+
+ vendor.id usb 0x04b9
+&device.id usb 0x1001
++device.name iKey 1200 Token
+
+ vendor.id usb 0x04b9
+&device.id usb 0x1200
++device.name iKey 2000 Token
+
+ vendor.id usb 0x04b9
+&device.id usb 0x1202
++device.name iKey 2032 Token
+
+ vendor.id usb 0x04b9
+&device.id usb 0x1300
++device.name iKey 3000 Token
+
+ vendor.id usb 0x04ba
++vendor.name Toucan Systems Ltd.
+
+ vendor.id usb 0x04bb
++vendor.name I-O Data Device, Inc.
+
+ vendor.id usb 0x04bb
+&device.id usb 0x0904
++device.name ET/TX Ethernet [pegasus]
+
+ vendor.id usb 0x04bb
+&device.id usb 0x0913
++device.name ET/TX-S Ethernet [pegasus2]
+
+ vendor.id usb 0x04bd
++vendor.name Toshiba Electronics Taiwan Corp.
+
+ vendor.id usb 0x04be
++vendor.name Telia Research AB
+
+ vendor.id usb 0x04bf
++vendor.name TDK Corp.
+
+ vendor.id usb 0x04bf
+&device.id usb 0x0100
++device.name MediaReader CF
+
+ vendor.id usb 0x04c1
++vendor.name U.S. Robotics (3Com)
+
+ vendor.id usb 0x04c1
+&device.id usb 0x0082
++device.name OfficeConnect Analog Modem
+
+ vendor.id usb 0x04c1
+&device.id usb 0x008f
++device.name Pro ISDN TA
+
+ vendor.id usb 0x04c1
+&device.id usb 0x009d
++device.name HomeConnect WebCam [vicam]
+
+ vendor.id usb 0x04c1
+&device.id usb 0x3021
++device.name 56k Voice FaxModem Pro
+
+ vendor.id usb 0x04c2
++vendor.name Methode Electronics Far East PTE Ltd.
+
+ vendor.id usb 0x04c3
++vendor.name Maxi Switch, Inc.
+
+ vendor.id usb 0x04c4
++vendor.name Lockheed Martin Energy Research
+
+ vendor.id usb 0x04c5
++vendor.name Fujitsu Ltd.
+
+ vendor.id usb 0x04c6
++vendor.name Toshiba America Electronic Components
+
+ vendor.id usb 0x04c7
++vendor.name Micro Macro Technologies
+
+ vendor.id usb 0x04c8
++vendor.name Konica Corp.
+
+ vendor.id usb 0x04c8
+&device.id usb 0x0720
++device.name Digital Color Camera
+
+ vendor.id usb 0x04c8
+&device.id usb 0x0721
++device.name e-miniD Camera
+
+ vendor.id usb 0x04c8
+&device.id usb 0x0723
++device.name KD-200Z Camera
+
+ vendor.id usb 0x04ca
++vendor.name Lite-On Technology Corp.
+
+ vendor.id usb 0x04cb
++vendor.name Fuji Photo Film Co., Ltd.
+
+ vendor.id usb 0x04cb
+&device.id usb 0x0100
++device.name FinePix 1300 / 1400 / 4700 Zoom digital camrea
+
+ vendor.id usb 0x04cb
+&device.id usb 0x0103
++device.name FinePix NX-700 printer
+
+ vendor.id usb 0x04cc
++vendor.name Philips Semiconductors
+
+ vendor.id usb 0x04cc
+&device.id usb 0x1122
++device.name Hub
+
+ vendor.id usb 0x04cc
+&device.id usb 0x8116
++device.name Camera
+
+ vendor.id usb 0x04cd
++vendor.name Tatung Co. Of America
+
+ vendor.id usb 0x04ce
++vendor.name ScanLogic Corp.
+
+ vendor.id usb 0x04ce
+&device.id usb 0x0002
++device.name SL11R-IDE IDE Bridge
+
+ vendor.id usb 0x04cf
++vendor.name Myson Technology Inc.
+
+ vendor.id usb 0x04d0
++vendor.name Digi International
+
+ vendor.id usb 0x04d1
++vendor.name ITT Canon
+
+ vendor.id usb 0x04d2
++vendor.name Altec Lansing Technologies
+
+ vendor.id usb 0x04d2
+&device.id usb 0x0311
++device.name ADA-310 Speakers
+
+ vendor.id usb 0x04d2
+&device.id usb 0xff05
++device.name ADA-305 Speakers
+
+ vendor.id usb 0x04d3
++vendor.name VidUS, Inc.
+
+ vendor.id usb 0x04d4
++vendor.name LSI Logic Corp.
+
+ vendor.id usb 0x04d5
++vendor.name Forte Technologies, Inc.
+
+ vendor.id usb 0x04d6
++vendor.name Mentor Graphics
+
+ vendor.id usb 0x04d7
++vendor.name Oki Semiconductor
+
+ vendor.id usb 0x04d8
++vendor.name Microchip Technology Inc.
+
+ vendor.id usb 0x04d9
++vendor.name Holtek Semiconductor, Inc.
+
+ vendor.id usb 0x04da
++vendor.name Panasonic (Matsushita)
+
+ vendor.id usb 0x04db
++vendor.name Hypertec Pty Ltd.
+
+ vendor.id usb 0x04dc
++vendor.name Huan Hsin Co.
+
+ vendor.id usb 0x04dd
++vendor.name Sharp Corp.
+
+ vendor.id usb 0x04dd
+&device.id usb 0x8004
++device.name Zaurus SL-5000D/SL-5500 PDA
+
+ vendor.id usb 0x04de
++vendor.name MindShare, Inc.
+
+ vendor.id usb 0x04df
++vendor.name Interlink Electronics
+
+ vendor.id usb 0x04e1
++vendor.name Iiyama North America Inc.
+
+ vendor.id usb 0x04e1
+&device.id usb 0x0201
++device.name Monitor Hub
+
+ vendor.id usb 0x04e2
++vendor.name Exar Corp.
+
+ vendor.id usb 0x04e3
++vendor.name Zilog
+
+ vendor.id usb 0x04e4
++vendor.name ACC Microelectronics
+
+ vendor.id usb 0x04e5
++vendor.name Promise Technology
+
+ vendor.id usb 0x04e6
++vendor.name Shuttle Technology Inc.
+
+ vendor.id usb 0x04e6
+&device.id usb 0x0001
++device.name E-USB ATA Bridge
+
+ vendor.id usb 0x04e6
+&device.id usb 0x0002
++device.name eUSCSI SCSI Bridge
+
+ vendor.id usb 0x04e6
+&device.id usb 0x0003
++device.name eUSB SmartMedia Card Reader
+
+ vendor.id usb 0x04e6
+&device.id usb 0x0005
++device.name eUSB SmartMedia/CompactFlash Card Reader
+
+ vendor.id usb 0x04e6
+&device.id usb 0x0006
++device.name eUSB SmartMedia Card Reader
+
+ vendor.id usb 0x04e6
+&device.id usb 0x0007
++device.name Hifd
+
+ vendor.id usb 0x04e6
+&device.id usb 0x0101
++device.name E-USB ATA Bridge
+
+ vendor.id usb 0x04e6
+&device.id usb 0x1010
++device.name USBAT-2 CompactFlash Card Reader
+
+ vendor.id usb 0x04e7
++vendor.name Elo TouchSystems
+
+ vendor.id usb 0x04e7
+&device.id usb 0x0001
++device.name TouchScreen
+
+ vendor.id usb 0x04e8
++vendor.name Samsung Electronics Co., Ltd.
+
+ vendor.id usb 0x04e8
+&device.id usb 0x5a03
++device.name Yepp MP3 Player
+
+ vendor.id usb 0x04e9
++vendor.name PC-Tel Inc.
+
+ vendor.id usb 0x04ea
++vendor.name Brooktree Corp.
+
+ vendor.id usb 0x04eb
++vendor.name Northstar Systems, Inc.
+
+ vendor.id usb 0x04ec
++vendor.name Tokyo Electron Limited
+
+ vendor.id usb 0x04ed
++vendor.name Annabooks
+
+ vendor.id usb 0x04ef
++vendor.name Pacific Electronic International, Inc.
+
+ vendor.id usb 0x04f0
++vendor.name Daewoo Electronics Co., Ltd.
+
+ vendor.id usb 0x04f1
++vendor.name Victor Company of Japan (JVC)
+
+ vendor.id usb 0x04f1
+&device.id usb 0x0001
++device.name GC-QX3 Digital Still Camera
+
+ vendor.id usb 0x04f1
+&device.id usb 0x0004
++device.name GR-DVL815U Digital Video Camera
+
+ vendor.id usb 0x04f2
++vendor.name Chicony Electronics Co., Ltd.
+
+ vendor.id usb 0x04f2
+&device.id usb 0x0001
++device.name KU-8933 Keyboard
+
+ vendor.id usb 0x04f2
+&device.id usb 0x0002
++device.name NT68P81 Keyboard
+
+ vendor.id usb 0x04f2
+&device.id usb 0x0112
++device.name KU-8933 Keyboard with PS/2 Mouse port
+
+ vendor.id usb 0x04f3
++vendor.name Elan Microelectronics Corportation
+
+ vendor.id usb 0x04f4
++vendor.name Harting Elektronik Inc.
+
+ vendor.id usb 0x04f5
++vendor.name Fujitsu-ICL Systems, Inc.
+
+ vendor.id usb 0x04f6
++vendor.name Norand Corp.
+
+ vendor.id usb 0x04f7
++vendor.name Newnex Technology Corp.
+
+ vendor.id usb 0x04f8
++vendor.name FuturePlus Systems
+
+ vendor.id usb 0x04f9
++vendor.name Brother Industries, Ltd.
+
+ vendor.id usb 0x04f9
+&device.id usb 0x0002
++device.name HL-1050 Laser Printer
+
+ vendor.id usb 0x04f9
+&device.id usb 0x0007
++device.name HL-1250 Laser Printer
+
+ vendor.id usb 0x04f9
+&device.id usb 0x0008
++device.name HL-1270 Laser Printer
+
+ vendor.id usb 0x04fa
++vendor.name Dallas Semiconductor
+
+ vendor.id usb 0x04fa
+&device.id usb 0x2490
++device.name DS1490F 2-in-1 Fob, 1-Wire adapter
+
+ vendor.id usb 0x04fa
+&device.id usb 0x4201
++device.name DS4201 Audio DAC
+
+ vendor.id usb 0x04fb
++vendor.name Biostar Microtech Int'l Corp.
+
+ vendor.id usb 0x04fc
++vendor.name Sunplus Technology Co.
+
+ vendor.id usb 0x04fd
++vendor.name Soliton Systems, K.K.
+
+ vendor.id usb 0x04fe
++vendor.name PFU Limited
+
+ vendor.id usb 0x04ff
++vendor.name E-CMOS Corp.
+
+ vendor.id usb 0x0500
++vendor.name Siam United Hi-Tech
+
+ vendor.id usb 0x0501
++vendor.name DDK Electronics, Inc.
+
+ vendor.id usb 0x0502
++vendor.name Acer, Inc.
+
+ vendor.id usb 0x0502
+&device.id usb 0xd001
++device.name Divio NW801/DVC-V6+ Digital Camera
+
+ vendor.id usb 0x0503
++vendor.name Hitachi America Ltd.
+
+ vendor.id usb 0x0504
++vendor.name Hayes Microcomputer Products
+
+ vendor.id usb 0x0506
++vendor.name 3Com Corp.
+
+ vendor.id usb 0x0506
+&device.id usb 0x03e8
++device.name 3C19250 Ethernet [klsi]
+
+ vendor.id usb 0x0506
+&device.id usb 0x4601
++device.name 3C460B USB 10/100 Ethernet Adaptor
+
+ vendor.id usb 0x0506
+&device.id usb 0xf002
++device.name 3CP4218 ADSL Modem (pre-init)
+
+ vendor.id usb 0x0506
+&device.id usb 0xf003
++device.name 3CP4218 ADSL Modem
+
+ vendor.id usb 0x0506
+&device.id usb 0xf100
++device.name 3CP4218 ADSL Modem (pre-init)
+
+ vendor.id usb 0x0507
++vendor.name Hosiden Corp.
+
+ vendor.id usb 0x0508
++vendor.name Clarion Co., Ltd.
+
+ vendor.id usb 0x0509
++vendor.name Aztech Systems Ltd.
+
+ vendor.id usb 0x050a
++vendor.name Cinch Connectors
+
+ vendor.id usb 0x050b
++vendor.name Cable System International
+
+ vendor.id usb 0x050c
++vendor.name InnoMedia, Inc.
+
+ vendor.id usb 0x050d
++vendor.name Belkin Components
+
+ vendor.id usb 0x050d
+&device.id usb 0x0103
++device.name F5U103 Serial Adapter [etek]
+
+ vendor.id usb 0x050d
+&device.id usb 0x0109
++device.name F5U109 PDA Adapter
+
+ vendor.id usb 0x050d
+&device.id usb 0x0115
++device.name SCSI Adapter
+
+ vendor.id usb 0x050d
+&device.id usb 0x0121
++device.name F5D5050 100Mbps Ethernet
+
+ vendor.id usb 0x050d
+&device.id usb 0x0208
++device.name Video Adapter [nt1004]
+
+ vendor.id usb 0x050d
+&device.id usb 0x0805
++device.name Nostromo N50 GamePad
+
+ vendor.id usb 0x050d
+&device.id usb 0x1203
++device.name F5U120-PC Serial Port
+
+ vendor.id usb 0x050e
++vendor.name Neon Technology, Inc.
+
+ vendor.id usb 0x050f
++vendor.name KC Technology Inc.
+
+ vendor.id usb 0x050f
+&device.id usb 0x0003
++device.name KC82C160S Hub
+
+ vendor.id usb 0x050f
+&device.id usb 0x0180
++device.name KC-180 IrDA Dongle
+
+ vendor.id usb 0x0510
++vendor.name Sejin Electron Inc.
+
+ vendor.id usb 0x0511
++vendor.name N'Able (DataBook) Technologies, Inc.
+
+ vendor.id usb 0x0512
++vendor.name Hualon Microelectronics Corp.
+
+ vendor.id usb 0x0513
++vendor.name digital-X, Inc.
+
+ vendor.id usb 0x0514
++vendor.name FCI/Berg Electronics Group
+
+ vendor.id usb 0x0515
++vendor.name ACTC
+
+ vendor.id usb 0x0516
++vendor.name Longwell Electronics
+
+ vendor.id usb 0x0517
++vendor.name Butterfly Communications
+
+ vendor.id usb 0x0518
++vendor.name EzKEY Corp.
+
+ vendor.id usb 0x0519
++vendor.name Star Micronics Co., Ltd.
+
+ vendor.id usb 0x051a
++vendor.name WYSE Technology
+
+ vendor.id usb 0x051b
++vendor.name Silicon Graphics
+
+ vendor.id usb 0x051c
++vendor.name Shuttle Inc.
+
+ vendor.id usb 0x051d
++vendor.name American Power Conversion
+
+ vendor.id usb 0x051d
+&device.id usb 0x0002
++device.name Back-UPS Pro 500
+
+ vendor.id usb 0x051e
++vendor.name Scientific Atlanta
+
+ vendor.id usb 0x051f
++vendor.name IO Systems (Elite Electronics), Inc.
+
+ vendor.id usb 0x0520
++vendor.name Taiwan Semiconductor Manufacturing Co.
+
+ vendor.id usb 0x0521
++vendor.name Airborn Connectors
+
+ vendor.id usb 0x0522
++vendor.name Advanced Connectek USA Inc.
+
+ vendor.id usb 0x0523
++vendor.name ATEN GmbH
+
+ vendor.id usb 0x0524
++vendor.name Sola Electronics
+
+ vendor.id usb 0x0525
++vendor.name Netchip Technology Inc.
+
+ vendor.id usb 0x0525
+&device.id usb 0x1080
++device.name NET1080 USB-USB Bridge
+
+ vendor.id usb 0x0526
++vendor.name Temic MHS S.A.
+
+ vendor.id usb 0x0527
++vendor.name ALTRA
+
+ vendor.id usb 0x0528
++vendor.name ATI Technologies, Inc.
+
+ vendor.id usb 0x0528
+&device.id usb 0x7561
++device.name TV Wonder
+
+ vendor.id usb 0x0529
++vendor.name Aladdin Knowledge Systems
+
+ vendor.id usb 0x0529
+&device.id usb 0x0001
++device.name HASP v0.06
+
+ vendor.id usb 0x0529
+&device.id usb 0x030b
++device.name eToken R1 v3.1.3.x
+
+ vendor.id usb 0x0529
+&device.id usb 0x0313
++device.name eToken R1 v3.2.3.x
+
+ vendor.id usb 0x0529
+&device.id usb 0x031b
++device.name eToken R1 v3.3.3.x
+
+ vendor.id usb 0x0529
+&device.id usb 0x0323
++device.name eToken R1 v3.4.3.x
+
+ vendor.id usb 0x0529
+&device.id usb 0x050c
++device.name eToken Pro v4.1.5.x
+
+ vendor.id usb 0x0529
+&device.id usb 0x0412
++device.name eToken R2 v2.2.4.x
+
+ vendor.id usb 0x0529
+&device.id usb 0x041a
++device.name eToken R2 v2.2.4.x
+
+ vendor.id usb 0x0529
+&device.id usb 0x0422
++device.name eToken R2 v2.4.4.x
+
+ vendor.id usb 0x0529
+&device.id usb 0x042a
++device.name eToken R2 v2.5.4.x
+
+ vendor.id usb 0x052a
++vendor.name Crescent Heart Software
+
+ vendor.id usb 0x052b
++vendor.name Tekom Technologies, Inc.
+
+ vendor.id usb 0x052c
++vendor.name Canon Information System
+
+ vendor.id usb 0x052d
++vendor.name Avid Electronics Corp.
+
+ vendor.id usb 0x052e
++vendor.name Standard Microsystems Corp.
+
+ vendor.id usb 0x052f
++vendor.name Unicore Software, Inc.
+
+ vendor.id usb 0x0530
++vendor.name American Microsystems Inc.
+
+ vendor.id usb 0x0531
++vendor.name Wacom Technology Corp.
+
+ vendor.id usb 0x0532
++vendor.name Systech Corp.
+
+ vendor.id usb 0x0533
++vendor.name Alcatel Mobile Phones
+
+ vendor.id usb 0x0534
++vendor.name Motorola
+
+ vendor.id usb 0x0535
++vendor.name LIH TZU Electric Co., Ltd.
+
+ vendor.id usb 0x0536
++vendor.name Welch Allyn Inc.
+
+ vendor.id usb 0x0537
++vendor.name Inventec Corp.
+
+ vendor.id usb 0x0538
++vendor.name Santa Cruz Operation
+
+ vendor.id usb 0x0539
++vendor.name Shyh Shiun Terminals Co. Ltd.
+
+ vendor.id usb 0x053a
++vendor.name Preh Werke GmbH & Co. KG
+
+ vendor.id usb 0x053b
++vendor.name Global Village Communication
+
+ vendor.id usb 0x053c
++vendor.name Institut of Microelectronic & Mechatronic Systems
+
+ vendor.id usb 0x053d
++vendor.name Silicon Architect
+
+ vendor.id usb 0x053e
++vendor.name Mobility Electronics
+
+ vendor.id usb 0x053f
++vendor.name Synopsys, Inc.
+
+ vendor.id usb 0x0540
++vendor.name UniAccess AB
+
+ vendor.id usb 0x0540
+&device.id usb 0x0101
++device.name Panache Surf ISDN TA
+
+ vendor.id usb 0x0541
++vendor.name Sirf Technology, Inc.
+
+ vendor.id usb 0x0543
++vendor.name ViewSonic Corp.
+
+ vendor.id usb 0x0543
+&device.id usb 0x00fe
++device.name G773 Monitor Hub
+
+ vendor.id usb 0x0543
+&device.id usb 0x00ff
++device.name P815 Monitor Hub
+
+ vendor.id usb 0x0543
+&device.id usb 0x4153
++device.name ViewSonic G773 Control (?)
+
+ vendor.id usb 0x0544
++vendor.name Cristie Electronics Ltd.
+
+ vendor.id usb 0x0545
++vendor.name Xirlink, Inc.
+
+ vendor.id usb 0x0545
+&device.id usb 0x8002
++device.name IBM NetCamera
+
+ vendor.id usb 0x0545
+&device.id usb 0x800c
++device.name Veo StingRay
+
+ vendor.id usb 0x0545
+&device.id usb 0x8080
++device.name IBM C-It WebCam
+
+ vendor.id usb 0x0546
++vendor.name Polaroid Corp.
+
+ vendor.id usb 0x0547
++vendor.name Anchor Chips Inc.
+
+ vendor.id usb 0x0547
+&device.id usb 0x2131
++device.name AN2131 EZUSB Microcontroller
+
+ vendor.id usb 0x0547
+&device.id usb 0x2235
++device.name AN2235 EZUSB-FX Microcontroller
+
+ vendor.id usb 0x0547
+&device.id usb 0x2720
++device.name AN2720 USB-USB Bridge
+
+ vendor.id usb 0x0547
+&device.id usb 0x2727
++device.name Xircom PGUNET USB-USB Bridge
+
+ vendor.id usb 0x0547
+&device.id usb 0x2810
++device.name Cypress USB ATAPI Bridge
+
+ vendor.id usb 0x0547
+&device.id usb 0x9999
++device.name AN2131 uninitialized (?)
+
+ vendor.id usb 0x0548
++vendor.name Tyan Computer Corp.
+
+ vendor.id usb 0x0549
++vendor.name Pixera Corp.
+
+ vendor.id usb 0x054a
++vendor.name Fujitsu Microelectronics, Inc.
+
+ vendor.id usb 0x054b
++vendor.name New Media Corp.
+
+ vendor.id usb 0x054c
++vendor.name Sony Corp.
+
+ vendor.id usb 0x054c
+&device.id usb 0x0010
++device.name DSC-S30/S70/S75/F505V/F505/FD92 Cybershot/Mavica Digital Camera
+
+ vendor.id usb 0x054c
+&device.id usb 0x0023
++device.name CD Writer
+
+ vendor.id usb 0x054c
+&device.id usb 0x0024
++device.name Mavica CD-1000 Camera
+
+ vendor.id usb 0x054c
+&device.id usb 0x0025
++device.name NW-MS7 Walkman MemoryStick Reader
+
+ vendor.id usb 0x054c
+&device.id usb 0x002d
++device.name MSAC-US1 MemoryStick Reader
+
+ vendor.id usb 0x054c
+&device.id usb 0x002e
++device.name Sony HandyCam MemoryStick Reader
+
+ vendor.id usb 0x054c
+&device.id usb 0x0032
++device.name MemoryStick MSC-U01 Reader
+
+ vendor.id usb 0x054c
+&device.id usb 0x0038
++device.name Clie PEG-S300/D PalmOS PDA
+
+ vendor.id usb 0x054c
+&device.id usb 0x0058
++device.name Clie PEG-N7x0C PalmOS PDA Mass Storage
+
+ vendor.id usb 0x054c
+&device.id usb 0x0066
++device.name Clie PEG-N7x0C PalmOS PDA Serial
+
+ vendor.id usb 0x054c
+&device.id usb 0x0069
++device.name Memorystick MSC-U03 Reader
+
+ vendor.id usb 0x054c
+&device.id usb 0x0099
++device.name Clie NR70 PDA Mass Storage
+
+ vendor.id usb 0x054c
+&device.id usb 0x009a
++device.name Clie NR70 PDA Serial
+
+ vendor.id usb 0x054d
++vendor.name Try Corp.
+
+ vendor.id usb 0x054e
++vendor.name Proside Corp.
+
+ vendor.id usb 0x054f
++vendor.name WYSE Technology Taiwan
+
+ vendor.id usb 0x0550
++vendor.name Fuji Xerox Co., Ltd.
+
+ vendor.id usb 0x0551
++vendor.name CompuTrend Systems, Inc.
+
+ vendor.id usb 0x0552
++vendor.name Philips Monitors
+
+ vendor.id usb 0x0553
++vendor.name VLSI Vision Ltd.
+
+ vendor.id usb 0x0553
+&device.id usb 0x0002
++device.name CPiA WebCam
+
+ vendor.id usb 0x0553
+&device.id usb 0x0202
++device.name Aiptek PenCam 1
+
+ vendor.id usb 0x0554
++vendor.name Dictaphone Corp.
+
+ vendor.id usb 0x0555
++vendor.name ANAM S&T Co., Ltd.
+
+ vendor.id usb 0x0556
++vendor.name Asahi Kasei Microsystems Co., Ltd.
+
+ vendor.id usb 0x0557
++vendor.name ATEN International Co. Ltd.
+
+ vendor.id usb 0x0557
+&device.id usb 0x2001
++device.name UC-1284 Printer Port
+
+ vendor.id usb 0x0557
+&device.id usb 0x2002
++device.name 10Mbps Ethernet [klsi]
+
+ vendor.id usb 0x0557
+&device.id usb 0x2004
++device.name UC-100KM PS/2 Mouse and Keyboard adapter
+
+ vendor.id usb 0x0557
+&device.id usb 0x2006
++device.name UC-1284B Printer Port
+
+ vendor.id usb 0x0557
+&device.id usb 0x2007
++device.name UC-110T 100Mbps Ethernet [pegasus]
+
+ vendor.id usb 0x0557
+&device.id usb 0x2008
++device.name UC-232A Serial Port [pl2303]
+
+ vendor.id usb 0x0557
+&device.id usb 0x2202
++device.name CS124U Miniview II KVM Switch
+
+ vendor.id usb 0x0557
+&device.id usb 0x2600
++device.name IDE Bridge
+
+ vendor.id usb 0x0557
+&device.id usb 0x4000
++device.name DSB-650 10Mbps Ethernet [klsi]
+
+ vendor.id usb 0x0558
++vendor.name Truevision, Inc.
+
+ vendor.id usb 0x0559
++vendor.name Cadence Design Systems, Inc.
+
+ vendor.id usb 0x055a
++vendor.name Kenwood USA
+
+ vendor.id usb 0x055b
++vendor.name KnowledgeTek, Inc.
+
+ vendor.id usb 0x055c
++vendor.name Proton Electronic Ind.
+
+ vendor.id usb 0x055d
++vendor.name Samsung Electro-Mechanics Co.
+
+ vendor.id usb 0x055d
+&device.id usb 0x9000
++device.name AnyCam [pwc]
+
+ vendor.id usb 0x055d
+&device.id usb 0x9001
++device.name MPC-C30 AnyCam Premium for Notebooks [pwc]
+
+ vendor.id usb 0x055e
++vendor.name CTX Opto-Electronics Corp.
+
+ vendor.id usb 0x055f
++vendor.name Mustek Systems Inc.
+
+ vendor.id usb 0x055f
+&device.id usb 0x0001
++device.name ScanExpress 1200 CU
+
+ vendor.id usb 0x055f
+&device.id usb 0x0002
++device.name ScanExpress 600 CU
+
+ vendor.id usb 0x055f
+&device.id usb 0x0003
++device.name ScanExpress 1200 USB
+
+ vendor.id usb 0x055f
+&device.id usb 0x0006
++device.name ScanExpress 1200 UB
+
+ vendor.id usb 0x055f
+&device.id usb 0x0008
++device.name ScanExpress 1200 CU Plus
+
+ vendor.id usb 0x055f
+&device.id usb 0x0218
++device.name BearPaw 2400 TA
+
+ vendor.id usb 0x055f
+&device.id usb 0xa800
++device.name MDC 800 Camera
+
+ vendor.id usb 0x0560
++vendor.name Interface Co., Ltd.
+
+ vendor.id usb 0x0561
++vendor.name Oasis Design, Inc.
+
+ vendor.id usb 0x0562
++vendor.name Telex Communications Inc.
+
+ vendor.id usb 0x0562
+&device.id usb 0x0001
++device.name Enhanced Microphone
+
+ vendor.id usb 0x0563
++vendor.name Immersion Corp.
+
+ vendor.id usb 0x0564
++vendor.name Chinon Industries, Inc.
+
+ vendor.id usb 0x0565
++vendor.name Peracom Networks, Inc.
+
+ vendor.id usb 0x0565
+&device.id usb 0x0001
++device.name Serial Port [etek]
+
+ vendor.id usb 0x0565
+&device.id usb 0x0002
++device.name Enet Ethernet [klsi]
+
+ vendor.id usb 0x0565
+&device.id usb 0x0003
++device.name @Home Networks Ethernet [klsi]
+
+ vendor.id usb 0x0565
+&device.id usb 0x0005
++device.name Enet2 Ethernet [klsi]
+
+ vendor.id usb 0x0567
++vendor.name Xyratex Int'l Ltd.
+
+ vendor.id usb 0x0568
++vendor.name Quartz Ingenierie
+
+ vendor.id usb 0x0569
++vendor.name SegaSoft
+
+ vendor.id usb 0x056a
++vendor.name Wacom Co., Ltd.
+
+ vendor.id usb 0x056a
+&device.id usb 0x0000
++device.name PenPartner
+
+ vendor.id usb 0x056a
+&device.id usb 0x0010
++device.name Graphire
+
+ vendor.id usb 0x056a
+&device.id usb 0x0011
++device.name Graphire 2
+
+ vendor.id usb 0x056a
+&device.id usb 0x0020
++device.name Intuos 4x5
+
+ vendor.id usb 0x056a
+&device.id usb 0x0021
++device.name Intuos 6x8
+
+ vendor.id usb 0x056a
+&device.id usb 0x0022
++device.name Intuos 9x12
+
+ vendor.id usb 0x056a
+&device.id usb 0x0023
++device.name Intuos 12x12
+
+ vendor.id usb 0x056a
+&device.id usb 0x0024
++device.name Intuos 12x18
+
+ vendor.id usb 0x056a
+&device.id usb 0x0031
++device.name PL500
+
+ vendor.id usb 0x056a
+&device.id usb 0x0043
++device.name Intuos 2
+
+ vendor.id usb 0x056b
++vendor.name Decicon Incorporated
+
+ vendor.id usb 0x056c
++vendor.name eTEK Labs
+
+ vendor.id usb 0x056c
+&device.id usb 0x8007
++device.name Kwik232 Serial Port
+
+ vendor.id usb 0x056c
+&device.id usb 0x8101
++device.name KwikLink USB-USB Bridge
+
+ vendor.id usb 0x056d
++vendor.name EIZO Corp.
+
+ vendor.id usb 0x056d
+&device.id usb 0x0000
++device.name Hub
+
+ vendor.id usb 0x056d
+&device.id usb 0x0001
++device.name Monitor
+
+ vendor.id usb 0x056e
++vendor.name Elecom Co., Ltd.
+
+ vendor.id usb 0x056e
+&device.id usb 0x0002
++device.name 29UO Mouse
+
+ vendor.id usb 0x056e
+&device.id usb 0x4002
++device.name Laneed 100Mbps Ethernet LD-USB/TX [pegasus]
+
+ vendor.id usb 0x056f
++vendor.name Korea Data Systems Co., Ltd.
+
+ vendor.id usb 0x0570
++vendor.name Epson America
+
+ vendor.id usb 0x0571
++vendor.name Interex, Inc.
+
+ vendor.id usb 0x0572
++vendor.name Conexant Systems (Rockwell), Inc.
+
+ vendor.id usb 0x0572
+&device.id usb 0x0001
++device.name Ezcam II WebCam
+
+ vendor.id usb 0x0572
+&device.id usb 0x0002
++device.name Ezcam II WebCam
+
+ vendor.id usb 0x0572
+&device.id usb 0x1232
++device.name V.90 modem
+
+ vendor.id usb 0x0573
++vendor.name Nogatech Ltd.
+
+ vendor.id usb 0x0573
+&device.id usb 0x2000
++device.name X10 va10a Wireless Camera
+
+ vendor.id usb 0x0573
+&device.id usb 0x4d01
++device.name Hauppauge USB TV
+
+ vendor.id usb 0x0573
+&device.id usb 0x4d02
++device.name NT1003 Frame Grabber
+
+ vendor.id usb 0x0573
+&device.id usb 0x4d11
++device.name NT1003 Frame Grabber
+
+ vendor.id usb 0x0574
++vendor.name City University of Hong Kong
+
+ vendor.id usb 0x0575
++vendor.name Philips Creative Display Solutions
+
+ vendor.id usb 0x0576
++vendor.name BAFO/Quality Computer Accessories
+
+ vendor.id usb 0x0577
++vendor.name ELSA
+
+ vendor.id usb 0x0578
++vendor.name Intrinsix Corp.
+
+ vendor.id usb 0x0579
++vendor.name GVC Corp.
+
+ vendor.id usb 0x057a
++vendor.name Samsung Electronics America
+
+ vendor.id usb 0x057b
++vendor.name Y-E Data, Inc.
+
+ vendor.id usb 0x057b
+&device.id usb 0x0000
++device.name FlashBuster-U Floppy
+
+ vendor.id usb 0x057c
++vendor.name AVM GmbH
+
+ vendor.id usb 0x057c
+&device.id usb 0x2800
++device.name ISDN-Connector TA
+
+ vendor.id usb 0x057d
++vendor.name Shark Multimedia Inc.
+
+ vendor.id usb 0x057e
++vendor.name Nintendo Co., Ltd.
+
+ vendor.id usb 0x057f
++vendor.name QuickShot Limited
+
+ vendor.id usb 0x0580
++vendor.name Denron Inc.
+
+ vendor.id usb 0x0581
++vendor.name Racal Data Group
+
+ vendor.id usb 0x0582
++vendor.name Roland Corp.
+
+ vendor.id usb 0x0582
+&device.id usb 0x0002
++device.name MPU64 Midi Interface
+
+ vendor.id usb 0x0582
+&device.id usb 0x0003
++device.name Sound Canvas SC-8850
+
+ vendor.id usb 0x0582
+&device.id usb 0x0005
++device.name Edirol UM-2 MIDI Adapter
+
+ vendor.id usb 0x0583
++vendor.name Padix (Rockfire) Co. Ltd.
+
+ vendor.id usb 0x0583
+&device.id usb 0x2030
++device.name RM-203 USB Nest [mode 1]
+
+ vendor.id usb 0x0583
+&device.id usb 0x2031
++device.name RM-203 USB Nest [mode 2]
+
+ vendor.id usb 0x0583
+&device.id usb 0x2032
++device.name RM-203 USB Nest [mode 3]
+
+ vendor.id usb 0x0583
+&device.id usb 0x2033
++device.name RM-203 USB Nest [mode 4]
+
+ vendor.id usb 0x0583
+&device.id usb 0x3050
++device.name QF-305u Gamepad
+
+ vendor.id usb 0x0583
+&device.id usb 0x7070
++device.name QF-707u Joystick [Bazooka]
+
+ vendor.id usb 0x0584
++vendor.name RATOC System Inc.
+
+ vendor.id usb 0x0585
++vendor.name FlashPoint Technology, Inc.
+
+ vendor.id usb 0x0586
++vendor.name ZyXEL Communications Corp.
+
+ vendor.id usb 0x0586
+&device.id usb 0x1000
++device.name Omni NET Modem / ISDN TA
+
+ vendor.id usb 0x0587
++vendor.name America Kotobuki Electronics Ind.
+
+ vendor.id usb 0x0588
++vendor.name Sapien Design
+
+ vendor.id usb 0x0589
++vendor.name Victron
+
+ vendor.id usb 0x058a
++vendor.name Nohau Corp.
+
+ vendor.id usb 0x058b
++vendor.name Infineon Technologies
+
+ vendor.id usb 0x058c
++vendor.name In Focus Systems
+
+ vendor.id usb 0x058d
++vendor.name Micrel Semiconductor
+
+ vendor.id usb 0x058e
++vendor.name Tripath Technology Inc.
+
+ vendor.id usb 0x058f
++vendor.name Alcor Micro, Inc.
+
+ vendor.id usb 0x058f
+&device.id usb 0x2802
++device.name Monterey Keyboard
+
+ vendor.id usb 0x058f
+&device.id usb 0x9213
++device.name MacAlly Kbd Hub
+
+ vendor.id usb 0x058f
+&device.id usb 0x9215
++device.name AU9814 Hub
+
+ vendor.id usb 0x058f
+&device.id usb 0x9254
++device.name Hub
+
+ vendor.id usb 0x058f
+&device.id usb 0x9410
++device.name MicroConnectors/StrongMan Keyboard
+
+ vendor.id usb 0x058f
+&device.id usb 0x9472
++device.name Monterey/NEC Kbd Hub
+
+ vendor.id usb 0x0590
++vendor.name Omron Corp.
+
+ vendor.id usb 0x0590
+&device.id usb 0x0004
++device.name Cable Modem
+
+ vendor.id usb 0x0591
++vendor.name Questra Consulting
+
+ vendor.id usb 0x0592
++vendor.name Powerware Corp.
+
+ vendor.id usb 0x0593
++vendor.name Incite
+
+ vendor.id usb 0x0594
++vendor.name Princeton Graphic Systems
+
+ vendor.id usb 0x0595
++vendor.name Zoran Microelectronics Ltd.
+
+ vendor.id usb 0x0596
++vendor.name MicroTouch Systems Inc.
+
+ vendor.id usb 0x0596
+&device.id usb 0x0001
++device.name Touchscreen
+
+ vendor.id usb 0x0597
++vendor.name Trisignal Communications
+
+ vendor.id usb 0x0598
++vendor.name Niigata Canotec Co., Inc.
+
+ vendor.id usb 0x0599
++vendor.name Brilliance Semiconductor Inc.
+
+ vendor.id usb 0x059a
++vendor.name Spectrum Signal Processing Inc.
+
+ vendor.id usb 0x059b
++vendor.name Iomega Corp.
+
+ vendor.id usb 0x059b
+&device.id usb 0x0001
++device.name Zip 100 (Type 1)
+
+ vendor.id usb 0x059b
+&device.id usb 0x000b
++device.name Zip 100 (Type 2)
+
+ vendor.id usb 0x059b
+&device.id usb 0x0030
++device.name Zip 250 (Ver 1)
+
+ vendor.id usb 0x059b
+&device.id usb 0x0031
++device.name Zip 100 (Type 3)
+
+ vendor.id usb 0x059b
+&device.id usb 0x0032
++device.name Zip 250 (Ver 2)
+
+ vendor.id usb 0x059b
+&device.id usb 0x0040
++device.name SCSI Bridge
+
+ vendor.id usb 0x059b
+&device.id usb 0x0050
++device.name Zip CD 650 Writer
+
+ vendor.id usb 0x059b
+&device.id usb 0x006d
++device.name HipZip MP3 Player
+
+ vendor.id usb 0x059c
++vendor.name A-Trend Technology Co., Ltd.
+
+ vendor.id usb 0x059d
++vendor.name Advanced Input Devices
+
+ vendor.id usb 0x059e
++vendor.name Intelligent Instrumentation
+
+ vendor.id usb 0x059f
++vendor.name LaCie
+
+ vendor.id usb 0x059f
+&device.id usb 0xa601
++device.name HardDrive
+
+ vendor.id usb 0x05a0
++vendor.name Vetronix Corp.
+
+ vendor.id usb 0x05a1
++vendor.name USC Corp.
+
+ vendor.id usb 0x05a2
++vendor.name Fuji Film Microdevices Co. Ltd.
+
+ vendor.id usb 0x05a3
++vendor.name V Automation Inc.
+
+ vendor.id usb 0x05a4
++vendor.name Ortek Technology, Inc.
+
+ vendor.id usb 0x05a4
+&device.id usb 0x9731
++device.name MCK-600W Keyboard
+
+ vendor.id usb 0x05a5
++vendor.name Sampo Technology Corp.
+
+ vendor.id usb 0x05a6
++vendor.name Cisco Systems
+
+ vendor.id usb 0x05a7
++vendor.name Bose Corp.
+
+ vendor.id usb 0x05a8
++vendor.name Spacetec IMC Corp.
+
+ vendor.id usb 0x05a9
++vendor.name OmniVision Technologies, Inc.
+
+ vendor.id usb 0x05a9
+&device.id usb 0x0511
++device.name OV511 WebCam
+
+ vendor.id usb 0x05a9
+&device.id usb 0x0518
++device.name OV518 WebCam
+
+ vendor.id usb 0x05a9
+&device.id usb 0xa511
++device.name OV511+ WebCam
+
+ vendor.id usb 0x05aa
++vendor.name Utilux South China Ltd.
+
+ vendor.id usb 0x05ab
++vendor.name In-System Design
+
+ vendor.id usb 0x05ab
+&device.id usb 0x0002
++device.name Parallel Port
+
+ vendor.id usb 0x05ab
+&device.id usb 0x0031
++device.name ATA Bridge
+
+ vendor.id usb 0x05ab
+&device.id usb 0x0060
++device.name USB 2.0 Bridge
+
+ vendor.id usb 0x05ab
+&device.id usb 0x0200
++device.name USS725 ATA Bridge
+
+ vendor.id usb 0x05ab
+&device.id usb 0x0202
++device.name ATA Bridge
+
+ vendor.id usb 0x05ab
+&device.id usb 0x081a
++device.name ATA Bridge
+
+ vendor.id usb 0x05ac
++vendor.name Apple Computer
+
+ vendor.id usb 0x05ac
+&device.id usb 0x0201
++device.name iMac Keyboard [ALPS M2452]
+
+ vendor.id usb 0x05ac
+&device.id usb 0x0202
++device.name Apple Keyboard [ALPS]
+
+ vendor.id usb 0x05ac
+&device.id usb 0x0206
++device.name Apple Extended Keyboard [Mitsumi]
+
+ vendor.id usb 0x05ac
+&device.id usb 0x0301
++device.name iMac Mouse [Mitsumi/Logitech]
+
+ vendor.id usb 0x05ac
+&device.id usb 0x0302
++device.name Apple Optical Mouse [Fujitsu]
+
+ vendor.id usb 0x05ac
+&device.id usb 0x1001
++device.name Apple Keyboard Hub [ALPS]
+
+ vendor.id usb 0x05ac
+&device.id usb 0x1002
++device.name Apple Extended Keyboard Hub [Mitsumi]
+
+ vendor.id usb 0x05ad
++vendor.name Y.C.Cable U.S.A., Inc.
+
+ vendor.id usb 0x05ae
++vendor.name Synopsys, Inc.
+
+ vendor.id usb 0x05af
++vendor.name Jing-Mold Enterprise Co., Ltd.
+
+ vendor.id usb 0x05b0
++vendor.name Fountain Technologies, Inc.
+
+ vendor.id usb 0x05b1
++vendor.name First International Computer, Inc.
+
+ vendor.id usb 0x05b4
++vendor.name LG Semicon Co., Ltd.
+
+ vendor.id usb 0x05b5
++vendor.name Dialogic Corp
+
+ vendor.id usb 0x05b6
++vendor.name Proxima Corp.
+
+ vendor.id usb 0x05b7
++vendor.name Medianix Semiconductor, Inc.
+
+ vendor.id usb 0x05b8
++vendor.name Agiler, Inc.
+
+ vendor.id usb 0x05b8
+&device.id usb 0x3002
++device.name Scroll Mouse
+
+ vendor.id usb 0x05b9
++vendor.name Philips Research Laboratories
+
+ vendor.id usb 0x05ba
++vendor.name DigitalPersona, Inc.
+
+ vendor.id usb 0x05bd
++vendor.name RAFI GmbH & Co. KG
+
+ vendor.id usb 0x05be
++vendor.name Raychem Corp.
+
+ vendor.id usb 0x05bf
++vendor.name S & S Research
+
+ vendor.id usb 0x05c0
++vendor.name Keil Software
+
+ vendor.id usb 0x05c1
++vendor.name Kawasaki Steel
+
+ vendor.id usb 0x05c2
++vendor.name Media Phonics (Suisse) S.A.
+
+ vendor.id usb 0x05c5
++vendor.name Digi International Inc.
+
+ vendor.id usb 0x05c6
++vendor.name Qualcomm, Inc.
+
+ vendor.id usb 0x05c6
+&device.id usb 0x3100
++device.name CDMA Wireless Modem/Phone
+
+ vendor.id usb 0x05c6
+&device.id usb 0x3196
++device.name CDMA Wireless Modem
+
+ vendor.id usb 0x05c6
+&device.id usb 0x3197
++device.name CDMA Wireless Modem/Phone
+
+ vendor.id usb 0x05c7
++vendor.name Qtronix Corp
+
+ vendor.id usb 0x05c7
+&device.id usb 0x1001
++device.name Lynx Mouse
+
+ vendor.id usb 0x05c7
+&device.id usb 0x2011
++device.name Scorpius Keyboard
+
+ vendor.id usb 0x05c8
++vendor.name Cheng Uei Precision Industry Co., Ltd.
+
+ vendor.id usb 0x05c9
++vendor.name Semtech Corp.
+
+ vendor.id usb 0x05ca
++vendor.name Ricoh Company Ltd.
+
+ vendor.id usb 0x05ca
+&device.id usb 0x0101
++device.name RDC-5300 Digital Camera
+
+ vendor.id usb 0x05ca
+&device.id usb 0x2201
++device.name RDC-7 Digital Camera
+
+ vendor.id usb 0x05cb
++vendor.name PowerVision Technologies Inc.
+
+ vendor.id usb 0x05cb
+&device.id usb 0x1483
++device.name Trust CombiScan 19200
+
+ vendor.id usb 0x05cc
++vendor.name ELSA AG
+
+ vendor.id usb 0x05cc
+&device.id usb 0x2100
++device.name MicroLink ISDN Office
+
+ vendor.id usb 0x05cc
+&device.id usb 0x2219
++device.name MicroLink ISDN
+
+ vendor.id usb 0x05cc
+&device.id usb 0x2265
++device.name MicroLink 56k
+
+ vendor.id usb 0x05cc
+&device.id usb 0x2280
++device.name MicroLink 56k Fun
+
+ vendor.id usb 0x05cc
+&device.id usb 0x3000
++device.name Micolink USB2Ethernet [pegasus]
+
+ vendor.id usb 0x05cd
++vendor.name Silicom Ltd.
+
+ vendor.id usb 0x05ce
++vendor.name SICAN GmbH
+
+ vendor.id usb 0x05cf
++vendor.name Sung Forn Co. Ltd.
+
+ vendor.id usb 0x05d0
++vendor.name Lunar Corp.
+
+ vendor.id usb 0x05d1
++vendor.name Brainboxes Limited
+
+ vendor.id usb 0x05d2
++vendor.name Wave Systems Corp.
+
+ vendor.id usb 0x05d6
++vendor.name Philips Semiconductors, CICT
+
+ vendor.id usb 0x05d7
++vendor.name Thomas & Betts Corp.
+
+ vendor.id usb 0x05d7
+&device.id usb 0x0099
++device.name 10Mbps Ethernet [klsi]
+
+ vendor.id usb 0x05d8
++vendor.name Ultima Electronics Corp.
+
+ vendor.id usb 0x05d8
+&device.id usb 0x4002
++device.name Lifetec LT9385 Scanner
+
+ vendor.id usb 0x05d9
++vendor.name Axiohm Transaction Solutions
+
+ vendor.id usb 0x05da
++vendor.name Microtek International Inc.
+
+ vendor.id usb 0x05da
+&device.id usb 0x0093
++device.name ScanMaker V6USL
+
+ vendor.id usb 0x05da
+&device.id usb 0x0094
++device.name Phantom 336CX/C3
+
+ vendor.id usb 0x05da
+&device.id usb 0x0099
++device.name ScanMaker X6/X6U
+
+ vendor.id usb 0x05da
+&device.id usb 0x009a
++device.name Phantom C6
+
+ vendor.id usb 0x05da
+&device.id usb 0x00a0
++device.name Phantom 336CX/C3 (#2)
+
+ vendor.id usb 0x05da
+&device.id usb 0x00b6
++device.name ScanMaker V6UPL
+
+ vendor.id usb 0x05da
+&device.id usb 0x30cf
++device.name ScanMaker 4800
+
+ vendor.id usb 0x05da
+&device.id usb 0x40ca
++device.name ScanMaker 3600
+
+ vendor.id usb 0x05da
+&device.id usb 0x80a3
++device.name ScanMaker V6USL (#2)
+
+ vendor.id usb 0x05da
+&device.id usb 0x80ac
++device.name ScanMaker V6UL/SpicyU
+
+ vendor.id usb 0x05dc
++vendor.name Lexar Media, Inc.
+
+ vendor.id usb 0x05dd
++vendor.name Delta Electronics Inc.
+
+ vendor.id usb 0x05e0
++vendor.name Symbol Technologies
+
+ vendor.id usb 0x05e3
++vendor.name Genesys Logic, Inc.
+
+ vendor.id usb 0x05e3
+&device.id usb 0x000a
++device.name Keyboard with PS/2 Port
+
+ vendor.id usb 0x05e3
+&device.id usb 0x000b
++device.name Karna Razor BoomSlang 2000 Mouse
+
+ vendor.id usb 0x05e3
+&device.id usb 0x0120
++device.name Pacific Image Electronics PrimeFilm 1800u slide/negative scanner
+
+ vendor.id usb 0x05e3
+&device.id usb 0x0300
++device.name GLUSB98PT Parallel Port
+
+ vendor.id usb 0x05e3
+&device.id usb 0x0502
++device.name GL620USB GeneLink USB-USB Bridge
+
+ vendor.id usb 0x05e3
+&device.id usb 0x0700
++device.name SIIG US2256 CompactFlash Card Reader
+
+ vendor.id usb 0x05e3
+&device.id usb 0x1205
++device.name Afilias Optical Mouse H3003
+
+ vendor.id usb 0x05e5
++vendor.name Fuji Electric Co., Ltd.
+
+ vendor.id usb 0x05e6
++vendor.name Keithley Instruments
+
+ vendor.id usb 0x05e9
++vendor.name Kawasaki LSI
+
+ vendor.id usb 0x05e9
+&device.id usb 0x0008
++device.name KL5KUSB101B Ethernet [klsi]
+
+ vendor.id usb 0x05e9
+&device.id usb 0x0009
++device.name Sony 10Mbps Ethernet [pegasus]
+
+ vendor.id usb 0x05eb
++vendor.name FFC Limited
+
+ vendor.id usb 0x05ef
++vendor.name AVB, Inc. [anko?]
+
+ vendor.id usb 0x05ef
+&device.id usb 0x020a
++device.name Top Shot Pegasus Joystick
+
+ vendor.id usb 0x05ef
+&device.id usb 0x8884
++device.name Mag Turbo Force Wheel
+
+ vendor.id usb 0x05ef
+&device.id usb 0x8888
++device.name Top Shot Force Feedback Racing Wheel
+
+ vendor.id usb 0x05f0
++vendor.name Canopus Co., Ltd.
+
+ vendor.id usb 0x05f0
+&device.id usb 0x0101
++device.name DA-Port DAC
+
+ vendor.id usb 0x05f2
++vendor.name Dexin Corp., Ltd.
+
+ vendor.id usb 0x05f3
++vendor.name PI Engineering, Inc.
+
+ vendor.id usb 0x05f3
+&device.id usb 0x020b
++device.name PS2 Adapter
+
+ vendor.id usb 0x05f5
++vendor.name Unixtar Technology Inc.
+
+ vendor.id usb 0x05f6
++vendor.name AOC International
+
+ vendor.id usb 0x05f7
++vendor.name RFC Distribution(s) PTE Ltd.
+
+ vendor.id usb 0x05f9
++vendor.name PSC Scanning, Inc.
+
+ vendor.id usb 0x05fa
++vendor.name Siemens Telecommunications Systems Limited
+
+ vendor.id usb 0x05fc
++vendor.name Harman Multimedia
+
+ vendor.id usb 0x05fd
++vendor.name InterAct, Inc.
+
+ vendor.id usb 0x05fd
+&device.id usb 0x0251
++device.name Raider Pro
+
+ vendor.id usb 0x05fd
+&device.id usb 0x0253
++device.name ProPad 8 Digital
+
+ vendor.id usb 0x05fd
+&device.id usb 0x262a
++device.name 3dfx HammerHead FX
+
+ vendor.id usb 0x05fd
+&device.id usb 0xdaae
++device.name Game Shark
+
+ vendor.id usb 0x05fe
++vendor.name Chic Technology Corp.
+
+ vendor.id usb 0x05fe
+&device.id usb 0x0001
++device.name Mouse
+
+ vendor.id usb 0x05fe
+&device.id usb 0x0007
++device.name Twinhead Mouse
+
+ vendor.id usb 0x05fe
+&device.id usb 0x0009
++device.name Inland Pro 4500/5000 Mouse
+
+ vendor.id usb 0x05fe
+&device.id usb 0x0011
++device.name Browser Mouse
+
+ vendor.id usb 0x05ff
++vendor.name LeCroy Corp.
+
+ vendor.id usb 0x0600
++vendor.name Barco Display Systems
+
+ vendor.id usb 0x0601
++vendor.name Jazz Hipster Corp.
+
+ vendor.id usb 0x0602
++vendor.name Vista Imaging Inc.
+
+ vendor.id usb 0x0602
+&device.id usb 0x1001
++device.name ViCam WebCam
+
+ vendor.id usb 0x0603
++vendor.name Novatek Microelectronics Corp.
+
+ vendor.id usb 0x0603
+&device.id usb 0x6871
++device.name Mouse
+
+ vendor.id usb 0x0604
++vendor.name Jean Co, Ltd.
+
+ vendor.id usb 0x0606
++vendor.name Royal Information Electronics Co., Ltd.
+
+ vendor.id usb 0x0607
++vendor.name Bridge Information Co., Ltd.
+
+ vendor.id usb 0x0609
++vendor.name SMK Manufacturing Inc.
+
+ vendor.id usb 0x060a
++vendor.name Worthington Data Solutions, Inc.
+
+ vendor.id usb 0x060b
++vendor.name Solid Year (?)
+
+ vendor.id usb 0x060b
+&device.id usb 0x0001
++device.name MacAlly Keyboard
+
+ vendor.id usb 0x060b
+&device.id usb 0x2101
++device.name Solid Year Keyboard
+
+ vendor.id usb 0x060c
++vendor.name EEH Datalink GmbH
+
+ vendor.id usb 0x060f
++vendor.name Joinsoon Electronics Mfg. Co., Ltd.
+
+ vendor.id usb 0x0611
++vendor.name Totoku Electric Co., Ltd.
+
+ vendor.id usb 0x0613
++vendor.name Ithaca Peripherals
+
+ vendor.id usb 0x0614
++vendor.name Bio-Rad Laboratories
+
+ vendor.id usb 0x0616
++vendor.name Future Techno Designs PVT. Ltd.
+
+ vendor.id usb 0x0618
++vendor.name MacAlly
+
+ vendor.id usb 0x0618
+&device.id usb 0x0101
++device.name Mouse
+
+ vendor.id usb 0x0619
++vendor.name Seiko Instruments Inc.
+
+ vendor.id usb 0x061c
++vendor.name Act Labs, Ltd.
+
+ vendor.id usb 0x061d
++vendor.name Quatech, Inc.
+
+ vendor.id usb 0x061e
++vendor.name Nissei Electric Co.
+
+ vendor.id usb 0x0620
++vendor.name Alaris, Inc.
+
+ vendor.id usb 0x0621
++vendor.name ODU-Steckverbindungssysteme GmbH & Co. KG
+
+ vendor.id usb 0x0624
++vendor.name Apex, Inc.
+
+ vendor.id usb 0x0626
++vendor.name Nippon Systems Development Co., Ltd.
+
+ vendor.id usb 0x0629
++vendor.name Zida Technologies Limited
+
+ vendor.id usb 0x062b
++vendor.name Greatlink Electronics Taiwan Ltd.
+
+ vendor.id usb 0x062d
++vendor.name Taiwan Tai-Hao Enterprises Co. Ltd.
+
+ vendor.id usb 0x062e
++vendor.name Mainsuper Enterprises Co., Ltd.
+
+ vendor.id usb 0x062f
++vendor.name Sin Sheng Terminal & Machine Inc.
+
+ vendor.id usb 0x0634
++vendor.name Micron Technology, Inc.
+
+ vendor.id usb 0x0636
++vendor.name Sierra Imaging, Inc.
+
+ vendor.id usb 0x0638
++vendor.name Avision, Inc.
+
+ vendor.id usb 0x0638
+&device.id usb 0x0268
++device.name iVina 1200U Scanner
+
+ vendor.id usb 0x0638
+&device.id usb 0x026a
++device.name Minolta Dimage Scan Dual II
+
+ vendor.id usb 0x0638
+&device.id usb 0x4004
++device.name Minolta Dimage Scan Elite II
+
+ vendor.id usb 0x063d
++vendor.name Fong Kai Industrial Co., Ltd.
+
+ vendor.id usb 0x063f
++vendor.name New Technology Cable Ltd.
+
+ vendor.id usb 0x0640
++vendor.name Hitex Development Tools
+
+ vendor.id usb 0x0641
++vendor.name Woods Industries, Inc.
+
+ vendor.id usb 0x0642
++vendor.name VIA Medical Corp.
+
+ vendor.id usb 0x0644
++vendor.name TEAC Corp.
+
+ vendor.id usb 0x0644
+&device.id usb 0x0000
++device.name Floppy
+
+ vendor.id usb 0x0645
++vendor.name Who? Vision Systems, Inc.
+
+ vendor.id usb 0x0646
++vendor.name UMAX
+
+ vendor.id usb 0x0648
++vendor.name Inside Out Networks
+
+ vendor.id usb 0x064b
++vendor.name White Mountain DSP, Inc.
+
+ vendor.id usb 0x064c
++vendor.name Ji-Haw Industrial Co., Ltd.
+
+ vendor.id usb 0x064f
++vendor.name WIBU-Systems AG
+
+ vendor.id usb 0x0651
++vendor.name Likom Technology Sdn. Bhd.
+
+ vendor.id usb 0x0652
++vendor.name Stargate Solutions, Inc.
+
+ vendor.id usb 0x0654
++vendor.name Granite Microsystems, Inc.
+
+ vendor.id usb 0x0655
++vendor.name Space Shuttle Hi-Fi Wire & Cable Industry Co, Ltd.
+
+ vendor.id usb 0x0656
++vendor.name Glory Mark Electronic Ltd.
+
+ vendor.id usb 0x0657
++vendor.name Tekcon American Corp.
+
+ vendor.id usb 0x065a
++vendor.name Optoelectronics Co., Ltd.
+
+ vendor.id usb 0x065e
++vendor.name Silicon Graphics
+
+ vendor.id usb 0x065f
++vendor.name Good Way Industrial Co, Ltd & GWC Technology Inc.
+
+ vendor.id usb 0x0661
++vendor.name Hamamatsu Photonics K.K.
+
+ vendor.id usb 0x0663
++vendor.name Topmax Electronic Co., Ltd.
+
+ vendor.id usb 0x0663
+&device.id usb 0x0103
++device.name CobraPad
+
+ vendor.id usb 0x0667
++vendor.name Aiwa Co., Ltd.
+
+ vendor.id usb 0x0667
+&device.id usb 0x0fa1
++device.name TD-U8000 Tape Drive
+
+ vendor.id usb 0x0668
++vendor.name WordWand
+
+ vendor.id usb 0x0669
++vendor.name Oce' Printing Systems GmbH
+
+ vendor.id usb 0x066a
++vendor.name Total Technologies, Ltd.
+
+ vendor.id usb 0x066b
++vendor.name Linksys Inc.
+
+ vendor.id usb 0x066b
+&device.id usb 0x0105
++device.name SCM eUSB SmartMedia Card Reader
+
+ vendor.id usb 0x066b
+&device.id usb 0x010a
++device.name Melco MCR-U2 SmartMedia / CompactFlash Reader
+
+ vendor.id usb 0x066b
+&device.id usb 0x2202
++device.name USB10TX Ethernet [pegasus]
+
+ vendor.id usb 0x066b
+&device.id usb 0x2203
++device.name USB100TX Ethernet [pegasus]
+
+ vendor.id usb 0x066b
+&device.id usb 0x2204
++device.name USB100TX HomePNA Ethernet [pegasus]
+
+ vendor.id usb 0x066b
+&device.id usb 0x2206
++device.name USB Ethernet [pegasus]
+
+ vendor.id usb 0x066b
+&device.id usb 0x2211
++device.name WUSB11 Wireless Ethernet
+
+ vendor.id usb 0x066d
++vendor.name Entrega Inc.
+
+ vendor.id usb 0x066e
++vendor.name Acer Semiconductor America, Inc.
+
+ vendor.id usb 0x066f
++vendor.name SigmaTel, Inc.
+
+ vendor.id usb 0x066f
+&device.id usb 0x4200
++device.name STIr4200 IrDA Bridge
+
+ vendor.id usb 0x0672
++vendor.name Labtec Inc.
+
+ vendor.id usb 0x0672
+&device.id usb 0x1041
++device.name LCS1040 Speaker System
+
+ vendor.id usb 0x0672
+&device.id usb 0x5000
++device.name SpaceBall 4000 FLX
+
+ vendor.id usb 0x0673
++vendor.name HCL
+
+ vendor.id usb 0x0673
+&device.id usb 0x5000
++device.name Keyboard
+
+ vendor.id usb 0x0675
++vendor.name Draytech
+
+ vendor.id usb 0x0675
+&device.id usb 0x0110
++device.name Vigor 128 ISDN TA
+
+ vendor.id usb 0x0676
++vendor.name Teles AG
+
+ vendor.id usb 0x0677
++vendor.name Aiwa Co., Ltd.
+
+ vendor.id usb 0x0677
+&device.id usb 0x0fa1
++device.name TD-U8000 Tape Drive
+
+ vendor.id usb 0x0678
++vendor.name ACard Technology Corp.
+
+ vendor.id usb 0x067b
++vendor.name Prolific Technology, Inc.
+
+ vendor.id usb 0x067b
+&device.id usb 0x0000
++device.name PL2301 USB-USB Bridge
+
+ vendor.id usb 0x067b
+&device.id usb 0x0001
++device.name PL2302 USB-USB Bridge
+
+ vendor.id usb 0x067b
+&device.id usb 0x2307
++device.name PL2307 USB-ATAPI4 Bridge
+
+ vendor.id usb 0x067b
+&device.id usb 0x2303
++device.name PL2303 Serial Port
+
+ vendor.id usb 0x067c
++vendor.name Efficient Networks, Inc.
+
+ vendor.id usb 0x067c
+&device.id usb 0x1001
++device.name Siemens SpeedStream 100MBps Ethernet
+
+ vendor.id usb 0x067c
+&device.id usb 0x1022
++device.name Siemens 802.11b Wireless Ethernet
+
+ vendor.id usb 0x067c
+&device.id usb 0x4060
++device.name Alcatel Speedstream 4060 ADSL Modem
+
+ vendor.id usb 0x067d
++vendor.name Hohner Corp.
+
+ vendor.id usb 0x067e
++vendor.name Intermec
+
+ vendor.id usb 0x067f
++vendor.name Virata Ltd.
+
+ vendor.id usb 0x0680
++vendor.name Avance Logic, Inc.
+
+ vendor.id usb 0x0681
++vendor.name Siemens Information and Communication Products
+
+ vendor.id usb 0x0681
+&device.id usb 0x0002
++device.name Gigaset 3075 Passive ISDN
+
+ vendor.id usb 0x0681
+&device.id usb 0x0005
++device.name Mouse with Fingerprint Reader
+
+ vendor.id usb 0x0684
++vendor.name Actiontec Electronics, Inc.
+
+ vendor.id usb 0x0686
++vendor.name Minolta Co., Ltd.
+
+ vendor.id usb 0x0686
+&device.id usb 0x4006
++device.name Dimage 7 digital still camera
+
+ vendor.id usb 0x0686
+&device.id usb 0x4007
++device.name Dimage S304 digital still camera
+
+ vendor.id usb 0x0686
+&device.id usb 0x4009
++device.name Dimage X digital still camera
+
+ vendor.id usb 0x0686
+&device.id usb 0x400a
++device.name Dimage S404 digital still camera
+
+ vendor.id usb 0x0686
+&device.id usb 0x400b
++device.name Dimage 7i digital still camera
+
+ vendor.id usb 0x068a
++vendor.name Pertech Inc.
+
+ vendor.id usb 0x068e
++vendor.name CH Products, Inc.
+
+ vendor.id usb 0x068e
+&device.id usb 0x00ff
++device.name Flight Sim Yoke
+
+ vendor.id usb 0x068e
+&device.id usb 0x0500
++device.name GameStick 3D
+
+ vendor.id usb 0x068e
+&device.id usb 0x0501
++device.name CH Pro Pedals
+
+ vendor.id usb 0x068e
+&device.id usb 0x0504
++device.name F-16 Combat Stick
+
+ vendor.id usb 0x0690
++vendor.name Golden Bridge Electric Co., Ltd.
+
+ vendor.id usb 0x0693
++vendor.name Hagiwara Sys-Com
+
+ vendor.id usb 0x0693
+&device.id usb 0x0002
++device.name FlashGate SmartMedia Card Reader
+
+ vendor.id usb 0x0693
+&device.id usb 0x0003
++device.name FlasgGate CompactFlash Card Reader
+
+ vendor.id usb 0x0693
+&device.id usb 0x0005
++device.name FlashGate
+
+ vendor.id usb 0x0694
++vendor.name Lego Group
+
+ vendor.id usb 0x0694
+&device.id usb 0x0001
++device.name Mindstorms Tower
+
+ vendor.id usb 0x0698
++vendor.name Chuntex (CTX)
+
+ vendor.id usb 0x0698
+&device.id usb 0x1786
++device.name 1300ex Monitor
+
+ vendor.id usb 0x0698
+&device.id usb 0x9999
++device.name VLxxxx Monitor+Hub
+
+ vendor.id usb 0x069a
++vendor.name Askey Computer Corp.
+
+ vendor.id usb 0x069a
+&device.id usb 0x0001
++device.name VC010 WebCam [pwc]
+
+ vendor.id usb 0x069b
++vendor.name Thomson Consumer Electronics
+
+ vendor.id usb 0x069d
++vendor.name Hughes Network Systems (HNS)
+
+ vendor.id usb 0x069d
+&device.id usb 0x0002
++device.name Satellite Device
+
+ vendor.id usb 0x069e
++vendor.name Marx
+
+ vendor.id usb 0x069e
+&device.id usb 0x0005
++device.name CryptoBox v1.2
+
+ vendor.id usb 0x06a3
++vendor.name Saitek PLC
+
+ vendor.id usb 0x06a3
+&device.id usb 0x0006
++device.name Cyborg Gold Joystick
+
+ vendor.id usb 0x06a3
+&device.id usb 0x052d
++device.name P750 Gamepad
+
+ vendor.id usb 0x06a3
+&device.id usb 0x053f
++device.name X36F Flightstick
+
+ vendor.id usb 0x06a3
+&device.id usb 0x100a
++device.name SP550 Pad and Joystick Combo
+
+ vendor.id usb 0x06a3
+&device.id usb 0x100b
++device.name SP550 Pad
+
+ vendor.id usb 0x06a5
++vendor.name Divio
+
+ vendor.id usb 0x06a5
+&device.id usb 0xd001
++device.name ProLink DS3303u WebCam
+
+ vendor.id usb 0x06aa
++vendor.name Sysgration Ltd.
+
+ vendor.id usb 0x06ac
++vendor.name Fujitsu PC Corp.
+
+ vendor.id usb 0x06ad
++vendor.name Greatland Electronics Taiwan Ltd.
+
+ vendor.id usb 0x06ae
++vendor.name Professional Multimedia Testing Centre
+
+ vendor.id usb 0x06b8
++vendor.name Pixela Corproation
+
+ vendor.id usb 0x06b9
++vendor.name Alcatel Telecom
+
+ vendor.id usb 0x06b9
+&device.id usb 0x4061
++device.name Speed Touch ISDN
+
+ vendor.id usb 0x06ba
++vendor.name Smooth Cord & Connector Co., Ltd.
+
+ vendor.id usb 0x06bb
++vendor.name EDA Inc.
+
+ vendor.id usb 0x06bc
++vendor.name Oki Data Corp.
+
+ vendor.id usb 0x06bd
++vendor.name AGFA-Gevaert NV
+
+ vendor.id usb 0x06bd
+&device.id usb 0x0001
++device.name SnapScan 1212U
+
+ vendor.id usb 0x06bd
+&device.id usb 0x0002
++device.name SnapScan 1236U
+
+ vendor.id usb 0x06bd
+&device.id usb 0x0100
++device.name SnapScan Touch
+
+ vendor.id usb 0x06bd
+&device.id usb 0x0403
++device.name ePhoto CL18 Camera
+
+ vendor.id usb 0x06bd
+&device.id usb 0x0404
++device.name ePhoto CL20 Camera
+
+ vendor.id usb 0x06bd
+&device.id usb 0x2061
++device.name SnapScan 1212U (?)
+
+ vendor.id usb 0x06bd
+&device.id usb 0x208f
++device.name SnapScan e50
+
+ vendor.id usb 0x06bd
+&device.id usb 0x20fd
++device.name SnapScan e52
+
+ vendor.id usb 0x06be
++vendor.name Asia Microelectronic Development, Inc.
+
+ vendor.id usb 0x06bf
++vendor.name Leoco Corp.
+
+ vendor.id usb 0x06c4
++vendor.name Bizlink International Corp.
+
+ vendor.id usb 0x06c5
++vendor.name Hagenuk, GmbH
+
+ vendor.id usb 0x06c6
++vendor.name Infowave Software Inc.
+
+ vendor.id usb 0x06c8
++vendor.name SIIG, Inc.
+
+ vendor.id usb 0x06c9
++vendor.name Taxan (Europe) Ltd.
+
+ vendor.id usb 0x06ca
++vendor.name Newer Technology, Inc.
+
+ vendor.id usb 0x06cb
++vendor.name Synaptics
+
+ vendor.id usb 0x06cc
++vendor.name Terayon Communication Systems
+
+ vendor.id usb 0x06cd
++vendor.name Keyspan
+
+ vendor.id usb 0x06cd
+&device.id usb 0x0101
++device.name USA-28 PDA [preenum]
+
+ vendor.id usb 0x06cd
+&device.id usb 0x0102
++device.name USA-28X PDA [preenum]
+
+ vendor.id usb 0x06cd
+&device.id usb 0x0103
++device.name USA-19 PDA [preenum]
+
+ vendor.id usb 0x06cd
+&device.id usb 0x0104
++device.name PDA [prerenum]
+
+ vendor.id usb 0x06cd
+&device.id usb 0x0105
++device.name USA-18X PDA [preenum]
+
+ vendor.id usb 0x06cd
+&device.id usb 0x0106
++device.name USA-19W PDA [preenum]
+
+ vendor.id usb 0x06cd
+&device.id usb 0x0107
++device.name USA-19 PDA
+
+ vendor.id usb 0x06cd
+&device.id usb 0x0108
++device.name USA-19W PDA
+
+ vendor.id usb 0x06cd
+&device.id usb 0x010b
++device.name USA-19Q PDA
+
+ vendor.id usb 0x06cd
+&device.id usb 0x010f
++device.name USA-28 PDA
+
+ vendor.id usb 0x06cd
+&device.id usb 0x0110
++device.name USA-28X PDA
+
+ vendor.id usb 0x06cd
+&device.id usb 0x0112
++device.name USA-18X PDA
+
+ vendor.id usb 0x06cd
+&device.id usb 0x0114
++device.name USA-28X PDA
+
+ vendor.id usb 0x06cd
+&device.id usb 0x0118
++device.name USA-19QW PDA
+
+ vendor.id usb 0x06cd
+&device.id usb 0x0201
++device.name Digital Media Remote
+
+ vendor.id usb 0x06cf
++vendor.name SpheronVR AG
+
+ vendor.id usb 0x06cf
+&device.id usb 0x1010
++device.name PanoCam 10
+
+ vendor.id usb 0x06cf
+&device.id usb 0x1012
++device.name PanoCam 12/12X
+
+ vendor.id usb 0x06d0
++vendor.name LapLink, Inc.
+
+ vendor.id usb 0x06d0
+&device.id usb 0x0622
++device.name LapLink Gold USB-USB Bridge [net1080]
+
+ vendor.id usb 0x06d1
++vendor.name Daewoo Electronics Co Ltd.
+
+ vendor.id usb 0x06d3
++vendor.name Mitsubishi Electric Corp.
+
+ vendor.id usb 0x06d5
++vendor.name Toshiba
+
+ vendor.id usb 0x06d5
+&device.id usb 0x4000
++device.name Japanese Keyboard
+
+ vendor.id usb 0x06d6
++vendor.name Aashima Technology B.V.
+
+ vendor.id usb 0x06d7
++vendor.name Network Computing Devices (NCD)
+
+ vendor.id usb 0x06d8
++vendor.name Technical Marketing Research, Inc.
+
+ vendor.id usb 0x06da
++vendor.name Phoenixtec Power Co., Ltd.
+
+ vendor.id usb 0x06db
++vendor.name Paradyne
+
+ vendor.id usb 0x06dc
++vendor.name Compeye Corp.
+
+ vendor.id usb 0x06de
++vendor.name Heisei Electronics Co. Ltd.
+
+ vendor.id usb 0x06e0
++vendor.name Multi-Tech Systems, Inc.
+
+ vendor.id usb 0x06e0
+&device.id usb 0xf101
++device.name MT5634ZBA MultiModem 56k Intl.
+
+ vendor.id usb 0x06e0
+&device.id usb 0xf104
++device.name MT5634ZBA MultiModem 56k
+
+ vendor.id usb 0x06e1
++vendor.name ADS Technologies, Inc.
+
+ vendor.id usb 0x06e1
+&device.id usb 0x0008
++device.name UBS-10BT Ethernet [klsi]
+
+ vendor.id usb 0x06e4
++vendor.name Alcatel Microelectronics
+
+ vendor.id usb 0x06e6
++vendor.name Tiger Jet Network, Inc.
+
+ vendor.id usb 0x06ea
++vendor.name Sirius Technologies
+
+ vendor.id usb 0x06ea
+&device.id usb 0x0001
++device.name NetCom Roadster II 56k
+
+ vendor.id usb 0x06ea
+&device.id usb 0x0002
++device.name Roadster II 56k
+
+ vendor.id usb 0x06ef
++vendor.name I.A.C. Geometrische Ingenieurs B.V.
+
+ vendor.id usb 0x06f0
++vendor.name T.N.C Industrial Co., Ltd.
+
+ vendor.id usb 0x06f1
++vendor.name Opcode Systems Inc.
+
+ vendor.id usb 0x06f2
++vendor.name Machkey International (USA)
+
+ vendor.id usb 0x06f6
++vendor.name Wintrend Technology Co., Ltd.
+
+ vendor.id usb 0x06fa
++vendor.name HSD S.r.L
+
+ vendor.id usb 0x06fd
++vendor.name Boston Acoustics
+
+ vendor.id usb 0x06fe
++vendor.name Gallant Computer, Inc.
+
+ vendor.id usb 0x0701
++vendor.name Supercomal Wire & Cable SDN. BHD.
+
+ vendor.id usb 0x0703
++vendor.name Bencent Tzeng Industry Co., Ltd.
+
+ vendor.id usb 0x0707
++vendor.name Standard Microsystems Corp
+
+ vendor.id usb 0x0707
+&device.id usb 0x0100
++device.name 2202 Ethernet [klsi]
+
+ vendor.id usb 0x0707
+&device.id usb 0x0200
++device.name 2202 Ethernet [pegasus]
+
+ vendor.id usb 0x0709
++vendor.name Silicon Systems Ltd. (SSL)
+
+ vendor.id usb 0x070a
++vendor.name Oki Electric Industry Co., Ltd.
+
+ vendor.id usb 0x070d
++vendor.name Comoss Electronic Co., Ltd.
+
+ vendor.id usb 0x0710
++vendor.name Connect Tech Inc.
+
+ vendor.id usb 0x0710
+&device.id usb 0x0001
++device.name WhiteHeat (fake ID)
+
+ vendor.id usb 0x0710
+&device.id usb 0x8001
++device.name WhiteHeat
+
+ vendor.id usb 0x0711
++vendor.name Magic Control Technology Corp.
+
+ vendor.id usb 0x0711
+&device.id usb 0x0100
++device.name Hub
+
+ vendor.id usb 0x0711
+&device.id usb 0x0200
++device.name BAY-3U1S1P Serial Port
+
+ vendor.id usb 0x0711
+&device.id usb 0x0210
++device.name MCT1S Serial Port
+
+ vendor.id usb 0x0711
+&device.id usb 0x0230
++device.name MCT-232 Serial Port
+
+ vendor.id usb 0x0711
+&device.id usb 0x0231
++device.name PS/2 Mouse Port
+
+ vendor.id usb 0x0711
+&device.id usb 0x0240
++device.name PS/2 to USB Converter
+
+ vendor.id usb 0x0711
+&device.id usb 0x0300
++device.name BAY-3U1S1P Parallel Port
+
+ vendor.id usb 0x0711
+&device.id usb 0x0302
++device.name Parallel Port
+
+ vendor.id usb 0x0714
++vendor.name NewMotion, Inc.
+
+ vendor.id usb 0x0714
+&device.id usb 0x0003
++device.name ADB to USB convertor
+
+ vendor.id usb 0x0718
++vendor.name Imation Corp.
+
+ vendor.id usb 0x0719
++vendor.name Tremon Enterprises Co., Ltd.
+
+ vendor.id usb 0x071b
++vendor.name Domain Technologies, Inc.
+
+ vendor.id usb 0x071b
+&device.id usb 0x0002
++device.name DTI-56362-USB Digital Interface Unit
+
+ vendor.id usb 0x071b
+&device.id usb 0x0101
++device.name Audio4-USB DSP Data Acquisition Unit
+
+ vendor.id usb 0x071b
+&device.id usb 0x0201
++device.name Audio4-5410 DSP Data Acquisition Unit
+
+ vendor.id usb 0x071b
+&device.id usb 0x0301
++device.name SB-USB JTAG Emulator
+
+ vendor.id usb 0x071c
++vendor.name Xionics Document Technologies, Inc.
+
+ vendor.id usb 0x071d
++vendor.name Eicon Technology Corp.
+
+ vendor.id usb 0x071d
+&device.id usb 0x1000
++device.name Diva ISDN TA
+
+ vendor.id usb 0x0723
++vendor.name Centillium Communications Corp.
+
+ vendor.id usb 0x0726
++vendor.name Vanguard International Semiconductor-America
+
+ vendor.id usb 0x0729
++vendor.name Amitm
+
+ vendor.id usb 0x0729
+&device.id usb 0x1000
++device.name USC-1000 Serial Port
+
+ vendor.id usb 0x072f
++vendor.name ACS, Ltd.
+
+ vendor.id usb 0x072f
+&device.id usb 0x0001
++device.name ACR20U SmartCard Reader
+
+ vendor.id usb 0x0733
++vendor.name ViewQuest Technologies, Inc.
+
+ vendor.id usb 0x0733
+&device.id usb 0x0401
++device.name CS330 WebCam
+
+ vendor.id usb 0x0733
+&device.id usb 0x0402
++device.name M-318B WebCam
+
+ vendor.id usb 0x0733
+&device.id usb 0x0430
++device.name Intel Pro Share WebCam
+
+ vendor.id usb 0x0734
++vendor.name Lasat Communications A/S
+
+ vendor.id usb 0x0734
+&device.id usb 0x0001
++device.name 560V Modem
+
+ vendor.id usb 0x0735
++vendor.name Asuscom Network
+
+ vendor.id usb 0x0735
+&device.id usb 0xc541
++device.name ISDN TA 280
+
+ vendor.id usb 0x0738
++vendor.name Mad Catz, Inc.
+
+ vendor.id usb 0x073e
++vendor.name NEC, Inc.
+
+ vendor.id usb 0x073e
+&device.id usb 0x0301
++device.name Game Pad
+
+ vendor.id usb 0x073b
++vendor.name Suncom Technologies
+
+ vendor.id usb 0x0745
++vendor.name Syntech Information Co., Ltd.
+
+ vendor.id usb 0x0746
++vendor.name Onkyo Corp.
+
+ vendor.id usb 0x0747
++vendor.name Labway Corp.
+
+ vendor.id usb 0x0748
++vendor.name Strong Man Enterprise Co., Ltd.
+
+ vendor.id usb 0x0749
++vendor.name EVer Electronics Corp.
+
+ vendor.id usb 0x074a
++vendor.name Ming Fortune Industry Co., Ltd.
+
+ vendor.id usb 0x074b
++vendor.name Polestar Tech. Corp.
+
+ vendor.id usb 0x074c
++vendor.name C-C-C Group PLC
+
+ vendor.id usb 0x074d
++vendor.name Micronas Intermetall GmbH
+
+ vendor.id usb 0x074e
++vendor.name Digital Stream Corp.
+
+ vendor.id usb 0x074e
+&device.id usb 0x0001
++device.name PS/2 Adapter
+
+ vendor.id usb 0x074e
+&device.id usb 0x0002
++device.name PS/2 Adapter
+
+ vendor.id usb 0x0755
++vendor.name Aureal Semiconductor
+
+ vendor.id usb 0x0763
++vendor.name Midiman
+
+ vendor.id usb 0x0763
+&device.id usb 0x1001
++device.name Midisport 2x2
+
+ vendor.id usb 0x0763
+&device.id usb 0x1010
++device.name Midisport 1x1
+
+ vendor.id usb 0x0763
+&device.id usb 0x1020
++device.name Midisport 4x4
+
+ vendor.id usb 0x0763
+&device.id usb 0x1030
++device.name Midisport 8x8
+
+ vendor.id usb 0x0757
++vendor.name Network Technologies, Inc.
+
+ vendor.id usb 0x0764
++vendor.name Cyber Power System, Inc.
+
+ vendor.id usb 0x0765
++vendor.name X-Rite Incorporated
+
+ vendor.id usb 0x0766
++vendor.name Destech Solutions, Inc.
+
+ vendor.id usb 0x0768
++vendor.name Camtel Technology Corp.
+
+ vendor.id usb 0x0769
++vendor.name Surecom Technology Corp.
+
+ vendor.id usb 0x076a
++vendor.name Smart Technology Enablers, Inc.
+
+ vendor.id usb 0x076b
++vendor.name Utimaco Safeware AG
+
+ vendor.id usb 0x076d
++vendor.name Denso Corp.
+
+ vendor.id usb 0x076e
++vendor.name Kuan Tech Enterprise Co., Ltd.
+
+ vendor.id usb 0x076f
++vendor.name Jhen Vei Enterprise Co., Ltd.
+
+ vendor.id usb 0x0774
++vendor.name AmTRAN Technology Co., Ltd.
+
+ vendor.id usb 0x0775
++vendor.name Longshine Electronics Corp.
+
+ vendor.id usb 0x0776
++vendor.name Inalways Corp.
+
+ vendor.id usb 0x0777
++vendor.name Comda Enterprise Corp.
+
+ vendor.id usb 0x0779
++vendor.name Fairchild Semiconductor
+
+ vendor.id usb 0x077a
++vendor.name Sankyo Seiki Mfg. Co., Ltd.
+
+ vendor.id usb 0x077b
++vendor.name Linksys
+
+ vendor.id usb 0x077c
++vendor.name Forward Electronics Co., Ltd.
+
+ vendor.id usb 0x077c
+&device.id usb 0x0005
++device.name NEC Keyboard
+
+ vendor.id usb 0x077d
++vendor.name Griffin Technology
+
+ vendor.id usb 0x077d
+&device.id usb 0x0223
++device.name IMic Audio In/Out
+
+ vendor.id usb 0x077f
++vendor.name Well Excellent & Most Corp.
+
+ vendor.id usb 0x0781
++vendor.name SanDisk Corp.
+
+ vendor.id usb 0x0781
+&device.id usb 0x0001
++device.name SDDR-05a ImageMate CompactFlash Reader
+
+ vendor.id usb 0x0781
+&device.id usb 0x0002
++device.name SDDR-31 ImageMate II CompactFlash Reader
+
+ vendor.id usb 0x0781
+&device.id usb 0x0005
++device.name SDDR-05b (CF II) ImageMate CompactFlash Reader
+
+ vendor.id usb 0x0781
+&device.id usb 0x0200
++device.name SDDR-09 (SSFDC) ImageMate SmartMedia Reader [eusb]
+
+ vendor.id usb 0x0782
++vendor.name Trackerball
+
+ vendor.id usb 0x0784
++vendor.name Vivitar Inc.
+
+ vendor.id usb 0x0784
+&device.id usb 0x0100
++device.name ViviCam 2655
+
+ vendor.id usb 0x0784
+&device.id usb 0x1310
++device.name Vivicam 3305
+
+ vendor.id usb 0x0784
+&device.id usb 0x5260
++device.name Werlisa Sport PX 100
+
+ vendor.id usb 0x0785
++vendor.name NTT-ME
+
+ vendor.id usb 0x0785
+&device.id usb 0x0001
++device.name MN128mini-V ISDN TA
+
+ vendor.id usb 0x0785
+&device.id usb 0x0003
++device.name MN128mini-J ISDN TA
+
+ vendor.id usb 0x078b
++vendor.name Happ Controls, Inc.
+
+ vendor.id usb 0x078b
+&device.id usb 0x0010
++device.name Driving UGCI
+
+ vendor.id usb 0x078b
+&device.id usb 0x0020
++device.name Flying UGCI
+
+ vendor.id usb 0x078b
+&device.id usb 0x0030
++device.name Fighting UGCI
+
+ vendor.id usb 0x078e
++vendor.name Brimax Inc.
+
+ vendor.id usb 0x0790
++vendor.name Pro-Image Manufacturing Co., Ltd.
+
+ vendor.id usb 0x0791
++vendor.name Copartner Wire and Cable Mfg. Corp.
+
+ vendor.id usb 0x0792
++vendor.name Axis Communications AB
+
+ vendor.id usb 0x0793
++vendor.name Wha Yu Industrial Co., Ltd.
+
+ vendor.id usb 0x0794
++vendor.name ABL Electronics Corp.
+
+ vendor.id usb 0x0795
++vendor.name RealChip Inc.
+
+ vendor.id usb 0x0796
++vendor.name Certicom Corp.
+
+ vendor.id usb 0x0797
++vendor.name Grandtech Semiconductor Corp.
+
+ vendor.id usb 0x0797
+&device.id usb 0x8001
++device.name SmartCam
+
+ vendor.id usb 0x079b
++vendor.name Sagem
+
+ vendor.id usb 0x079d
++vendor.name Alfadata Computer Corp.
+
+ vendor.id usb 0x079d
+&device.id usb 0x0201
++device.name GamePort Adapter
+
+ vendor.id usb 0x07a1
++vendor.name Digicom S.p.A.
+
+ vendor.id usb 0x07a1
+&device.id usb 0xd952
++device.name Palladio USB V.92 Modem
+
+ vendor.id usb 0x07a2
++vendor.name National Technical Systems
+
+ vendor.id usb 0x07a3
++vendor.name Onnto Corp.
+
+ vendor.id usb 0x07a4
++vendor.name Be Incorporated
+
+ vendor.id usb 0x07a6
++vendor.name ADMtek Incorporated
+
+ vendor.id usb 0x07a6
+&device.id usb 0x0986
++device.name AN986 Pegasus Ethernet
+
+ vendor.id usb 0x07a6
+&device.id usb 0x8511
++device.name ADM8511 Pegasus II Ethernet
+
+ vendor.id usb 0x07aa
++vendor.name Correga K.K.
+
+ vendor.id usb 0x07aa
+&device.id usb 0x0001
++device.name Ether USB-T Ethernet [klsi]
+
+ vendor.id usb 0x07aa
+&device.id usb 0x0004
++device.name FEther USB-TX Ethernet [pegasus]
+
+ vendor.id usb 0x07ab
++vendor.name Freecom
+
+ vendor.id usb 0x07ab
+&device.id usb 0xfc01
++device.name IDE bridge
+
+ vendor.id usb 0x07af
++vendor.name Microtech
+
+ vendor.id usb 0x07af
+&device.id usb 0x0004
++device.name SCSI-DB25 SCSI Bridge [shuttle]
+
+ vendor.id usb 0x07af
+&device.id usb 0x0005
++device.name SCSI-HD50 SCSI Bridge [shuttle]
+
+ vendor.id usb 0x07af
+&device.id usb 0x0006
++device.name CameraMate SmartMedia and CompactFlash Card Reader [eusb/shuttle]
+
+ vendor.id usb 0x07b0
++vendor.name Trust Technologies
+
+ vendor.id usb 0x07b0
+&device.id usb 0x0001
++device.name ISDN TA
+
+ vendor.id usb 0x07b1
++vendor.name IMP, Inc.
+
+ vendor.id usb 0x07b2
++vendor.name Motorola ING
+
+ vendor.id usb 0x07b2
+&device.id usb 0x4100
++device.name SB4100 Cable Modem
+
+ vendor.id usb 0x07b3
++vendor.name Plustek, Inc.
+
+ vendor.id usb 0x07b3
+&device.id usb 0x0001
++device.name OpticPro 1212U Scanner
+
+ vendor.id usb 0x07b4
++vendor.name Olympus Optical Co., Ltd.
+
+ vendor.id usb 0x07b4
+&device.id usb 0x0100
++device.name Camedia C-2100/C-3000 Ultra Zoom Camera
+
+ vendor.id usb 0x07b4
+&device.id usb 0x0102
++device.name Camedia E-10/C-220 Camera
+
+ vendor.id usb 0x07b4
+&device.id usb 0x0105
++device.name Camedia C-700/C-3040 Zoom Camera
+
+ vendor.id usb 0x07b5
++vendor.name Mega World International Ltd.
+
+ vendor.id usb 0x07b5
+&device.id usb 0x9902
++device.name GamePad
+
+ vendor.id usb 0x07b6
++vendor.name Marubun Corp.
+
+ vendor.id usb 0x07b7
++vendor.name TIME Interconect Ltd.
+
+ vendor.id usb 0x07b8
++vendor.name D-Link, Inc.
+
+ vendor.id usb 0x07b8
+&device.id usb 0xabc1
++device.name DU-E10 Ethernet [pegasus]
+
+ vendor.id usb 0x07b8
+&device.id usb 0x4000
++device.name DU-E10 Ethernet [klsi]
+
+ vendor.id usb 0x07b8
+&device.id usb 0x4002
++device.name DU-E100 Ethernet [pegasus]
+
+ vendor.id usb 0x07b8
+&device.id usb 0xf101
++device.name DSB-560 Modem [atlas]
+
+ vendor.id usb 0x07bc
++vendor.name Canon Computer Sytems, Inc.
+
+ vendor.id usb 0x07bd
++vendor.name Webgear Inc.
+
+ vendor.id usb 0x07be
++vendor.name Veridicom
+
+ vendor.id usb 0x07c0
++vendor.name Code Mercenaries Hard- und Software GmbH
+
+ vendor.id usb 0x07c4
++vendor.name DataFab Systems, Inc.
+
+ vendor.id usb 0x07c4
+&device.id usb 0xa000
++device.name CompactFlash Card Reader
+
+ vendor.id usb 0x07c4
+&device.id usb 0xa001
++device.name CompactFlash & SmartMedia Card Reader [eusb]
+
+ vendor.id usb 0x07c4
+&device.id usb 0xa002
++device.name Disk Drive
+
+ vendor.id usb 0x07c4
+&device.id usb 0xa005
++device.name CompactFlash & SmartMedia Card Reader
+
+ vendor.id usb 0x07c4
+&device.id usb 0xa006
++device.name SmartMedia Card Reader
+
+ vendor.id usb 0x07c4
+&device.id usb 0xa109
++device.name LC1 CompactFlash & SmartMedia Card Reader
+
+ vendor.id usb 0x07c4
+&device.id usb 0xa400
++device.name CompactFlash & Microdrive Reader
+
+ vendor.id usb 0x07c5
++vendor.name APG Cash Drawer
+
+ vendor.id usb 0x07c6
++vendor.name Share Wave, Inc.
+
+ vendor.id usb 0x07c7
++vendor.name Powertech Industrial Co., Ltd.
+
+ vendor.id usb 0x07c8
++vendor.name B.U.G., Inc.
+
+ vendor.id usb 0x07c9
++vendor.name Allied Telesyn International
+
+ vendor.id usb 0x07ca
++vendor.name AVerMedia Technologies, Inc.
+
+ vendor.id usb 0x07cb
++vendor.name Kingmax Technology Inc.
+
+ vendor.id usb 0x07cc
++vendor.name Carry Inc.
+
+ vendor.id usb 0x07cc
+&device.id usb 0x0000
++device.name CF Card Reader
+
+ vendor.id usb 0x07cc
+&device.id usb 0x0003
++device.name SM Card Reader
+
+ vendor.id usb 0x07cc
+&device.id usb 0x0004
++device.name SM/CF/PCMCIA Card Reader
+
+ vendor.id usb 0x07cc
+&device.id usb 0x0006
++device.name SM/CF/PCMCIA Card Reader
+
+ vendor.id usb 0x07cc
+&device.id usb 0x000c
++device.name SM/CF Card Reader
+
+ vendor.id usb 0x07cc
+&device.id usb 0x000d
++device.name SM/CF Card Reader
+
+ vendor.id usb 0x07cd
++vendor.name Elektor
+
+ vendor.id usb 0x07cd
+&device.id usb 0x0001
++device.name USBuart Serial Port
+
+ vendor.id usb 0x07cf
++vendor.name Casio Computer Co., Ltd.
+
+ vendor.id usb 0x07cf
+&device.id usb 0x1001
++device.name QV-8000SX/3000EX Digicam
+
+ vendor.id usb 0x07cf
+&device.id usb 0x2002
++device.name E-125 Cassiopeia Pocket PC
+
+ vendor.id usb 0x07cf
+&device.id usb 0x3801
++device.name Casio WMP-1 MP3-Watch
+
+ vendor.id usb 0x07d1
++vendor.name D-Link System
+
+ vendor.id usb 0x07d2
++vendor.name Aptio Products Inc.
+
+ vendor.id usb 0x07d3
++vendor.name Cyberdata Corp.
+
+ vendor.id usb 0x07d7
++vendor.name GCC Technologies, Inc.
+
+ vendor.id usb 0x07da
++vendor.name Arasan Chip Systems
+
+ vendor.id usb 0x07e1
++vendor.name Ambient Technologies, Inc.
+
+ vendor.id usb 0x07e1
+&device.id usb 0x5201
++device.name V.90 Modem
+
+ vendor.id usb 0x07e2
++vendor.name Elmeg GmbH & Co., Ltd.
+
+ vendor.id usb 0x07e3
++vendor.name Planex Communications, Inc.
+
+ vendor.id usb 0x07e4
++vendor.name Movado Enterprise Co., Ltd.
+
+ vendor.id usb 0x07e5
++vendor.name QPS, Inc.
+
+ vendor.id usb 0x07e5
+&device.id usb 0x5c01
++device.name Que! CDRW
+
+ vendor.id usb 0x07e6
++vendor.name Allied Cable Corp.
+
+ vendor.id usb 0x07e7
++vendor.name Mirvo Toys, Inc.
+
+ vendor.id usb 0x07e8
++vendor.name Labsystems
+
+ vendor.id usb 0x07eb
++vendor.name Double-H Technology Co., Ltd.
+
+ vendor.id usb 0x07ec
++vendor.name Taiyo Electrical Wire & Cable Co., Ltd.
+
+ vendor.id usb 0x07fa
++vendor.name Draytek
+
+ vendor.id usb 0x07fa
+&device.id usb 0x0778
++device.name miniVigor 128 ISDN TA
+
+ vendor.id usb 0x07f6
++vendor.name Circuit Assembly Corp
+
+ vendor.id usb 0x07f7
++vendor.name Century Corp.
+
+ vendor.id usb 0x07fd
++vendor.name Mark of the Unicorn
+
+ vendor.id usb 0x07fd
+&device.id usb 0x0000
++device.name FastLane MIDI Interface
+
+ vendor.id usb 0x0801
++vendor.name Mag-Tek
+
+ vendor.id usb 0x0802
++vendor.name Tritheim Technologies, Inc.
+
+ vendor.id usb 0x0803
++vendor.name Zoom Telephonics, Inc.
+
+ vendor.id usb 0x0803
+&device.id usb 0x9700
++device.name 2986L FaxModem
+
+ vendor.id usb 0x0809
++vendor.name Genicom Corp.
+
+ vendor.id usb 0x080a
++vendor.name Evermuch Technology Co., Ltd.
+
+ vendor.id usb 0x080d
++vendor.name Teco Image Systems Co., Ltd.
+
+ vendor.id usb 0x0813
++vendor.name Mattel, Inc.
+
+ vendor.id usb 0x081a
++vendor.name MG Logic
+
+ vendor.id usb 0x081a
+&device.id usb 0x1000
++device.name Duo Pen Tablet
+
+ vendor.id usb 0x081c
++vendor.name Mipsys
+
+ vendor.id usb 0x081e
++vendor.name Intelligent Peripheral Devices, Inc.
+
+ vendor.id usb 0x0822
++vendor.name Reudo Corp.
+
+ vendor.id usb 0x0825
++vendor.name GC Protronics
+
+ vendor.id usb 0x0826
++vendor.name Data Transit
+
+ vendor.id usb 0x0827
++vendor.name BroadLogic, Inc.
+
+ vendor.id usb 0x0828
++vendor.name Sato Corp.
+
+ vendor.id usb 0x0829
++vendor.name Telocity, Inc.
+
+ vendor.id usb 0x082d
++vendor.name Handspring
+
+ vendor.id usb 0x082d
+&device.id usb 0x0100
++device.name Visor
+
+ vendor.id usb 0x0830
++vendor.name Palm Computing, Inc.
+
+ vendor.id usb 0x0830
+&device.id usb 0x0002
++device.name Palm M505
+
+ vendor.id usb 0x0830
+&device.id usb 0x0003
++device.name Palm M515
+
+ vendor.id usb 0x0830
+&device.id usb 0x0020
++device.name Palm I705
+
+ vendor.id usb 0x0830
+&device.id usb 0x0040
++device.name Palm M125
+
+ vendor.id usb 0x0830
+&device.id usb 0x0050
++device.name Palm M130
+
+ vendor.id usb 0x0830
+&device.id usb 0x0080
++device.name Palm
+
+ vendor.id usb 0x0832
++vendor.name Kouwell Electronics Corp.
+
+ vendor.id usb 0x0833
++vendor.name Sourcenext Corp.
+
+ vendor.id usb 0x0835
++vendor.name Action Star Enterprise Co., Ltd.
+
+ vendor.id usb 0x0839
++vendor.name Samsung Aerospace Industries Ltd.
+
+ vendor.id usb 0x0839
+&device.id usb 0x0005
++device.name Digimax Camera
+
+ vendor.id usb 0x083a
++vendor.name Accton Technology Corp.
+
+ vendor.id usb 0x083a
+&device.id usb 0x1046
++device.name 10/100 Ethernet [pegasus]
+
+ vendor.id usb 0x083a
+&device.id usb 0x5046
++device.name SpeedStream 10/100 Ethernet [pegasus]
+
+ vendor.id usb 0x083f
++vendor.name Global Village
+
+ vendor.id usb 0x083f
+&device.id usb 0xb100
++device.name TelePort V.90 Fax/Modem
+
+ vendor.id usb 0x0841
++vendor.name Rioport.com Inc.
+
+ vendor.id usb 0x0841
+&device.id usb 0x0001
++device.name Rio 500
+
+ vendor.id usb 0x0846
++vendor.name NetGear, Inc.
+
+ vendor.id usb 0x0846
+&device.id usb 0x1001
++device.name EA101 Ethernet [klsi]
+
+ vendor.id usb 0x084d
++vendor.name Minton Optic Industry Co., Inc.
+
+ vendor.id usb 0x084d
+&device.id usb 0x0003
++device.name S-Cam F5 Digital Camera
+
+ vendor.id usb 0x084e
++vendor.name KB Gear
+
+ vendor.id usb 0x084e
+&device.id usb 0x1002
++device.name Pablo Tablet
+
+ vendor.id usb 0x084f
++vendor.name Empeg
+
+ vendor.id usb 0x084f
+&device.id usb 0x0001
++device.name Empeg-Car Mark I/II Player
+
+ vendor.id usb 0x0850
++vendor.name Fast Point Technologies, Inc.
+
+ vendor.id usb 0x0851
++vendor.name Macronix International Co., Ltd.
+
+ vendor.id usb 0x0852
++vendor.name CSEM
+
+ vendor.id usb 0x0854
++vendor.name ActiveWire Inc.
+
+ vendor.id usb 0x0854
+&device.id usb 0x0100
++device.name I/O Board
+
+ vendor.id usb 0x0854
+&device.id usb 0x0101
++device.name I/O Board, rev1
+
+ vendor.id usb 0x0858
++vendor.name Hitachi Maxell Ltd.
+
+ vendor.id usb 0x0859
++vendor.name Minolta Systems Laboratory, Inc.
+
+ vendor.id usb 0x085a
++vendor.name Xircom
+
+ vendor.id usb 0x085a
+&device.id usb 0x0001
++device.name Portstation Dual Serial Port
+
+ vendor.id usb 0x085a
+&device.id usb 0x8027
++device.name PGSDB9 Serial Port
+
+ vendor.id usb 0x0862
++vendor.name Teletrol Systems, Inc.
+
+ vendor.id usb 0x0863
++vendor.name Filanet Corp.
+
+ vendor.id usb 0x0864
++vendor.name NetGear, Inc.
+
+ vendor.id usb 0x0864
+&device.id usb 0x4100
++device.name MA101 Wireless Adapter
+
+ vendor.id usb 0x086a
++vendor.name Emagic Soft-und Hardware GmbH
+
+ vendor.id usb 0x086c
++vendor.name DeTeWe - Deutsche Telephonwerke AG & Co.
+
+ vendor.id usb 0x086c
+&device.id usb 0x1001
++device.name Eumex 504PC ISDN TA
+
+ vendor.id usb 0x086e
++vendor.name System TALKS Inc.
+
+ vendor.id usb 0x086f
++vendor.name MEC IMEX Inc/HPT
+
+ vendor.id usb 0x0870
++vendor.name Metricom
+
+ vendor.id usb 0x0871
++vendor.name SanDisk, Inc.
+
+ vendor.id usb 0x0871
+&device.id usb 0x0001
++device.name SDDR-01 Compact Flash Reader
+
+ vendor.id usb 0x0871
+&device.id usb 0x0002
++device.name SDDR-31 Compact Flash Reader
+
+ vendor.id usb 0x0871
+&device.id usb 0x0005
++device.name SDDR-05 Compact Flash Reader
+
+ vendor.id usb 0x0873
++vendor.name Xpeed Inc.
+
+ vendor.id usb 0x0879
++vendor.name Comtrol Corp.
+
+ vendor.id usb 0x087c
++vendor.name Adesso/Kbtek America Inc.
+
+ vendor.id usb 0x087d
++vendor.name Jaton Corp.
+
+ vendor.id usb 0x087e
++vendor.name Fujitsu Computer Products of America
+
+ vendor.id usb 0x087f
++vendor.name Virtual IP Group, Inc.
+
+ vendor.id usb 0x0880
++vendor.name APT Technologies Inc.
+
+ vendor.id usb 0x0883
++vendor.name Recording Industry Association of America (RIAA)
+
+ vendor.id usb 0x0885
++vendor.name Boca Research, Inc.
+
+ vendor.id usb 0x0886
++vendor.name XAC Automation Corp.
+
+ vendor.id usb 0x0887
++vendor.name Hannstar Electronics Corp.
+
+ vendor.id usb 0x088b
++vendor.name MassWorks, Inc.
+
+ vendor.id usb 0x088b
+&device.id usb 0x4944
++device.name MassWorks ID-75 TouchScreen
+
+ vendor.id usb 0x0892
++vendor.name DioGraphy Inc.
+
+ vendor.id usb 0x089c
++vendor.name United Technologies Research Cntr.
+
+ vendor.id usb 0x089d
++vendor.name Icron Systems Inc.
+
+ vendor.id usb 0x089e
++vendor.name NST Co., Ltd.
+
+ vendor.id usb 0x08a5
++vendor.name e9 Inc.
+
+ vendor.id usb 0x08a8
++vendor.name Andrea Electronics
+
+ vendor.id usb 0x08b8
++vendor.name J. Gordon Electronic Design, Inc.
+
+ vendor.id usb 0x08b8
+&device.id usb 0x01f4
++device.name USBSIMM1
+
+ vendor.id usb 0x08b9
++vendor.name Tandy Corp./Radio Shack
+
+ vendor.id usb 0x08bb
++vendor.name Burr-Brown Japan, Ltd.
+
+ vendor.id usb 0x08bd
++vendor.name Citizen Watch Co., Ltd.
+
+ vendor.id usb 0x08c3
++vendor.name Precise Biometrics
+
+ vendor.id usb 0x08c3
+&device.id usb 0x0101
++device.name Precise 100 MC FingerPrint and SmartCard Reader
+
+ vendor.id usb 0x08c4
++vendor.name Proxim, Inc.
+
+ vendor.id usb 0x08c7
++vendor.name Key Nice Enterprise Co., Ltd.
+
+ vendor.id usb 0x08c8
++vendor.name 2Wire, Inc.
+
+ vendor.id usb 0x08c9
++vendor.name Nippon Telegraph and Telephone Corp.
+
+ vendor.id usb 0x08ca
++vendor.name AIPTEK International Inc.
+
+ vendor.id usb 0x08ca
+&device.id usb 0x0020
++device.name APT-6000U Tablet
+
+ vendor.id usb 0x08ca
+&device.id usb 0x0103
++device.name Pocket DV Digital Camera
+
+ vendor.id usb 0x08cd
++vendor.name Jue Hsun Ind. Corp.
+
+ vendor.id usb 0x08ce
++vendor.name Long Well Electronics Corp.
+
+ vendor.id usb 0x08cf
++vendor.name Productivity Enhancement Products
+
+ vendor.id usb 0x08d1
++vendor.name smartBridges, Inc.
+
+ vendor.id usb 0x08d1
+&device.id usb 0x0001
++device.name smartNIC Ethernet [catc]
+
+ vendor.id usb 0x08d3
++vendor.name Virtual Ink
+
+ vendor.id usb 0x08d4
++vendor.name Siemens PC Systems
+
+ vendor.id usb 0x08dd
++vendor.name Billionton Systems, Inc.
+
+ vendor.id usb 0x08dd
+&device.id usb 0x0986
++device.name USB-100N Ethernet [pegasus]
+
+ vendor.id usb 0x08dd
+&device.id usb 0x0987
++device.name USBLP-100 HomePNA Ethernet [pegasus]
+
+ vendor.id usb 0x08dd
+&device.id usb 0x0988
++device.name USBEL-100 Ethernet [pegasus]
+
+ vendor.id usb 0x08dd
+&device.id usb 0x8511
++device.name USBE-100 Ethernet [pegasus2]
+
+ vendor.id usb 0x08e3
++vendor.name Olitec, Inc.
+
+ vendor.id usb 0x08e3
+&device.id usb 0x0002
++device.name USB-RS232 Bridge
+
+ vendor.id usb 0x08e5
++vendor.name Litronic
+
+ vendor.id usb 0x08e6
++vendor.name GemPlus
+
+ vendor.id usb 0x08e7
++vendor.name Pan-International Wire & Cable
+
+ vendor.id usb 0x08e8
++vendor.name Integrated Memory Logic
+
+ vendor.id usb 0x08e9
++vendor.name Extended Systems, Inc.
+
+ vendor.id usb 0x08e9
+&device.id usb 0x0100
++device.name XTNDAccess IrDA Dongle
+
+ vendor.id usb 0x08ea
++vendor.name Ericsson Inc., Blue Ridge Labs
+
+ vendor.id usb 0x08ec
++vendor.name M-Systems
+
+ vendor.id usb 0x08ec
+&device.id usb 0x0010
++device.name DiskOnKey
+
+ vendor.id usb 0x08f1
++vendor.name CTI Electronics Corp.
+
+ vendor.id usb 0x08f5
++vendor.name SYSTEC Co., Ltd.
+
+ vendor.id usb 0x08f6
++vendor.name Logic 3 International Limited
+
+ vendor.id usb 0x08f8
++vendor.name Keen Top International Enterprise Co., Ltd.
+
+ vendor.id usb 0x08f9
++vendor.name EnThink, Inc.
+
+ vendor.id usb 0x08fa
++vendor.name Caere
+
+ vendor.id usb 0x08fb
++vendor.name Socket Communications
+
+ vendor.id usb 0x08fc
++vendor.name Sicon Cable Technology Co. Ltd.
+
+ vendor.id usb 0x08fd
++vendor.name Digianswer A/S
+
+ vendor.id usb 0x08ff
++vendor.name AuthenTec, Inc.
+
+ vendor.id usb 0x0900
++vendor.name Pinnacle Systems, Inc.
+
+ vendor.id usb 0x0901
++vendor.name VST Technologies
+
+ vendor.id usb 0x0906
++vendor.name Faraday Technology Corp.
+
+ vendor.id usb 0x090a
++vendor.name Trumpion Microelectronics Inc.
+
+ vendor.id usb 0x090b
++vendor.name Neurosmith
+
+ vendor.id usb 0x090c
++vendor.name Feiya Technology Corp.
+
+ vendor.id usb 0x090d
++vendor.name Multiport Computer Vertriebs GmbH
+
+ vendor.id usb 0x090e
++vendor.name Shining Technology, Inc.
+
+ vendor.id usb 0x090f
++vendor.name Fujitsu Devices Inc.
+
+ vendor.id usb 0x0910
++vendor.name Alation Systems, Inc.
+
+ vendor.id usb 0x0911
++vendor.name Philips Speech Processing
+
+ vendor.id usb 0x0912
++vendor.name Voquette, Inc.
+
+ vendor.id usb 0x0915
++vendor.name GlobeSpan, Inc.
+
+ vendor.id usb 0x0917
++vendor.name SmartDisk Corp.
+
+ vendor.id usb 0x0919
++vendor.name Tiger Electronics
+
+ vendor.id usb 0x0919
+&device.id usb 0x0100
++device.name Fast Flicks Digital Camera
+
+ vendor.id usb 0x0920
++vendor.name Echelon Co.
+
+ vendor.id usb 0x0921
++vendor.name GoHubs, Inc.
+
+ vendor.id usb 0x0922
++vendor.name Dymo-CoStar Corp.
+
+ vendor.id usb 0x0923
++vendor.name IC Media Corp.
+
+ vendor.id usb 0x0924
++vendor.name Xerox
+
+ vendor.id usb 0x0927
++vendor.name Summus, Ltd.
+
+ vendor.id usb 0x0928
++vendor.name Oxford Semiconductor Ltd.
+
+ vendor.id usb 0x0929
++vendor.name American Biometric Company
+
+ vendor.id usb 0x0930
++vendor.name Toshiba Corp.
+
+ vendor.id usb 0x0931
++vendor.name Harmonic Data Systems Ltd.
+
+ vendor.id usb 0x0932
++vendor.name Crescentec Corp.
+
+ vendor.id usb 0x0933
++vendor.name Quantum Corp.
+
+ vendor.id usb 0x0934
++vendor.name Netcom Systems
+
+ vendor.id usb 0x0939
++vendor.name Lumberg, Inc.
+
+ vendor.id usb 0x093a
++vendor.name Pixart Imaging, Inc.
+
+ vendor.id usb 0x093b
++vendor.name Plextor
+
+ vendor.id usb 0x093e
++vendor.name J.S.T. Mfg. Co., Ltd.
+
+ vendor.id usb 0x093f
++vendor.name Olympia Telecom Vertriebs GmbH
+
+ vendor.id usb 0x0940
++vendor.name Japan Storage Battery Co., Ltd.
+
+ vendor.id usb 0x0941
++vendor.name Photobit Corp.
+
+ vendor.id usb 0x0942
++vendor.name i2Go.com, LLC
+
+ vendor.id usb 0x0943
++vendor.name HCL Technologies India Private Limited
+
+ vendor.id usb 0x0944
++vendor.name KORG, Inc.
+
+ vendor.id usb 0x0945
++vendor.name Pasco Scientific
+
+ vendor.id usb 0x0948
++vendor.name Kronauer music in digital
+
+ vendor.id usb 0x0948
+&device.id usb 0x1105
++device.name USB One
+
+ vendor.id usb 0x0948
+&device.id usb 0x0301
++device.name USB Pro (24/48)
+
+ vendor.id usb 0x0948
+&device.id usb 0x0302
++device.name USB Pro (24/96 playback)
+
+ vendor.id usb 0x0948
+&device.id usb 0x0303
++device.name USB Pro (24/96 record)
+
+ vendor.id usb 0x0948
+&device.id usb 0x0304
++device.name USB Pro (16/48)
+
+ vendor.id usb 0x094d
++vendor.name Cable Television Laboratories
+
+ vendor.id usb 0x0951
++vendor.name Kingston Technology
+
+ vendor.id usb 0x0951
+&device.id usb 0x000a
++device.name KNU101TX 100baseTX Ethernet
+
+ vendor.id usb 0x0954
++vendor.name RPM Systems Corp.
+
+ vendor.id usb 0x0955
++vendor.name NVidia
+
+ vendor.id usb 0x0956
++vendor.name BlueWater Systems, Inc.
+
+ vendor.id usb 0x0957
++vendor.name Agilent Technologies, Inc.
+
+ vendor.id usb 0x0958
++vendor.name CompuLink Research, Inc.
+
+ vendor.id usb 0x0959
++vendor.name Cologne Chip Designs GmbH
+
+ vendor.id usb 0x095a
++vendor.name Portsmith
+
+ vendor.id usb 0x095b
++vendor.name Medialogic Corp.
+
+ vendor.id usb 0x095c
++vendor.name K-Tec Electronics
+
+ vendor.id usb 0x095d
++vendor.name Polycom, Inc.
+
+ vendor.id usb 0x0968
++vendor.name Catalyst Enterprises, Inc.
+
+ vendor.id usb 0x0971
++vendor.name Gretag-Macbeth AG
+
+ vendor.id usb 0x0973
++vendor.name Schlumberger
+
+ vendor.id usb 0x0974
++vendor.name Datagraphix, a business unit of Anacomp
+
+ vendor.id usb 0x0975
++vendor.name OL'E Communications, Inc.
+
+ vendor.id usb 0x0976
++vendor.name Adirondack Wire & Cable
+
+ vendor.id usb 0x0977
++vendor.name Lightsurf Technologies
+
+ vendor.id usb 0x0978
++vendor.name Beckhoff GmbH
+
+ vendor.id usb 0x0979
++vendor.name Teracom International Inc.
+
+ vendor.id usb 0x097a
++vendor.name Minds At Work LLC
+
+ vendor.id usb 0x097b
++vendor.name Knudsen Engineering Limited
+
+ vendor.id usb 0x097c
++vendor.name Marunix Co., Ltd.
+
+ vendor.id usb 0x097d
++vendor.name Rosun Technologies, Inc.
+
+ vendor.id usb 0x0981
++vendor.name Oak Technology Ltd.
+
+ vendor.id usb 0x0985
++vendor.name cab Produkttechnik GmbH & Co KG
+
+ vendor.id usb 0x0985
+&device.id usb 0x00a3
++device.name A3/200 or A3/300 Label Printer
+
+ vendor.id usb 0x098c
++vendor.name Vitana Corp.
+
+ vendor.id usb 0x098d
++vendor.name INDesign
+
+ vendor.id usb 0x098e
++vendor.name Integrated Intellectual Property Inc.
+
+ vendor.id usb 0x098f
++vendor.name Kenwood TMI Corp.
+
+ vendor.id usb 0x0993
++vendor.name Gemstar eBook Group, Ltd.
+
+ vendor.id usb 0x0993
+&device.id usb 0x0001
++device.name REB1100 eBook Reader
+
+ vendor.id usb 0x0996
++vendor.name Integrated Telecom Express, Inc.
+
+ vendor.id usb 0x09a3
++vendor.name PairGain Technologies
+
+ vendor.id usb 0x09a4
++vendor.name Contech Research, Inc.
+
+ vendor.id usb 0x09a5
++vendor.name VCON Telecommunications
+
+ vendor.id usb 0x09a6
++vendor.name Poinchips
+
+ vendor.id usb 0x09a7
++vendor.name Data Transmission Network Corp.
+
+ vendor.id usb 0x09a8
++vendor.name Shinestar Enterprise Co., Ltd.
+
+ vendor.id usb 0x09a9
++vendor.name Smart Card Technologies Co., Ltd.
+
+ vendor.id usb 0x09aa
++vendor.name Intersil Corp.
+
+ vendor.id usb 0x09b2
++vendor.name Franklin Electronic Publishers
+
+ vendor.id usb 0x09b2
+&device.id usb 0x0001
++device.name eBookman Palm Computer
+
+ vendor.id usb 0x09b3
++vendor.name Altius Solutions, Inc.
+
+ vendor.id usb 0x09b4
++vendor.name MDS Telephone Systems
+
+ vendor.id usb 0x09b5
++vendor.name Celltrix Technology Co., Ltd.
+
+ vendor.id usb 0x09be
++vendor.name MySmart.Com
+
+ vendor.id usb 0x09be
+&device.id usb 0x0001
++device.name MySmartPad
+
+ vendor.id usb 0x09bf
++vendor.name Auerswald GmbH & Co. KG
+
+ vendor.id usb 0x09bf
+&device.id usb 0x00c0
++device.name COMpact 2104 ISDN PBX
+
+ vendor.id usb 0x09bf
+&device.id usb 0x00db
++device.name COMpact 4410/2206 ISDN ISDN
+
+ vendor.id usb 0x09bf
+&device.id usb 0x00f1
++device.name COMfort System Telephones
+
+ vendor.id usb 0x09c1
++vendor.name Arris Interactive LLC
+
+ vendor.id usb 0x09c3
++vendor.name ActivCard, INC.
+
+ vendor.id usb 0x09c4
++vendor.name ACTiSYS Corp.
+
+ vendor.id usb 0x09c4
+&device.id usb 0x0011
++device.name ACT-IR2000U IrDA Dongle
+
+ vendor.id usb 0x09c5
++vendor.name Memory Corp.
+
+ vendor.id usb 0x09cc
++vendor.name Workbit Corp.
+
+ vendor.id usb 0x09cd
++vendor.name Psion Dacom Home Networks Ltd.
+
+ vendor.id usb 0x09ce
++vendor.name City Electronics Ltd.
+
+ vendor.id usb 0x09cf
++vendor.name Electronics Testing Center, Taiwan
+
+ vendor.id usb 0x09d1
++vendor.name NeoMagic Inc.
+
+ vendor.id usb 0x09d2
++vendor.name Vreelin Engineering Inc.
+
+ vendor.id usb 0x09d3
++vendor.name Com One
+
+ vendor.id usb 0x09d9
++vendor.name KRF Tech Ltd.
+
+ vendor.id usb 0x09da
++vendor.name A4 Tech Co., Ltd.
+
+ vendor.id usb 0x09db
++vendor.name ComputerBoards Inc.
+
+ vendor.id usb 0x09dc
++vendor.name Aimex Corp.
+
+ vendor.id usb 0x09dd
++vendor.name Fellowes Manufacturing Co.
+
+ vendor.id usb 0x09df
++vendor.name Addonics Technologies Corp.
+
+ vendor.id usb 0x09e5
++vendor.name Jo-Dan International, Inc.
+
+ vendor.id usb 0x09e6
++vendor.name Silutia, Inc.
+
+ vendor.id usb 0x09e7
++vendor.name Real 3D, Inc.
+
+ vendor.id usb 0x09e8
++vendor.name AKAI Professional M.I. Corp.
+
+ vendor.id usb 0x09e9
++vendor.name Chen-Source Inc.
+
+ vendor.id usb 0x09ef
++vendor.name Xitel
+
+ vendor.id usb 0x09ef
+&device.id usb 0x0101
++device.name MD-Port DG2 MiniDisc Interface
+
+ vendor.id usb 0x09f5
++vendor.name AresCom
+
+ vendor.id usb 0x09f6
++vendor.name RocketChips, Inc.
+
+ vendor.id usb 0x09f7
++vendor.name Edu-Science (H.K.) Ltd.
+
+ vendor.id usb 0x09f8
++vendor.name SoftConnex
+
+ vendor.id usb 0x09f9
++vendor.name Bay Associates
+
+ vendor.id usb 0x09fa
++vendor.name Mtek Vision
+
+ vendor.id usb 0x09fb
++vendor.name Altera
+
+ vendor.id usb 0x09ff
++vendor.name Gain Technology Corp.
+
+ vendor.id usb 0x0a00
++vendor.name Liquid Audio
+
+ vendor.id usb 0x0a01
++vendor.name ViA, Inc.
+
+ vendor.id usb 0x0a11
++vendor.name Xentec Incorporated
+
+ vendor.id usb 0x0a12
++vendor.name Cambridge Silicon Radio Ltd.
+
+ vendor.id usb 0x0a13
++vendor.name Telebyte Inc.
+
+ vendor.id usb 0x0a14
++vendor.name Spacelabs Medical Inc.
+
+ vendor.id usb 0x0a15
++vendor.name Scalar Corp.
+
+ vendor.id usb 0x0a16
++vendor.name Trek Technology (S) PTE Ltd.
+
+ vendor.id usb 0x0a16
+&device.id usb 0x9988
++device.name Trek2000 TD-G2
+
+ vendor.id usb 0x0a17
++vendor.name Asahi Optical Co., Ltd.
+
+ vendor.id usb 0x0a17
+&device.id usb 0x0004
++device.name Pentax Optio 330
+
+ vendor.id usb 0x0a18
++vendor.name Heidelberger Druckmaschinen AG
+
+ vendor.id usb 0x0a19
++vendor.name Hua Geng Technologies Inc.
+
+ vendor.id usb 0x0a43
++vendor.name Boca Systems Inc.
+
+ vendor.id usb 0x0a4d
++vendor.name Evolution Electronics Ltd.
+
+ vendor.id usb 0x0a4d
+&device.id usb 0x008e
++device.name MK-249C MIDI Keyboard
+
+ vendor.id usb 0x0a5c
++vendor.name Broadcom Corp.
+
+ vendor.id usb 0x0a5f
++vendor.name Zebra
+
+ vendor.id usb 0x0a5f
+&device.id usb 0x0009
++device.name LP2844 Printer
+
+ vendor.id usb 0x0a6b
++vendor.name Green House
+
+ vendor.id usb 0x0a6b
+&device.id usb 0x0001
++device.name Compact Flash R/W with MP3 player
+
+ vendor.id usb 0x0abe
++vendor.name Stereo-Link
+
+ vendor.id usb 0x0abe
+&device.id usb 0x0101
++device.name SL1200 DAC
+
+ vendor.id usb 0x0aec
++vendor.name Neodio
+
+ vendor.id usb 0x0aec
+&device.id usb 0x5010
++device.name ND5010 Card Reader
+
+ vendor.id usb 0x0af9
++vendor.name Hama, Inc.
+
+ vendor.id usb 0x0af9
+&device.id usb 0x0010
++device.name USB SightCam 100
+
+ vendor.id usb 0x0b30
++vendor.name PNY Technologies, Inc.
+
+ vendor.id usb 0x0b30
+&device.id usb 0x0006
++device.name SM Media-Shuttle Card Reader
+
+ vendor.id usb 0x0b3b
++vendor.name Tekram Technology, Co., Ltd.
+
+ vendor.id usb 0x0b3b
+&device.id usb 0x1612
++device.name AIR.Mate 2@net
+
+ vendor.id usb 0x0c12
++vendor.name Zeroplus
+
+ vendor.id usb 0x0c12
+&device.id usb 0x0005
++device.name PSX Vibration Feedback Converter
+
+ vendor.id usb 0x0c70
++vendor.name MCT Elektronikladen
+
+ vendor.id usb 0x0c70
+&device.id usb 0x0000
++device.name USB08 Development board
+
+ vendor.id usb 0x0c76
++vendor.name JMTek, LLC.
+
+ vendor.id usb 0x0c76
+&device.id usb 0x0003
++device.name USBdisk
+
+ vendor.id usb 0x0c76
+&device.id usb 0x0005
++device.name USBdisk
+
+ vendor.id usb 0x0bda
++vendor.name RealTek Semiconductor Corp.
+
+ vendor.id usb 0x0bda
+&device.id usb 0x8150
++device.name RTL8150 Fast Ethernet Adapter
+
+ vendor.id usb 0x0bda
+&device.id usb 0x8151
++device.name RTL8151 HomePNA Adapter
+
+ vendor.id usb 0x0bf6
++vendor.name Addonics Technologies, Inc.
+
+ vendor.id usb 0x0bf6
+&device.id usb 0xa002
++device.name IDE Bridge
+
+ vendor.id usb 0x0c08
++vendor.name Agate
+
+ vendor.id usb 0x0c08
+&device.id usb 0x0378
++device.name Q 16MB Storage Device
+
+ vendor.id usb 0x0c0b
++vendor.name Acomdata
+
+ vendor.id usb 0x0c0b
+&device.id usb 0xb004
++device.name MMC/SD Reader and Writer
+
+ vendor.id usb 0x0c0b
+&device.id usb 0xa109
++device.name CF/SM Reader and Writer
+
+ vendor.id usb 0x0c0b
+&device.id usb 0xa10c
++device.name SD/MS Reader and Writer
+
+ vendor.id usb 0x0c5e
++vendor.name Xytronix Research & Design
+
+ vendor.id usb 0x0c86
++vendor.name NDA Technologies, Inc.
+
+ vendor.id usb 0x0d06
++vendor.name telos EDV Systementwicklung GmbH
+
+ vendor.id usb 0x0d7d
++vendor.name Apacer
+
+ vendor.id usb 0x0d7d
+&device.id usb 0x0100
++device.name HandyDrive 64MB
+
+ vendor.id usb 0x0d8e
++vendor.name Repotec
+
+ vendor.id usb 0x0d8e
+&device.id usb 0x7100
++device.name Wireless 802.11b Ethernet
+
+ vendor.id usb 0x0d96
++vendor.name Traveler
+
+ vendor.id usb 0x0d96
+&device.id usb 0x3300
++device.name SX330z Digital Camera
+
+ vendor.id usb 0x0d96
+&device.id usb 0x4100
++device.name SX410z Digital Camera
+
+ vendor.id usb 0x0dbf
++vendor.name Pocketec
+
+ vendor.id usb 0x0dcd
++vendor.name NetworkFab Corporation
+
+ vendor.id usb 0x0dcd
+&device.id usb 0x0001
++device.name Remote Interface Adapter
+
+ vendor.id usb 0x0dcd
+&device.id usb 0x0002
++device.name High Bandwidth Codec
+
+ vendor.id usb 0x0e0c
++vendor.name Gesytec
+
+ vendor.id usb 0x0e0c
+&device.id usb 0x0101
++device.name LonUSB LonTalk Network Adapter
+
+ vendor.id usb 0x0e1b
++vendor.name Crewave
+
+ vendor.id usb 0x0e1b
+&device.id usb 0x1100
++device.name CW-1100 Wireless Network Adapter
+
+ vendor.id usb 0x0e48
++vendor.name Julia Corp., Ltd.
+
+ vendor.id usb 0x0e48
+&device.id usb 0x0100
++device.name CardPro SmartCard Reader
+
+ vendor.id usb 0x0e66
++vendor.name Hawking
+
+ vendor.id usb 0x0e66
+&device.id usb 0x400c
++device.name UF100 Ethernet [pegasus2]
+
+ vendor.id usb 0x0e75
++vendor.name TVS Electronics, Ltd.
+
+ vendor.id usb 0x0ef7
++vendor.name Tulip Computers International
+
+ vendor.id usb 0x1046
++vendor.name Winbond Electronics Corp. [hex]
+
+ vendor.id usb 0x1046
+&device.id usb 0x9967
++device.name W9967CF/W9968CF WebCam IC
+
+ vendor.id usb 0x1063
++vendor.name Motorola Electronics Taiwan Ltd. [hex]
+
+ vendor.id usb 0x1063
+&device.id usb 0x1555
++device.name MC141555 Hub
+
+ vendor.id usb 0x1065
++vendor.name CCYU Technology
+
+ vendor.id usb 0x1065
+&device.id usb 0x2136
++device.name EasyDisk ED1064
+
+ vendor.id usb 0x10ac
++vendor.name Honeywell, Inc.
+
+ vendor.id usb 0x10b5
++vendor.name PLX
+
+ vendor.id usb 0x10b5
+&device.id usb 0x9060
++device.name Test Board
+
+ vendor.id usb 0x1132
++vendor.name Toshiba Corp., Digital Media Equipment [hex]
+
+ vendor.id usb 0x1132
+&device.id usb 0x4331
++device.name PDR-M4/M5/M70 Digital Camera
+
+ vendor.id usb 0x1132
+&device.id usb 0x4432
++device.name PDR-M60 Digital Camera
+
+ vendor.id usb 0x1183
++vendor.name Compaq Computer Corp. [hex]
+
+ vendor.id usb 0x1183
+&device.id usb 0x4008
++device.name 56k FaxModem
+
+ vendor.id usb 0x1183
+&device.id usb 0x19c7
++device.name ISDN TA
+
+ vendor.id usb 0x1183
+&device.id usb 0x504a
++device.name PJB-100 Personal Jukebox
+
+ vendor.id usb 0x1190
++vendor.name Tripace
+
+ vendor.id usb 0x120e
++vendor.name Hudson Soft Co., Ltd.
+
+ vendor.id usb 0x1292
++vendor.name Innomedia
+
+ vendor.id usb 0x1292
+&device.id usb 0x0258
++device.name Creative Labs VoIP Blaster
+
+ vendor.id usb 0x1293
++vendor.name Belkin Components [hex]
+
+ vendor.id usb 0x1293
+&device.id usb 0x0002
++device.name F5U002 Parallel Port [uss720]
+
+ vendor.id usb 0x1293
+&device.id usb 0x2101
++device.name 104-key keyboard
+
+ vendor.id usb 0x1342
++vendor.name Mobility
+
+ vendor.id usb 0x1342
+&device.id usb 0x0200
++device.name EasiDock 200 Hub
+
+ vendor.id usb 0x1342
+&device.id usb 0x0201
++device.name EasiDock 200 Keyboard and Mouse Port
+
+ vendor.id usb 0x1342
+&device.id usb 0x0202
++device.name EasiDock 200 Serial Port
+
+ vendor.id usb 0x1342
+&device.id usb 0x0203
++device.name EasiDock 200 Printer Port
+
+ vendor.id usb 0x13d2
++vendor.name Shark Multimedia
+
+ vendor.id usb 0x13d2
+&device.id usb 0x0400
++device.name Pocket Ethernet [klsi]
+
+ vendor.id usb 0x1484
++vendor.name Elsa AG [hex]
+
+ vendor.id usb 0x1484
+&device.id usb 0x1746
++device.name Ecomo 19H99 Monitor
+
+ vendor.id usb 0x1484
+&device.id usb 0x7616
++device.name Elsa Hub
+
+ vendor.id usb 0x15e8
++vendor.name SohoWare
+
+ vendor.id usb 0x15e8
+&device.id usb 0x9100
++device.name NUB100 Ethernet [pegasus]
+
+ vendor.id usb 0x1604
++vendor.name Tascam
+
+ vendor.id usb 0x1604
+&device.id usb 0x8000
++device.name US-428 Audio/Midi Controller (without fw)
+
+ vendor.id usb 0x1604
+&device.id usb 0x8001
++device.name US-428 Audio/Midi Controller
+
+ vendor.id usb 0x1606
++vendor.name Umax [hex]
+
+ vendor.id usb 0x1606
+&device.id usb 0x0010
++device.name Astra 1220U
+
+ vendor.id usb 0x1606
+&device.id usb 0x0030
++device.name Astra 2000U
+
+ vendor.id usb 0x1606
+&device.id usb 0x0060
++device.name Astra 3400U
+
+ vendor.id usb 0x1606
+&device.id usb 0x0230
++device.name Astra 2200/2200SU
+
+ vendor.id usb 0x1606
+&device.id usb 0x2020
++device.name AstraCam 1000
+
+ vendor.id usb 0x1608
++vendor.name Inside Out Networks [hex]
+
+ vendor.id usb 0x1608
+&device.id usb 0x0001
++device.name EdgePort/4 Serial Port
+
+ vendor.id usb 0x1608
+&device.id usb 0x1403
++device.name MultiTech Systems MT4X56 Modem
+
+ vendor.id usb 0x1645
++vendor.name Entrega [hex]
+
+ vendor.id usb 0x1645
+&device.id usb 0x0001
++device.name 1S Serial Port
+
+ vendor.id usb 0x1645
+&device.id usb 0x0002
++device.name 2S Serial Port
+
+ vendor.id usb 0x1645
+&device.id usb 0x0003
++device.name 1S25 Serial Port
+
+ vendor.id usb 0x1645
+&device.id usb 0x0004
++device.name 4S Serial Port
+
+ vendor.id usb 0x1645
+&device.id usb 0x0005
++device.name E45 Ethernet [klsi]
+
+ vendor.id usb 0x1645
+&device.id usb 0x0006
++device.name Parallel Port
+
+ vendor.id usb 0x1645
+&device.id usb 0x0007
++device.name U1-SC25 SCSI
+
+ vendor.id usb 0x1645
+&device.id usb 0x0093
++device.name 1S9 Serial Port
+
+ vendor.id usb 0x1645
+&device.id usb 0x8000
++device.name EZ-USB
+
+ vendor.id usb 0x1645
+&device.id usb 0x8002
++device.name 2x Serial Port
+
+ vendor.id usb 0x1645
+&device.id usb 0x8093
++device.name PortGear Serial Port
+
+ vendor.id usb 0x1668
++vendor.name Actiontec Electronics, Inc. [hex]
+
+ vendor.id usb 0x1668
+&device.id usb 0x0333
++device.name Modem
+
+ vendor.id usb 0x1668
+&device.id usb 0x0421
++device.name 802.11b Wireless Adapter
+
+ vendor.id usb 0x1690
++vendor.name Askey Computer Corp. [hex]
+
+ vendor.id usb 0x1690
+&device.id usb 0x0101
++device.name Creative Modem Blaster DE5670
+
+ vendor.id usb 0x1690
+&device.id usb 0x0103
++device.name Askey 1456 VQE-R3 Modem [conexant]
+
+ vendor.id usb 0x1690
+&device.id usb 0x0109
++device.name Askey MagicXpress V.90 Pocket Modem [conexant]
+
+ vendor.id usb 0x2001
++vendor.name D-Link Corp [hex]
+
+ vendor.id usb 0x2001
+&device.id usb 0x4000
++device.name DSB-650C Ethernet [klsi]
+
+ vendor.id usb 0x2001
+&device.id usb 0x4001
++device.name DSB-650TX Ethernet [pegasus]
+
+ vendor.id usb 0x2001
+&device.id usb 0x4002
++device.name DSB-650TX Ethernet [pegasus]
+
+ vendor.id usb 0x2001
+&device.id usb 0x4003
++device.name DSB-650TX-PNA Ethernet [pegasus]
+
+ vendor.id usb 0x2001
+&device.id usb 0xabc1
++device.name DSB-650 Ethernet [pegasus]
+
+ vendor.id usb 0x2222
++vendor.name MacAlly
+
+ vendor.id usb 0x2222
+&device.id usb 0x0004
++device.name iWebKey Keyboard
+
+ vendor.id usb 0x22b8
++vendor.name Motorola PCS
+
+ vendor.id usb 0x22b8
+&device.id usb 0x1005
++device.name Ti280e GSM/GPRS Phone
+
+ vendor.id usb 0x2304
++vendor.name Pinnacle Systems, Inc. [hex]
+
+ vendor.id usb 0x2304
+&device.id usb 0x0111
++device.name Studio PCTV (PAL) Frame Grabber
+
+ vendor.id usb 0x2304
+&device.id usb 0x0112
++device.name Studio PCTV (NTSC) Frame Grabber
+
+ vendor.id usb 0x2304
+&device.id usb 0x0210
++device.name Studio PCTV (PAL) Frame Grabber
+
+ vendor.id usb 0x2304
+&device.id usb 0x0212
++device.name Studio PCTV (NTSC) Frame Grabber
+
+ vendor.id usb 0x2318
++vendor.name Shining Technologies Inc. [hex]
+
+ vendor.id usb 0x2318
+&device.id usb 0x0011
++device.name CitiDISK Jr. IDE Enclosure
+
+ vendor.id usb 0x2375
++vendor.name Digit@lway, Inc.
+
+ vendor.id usb 0x2375
+&device.id usb 0x0001
++device.name Digital Audio Player
+
+ vendor.id usb 0x3125
++vendor.name Eagletron
+
+ vendor.id usb 0x3125
+&device.id usb 0x0001
++device.name TrackerPod Camera Stand
+
+ vendor.id usb 0x3504
++vendor.name Micro Star
+
+ vendor.id usb 0x3504
+&device.id usb 0xf110
++device.name Security Key
+
+ vendor.id usb 0x3538
++vendor.name PQI
+
+ vendor.id usb 0x3538
+&device.id usb 0x0001
++device.name Travel Flash
+
+ vendor.id usb 0x4242
++vendor.name USB Design by Example
+
+ vendor.id usb 0x4242
+&device.id usb 0x4201
++device.name Buttons and Lights HID device
+
+ vendor.id usb 0x4242
+&device.id usb 0x4220
++device.name Echo 1 Camera
+
+ vendor.id usb 0x544d
++vendor.name Transmeta Corp.
+
+ vendor.id usb 0x55aa
++vendor.name OnSpec Electronic Inc.
+
+ vendor.id usb 0x55aa
+&device.id usb 0x1234
++device.name ATAPI Bridge
+
+ vendor.id usb 0x55aa
+&device.id usb 0xa103
++device.name Sandisk SDDR-55 SmartMedia Card Reader
+
+ vendor.id usb 0x5543
++vendor.name UC-Logic Technology, Corp.
+
+ vendor.id usb 0x5543
+&device.id usb 0x0002
++device.name SuperPen WP3325U Tablet
+
+ vendor.id usb 0x636c
++vendor.name CoreLogic, Inc.
+
+ vendor.id usb 0x6666
++vendor.name Prototype product Vendor ID
+
+ vendor.id usb 0x6666
+&device.id usb 0x0667
++device.name Smart Joy PSX, PS-PC Smart JoyPad
+
+ vendor.id usb 0x6a75
++vendor.name Shanghai Jujo Electronics Co., Ltd.
+
+ vendor.id usb 0x8086
++vendor.name Intel Corp.
+
+ vendor.id usb 0x8086
+&device.id usb 0x0110
++device.name Easy PC Camera
+
+ vendor.id usb 0x8086
+&device.id usb 0x0431
++device.name Intel Pro Video PC Camera
+
+ vendor.id usb 0x8086
+&device.id usb 0x0510
++device.name Digital Movie Creator
+
+ vendor.id usb 0x8086
+&device.id usb 0x0630
++device.name Pocket PC Camera
+
+ vendor.id usb 0x8086
+&device.id usb 0x9890
++device.name 82930 Test Board
+
+ vendor.id usb 0x8086
+&device.id usb 0xc013
++device.name Wireless HID Station
+
+ vendor.id usb 0xc251
++vendor.name Keil Software
+
--- /dev/null
+# some more usb info
+
+
+ vendor.id usb 0x03e8
++vendor.name AOX Inc.
+
+ vendor.id usb 0x03e9
++vendor.name Thesys Microelectronics
+
+ vendor.id usb 0x03ea
++vendor.name Data Broadcasting Corp.
+
+ vendor.id usb 0x03eb
++vendor.name Atmel Corporation
+
+ vendor.id usb 0x03ec
++vendor.name Iwatsu America Inc.
+
+ vendor.id usb 0x03ed
++vendor.name Mitel Corporation
+
+ vendor.id usb 0x03ee
++vendor.name Mitsumi
+
+ vendor.id usb 0x03f0
++vendor.name Hewlett Packard
+
+ vendor.id usb 0x03f1
++vendor.name Genoa Technology
+
+ vendor.id usb 0x03f2
++vendor.name Oak Technology, Inc
+
+ vendor.id usb 0x03f3
++vendor.name Adaptec, Inc.
+
+ vendor.id usb 0x03f4
++vendor.name Diebold, Inc.
+
+ vendor.id usb 0x03f5
++vendor.name Siemens Electromechanical
+
+ vendor.id usb 0x03f8
++vendor.name Epson Research Center
+
+ vendor.id usb 0x03f9
++vendor.name KeyTronic Corp.
+
+ vendor.id usb 0x03fb
++vendor.name OPTi Inc.
+
+ vendor.id usb 0x03fc
++vendor.name Elitegroup Computer Systems
+
+ vendor.id usb 0x03fd
++vendor.name Xilinx Inc.
+
+ vendor.id usb 0x03fe
++vendor.name Farallon
+
+ vendor.id usb 0x0400
++vendor.name National Semiconductor
+
+ vendor.id usb 0x0401
++vendor.name National Registry Inc.
+
+ vendor.id usb 0x0402
++vendor.name Acer Labs Inc.
+
+ vendor.id usb 0x0403
++vendor.name Future Technology Devices
+
+ vendor.id usb 0x0404
++vendor.name NCR Corporation
+
+ vendor.id usb 0x0405
++vendor.name Sand Microelectronics Inc.
+
+ vendor.id usb 0x0406
++vendor.name Fujitsu-ICL Computers
+
+ vendor.id usb 0x0407
++vendor.name Fujitsu Personal Systems, Inc.
+
+ vendor.id usb 0x0408
++vendor.name Quanta Computer Inc.
+
+ vendor.id usb 0x0409
++vendor.name NEC
+
+ vendor.id usb 0x040a
++vendor.name Eastman Kodak Co.
+
+ vendor.id usb 0x040b
++vendor.name Weltrend Semiconductor
+
+ vendor.id usb 0x040c
++vendor.name VTech Computers Ltd
+
+ vendor.id usb 0x040d
++vendor.name VIA Technologies, Inc.
+
+ vendor.id usb 0x040e
++vendor.name MCCI
+
+ vendor.id usb 0x040f
++vendor.name Echo Speech Corporation
+
+ vendor.id usb 0x0411
++vendor.name Melco, Inc.
+
+ vendor.id usb 0x0412
++vendor.name Award Software International
+
+ vendor.id usb 0x0413
++vendor.name Leadtek Research Inc.
+
+ vendor.id usb 0x0414
++vendor.name Giga-Byte Technology Co., Ltd.
+
+ vendor.id usb 0x0416
++vendor.name Winbond Electronics Corp.
+
+ vendor.id usb 0x0417
++vendor.name Symbios Logic
+
+ vendor.id usb 0x0418
++vendor.name AST Research
+
+ vendor.id usb 0x0419
++vendor.name Samsung Info. Systems America Inc.
+
+ vendor.id usb 0x041a
++vendor.name Phoenix Technologies, Ltd.
+
+ vendor.id usb 0x041b
++vendor.name d'TV
+
+ vendor.id usb 0x041d
++vendor.name S3, Inc.
+
+ vendor.id usb 0x041e
++vendor.name Creative Labs
+
+ vendor.id usb 0x041f
++vendor.name LCS Telegraphics
+
+ vendor.id usb 0x0420
++vendor.name Chips and Technologies
+
+ vendor.id usb 0x0421
++vendor.name Nokia Mobile Phones
+
+ vendor.id usb 0x0422
++vendor.name ADI Systems
+
+ vendor.id usb 0x0423
++vendor.name Computer Access Technology Corp.
+
+ vendor.id usb 0x0424
++vendor.name Standard Microsystems Corp.
+
+ vendor.id usb 0x0425
++vendor.name Motorola Semiconductors HK, Ltd.
+
+ vendor.id usb 0x0426
++vendor.name Integrated Device Technology
+
+ vendor.id usb 0x0427
++vendor.name Motorola Electronics Taiwan Ltd.
+
+ vendor.id usb 0x0428
++vendor.name Gravis
+
+ vendor.id usb 0x0428
+&device.id usb 0x4001
++baseclass.id 0x10d
++subclass.id 0x01
+
+ vendor.id usb 0x0429
++vendor.name Cirrus Logic
+
+ vendor.id usb 0x042a
++vendor.name Ericsson Austrian, AG
+
+ vendor.id usb 0x042b
++vendor.name Intel Corporation
+
+ vendor.id usb 0x042c
++vendor.name Innovative Semiconductors, Inc.
+
+ vendor.id usb 0x042d
++vendor.name Micronics
+
+ vendor.id usb 0x042e
++vendor.name Acer, Inc.
+
+ vendor.id usb 0x042f
++vendor.name Molex, Inc.
+
+ vendor.id usb 0x0430
++vendor.name Fujitsu Takamisawa America
+
+ vendor.id usb 0x0431
++vendor.name Itac Systems, Inc.
+
+ vendor.id usb 0x0432
++vendor.name Unisys Corp.
+
+ vendor.id usb 0x0433
++vendor.name Alps Electric Inc.
+
+ vendor.id usb 0x0434
++vendor.name Samsung Info. Systems America Inc.
+
+ vendor.id usb 0x0435
++vendor.name Hyundai Electronics America
+
+ vendor.id usb 0x0436
++vendor.name Taugagreining HF
+
+ vendor.id usb 0x0437
++vendor.name Framatome Connectors USA
+
+ vendor.id usb 0x0438
++vendor.name Advanced Micro Devices
+
+ vendor.id usb 0x0439
++vendor.name Voice Technologies Group
+
+ vendor.id usb 0x043d
++vendor.name Lexmark International Inc.
+
+ vendor.id usb 0x043e
++vendor.name LG Electronics USA Inc.
+
+ vendor.id usb 0x043f
++vendor.name RadiSys Corporation
+
+ vendor.id usb 0x0440
++vendor.name NANAO Corporation
+
+ vendor.id usb 0x0441
++vendor.name Winbond Systems Lab.
+
+ vendor.id usb 0x0442
++vendor.name Ericsson Inc.
+
+ vendor.id usb 0x0443
++vendor.name Gateway 2000
+
+ vendor.id usb 0x0445
++vendor.name Lucent Technologies
+
+ vendor.id usb 0x0446
++vendor.name NMB Technologies, Inc.
+
+ vendor.id usb 0x0447
++vendor.name Momentum Microsystems
+
+ vendor.id usb 0x044a
++vendor.name Shamrock Tech. Co., Ltd
+
+ vendor.id usb 0x044b
++vendor.name WSI
+
+ vendor.id usb 0x044c
++vendor.name CCL/ITRI
+
+ vendor.id usb 0x044d
++vendor.name Siemens Nixdorf
+
+ vendor.id usb 0x044e
++vendor.name Alps Electric Co.
+
+ vendor.id usb 0x044f
++vendor.name ThrustMaster, Inc.
+
+ vendor.id usb 0x0450
++vendor.name DFI Inc.
+
+ vendor.id usb 0x0451
++vendor.name Texas Instruments
+
+ vendor.id usb 0x0452
++vendor.name Mitsubishi Electronics America, Inc.
+
+ vendor.id usb 0x0453
++vendor.name CMD Technology
+
+ vendor.id usb 0x0454
++vendor.name Vobis Microcomputer AG
+
+ vendor.id usb 0x0455
++vendor.name Telematics International, Inc.
+
+ vendor.id usb 0x0456
++vendor.name Analog Devices, Inc.
+
+ vendor.id usb 0x0457
++vendor.name Silicon Integrated Systems Corp.
+
+ vendor.id usb 0x0458
++vendor.name KYE Systems Corp.
+
+ vendor.id usb 0x0458
+&device.id usb 0x0002
++device.name Genius NetMouse Pro
+
+ vendor.id usb 0x0459
++vendor.name Adobe Systems, Inc.
+
+ vendor.id usb 0x045a
++vendor.name Diamond Multimedia Systems
+
+ vendor.id usb 0x045b
++vendor.name Hitachi, Ltd
+
+ vendor.id usb 0x045d
++vendor.name Northern Telecom
+
+ vendor.id usb 0x045e
++vendor.name Microsoft
+
+ vendor.id usb 0x0460
++vendor.name Ace Cad Enterprise Co., Ltd.
+
+ vendor.id usb 0x0461
++vendor.name Primax Electronics
+
+ vendor.id usb 0x0463
++vendor.name MGE UPS Systems
+
+ vendor.id usb 0x0464
++vendor.name AMP Incorporated
+
+ vendor.id usb 0x0467
++vendor.name AT&T Paradyne
+
+ vendor.id usb 0x0468
++vendor.name Wieson Electronic Co., Ltd.
+
+ vendor.id usb 0x046a
++vendor.name Cherry Mikroschalter GmbH
+
+ vendor.id usb 0x046a
+&device.id usb 0x0001
++device.name RS 6000 M
+
+ vendor.id usb 0x046b
++vendor.name American Megatrends
+
+ vendor.id usb 0x046c
++vendor.name Toshiba
+
+ vendor.id usb 0x046d
++vendor.name Logitech Inc.
+
+ vendor.id usb 0x046d
+&device.id usb 0x0840
++baseclass.id 0x10f
++subclass.id 0x01
++device.name Webcam USB
+
+ vendor.id usb 0x046d
+&device.id usb 0xc001
++device.name Wheelmouse Model M-BB48
+
+ vendor.id usb 0x046e
++vendor.name Behavior Tech. Computer
+
+ vendor.id usb 0x046f
++vendor.name Crystal Semiconductor
+
+ vendor.id usb 0x0471
++vendor.name Philips
+
+ vendor.id usb 0x0472
++vendor.name Sun Microsystems
+
+ vendor.id usb 0x0473
++vendor.name Sanyo Information Business Co., Ltd.
+
+ vendor.id usb 0x0474
++vendor.name Sanyo Electric Co. Ltd.
+
+ vendor.id usb 0x0475
++vendor.name Relisys/TECO Information System
+
+ vendor.id usb 0x0476
++vendor.name AESP
+
+ vendor.id usb 0x0477
++vendor.name Seagate Technology
+
+ vendor.id usb 0x0478
++vendor.name Connectix Corp.
+
+ vendor.id usb 0x0479
++vendor.name Advanced Peripheral Laboratories
+
+ vendor.id usb 0x047a
++vendor.name USAR Systems
+
+ vendor.id usb 0x047b
++vendor.name Silitek Corp.
+
+ vendor.id usb 0x047c
++vendor.name Dell Computer Corp.
+
+ vendor.id usb 0x047d
++vendor.name Kensington
+
+ vendor.id usb 0x047d
+&device.id usb 0x4008
++baseclass.id 0x10d
++subclass.id 0x01
+
+ vendor.id usb 0x047e
++vendor.name Lucent Microelectronics Technologies
+
+ vendor.id usb 0x047f
++vendor.name Plantronics, Inc.
+
+ vendor.id usb 0x0480
++vendor.name Toshiba America Info. Systems, Inc.
+
+ vendor.id usb 0x0481
++vendor.name Zenith Data Systems
+
+ vendor.id usb 0x0482
++vendor.name Kyocera Electronics, Inc.
+
+ vendor.id usb 0x0483
++vendor.name SGS Thomson Microelectronics
+
+ vendor.id usb 0x0484
++vendor.name Specialix
+
+ vendor.id usb 0x0485
++vendor.name Nokia Monitors
+
+ vendor.id usb 0x0486
++vendor.name ASUS Computers Inc.
+
+ vendor.id usb 0x0487
++vendor.name Stewart Connector
+
+ vendor.id usb 0x0488
++vendor.name Cirque Corp.
+
+ vendor.id usb 0x0489
++vendor.name Foxconn / Hon Hai
+
+ vendor.id usb 0x048a
++vendor.name S-MOS Systems, Inc.
+
+ vendor.id usb 0x048c
++vendor.name Alps Electric Ireland Ltd.
+
+ vendor.id usb 0x048d
++vendor.name Integrated Technology Express
+
+ vendor.id usb 0x048f
++vendor.name Eicon Tech.
+
+ vendor.id usb 0x0490
++vendor.name United Microelectronics Corp.
+
+ vendor.id usb 0x0491
++vendor.name Capetronic
+
+ vendor.id usb 0x0492
++vendor.name Samsung SemiConductor, Inc.
+
+ vendor.id usb 0x0493
++vendor.name MAG Technology Co., Ltd.
+
+ vendor.id usb 0x0495
++vendor.name ESS Technology, Inc.
+
+ vendor.id usb 0x0496
++vendor.name Micron Electronics
+
+ vendor.id usb 0x0497
++vendor.name Smile International
+
+ vendor.id usb 0x0498
++vendor.name Capetronic (Kaohsiung) Corp.
+
+ vendor.id usb 0x0499
++vendor.name Yamaha Corporation
+
+ vendor.id usb 0x049a
++vendor.name Gandalf Technologies Ltd.
+
+ vendor.id usb 0x049b
++vendor.name System Connection
+
+ vendor.id usb 0x049c
++vendor.name Acer Advanced Labs, Inc.
+
+ vendor.id usb 0x049d
++vendor.name VLSI Technology
+
+ vendor.id usb 0x049f
++vendor.name Compaq Computers
+
+ vendor.id usb 0x04a0
++vendor.name Digital Equipment Corp.
+
+ vendor.id usb 0x04a1
++vendor.name SystemSoft Corporation
+
+ vendor.id usb 0x04a2
++vendor.name FirePower Systems
+
+ vendor.id usb 0x04a3
++vendor.name Trident Microsystems Inc.
+
+ vendor.id usb 0x04a4
++vendor.name Hitachi, Ltd.
+
+ vendor.id usb 0x04a5
++vendor.name Acer Peripheral Inc.
+
+ vendor.id usb 0x04a6
++vendor.name Nokia Display Products (Salcomp Oy)
+
+ vendor.id usb 0x04a7
++vendor.name Visioneer
+
+ vendor.id usb 0x04a8
++vendor.name Multivideo Labs, Inc.
+
+ vendor.id usb 0x04a9
++vendor.name Canon Inc.
+
+ vendor.id usb 0x04aa
++vendor.name DaeWoo Telecom, Ltd.
+
+ vendor.id usb 0x04ab
++vendor.name Chromatic Research
+
+ vendor.id usb 0x04ac
++vendor.name Micro Audiometrics Corp.
+
+ vendor.id usb 0x04ad
++vendor.name Dooin Electronics
+
+ vendor.id usb 0x04af
++vendor.name Winnov L.P.
+
+ vendor.id usb 0x04b0
++vendor.name Nikon Corporation
+
+ vendor.id usb 0x04b1
++vendor.name Pan International
+
+ vendor.id usb 0x04b3
++vendor.name IBM Corp.
+
+ vendor.id usb 0x04b4
++vendor.name Cypress Semiconductor
+
+ vendor.id usb 0x04b5
++vendor.name ROHM LSI Systems, Inc.
+
+ vendor.id usb 0x04b6
++vendor.name Hint Corporation
+
+ vendor.id usb 0x04b7
++vendor.name Compal Electronics, Inc.
+
+ vendor.id usb 0x04b8
++vendor.name Seiko Epson Corp.
+
+ vendor.id usb 0x04b9
++vendor.name Rainbow Technologies, Inc.
+
+ vendor.id usb 0x04ba
++vendor.name Toucan Systems Ltd.
+
+ vendor.id usb 0x04bb
++vendor.name I-O Data Device, Inc.
+
+ vendor.id usb 0x04bd
++vendor.name Toshiba Electronics Taiwan Corp.
+
+ vendor.id usb 0x04be
++vendor.name Telia Research AB
+
+ vendor.id usb 0x04bf
++vendor.name TDK USA Corporation
+
+ vendor.id usb 0x04c1
++vendor.name U.S. Robotics
+
+ vendor.id usb 0x04c2
++vendor.name Methode Electronics Far East Pte Ltd.
+
+ vendor.id usb 0x04c3
++vendor.name Maxi Switch, Inc.
+
+ vendor.id usb 0x04c4
++vendor.name Lockheed Martin Energy Research
+
+ vendor.id usb 0x04c5
++vendor.name Fujitsu Limited
+
+ vendor.id usb 0x04c6
++vendor.name Toshiba America Electronic Components
+
+ vendor.id usb 0x04c7
++vendor.name Micro Macro Technologies
+
+ vendor.id usb 0x04c8
++vendor.name Konica Corporation
+
+ vendor.id usb 0x04ca
++vendor.name Lite-On Technology Corp.
+
+ vendor.id usb 0x04cb
++vendor.name Fuji Photo Film Co., Ltd.
+
+ vendor.id usb 0x04cc
++vendor.name Philips Semiconductors
+
+ vendor.id usb 0x04cd
++vendor.name Tatung Co. Of America
+
+ vendor.id usb 0x04ce
++vendor.name ScanLogic Corporation
+
+ vendor.id usb 0x04cf
++vendor.name Myson Technology Inc.
+
+ vendor.id usb 0x04d0
++vendor.name Digi International
+
+ vendor.id usb 0x04d1
++vendor.name ITT Canon
+
+ vendor.id usb 0x04d2
++vendor.name Altec Lansing Technologies
+
+ vendor.id usb 0x04d3
++vendor.name VidUS, Inc.
+
+ vendor.id usb 0x04d4
++vendor.name LSI Logic Corporation
+
+ vendor.id usb 0x04d5
++vendor.name Forte Technologies, Inc.
+
+ vendor.id usb 0x04d6
++vendor.name CAE Technology
+
+ vendor.id usb 0x04d7
++vendor.name Oki Semiconductor
+
+ vendor.id usb 0x04d8
++vendor.name Micro Chip Technology, Inc.
+
+ vendor.id usb 0x04d9
++vendor.name Holtek Microelectronics Inc.
+
+ vendor.id usb 0x04da
++vendor.name Panasonic (Matsushita)
+
+ vendor.id usb 0x04db
++vendor.name Hypertec Pty Ltd.
+
+ vendor.id usb 0x04dc
++vendor.name Huan Hsin C., SDN.BHD
+
+ vendor.id usb 0x04dd
++vendor.name Sharp Corporation
+
+ vendor.id usb 0x04de
++vendor.name MindShare, Inc.
+
+ vendor.id usb 0x04df
++vendor.name Interlink Electronics
+
+ vendor.id usb 0x04e1
++vendor.name Iiyama North America Inc.
+
+ vendor.id usb 0x04e2
++vendor.name Exar Corporation
+
+ vendor.id usb 0x04e3
++vendor.name Zilog
+
+ vendor.id usb 0x04e4
++vendor.name ACC Microelectronics
+
+ vendor.id usb 0x04e5
++vendor.name Promise Technology
+
+ vendor.id usb 0x04e6
++vendor.name Shuttle Technology
+
+ vendor.id usb 0x04e7
++vendor.name ELO TouchSystems
+
+ vendor.id usb 0x04e8
++vendor.name Samsung Electronics Co., Ltd.
+
+ vendor.id usb 0x04e9
++vendor.name PC-Tel Inc.
+
+ vendor.id usb 0x04ea
++vendor.name Brooktree Corporation
+
+ vendor.id usb 0x04eb
++vendor.name Northstar Systems, Inc
+
+ vendor.id usb 0x04ec
++vendor.name Tokyo Electron Limited
+
+ vendor.id usb 0x04ed
++vendor.name Annabooks
+
+ vendor.id usb 0x04ef
++vendor.name Pacific Electronic International, Inc.
+
+ vendor.id usb 0x04f0
++vendor.name Daewoo Electronics Co., Ltd.
+
+ vendor.id usb 0x04f1
++vendor.name Victor Company of Japan
+
+ vendor.id usb 0x04f2
++vendor.name Chicony Electronics Co., Ltd.
+
+ vendor.id usb 0x04f3
++vendor.name Elan Microelectronics Corportation
+
+ vendor.id usb 0x04f4
++vendor.name Harting Elektronik Inc.
+
+ vendor.id usb 0x04f5
++vendor.name Fujitsu-ICL Systems, Inc.
+
+ vendor.id usb 0x04f6
++vendor.name Norand Corporation
+
+ vendor.id usb 0x04f7
++vendor.name Newnex Technology Corp.
+
+ vendor.id usb 0x04f8
++vendor.name FuturePlus Systems
+
+ vendor.id usb 0x04f9
++vendor.name Brother International Corp.
+
+ vendor.id usb 0x04fa
++vendor.name Dallas Semiconductor
+
+ vendor.id usb 0x04fb
++vendor.name Biostar Microtech Int'l Corp.
+
+ vendor.id usb 0x04fc
++vendor.name Sunplus Technology Co.
+
+ vendor.id usb 0x04fd
++vendor.name Soliton Systems, K.K.
+
+ vendor.id usb 0x04fe
++vendor.name PFU Limited
+
+ vendor.id usb 0x04ff
++vendor.name E-CMOS Corp.
+
+ vendor.id usb 0x0500
++vendor.name Siam United Hi-Tech
+
+ vendor.id usb 0x0501
++vendor.name DDK Electronics, Inc.
+
+ vendor.id usb 0x0502
++vendor.name Acer, Inc.
+
+ vendor.id usb 0x0503
++vendor.name Hitachi America Ltd.
+
+ vendor.id usb 0x0504
++vendor.name Hayes Microcomputer Products
+
+ vendor.id usb 0x0506
++vendor.name 3Com Corporation
+
+ vendor.id usb 0x0507
++vendor.name Hosiden Corporation
+
+ vendor.id usb 0x0508
++vendor.name Clarion Co., Ltd.
+
+ vendor.id usb 0x0509
++vendor.name Aztech Systems Ltd
+
+ vendor.id usb 0x050a
++vendor.name Cinch Connectors
+
+ vendor.id usb 0x050b
++vendor.name Cable System International
+
+ vendor.id usb 0x050c
++vendor.name InnoMedia, Inc.
+
+ vendor.id usb 0x050d
++vendor.name Belkin Components
+
+ vendor.id usb 0x050e
++vendor.name Neon Technology, Inc.
+
+ vendor.id usb 0x050f
++vendor.name Kawatsu Semiconductor, Inc.
+
+ vendor.id usb 0x0510
++vendor.name Sejin Electron Inc.
+
+ vendor.id usb 0x0511
++vendor.name N'ABLE Technologies, Inc (Data Book)
+
+ vendor.id usb 0x0512
++vendor.name Hualon Microelectronics Corp.
+
+ vendor.id usb 0x0513
++vendor.name digital-X, Inc.
+
+ vendor.id usb 0x0514
++vendor.name Berg Electronics, Inc.
+
+ vendor.id usb 0x0515
++vendor.name ACTC
+
+ vendor.id usb 0x0516
++vendor.name Longwell Electronics
+
+ vendor.id usb 0x0517
++vendor.name Butterfly Communications
+
+ vendor.id usb 0x0518
++vendor.name EzKEY Corp.
+
+ vendor.id usb 0x0519
++vendor.name Star Micronics America, Inc.
+
+ vendor.id usb 0x051a
++vendor.name WYSE Technology
+
+ vendor.id usb 0x051b
++vendor.name Silicon Graphics
+
+ vendor.id usb 0x051c
++vendor.name Holco Enterprise Co., Ltd./Shuttle Computer
+
+ vendor.id usb 0x051d
++vendor.name American Power Conversion
+
+ vendor.id usb 0x051e
++vendor.name Scientific Atlanta
+
+ vendor.id usb 0x051f
++vendor.name Elite Electronics, Inc.
+
+ vendor.id usb 0x0520
++vendor.name Taiwan Semiconductor Manufacturing Co.
+
+ vendor.id usb 0x0521
++vendor.name Airborn Connectors
+
+ vendor.id usb 0x0522
++vendor.name Advanced Connectek USA Inc.
+
+ vendor.id usb 0x0523
++vendor.name ATEN GMBH
+
+ vendor.id usb 0x0524
++vendor.name Micro Devices Technology
+
+ vendor.id usb 0x0525
++vendor.name Net Chip Technology, Inc.
+
+ vendor.id usb 0x0526
++vendor.name Temic Matra.mhs
+
+ vendor.id usb 0x0527
++vendor.name ALTRA
+
+ vendor.id usb 0x0528
++vendor.name ATI Technologies, Inc.
+
+ vendor.id usb 0x0529
++vendor.name Fast Security AG
+
+ vendor.id usb 0x052a
++vendor.name Crescent Heart Software
+
+ vendor.id usb 0x052b
++vendor.name Tekom Development
+
+ vendor.id usb 0x052c
++vendor.name Canon Information System
+
+ vendor.id usb 0x052d
++vendor.name Avid Electronics Corp.
+
+ vendor.id usb 0x052e
++vendor.name Standard Microsystems Corp.
+
+ vendor.id usb 0x052f
++vendor.name Unicore Software, Inc.
+
+ vendor.id usb 0x0530
++vendor.name American Microsystems Inc.
+
+ vendor.id usb 0x0531
++vendor.name Wacom Technology Corp.
+
+ vendor.id usb 0x0532
++vendor.name Systech Corporation
+
+ vendor.id usb 0x0533
++vendor.name Alcatel Mobile Phones
+
+ vendor.id usb 0x0534
++vendor.name Motorola
+
+ vendor.id usb 0x0535
++vendor.name LIH TZU Electric Co., Ltd.
+
+ vendor.id usb 0x0536
++vendor.name Welch Allyn Inc.
+
+ vendor.id usb 0x0537
++vendor.name Inventec Corporation
+
+ vendor.id usb 0x0538
++vendor.name Santa Cruz Operation
+
+ vendor.id usb 0x0539
++vendor.name Shyh Shiun Terminals Co. LTD
+
+ vendor.id usb 0x053a
++vendor.name Preh Werke Gmbh & Co. KG
+
+ vendor.id usb 0x053b
++vendor.name Global Village Communication
+
+ vendor.id usb 0x053c
++vendor.name Institut of Microelectronic & Mechatronic Systems
+
+ vendor.id usb 0x053d
++vendor.name Silicon Architect
+
+ vendor.id usb 0x053e
++vendor.name Electronic Accessory Specialists Int.
+
+ vendor.id usb 0x053f
++vendor.name Synopsys
+
+ vendor.id usb 0x0540
++vendor.name Universal Access
+
+ vendor.id usb 0x0541
++vendor.name Sirf Technology, Inc
+
+ vendor.id usb 0x0543
++vendor.name View Sonic Corporation
+
+ vendor.id usb 0x0544
++vendor.name Cristie Electronics Ltd.
+
+ vendor.id usb 0x0545
++vendor.name Xirlink, Inc.
+
+ vendor.id usb 0x0546
++vendor.name Polaroid Corporation
+
+ vendor.id usb 0x0547
++vendor.name Anchor Chips Inc.
+
+ vendor.id usb 0x0548
++vendor.name Tyan Computer Corp.
+
+ vendor.id usb 0x0549
++vendor.name Pixera Corporation
+
+ vendor.id usb 0x054a
++vendor.name Fujitsu Microelectronics, Inc.,
+
+ vendor.id usb 0x054b
++vendor.name New Media Corporation
+
+ vendor.id usb 0x054c
++vendor.name Sony Corporation
+
+ vendor.id usb 0x054d
++vendor.name Try Corporation
+
+ vendor.id usb 0x054e
++vendor.name Proside Corporation
+
+ vendor.id usb 0x054f
++vendor.name WYSE Technology Taiwan
+
+ vendor.id usb 0x0550
++vendor.name Fuji Xerox Co., Ltd.
+
+ vendor.id usb 0x0551
++vendor.name CompuTrend Systems, Inc.
+
+ vendor.id usb 0x0552
++vendor.name Philips Monitors
+
+ vendor.id usb 0x0553
++vendor.name VLSI Vision Ltd.
+
+ vendor.id usb 0x0554
++vendor.name Dictaphone Corp.
+
+ vendor.id usb 0x0555
++vendor.name ANAM S&T Co., Ltd.
+
+ vendor.id usb 0x0556
++vendor.name Asahi Kasei Microsystems Co., Ltd
+
+ vendor.id usb 0x0557
++vendor.name ATEN International Co. ltd.
+
+ vendor.id usb 0x0558
++vendor.name Truevision, Inc.
+
+ vendor.id usb 0x0559
++vendor.name Cadence Design Systems
+
+ vendor.id usb 0x055a
++vendor.name Kenwood USA
+
+ vendor.id usb 0x055b
++vendor.name KnowledgeTek, Inc.
+
+ vendor.id usb 0x055c
++vendor.name Proton Electronic Ind.
+
+ vendor.id usb 0x055d
++vendor.name Samsung Electro-Mechanics Co.
+
+ vendor.id usb 0x055e
++vendor.name CTX Opto-Electronics Corp.
+
+ vendor.id usb 0x055f
++vendor.name Mustek Systems Inc.
+
+ vendor.id usb 0x0560
++vendor.name Interface Co., Ltd.
+
+ vendor.id usb 0x0561
++vendor.name Oasis Design, Inc.
+
+ vendor.id usb 0x0562
++vendor.name Telex Communications Inc.
+
+ vendor.id usb 0x0563
++vendor.name Immersion Corporation
+
+ vendor.id usb 0x0564
++vendor.name Chinon Industries, Inc.
+
+ vendor.id usb 0x0565
++vendor.name Peracom Networks, Inc.
+
+ vendor.id usb 0x0567
++vendor.name Xyratex Int'l Ltd.
+
+ vendor.id usb 0x0568
++vendor.name Quartz Ingenierie
+
+ vendor.id usb 0x0569
++vendor.name SegaSoft
+
+ vendor.id usb 0x056a
++vendor.name WACOM Co., Ltd.
+
+ vendor.id usb 0x056b
++vendor.name Decicon Incorporated
+
+ vendor.id usb 0x056c
++vendor.name e-TEK Labs
+
+ vendor.id usb 0x056e
++vendor.name Elecom Co., Ltd.
+
+ vendor.id usb 0x056f
++vendor.name Korea Data Systems Co., Ltd.
+
+ vendor.id usb 0x0570
++vendor.name Epson America
+
+ vendor.id usb 0x0571
++vendor.name Interex, Inc.
+
+ vendor.id usb 0x0572
++vendor.name EEH Datalink Gmbh
+
+ vendor.id usb 0x0573
++vendor.name Nogatech Ltd.
+
+ vendor.id usb 0x0574
++vendor.name City University of Hong Kong
+
+ vendor.id usb 0x0575
++vendor.name Swets & Zeitlinger BV
+
+ vendor.id usb 0x0576
++vendor.name BAFO/Quality Computer Accessories
+
+ vendor.id usb 0x0577
++vendor.name ELSA
+
+ vendor.id usb 0x0578
++vendor.name Intrinsix Corp.
+
+ vendor.id usb 0x0579
++vendor.name GVC Corporation
+
+ vendor.id usb 0x057a
++vendor.name Samsung Electronics America
+
+ vendor.id usb 0x057b
++vendor.name Y-E Data, Inc.
+
+ vendor.id usb 0x057c
++vendor.name AVM Gmbh
+
+ vendor.id usb 0x057d
++vendor.name Shark Multimedia Inc.
+
+ vendor.id usb 0x057e
++vendor.name Nintendo Co.,
+
+ vendor.id usb 0x057f
++vendor.name Quickshot Technology Inc.
+
+ vendor.id usb 0x0580
++vendor.name Denron Inc.
+
+ vendor.id usb 0x0581
++vendor.name Racal Data Group
+
+ vendor.id usb 0x0582
++vendor.name Roland Corporation
+
+ vendor.id usb 0x0583
++vendor.name Padix Co. Ltd.
+
+ vendor.id usb 0x0584
++vendor.name RATOC System Inc.
+
+ vendor.id usb 0x0585
++vendor.name FlashPoint Technology, Inc.
+
+ vendor.id usb 0x0586
++vendor.name ZyXEL Communications Corp.
+
+ vendor.id usb 0x0587
++vendor.name America Kotobuki Electronics Ind.
+
+ vendor.id usb 0x0588
++vendor.name Sapien Design
+
+ vendor.id usb 0x0589
++vendor.name Victron
+
+ vendor.id usb 0x058a
++vendor.name Nohau Corporation
+
+ vendor.id usb 0x058b
++vendor.name Siemens Semiconductor
+
+ vendor.id usb 0x058c
++vendor.name In Focus Systems
+
+ vendor.id usb 0x058d
++vendor.name Micrel Semiconductor
+
+ vendor.id usb 0x058e
++vendor.name Tripath Technology Inc.
+
+ vendor.id usb 0x058f
++vendor.name Alcor Micro, Inc.
+
+ vendor.id usb 0x0590
++vendor.name OMRON Corporation
+
+ vendor.id usb 0x0591
++vendor.name Questra Consulting
+
+ vendor.id usb 0x0592
++vendor.name Exide Electronics
+
+ vendor.id usb 0x0593
++vendor.name Incite
+
+ vendor.id usb 0x0594
++vendor.name Princeton Graphic Systems
+
+ vendor.id usb 0x0595
++vendor.name Zoran Microelectronics Ltd.
+
+ vendor.id usb 0x0596
++vendor.name Microtouch Systems
+
+ vendor.id usb 0x0597
++vendor.name Trisignal Communications
+
+ vendor.id usb 0x0598
++vendor.name Nigata Canotec Co., Inc.
+
+ vendor.id usb 0x0599
++vendor.name Brilliance Semiconductor Inc.
+
+ vendor.id usb 0x059a
++vendor.name Spectrum Signal Processing Inc.
+
+ vendor.id usb 0x059b
++vendor.name Iomega Corporation
+
+ vendor.id usb 0x059b
+&device.id usb 0x0030
++device.name USB Zip 250
+
+ vendor.id usb 0x059c
++vendor.name A-Trend Technology Co., Ltd.
+
+ vendor.id usb 0x059d
++vendor.name Advanced Input Devices
+
+ vendor.id usb 0x059e
++vendor.name Intelligent Instrumentation
+
+ vendor.id usb 0x059f
++vendor.name Electronique D2
+
+ vendor.id usb 0x05a0
++vendor.name Vetronix Corporation
+
+ vendor.id usb 0x05a1
++vendor.name USC Corporation
+
+ vendor.id usb 0x05a2
++vendor.name Fuji Film Microdevices Co. Ltd.
+
+ vendor.id usb 0x05a3
++vendor.name VAutomation Inc.
+
+ vendor.id usb 0x05a4
++vendor.name Ortek Technology, Inc.
+
+ vendor.id usb 0x05a5
++vendor.name Sampo Technology Corp.
+
+ vendor.id usb 0x05a6
++vendor.name Cisco Systems
+
+ vendor.id usb 0x05a7
++vendor.name Bose Corporation
+
+ vendor.id usb 0x05a8
++vendor.name Spacetec IMC Corporation
+
+ vendor.id usb 0x05a9
++vendor.name OmniVision Technologies, Inc.
+
+ vendor.id usb 0x05aa
++vendor.name Utilux South China Ltd.
+
+ vendor.id usb 0x05ab
++vendor.name In-System Design
+
+ vendor.id usb 0x05ac
++vendor.name Apple Computer, Inc.
+
+ vendor.id usb 0x05ac
+&device.id usb 0x0202
++device.name Apple USB Keyboard
+
+ vendor.id usb 0x05ac
+&device.id usb 0x0301
++device.name Apple USB Mouse
+
+ vendor.id usb 0x05ac
+&device.id usb 0x1001
++device.name Apple USB Hub
+
+ vendor.id usb 0x05ad
++vendor.name Y.C.Cable U.S.A., Inc
+
+ vendor.id usb 0x05ae
++vendor.name Synopsys, Inc.
+
+ vendor.id usb 0x05af
++vendor.name Jing-Mold Enterprise Co., Ltd.
+
+ vendor.id usb 0x05b0
++vendor.name Fountain Technologies, Inc
+
+ vendor.id usb 0x05b1
++vendor.name First International Computer, Inc
+
+ vendor.id usb 0x05b4
++vendor.name LG Semicon Co., Ltd.
+
+ vendor.id usb 0x05b5
++vendor.name Dialogic Corp
+
+ vendor.id usb 0x05b6
++vendor.name Proxima Corporation
+
+ vendor.id usb 0x05b7
++vendor.name Medianix Semiconductor, Inc.
+
+ vendor.id usb 0x05b9
++vendor.name Philips Research Laboratories
+
+ vendor.id usb 0x05ba
++vendor.name Digital Persona
+
+ vendor.id usb 0x05be
++vendor.name Raychem Corporation
+
+ vendor.id usb 0x05bf
++vendor.name S & S Research
+
+ vendor.id usb 0x05c1
++vendor.name Kawasaki Steel
+
+ vendor.id usb 0x05c2
++vendor.name Mediaphonics S.A.
+
+ vendor.id usb 0x05c5
++vendor.name Central Data Corporation
+
+ vendor.id usb 0x05c6
++vendor.name Qualcomm, Inc
+
+ vendor.id usb 0x05c7
++vendor.name Qtronix Corp
+
+ vendor.id usb 0x05c8
++vendor.name Cheng Uei Precision Industry Co., Ltd
+
+ vendor.id usb 0x05c9
++vendor.name Semtech Corporation
+
+ vendor.id usb 0x05ca
++vendor.name Ricoh Company Ltd.
+
+ vendor.id usb 0x05cb
++vendor.name Powerchip Semiconductor Co.
+
+ vendor.id usb 0x05cc
++vendor.name ELSA Gmbh
+
+ vendor.id usb 0x05cd
++vendor.name Silicom LTD.
+
+ vendor.id usb 0x05ce
++vendor.name SICAN Gmbh
+
+ vendor.id usb 0x05cf
++vendor.name Sung Forn Co. LTD.
+
+ vendor.id usb 0x05d0
++vendor.name Lunar Corporation
+
+ vendor.id usb 0x05e3
+&device.id usb 0x000b
++device.name Razer Boomslang USB Mouse
+
+ vendor.id usb 0x0698
++vendor.name Chuntex (CTX)
+
+ vendor.id usb 0x0c4b
++vendor.name Reiner SCT
+
+ vendor.id usb 0x0c4b
+&device.id usb 0x0100
++baseclass.id 0x10e
++subclass.id 0x00
++device.name Cyberjack USB
+
+ vendor.id usb 0x0ef7
++vendor.name Tulip Computers International
+
+ vendor.id usb 0x1606
++vendor.name UMAX Data Systems, Inc.
+
+ vendor.id usb 0x1606
+&device.id usb 0x0010
++device.name Astra 1220U
+
+ vendor.id usb 0x1606
+&device.id usb 0x0030
++device.name Astra 2000U
+
+ vendor.id usb 0x1606
+&device.id usb 0x0130
++device.name Astra 2100U
+
+ vendor.id usb 0x1606
+&device.id usb 0x0230
++device.name Astra 2200 (USB)
+
+ vendor.id usb 0x1606
+&device.id usb 0x1030
++device.name Astra 4000U
+
+ vendor.id usb 0x8086
++vendor.name Intel Corporation
+
+ vendor.id usb 0xc251
++vendor.name Keil Software
+
--- /dev/null
+ vendor.id pci 0x1002
++vendor.name ATI Technologies Inc
+
+ vendor.id pci 0x1002
+&device.id pci 0x3150
++device.name Radeon Mobility X600 (M24) 3150 (PCIE)
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x3154
++device.name FireGL M24 GL 3154 (PCIE)
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x3e50
++device.name Radeon X600 (RV380) 3E50 (PCIE)
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x3e50
+&subvendor.id pci 0x174b
+&subdevice.id pci 0x0450
++subdevice.name Radeon X600 Pro
++driver.xfree 4|radeon
++driver.xfree 4|fglrx|3d||dri
++driver.xfree.config Option "UseInternalAGPGART" "no"
++driver.xfree.config Option "mtrr" "off"
++driver.xfree.config Option "VideoOverlay" "on"
++driver.xfree.config Option "OpenGLOverlay" "off"
++requires fglrx
+
+ vendor.id pci 0x1002
+&device.id pci 0x3e54
++device.name FireGL V3200 (RV380) 3E54 (PCIE)
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4136
++device.name RS100 4136
++driver.xfree 4|radeon
++driver.xfree 4|radeon|3d||dri
+
+ vendor.id pci 0x1002
+&device.id pci 0x4137
++device.name RS100 4137
++driver.xfree 4|radeon
++driver.xfree 4|radeon|3d||dri
+
+ vendor.id pci 0x1002
+&device.id pci 0x4144
++device.name R300 AD
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4145
++device.name E300 AE
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4146
++device.name R300 AF
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4147
++device.name R300 AG
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4148
++device.name R350 AH
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4149
++device.name R350 AI
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x414a
++device.name R350 AJ
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x414b
++device.name R350 AK
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4150
++device.name RV350 AP
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4151
++device.name RV350 AQ
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4152
++device.name RV350 AR
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4153
++device.name RV350 AS
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4154
++device.name RV350 AT
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4155
++device.name RV350 AU
++driver.xfree 4|radeon
++driver.xfree.config ChipID 0x4154
+
+ vendor.id pci 0x1002
+&device.id pci 0x4156
++device.name RV350 AV
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4157
++device.name RV350 AW
++driver.xfree 4|radeon
++driver.xfree.config ChipID 0x4154
+
+ vendor.id pci 0x1002
+&device.id pci 0x4237
++device.name RS250 4237
++driver.xfree 4|radeon
++driver.xfree 4|radeon|3d||dri
+
+ vendor.id pci 0x1002
+&device.id pci 0x4242
++device.name R200 BB
++driver.xfree 4|radeon
++driver.xfree 4|radeon|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x4243
++device.name R200 BC
++driver.xfree 4|radeon
++driver.xfree 4|radeon|3d||dri
+
+ vendor.id pci 0x1002
+&device.id pci 0x4336
++device.name RS100 4336
++driver.xfree 4|radeon
++driver.xfree 4|radeon|3d||dri
+
+ vendor.id pci 0x1002
+&device.id pci 0x4337
++device.name RS200 4337
++driver.xfree 4|radeon
++driver.xfree 4|radeon|3d||dri
+
+ vendor.id pci 0x1002
+&device.id pci 0x4354
++device.name 215CT [Mach64 CT]
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x4358
++device.name 210888CX [Mach64 CX]
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x4437
++device.name RS250 4437
++driver.xfree 4|radeon
++driver.xfree 4|radeon|3d||dri
+
+ vendor.id pci 0x1002
+&device.id pci 0x4554
++device.name 210888ET [Mach64 ET]
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x4742
++device.name 3D Rage Pro AGP 1X/2X
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x4744
++device.name 3D Rage Pro AGP 1X
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x4749
++device.name Mach64 GI
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x474c
++device.name Rage XC
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x474d
++device.name Rage XL AGP
++driver.xfree 4|ati|||||8,16,24
+
+ vendor.id pci 0x1002
+&device.id pci 0x474e
++device.name Rage XC AGP
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x474f
++device.name Rage XL
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x4750
++device.name 3D Rage Pro 215GP
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x4751
++device.name 3D Rage Pro 215GQ
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x4752
++device.name Mach64 GR
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x4753
++device.name Mach64 GS
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x4754
++device.name 3D Rage I/II 215GT [Mach64 GT]
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x4755
++device.name 3D Rage II+ 215GTB [Mach64 GTB]
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x4756
++device.name 3D Rage IIC 215IIC [Mach64 GT IIC]
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x4757
++device.name 3D Rage IIC AGP
++driver.xfree 4|ati|||||8,15,16,24
+
+ vendor.id pci 0x1002
+&device.id pci 0x4758
++device.name 210888GX [Mach64 GX]
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x4759
++device.name 3D Rage IIC
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x475a
++device.name Mach64 GZ
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x4966
++device.name RV250 If
++driver.xfree 4|radeon
++driver.xfree 4|radeon|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x4966
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x0002
++subdevice.name Radeon 9000
+
+ vendor.id pci 0x1002
+&device.id pci 0x4967
++device.name RV250 Ig
++driver.xfree 4|radeon
++driver.xfree 4|radeon|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x4a48
++device.name R420 JH
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4a49
++device.name R420 JI
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4a4a
++device.name R420 JJ
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4a4b
++device.name R420 JK
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4a4c
++device.name R420 JL
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4a4d
++device.name R420 JM
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4a4e
++device.name R420 JN
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4a50
++device.name R420 JP
++driver.xfree 4|radeon
++driver.xfree 4|fglrx|3d||dri
++driver.xfree.config Option "UseInternalAGPGART" "no"
++driver.xfree.config Option "mtrr" "off"
++driver.xfree.config Option "VideoOverlay" "on"
++driver.xfree.config Option "OpenGLOverlay" "off"
++requires fglrx
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c42
++device.name Mach64 LB
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c42
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x0044
++subdevice.name 3D Rage LT Pro AGP-133
++driver.xfree 4|ati
++driver.xfree.config Option "dpms" "off"
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c44
++device.name 3D Rage LT Pro AGP-66
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c45
++device.name Rage 128 Mobility LE
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c46
++device.name Mobility M3 AGP 2x
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c47
++device.name 3D Rage LT-G 215LG
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c49
++device.name Mach64 LI
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c4d
++device.name 3D Rage P/M Mobility AGP 2x
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c4d
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x00bb
++subdevice.name Mach64LM/Dell
++driver.xfree 4|fbdev
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c4e
++device.name 3D Rage L Mobility AGP 2x
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c50
++device.name 3D Rage LT Pro
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c51
++device.name Mach64 LQ
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c52
++device.name 3D Rage P/M Mobility
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c53
++device.name 3D Rage L Mobility
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c57
++device.name Radeon LW
++driver.xfree 4|radeon
++driver.xfree 4|radeon|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c58
++device.name Radeon LX
++driver.xfree 4|radeon
++driver.xfree 4|radeon|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c59
++device.name Radeon LY
++driver.xfree 4|radeon
++driver.xfree 4|radeon|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c5a
++device.name Radeon LZ
++driver.xfree 4|radeon
++driver.xfree 4|radeon|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c64
++device.name RV250 Ld
++driver.xfree 4|radeon
++driver.xfree 4|radeon|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c66
++device.name RV250 Lf
++driver.xfree 4|radeon
++driver.xfree 4|radeon|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c67
++device.name RV250 Lg
++driver.xfree 4|radeon
++driver.xfree 4|radeon|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x4d46
++device.name Rage 128 Mobility MF
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x4d4c
++device.name Rage 128 Mobility ML
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x4e44
++device.name R300 ND
++driver.xfree 4|radeon
++driver.xfree 4|fglrx|3d||dri
++driver.xfree.config Option "UseInternalAGPGART" "no"
++driver.xfree.config Option "mtrr" "off"
++driver.xfree.config Option "VideoOverlay" "on"
++driver.xfree.config Option "OpenGLOverlay" "off"
++requires fglrx
+
+ vendor.id pci 0x1002
+&device.id pci 0x4e44
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x0002
++subdevice.name Radeon 9700
+
+ vendor.id pci 0x1002
+&device.id pci 0x4e45
++device.name R300 NE
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4e46
++device.name R300 NF
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4e47
++device.name R300 NG
++driver.xfree 4|radeon
++driver.xfree 4|fglrx|3d||dri
++driver.xfree.config Option "UseInternalAGPGART" "no"
++driver.xfree.config Option "mtrr" "off"
++driver.xfree.config Option "VideoOverlay" "on"
++driver.xfree.config Option "OpenGLOverlay" "off"
++requires fglrx
+
+ vendor.id pci 0x1002
+&device.id pci 0x4e47
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x0172
++subdevice.name FireGL X1
+
+ vendor.id pci 0x1002
+&device.id pci 0x4e48
++device.name R350 NH
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4e49
++device.name R350 NI
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4e4a
++device.name R360 NJ
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4e4b
++device.name R350 NK
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4e50
++device.name RV350 NP
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4e51
++device.name RV350 NQ
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4e52
++device.name RV350 NR
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4e53
++device.name RV350 NS
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4e54
++device.name RV350 NT
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4e56
++device.name RV350 NV
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x5041
++device.name Rage 128 PA
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5042
++device.name Rage 128 PB
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5043
++device.name Rage 128 PC
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5044
++device.name Rage 128 PD
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5045
++device.name Rage 128 PE
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5046
++device.name Rage 128 PF
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5047
++device.name Rage 128 PG
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5048
++device.name Rage 128 PH
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5049
++device.name Rage 128 PI
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x504a
++device.name Rage 128 PJ
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x504b
++device.name Rage 128 PK
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x504c
++device.name Rage 128 PL
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x504d
++device.name Rage 128 PM
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x504e
++device.name Rage 128 PN
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x504f
++device.name Rage 128 PO
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5050
++device.name Rage 128 PP
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5051
++device.name Rage 128 PQ
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5052
++device.name Rage 128 PR
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5053
++device.name Rage 128 PS
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5054
++device.name Rage 128 PT
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5055
++device.name Rage 128 PU
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5056
++device.name Rage 128 PV
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5057
++device.name Rage 128 PW
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5058
++device.name Rage 128 PX
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5144
++device.name Radeon QD
++driver.xfree 4|radeon
++driver.xfree 4|radeon|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5145
++device.name Radeon QE
++driver.xfree 4|radeon
++driver.xfree 4|radeon|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5146
++device.name Radeon QF
++driver.xfree 4|radeon
++driver.xfree 4|radeon|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5147
++device.name Radeon QG
++driver.xfree 4|radeon
++driver.xfree 4|radeon|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5148
++device.name fgl8x00
++driver.xfree 4|radeon
++driver.xfree 4|radeon|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5148
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x0152
++subdevice.name FireGL 8800
+
+ vendor.id pci 0x1002
+&device.id pci 0x5148
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x0172
++subdevice.name FireGL 8700
++driver.xfree 4|radeon
++driver.xfree 4|radeon|3d||dri
+
+ vendor.id pci 0x1002
+&device.id pci 0x514c
++device.name R200 QL
++driver.xfree 4|radeon
++driver.xfree 4|radeon|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x514d
++device.name Radeon 9100 QM
++driver.xfree 4|radeon
++driver.xfree 4|radeon|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5157
++device.name RV200 QW
++driver.xfree 4|radeon
++driver.xfree 4|radeon|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5157
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x013a
++subdevice.name Radeon 7500
+
+ vendor.id pci 0x1002
+&device.id pci 0x5157
+&subvendor.id pci 0x174b
+&subdevice.id pci 0x7146
++subdevice.name Radeon 7500-7146
++driver.xfree 4|radeon
++driver.xfree 4|radeon|3d||dri
+
+ vendor.id pci 0x1002
+&device.id pci 0x5157
+&subvendor.id pci 0x174b
+&subdevice.id pci 0x7161
++subdevice.name Radeon 7500 LE
++driver.xfree 4|radeon
++driver.xfree 4|radeon|3d||dri
+
+ vendor.id pci 0x1002
+&device.id pci 0x5158
++device.name RV200 QX
++driver.xfree 4|radeon
++driver.xfree 4|radeon|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5159
++device.name Radeon VE
++driver.xfree 4|radeon
++driver.xfree 4|radeon|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x515a
++device.name Radeon QZ
++driver.xfree 4|radeon
++driver.xfree 4|radeon|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x515e
++device.name ES1000 (1002:515E)
++driver.xfree 4|radeon
++driver.xfree.config ChipID 0x5969
+
+ vendor.id pci 0x1002
+&device.id pci 0x5245
++device.name Rage 128 RE
++driver.xfree 4|r128|||||8,15,16,24
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5246
++device.name Rage 128 RF
++driver.xfree 4|r128|||||8,15,16,24
+
+ vendor.id pci 0x1002
+&device.id pci 0x5247
++device.name Rage 128 RG
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x524b
++device.name Rage 128 RK
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x524c
++device.name Rage 128 RL
++driver.xfree 4|r128|||||8,15,16,24
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5345
++device.name Rage 128 SE
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5346
++device.name Rage 128 SF
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5347
++device.name Rage 128 SG
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5348
++device.name Rage 128 4x
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x534b
++device.name Rage 128 SK
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x534c
++device.name Rage 128 SL
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x534d
++device.name Rage 128 SM
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x534e
++device.name Rage 128 SN
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5446
++device.name Rage 128 Ultra TF
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x544c
++device.name Rage128 TL
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5452
++device.name Rage 128 Pro TR (AGP)
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5453
++device.name Rage 128 TS
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5454
++device.name Rage 128 TT
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5455
++device.name Rage 128 TU
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5460
++device.name Radeon Mobility M300 (M22) 5460 (PCIE)
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x5464
++device.name FireGL M22 GL 5464 (PCIE)
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x5548
++device.name Radeon X800 (R423) UH (PCIE)
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x5549
++device.name Radeon X800PRO (R423) UI (PCIE)
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x554a
++device.name Radeon X800LE (R423) UJ (PCIE)
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x554b
++device.name Radeon X800SE (R423) UK (PCIE)
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x554d
++device.name Radeon X800 XL
++driver.xfree 4|radeon
++driver.xfree.config ChipID 0x554b
+
+ vendor.id pci 0x1002
+&device.id pci 0x554d
+&subvendor.id pci 0x174b
+&subdevice.id pci 0x0600
++subdevice.name Radeon X800 XL
+
+ vendor.id pci 0x1002
+&device.id pci 0x5551
++device.name FireGL V7200 (R423) UQ (PCIE)
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x5552
++device.name FireGL V5100 (R423) UR (PCIE)
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x5554
++device.name FireGL V7100 (R423) UT (PCIE)
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x5654
++device.name Mach64 VT
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x5655
++device.name 264VT3 [Mach64 VT3]
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x5656
++device.name 264VT4 [Mach64 VT4]
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x5834
++device.name RS300 5834
++driver.xfree 4|radeon
++driver.xfree 4|radeon|3d||dri
+
+ vendor.id pci 0x1002
+&device.id pci 0x5835
++device.name RS300 5835
++driver.xfree 4|radeon
++driver.xfree 4|radeon|3d||dri
+
+ vendor.id pci 0x1002
+&device.id pci 0x5960
++device.name RV280 5960
++driver.xfree 4|radeon
++driver.xfree 4|radeon|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5961
++device.name RV280 5961
++driver.xfree 4|radeon
++driver.xfree 4|radeon|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5962
++device.name RV280 5962
++driver.xfree 4|radeon
++driver.xfree 4|radeon|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5964
++device.name RV280 5964
++driver.xfree 4|radeon
++driver.xfree 4|radeon|3d||dri
+
+ vendor.id pci 0x1002
+&device.id pci 0x5964
+&subvendor.id pci 0x17af
+&subdevice.id pci 0x2012
++subdevice.name Radeon 9200 SE (DH)
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x5969
++device.name ES1000 (PCI)
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x5b60
++device.name Radeon X300 (RV370) 5B60 (PCIE)
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x5b60
+&subvendor.id pci 0x174b
+&subdevice.id pci 0x0440
++subdevice.name Radeon X300 SE
++driver.xfree 4|radeon
++driver.xfree 4|fglrx|3d||dri
++driver.xfree.config Option "UseInternalAGPGART" "no"
++driver.xfree.config Option "mtrr" "off"
++driver.xfree.config Option "VideoOverlay" "on"
++driver.xfree.config Option "OpenGLOverlay" "off"
++requires fglrx
+
+ vendor.id pci 0x1002
+&device.id pci 0x5b62
++device.name Radeon X600 (RV370) 5B62 (PCIE)
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x5b64
++device.name FireGL V3100 (RV370) 5B64 (PCIE)
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x5b65
++device.name FireGL D1100 (RV370) 5B65 (PCIE)
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x5c61
++device.name RV280 5c61
++driver.xfree 4|radeon
++driver.xfree 4|radeon|3d||dri
+
+ vendor.id pci 0x1002
+&device.id pci 0x5c63
++device.name RV280 5c63
++driver.xfree 4|radeon
++driver.xfree 4|radeon|3d||dri
+
+ vendor.id pci 0x1002
+&device.id pci 0x5d57
++device.name Radeon X800XT (R423) 5D57 (PCIE)
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x5e4a
++device.name Radeon X700 XT
++driver.xfree 4|radeon
++driver.xfree.config ChipID 0x5D57
+
+ vendor.id pci 0x1002
+&device.id pci 0x5e4b
++device.name Radeon X700 Pro
++driver.xfree 4|radeon
++driver.xfree.config ChipID 0x5549
++driver.xfree 4|fglrx|3d||dri
++requires fglrx
+
+ vendor.id pci 0x1002
+&device.id pci 0x5e4c
++device.name Radeon X700 SE
++driver.xfree 4|radeon
++driver.xfree.config ChipID 0x554B
+
+ vendor.id pci 0x1002
+&device.id pci 0x5e4d
++device.name Radeon X700 (5E4D)
++driver.xfree 4|radeon
++driver.xfree.config ChipID 0x5548
+
+ vendor.id pci 0x1002
+&device.id pci 0x5e4f
++device.name Radeon X700 (5E4F)
++driver.xfree 4|radeon
++driver.xfree.config ChipID 0x5548
+
+ vendor.id pci 0x1002
+&device.id pci 0x7834
++device.name Radeon 9100 PRO IGP 7834
++driver.xfree 4|radeon
++driver.xfree 4|radeon|3d||dri
+
+ vendor.id pci 0x1002
+&device.id pci 0x7835
++device.name Radeon Mobility 9200 IGP 7835
++driver.xfree 4|radeon
++driver.xfree 4|radeon|3d||dri
+
+ vendor.id pci 0x100b
++vendor.name National Semiconductor Corporation
+
+ vendor.id pci 0x100b
+&device.id pci 0x0030
++device.name REDCLOUD
++driver.xfree 4|nsc
+
+ vendor.id pci 0x100b
+&device.id pci 0x0104
++device.name SC1400
++driver.xfree 4|nsc
+
+ vendor.id pci 0x100b
+&device.id pci 0x0504
++device.name SC1200
++driver.xfree 4|nsc
+
+ vendor.id pci 0x100c
++vendor.name Tseng Labs Inc
+
+ vendor.id pci 0x100c
+&device.id pci 0x3202
++device.name ET4000/W32p rev A
++driver.xfree 4|tseng
+
+ vendor.id pci 0x100c
+&device.id pci 0x3205
++device.name ET4000/W32p rev B
++driver.xfree 4|tseng
+
+ vendor.id pci 0x100c
+&device.id pci 0x3206
++device.name ET4000/W32p rev C
++driver.xfree 4|tseng
+
+ vendor.id pci 0x100c
+&device.id pci 0x3207
++device.name ET4000/W32p rev D
++driver.xfree 4|tseng
+
+ vendor.id pci 0x100c
+&device.id pci 0x3208
++device.name ET6000
++driver.xfree 4|tseng
+
+ vendor.id pci 0x1013
++vendor.name Cirrus Logic
+
+ vendor.id pci 0x1013
+&device.id pci 0x0038
++device.name GD 7548
++driver.xfree 4|cirrus
+
+ vendor.id pci 0x1013
+&device.id pci 0x00a0
++device.name GD 5430/40 [Alpine]
++driver.xfree 4|cirrus||||Noaccel
+
+ vendor.id pci 0x1013
+&device.id pci 0x00a4
++device.name GD 5434-4 [Alpine]
++driver.xfree 4|cirrus
+
+ vendor.id pci 0x1013
+&device.id pci 0x00a8
++device.name GD 5434-8 [Alpine]
++driver.xfree 4|cirrus
+
+ vendor.id pci 0x1013
+&device.id pci 0x00ac
++device.name GD 5436 [Alpine]
++driver.xfree 4|cirrus
+
+ vendor.id pci 0x1013
+&device.id pci 0x00b8
++device.name GD 5446
++driver.xfree 4|cirrus
+
+ vendor.id pci 0x1013
+&device.id pci 0x00bc
++device.name GD 5480
++driver.xfree 4|cirrus
+
+ vendor.id pci 0x1013
+&device.id pci 0x00d0
++device.name GD 5462
++driver.xfree 4|cirrus
+
+ vendor.id pci 0x1013
+&device.id pci 0x00d4
++device.name GD 5464 [Laguna]
++driver.xfree 4|cirrus
+
+ vendor.id pci 0x1013
+&device.id pci 0x00d5
++device.name GD5464BD
++driver.xfree 4|cirrus
+
+ vendor.id pci 0x1013
+&device.id pci 0x00d6
++device.name GD 5465 [Laguna]
++driver.xfree 4|cirrus
+
+ vendor.id pci 0x1023
++vendor.name Trident Microsystems Inc.
+
+ vendor.id pci 0x1023
+&device.id pci 0x2100
++device.name CyberBlade/xp4
++driver.xfree 4|trident
+
+ vendor.id pci 0x1023
+&device.id pci 0x8400
++device.name CyberBlade/i7
++driver.xfree 4|trident
+
+ vendor.id pci 0x1023
+&device.id pci 0x8420
++device.name CyberBlade/i7d
++driver.xfree 4|trident
+
+ vendor.id pci 0x1023
+&device.id pci 0x8500
++device.name CyberBlade/i1
++driver.xfree 4|trident||||CyberStretch,sw_cursor
+
+ vendor.id pci 0x1023
+&device.id pci 0x8520
++device.name 8520
++driver.xfree 4|trident
+
+ vendor.id pci 0x1023
+&device.id pci 0x8600
++device.name 8600
++driver.xfree 4|trident
+
+ vendor.id pci 0x1023
+&device.id pci 0x8620
++device.name CyberBlade/DSTN/Ai1
++driver.xfree 4|trident
+
+ vendor.id pci 0x1023
+&device.id pci 0x8820
++device.name 8820
++driver.xfree 4|trident
+
+ vendor.id pci 0x1023
+&device.id pci 0x9320
++device.name 9320
++driver.xfree 4|trident
+
+ vendor.id pci 0x1023
+&device.id pci 0x9388
++device.name Cyber 9388
++driver.xfree 4|trident
+
+ vendor.id pci 0x1023
+&device.id pci 0x9397
++device.name Cyber 9397
++driver.xfree 4|trident
+
+ vendor.id pci 0x1023
+&device.id pci 0x939a
++device.name Cyber 9397DVD
++driver.xfree 4|trident
+
+ vendor.id pci 0x1023
+&device.id pci 0x9420
++device.name TGUI 9420
++driver.xfree 4|trident
+
+ vendor.id pci 0x1023
+&device.id pci 0x9440
++device.name TGUI 9440
++driver.xfree 4|trident
+
+ vendor.id pci 0x1023
+&device.id pci 0x9520
++device.name Cyber 9520
++driver.xfree 4|trident
+
+ vendor.id pci 0x1023
+&device.id pci 0x9525
++device.name Cyber 9525
++driver.xfree 4|trident
+
+ vendor.id pci 0x1023
+&device.id pci 0x9540
++device.name Cyber 9540
++driver.xfree 4|trident
+
+ vendor.id pci 0x1023
+&device.id pci 0x9660
++device.name TGUI 9660/968x/968x
++driver.xfree 4|trident
+
+ vendor.id pci 0x1023
+&device.id pci 0x9750
++device.name 3DIm`age 975
++driver.xfree 4|trident|||||8,15,16,24
+
+ vendor.id pci 0x1023
+&device.id pci 0x9850
++device.name 3DImage 9850
++driver.xfree 4|trident
+
+ vendor.id pci 0x1023
+&device.id pci 0x9880
++device.name 9880
++driver.xfree 4|trident
+
+ vendor.id pci 0x1023
+&device.id pci 0x9910
++device.name 9910
++driver.xfree 4|trident
+
+ vendor.id pci 0x102b
++vendor.name Matrox Graphics, Inc.
+
+ vendor.id pci 0x102b
+&device.id pci 0x0519
++device.name MGA 2064W [Millennium]
++driver.xfree 4|mga||||NoHal|8,16,24
+
+ vendor.id pci 0x102b
+&device.id pci 0x051a
++device.name MGA 1064SG [Mystique]
++driver.xfree 4|mga||||NoHal|8,16,24
+
+ vendor.id pci 0x102b
+&device.id pci 0x051b
++device.name MGA 2164W [Millennium II]
++driver.xfree 4|mga||||NoHal|8,16,24
+
+ vendor.id pci 0x102b
+&device.id pci 0x051f
++device.name MGA 2164W [Millennium II] AGP
++driver.xfree 4|mga||||NoHal
+
+ vendor.id pci 0x102b
+&device.id pci 0x0520
++device.name MGA G200
++driver.xfree 4|mga|||||8,16,24
+
+ vendor.id pci 0x102b
+&device.id pci 0x0521
++device.name MGA G200 AGP
++driver.xfree 4|mga|||||8,16,24
++driver.xfree.config VideoRam 8192
++driver.xfree 4|mga|3d||dri||16
++driver.xfree.config VideoRam 8192
+
+ vendor.id pci 0x102b
+&device.id pci 0x0525
++device.name MGA G400 AGP
++driver.xfree 4|mga
++driver.xfree 4|mga|3d||dri
+
+ vendor.id pci 0x102b
+&device.id pci 0x0525
+&subvendor.id pci 0x102b
+&subdevice.id pci 0x0540
++subdevice.name G450-0540
+
+ vendor.id pci 0x102b
+&device.id pci 0x0525
+&subvendor.id pci 0x102b
+&subdevice.id pci 0x0541
++subdevice.name G450
+
+ vendor.id pci 0x102b
+&device.id pci 0x0525
+&subvendor.id pci 0x102b
+&subdevice.id pci 0x0641
++subdevice.name Matrox G400 DH-0641
+
+ vendor.id pci 0x102b
+&device.id pci 0x0525
+&subvendor.id pci 0x102b
+&subdevice.id pci 0x07c0
++subdevice.name G450 LE
+
+ vendor.id pci 0x102b
+&device.id pci 0x0525
+&subvendor.id pci 0x102b
+&subdevice.id pci 0x0d41
++subdevice.name G450 DH G450
+
+ vendor.id pci 0x102b
+&device.id pci 0x0525
+&subvendor.id pci 0x102b
+&subdevice.id pci 0x0d43
++subdevice.name G450 PCI
++driver.xfree 4|mga
+
+ vendor.id pci 0x102b
+&device.id pci 0x0525
+&subvendor.id pci 0x102b
+&subdevice.id pci 0x2179
++subdevice.name G400 DH
+
+ vendor.id pci 0x102b
+&device.id pci 0x0525
+&subvendor.id pci 0x102b
+&subdevice.id pci 0x23c3
++subdevice.name G450-23c3
+
+ vendor.id pci 0x102b
+&device.id pci 0x1000
++device.name MGA G100 [Productiva]
++driver.xfree 4|mga||||NoHal
+
+ vendor.id pci 0x102b
+&device.id pci 0x1001
++device.name MGA G100 [Productiva] AGP
++driver.xfree 4|mga||||NoHal|8,16,24
+
+ vendor.id pci 0x102b
+&device.id pci 0x2527
++device.name G550
++driver.xfree 4|mga
++driver.xfree 4|mga|3d||dri
+
+ vendor.id pci 0x102c
++vendor.name Chips and Technologies
+
+ vendor.id pci 0x102c
+&device.id pci 0x00c0
++device.name F69000 HiQVideo
++driver.xfree 4|chips
+
+ vendor.id pci 0x102c
+&device.id pci 0x00d8
++device.name F65545
++driver.xfree 4|chips
+
+ vendor.id pci 0x102c
+&device.id pci 0x00dc
++device.name F65548
++driver.xfree 4|chips
+
+ vendor.id pci 0x102c
+&device.id pci 0x00e0
++device.name 65550
++driver.xfree 4|chips
+
+ vendor.id pci 0x102c
+&device.id pci 0x00e4
++device.name F65554
++driver.xfree 4|chips
+
+ vendor.id pci 0x102c
+&device.id pci 0x00e5
++device.name F65555 HiQVPro
++driver.xfree 4|chips
+
+ vendor.id pci 0x102c
+&device.id pci 0x00f4
++device.name F68554 HiQVision
++driver.xfree 4|chips
+
+ vendor.id pci 0x102c
+&device.id pci 0x0c30
++device.name 69030
++driver.xfree 4|chips
+
+ vendor.id pci 0x1039
++vendor.name Silicon Integrated Systems Corp.
+
+ vendor.id pci 0x1039
+&device.id pci 0x0200
++device.name 5597/5598 VGA
++driver.xfree 4|sis|||||16,24
+
+ vendor.id pci 0x1039
+&device.id pci 0x0300
++device.name SIS300
++driver.xfree 4|sis
+
+ vendor.id pci 0x1039
+&device.id pci 0x0310
++device.name SiS315H
++driver.xfree 4|sis
+
+ vendor.id pci 0x1039
+&device.id pci 0x0325
++device.name SiS315PRO
++driver.xfree 4|sis
+
+ vendor.id pci 0x1039
+&device.id pci 0x0330
++device.name SiS330
++driver.xfree 4|sis
+
+ vendor.id pci 0x1039
+&device.id pci 0x0340
++device.name SiS340
++driver.xfree 4|sis
+
+ vendor.id pci 0x1039
+&device.id pci 0x5300
++device.name SiS540 PCI Display Adapter
++driver.xfree 4|sis
+
+ vendor.id pci 0x1039
+&device.id pci 0x5315
++device.name SiS550
++driver.xfree 4|sis
+
+ vendor.id pci 0x1039
+&device.id pci 0x6300
++device.name SiS630 GUI Accelerator+3D
++driver.xfree 4|sis
+
+ vendor.id pci 0x1039
+&device.id pci 0x6306
++device.name 6306 3D-AGP
++driver.xfree 4|sis|||||16
+
+ vendor.id pci 0x1039
+&device.id pci 0x6325
++device.name SiS650
++driver.xfree 4|sis
+
+ vendor.id pci 0x1039
+&device.id pci 0x6326
++device.name 86C326
++driver.xfree 4|sis|||||8,16,24
+
+ vendor.id pci 0x1039
+&device.id pci 0x6330
++device.name SiS 660
++driver.xfree 4|sis
+
+ vendor.id pci 0x104c
++vendor.name Texas Instruments
+
+ vendor.id pci 0x104c
+&device.id pci 0x3d04
++device.name TVP4010 [Permedia]
++driver.xfree 4|glint
+
+ vendor.id pci 0x104c
+&device.id pci 0x3d07
++device.name TVP4020 [Permedia 2]
++driver.xfree 4|glint|||||8,15,16,24
+
+ vendor.id pci 0x105d
++vendor.name Number 9 Computer Company
+
+ vendor.id pci 0x105d
+&device.id pci 0x2309
++device.name Imagine 128
++driver.xfree 4|i128
+
+ vendor.id pci 0x105d
+&device.id pci 0x2339
++device.name Imagine 128-II
++driver.xfree 4|i128
+
+ vendor.id pci 0x105d
+&device.id pci 0x493d
++device.name Imagine 128 T2R [Ticket to Ride]
++driver.xfree 4|i128
+
+ vendor.id pci 0x105d
+&device.id pci 0x5348
++device.name Revolution 4
++driver.xfree 4|i128
+
+ vendor.id pci 0x1078
++vendor.name Cyrix Corporation
+
+ vendor.id pci 0x1078
+&device.id pci 0x0000
++device.name 5510
++driver.xfree 4|cyrix
+
+ vendor.id pci 0x1078
+&device.id pci 0x0002
++device.name 5520 [Cognac]
++driver.xfree 4|cyrix
+
+ vendor.id pci 0x1078
+&device.id pci 0x0104
++device.name 5530 Video [Kahlua]
++driver.xfree 4|cyrix
+
+ vendor.id pci 0x10c8
++vendor.name Neomagic Corporation
+
+ vendor.id pci 0x10c8
+&device.id pci 0x0001
++device.name NM2070 [MagicGraph NM2070]
++driver.xfree 4|neomagic
+
+ vendor.id pci 0x10c8
+&device.id pci 0x0002
++device.name NM2090 [MagicGraph 128V]
++driver.xfree 4|neomagic
+
+ vendor.id pci 0x10c8
+&device.id pci 0x0003
++device.name NM2093 [MagicGraph 128ZV]
++driver.xfree 4|neomagic
+
+ vendor.id pci 0x10c8
+&device.id pci 0x0004
++device.name NM2160 [MagicGraph 128XD]
++driver.xfree 4|neomagic|||||8,16
+
+ vendor.id pci 0x10c8
+&device.id pci 0x0005
++device.name MagicMedia 256AV
++driver.xfree 4|neomagic|||||8,16,24
+
+ vendor.id pci 0x10c8
+&device.id pci 0x0006
++device.name NM2360 [MagicMedia 256ZX]
++driver.xfree 4|neomagic|||||16
+
+ vendor.id pci 0x10c8
+&device.id pci 0x0016
++device.name 256XL(2380)
++driver.xfree 4|neomagic|||||8,16,24
++driver.xfree.config VideoRam 4096
+
+ vendor.id pci 0x10c8
+&device.id pci 0x0025
++device.name NM2230
++driver.xfree 4|neomagic
+
+ vendor.id pci 0x10c8
+&device.id pci 0x0083
++device.name MagicGraph 128ZV Plus
++driver.xfree 4|neomagic
+
+ vendor.id pci 0x10de
++vendor.name nVidia Corporation
+
+ vendor.id pci 0x10de
+&device.id pci 0x0020
++device.name RIVA TNT
++driver.xfree 4|nv|||||8,15,16,24
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x0028
++device.name RIVA TNT2/TNT2 Pro
++driver.xfree 4|nv|||||8,15,16,24
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x0029
++device.name RIVA TNT2 Ultra
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x002a
++device.name Unknown TNT2
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x002c
++device.name Vanta/Vanta LT
++driver.xfree 4|nv|||||8,16,24
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x002d
++device.name RIVA TNT2 Model 64/Model 64 Pro
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x0040
++device.name GeForce 6800 Ultra
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0041
++device.name GeForce 6800
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0042
++device.name GeForce 6800 LE
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0043
++device.name 0x0043
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0045
++device.name GeForce 6800 GT
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0049
++device.name 0x0049
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x004e
++device.name Quadro FX 4000
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x00a0
++device.name Aladdin TNT2
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x00c0
++device.name 0x00c0
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x00c1
++device.name GeForce 6800 (0x00C1)
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x00c2
++device.name 0x00c2
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x00c8
++device.name GeForce Go 6800
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x00c9
++device.name GeForce Go 6800 Ultra
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x00cc
++device.name Quadro FX Go1400
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x00cd
++device.name 0x00CD
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x00ce
++device.name Quadro FX 1400
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x00f0
++device.name GeForce 6800/GeForce 6800 Ultra
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x00f1
++device.name GeForce 6600/GeForce 6600 GT
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x00f2
++device.name GeForce 6600 GT (0x00F2)
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x00f3
++device.name GeForce 6200 (AGP)
++driver.xfree 4|nv
++driver.xfree.config Option "noaccel"
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x00f8
++device.name Quadro FX 3400
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x00f9
++device.name GeForce 6800 Ultra (0x00F9)
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x00fa
++device.name GeForce PCX 5750
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x00fb
++device.name GeForce PCX 5900
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x00fc
++device.name Quadro FX 330/GeForce PCX 5300
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x00fd
++device.name Quadro NVS 280 PCI-E/Quadro FX 330
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x00fe
++device.name Quadro FX 1300
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x00ff
++device.name GeForce PCX 4300
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0100
++device.name GeForce 256
++driver.xfree 4|nv|||||8,15,16,24
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x0101
++device.name GeForce DDR
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x0103
++device.name Quadro
++driver.xfree 4|nv|||||8,15,16,24
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x0110
++device.name GeForce2 MX/MX 400
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x0111
++device.name GeForce2 MX 100/200
++driver.xfree 4|nv||||sw_cursor
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x0112
++device.name GeForce2 Go
++driver.xfree 4|nv
++driver.xfree.config #Option "CrtcNumber" "0"
++driver.xfree 4|nvidia|3d||||16
++driver.xfree.config #Option "CrtcNumber" "0"
+
+ vendor.id pci 0x10de
+&device.id pci 0x0113
++device.name Quadro2 MXR/EX/Go
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x0140
++device.name GeForce 6600 GT
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0141
++device.name GeForce 6600
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0141
+&subvendor.id pci 0x1458
+&subdevice.id pci 0x3124
++subdevice.name GeForce 6600 (Gigabyte)
++driver.xfree 4|nv
++driver.xfree.config Option "XaaNoScreenToScreenCopy"
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0142
++device.name 0x0142
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0143
++device.name 0x0143
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0144
++device.name GeForce Go 6600
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0145
++device.name GeForce 6610 XL
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0146
++device.name GeForce Go 6600 TE/6200 TE
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0147
++device.name 0x0147
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0148
++device.name GeForce Go 6600 (0x0148)
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0149
++device.name 0x0149
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x014b
++device.name 0x014b
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x014c
++device.name 0x014c
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x014d
++device.name 0x014d
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x014e
++device.name Quadro FX 540
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x014f
++device.name GeForce 6200
++driver.xfree 4|nv
++driver.xfree.config Option "XaaNoScreenToScreenCopy"
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0150
++device.name GeForce2 GTS/GeForce2 Pro
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x0151
++device.name GeForce2 Ti
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x0152
++device.name GeForce2 Ultra
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x0153
++device.name Quadro2 Pro
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x0160
++device.name 0x0160
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0161
++device.name GeForce 6200 TurboCache(TM)
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0161
+&subvendor.id pci 0x10de
+&subdevice.id pci 0x025c
++subdevice.name GeForce 6200 TurboCache(TM) (10de:025c)
++driver.xfree 4|nv
++driver.xfree.config Option "XaaNoScreenToScreenCopy"
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0162
++device.name 0x0162
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0163
++device.name 0x0163
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0164
++device.name GeForce Go 6200
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0165
++device.name 0x0165
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0166
++device.name GeForce Go 6250
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0167
++device.name GeForce Go 6200 (0x0167)
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0168
++device.name GeForce Go 6250 (0x0168)
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0169
++device.name 0x0169
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x016b
++device.name 0x016B
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x016c
++device.name 0x016C
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x016d
++device.name 0x016D
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x016e
++device.name 0x016E
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0170
++device.name GeForce4 MX 460
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x0171
++device.name GeForce4 MX 440
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x0172
++device.name GeForce4 MX 420
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x0173
++device.name GeForce4 MX 440-SE
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x0174
++device.name GeForce4 440 Go
++driver.xfree 4|nv
++driver.xfree.config #Option "CrtcNumber" "0"
++driver.xfree.config #Option "CrtcNumber" "1"
++driver.xfree 4|nvidia|3d||||16
++driver.xfree.config #Option "CrtcNumber" "0"
++driver.xfree.config #Option "CrtcNumber" "1"
+
+ vendor.id pci 0x10de
+&device.id pci 0x0175
++device.name GeForce4 420 Go
++driver.xfree 4|nv
++driver.xfree.config #Option "CrtcNumber" "0"
++driver.xfree.config #Option "CrtcNumber" "1"
++driver.xfree 4|nvidia|3d||||16
++driver.xfree.config #Option "CrtcNumber" "0"
++driver.xfree.config #Option "CrtcNumber" "1"
+
+ vendor.id pci 0x10de
+&device.id pci 0x0176
++device.name GeForce4 420 Go 32M
++driver.xfree 4|nv
++driver.xfree.config #Option "CrtcNumber" "0"
++driver.xfree.config #Option "CrtcNumber" "1"
++driver.xfree 4|nvidia|3d||||16
++driver.xfree.config #Option "CrtcNumber" "0"
++driver.xfree.config #Option "CrtcNumber" "1"
+
+ vendor.id pci 0x10de
+&device.id pci 0x0176
+&subvendor.id pci 0x1584
+&subdevice.id pci 0x2241
++subdevice.name GeForce4 Go DH
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x0177
++device.name GeForce4 460 Go
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x0178
++device.name Quadro4 550 XGL
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x0178
+&subvendor.id pci 0x10de
+&subdevice.id pci 0x0151
++subdevice.name Quadro4 550 XGL DH
+
+ vendor.id pci 0x10de
+&device.id pci 0x0179
++device.name GeForce4 440 Go 64M
++driver.xfree 4|nv
++driver.xfree.config #Option "CrtcNumber" "0"
++driver.xfree.config #Option "CrtcNumber" "1"
++driver.xfree 4|nvidia|3d||||16
++driver.xfree.config #Option "CrtcNumber" "0"
++driver.xfree.config #Option "CrtcNumber" "1"
+
+ vendor.id pci 0x10de
+&device.id pci 0x017a
++device.name Quadro4 NVS
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x017c
++device.name Quadro4 500 GoGL
++driver.xfree 4|nv
++driver.xfree.config #Option "CrtcNumber" "0"
++driver.xfree.config #Option "CrtcNumber" "1"
++driver.xfree 4|nvidia|3d||||16
++driver.xfree.config #Option "CrtcNumber" "0"
++driver.xfree.config #Option "CrtcNumber" "1"
+
+ vendor.id pci 0x10de
+&device.id pci 0x017d
++device.name GeForce4 410 Go 16M
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x0181
++device.name GeForce4 MX 440 with AGP8X
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x0182
++device.name GeForce4 MX 440SE with AGP8X
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x0183
++device.name GeForce4 MX 420 with AGP8X
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x0185
++device.name GeForce4 MX 4000
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0186
++device.name GeForce4 448 Go
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x0187
++device.name GeForce4 488 Go
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x0188
++device.name Quadro4 580 XGL
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x0189
++device.name GeForce4 MX with AGP8X (Mac)
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x018a
++device.name Quadro NVS with AGP8X
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x018b
++device.name Quadro4 380 XGL
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x018c
++device.name Quadro NVS 50 PCI
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x018d
++device.name GeForce4 448 Go (0x018D)
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x01a0
++device.name GeForce2 Integrated GPU
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x01f0
++device.name GeForce4 MX Integrated GPU
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x0200
++device.name GeForce3
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x0201
++device.name GeForce3 Ti 200
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x0202
++device.name GeForce3 Ti 500
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x0203
++device.name Quadro DCC
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x0210
++device.name 0x0210
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0211
++device.name GeForce 6800 (0x0211)
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0212
++device.name GeForce 6800 LE (0x0212)
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0215
++device.name GeForce 6800 GT (0x0215)
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0220
++device.name 0x0220
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0221
++device.name 0x0221
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0222
++device.name 0x0222
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0228
++device.name 0x0228
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0250
++device.name GeForce4 Ti 4600
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x0250
+&subvendor.id pci 0x1462
+&subdevice.id pci 0x8725
++subdevice.name GeForce4 Ti 4600 DH
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0251
++device.name GeForce4 Ti 4400
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x0252
++device.name NV25
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x0253
++device.name GeForce4 Ti 4200
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x0258
++device.name Quadro4 900 XGL
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x0258
+&subvendor.id pci 0x10de
+&subdevice.id pci 0x0138
++subdevice.name Quadro4 900 XGL DH
+
+ vendor.id pci 0x10de
+&device.id pci 0x0259
++device.name Quadro4 750 XGL
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x0259
+&subvendor.id pci 0x10de
+&subdevice.id pci 0x0139
++subdevice.name Quadro4 750 XGL DH
+
+ vendor.id pci 0x10de
+&device.id pci 0x025b
++device.name Quadro4 700 XGL
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x025b
+&subvendor.id pci 0x10de
+&subdevice.id pci 0x013b
++subdevice.name Quadro4 700 XGL DH
+
+ vendor.id pci 0x10de
+&device.id pci 0x0280
++device.name GeForce4 Ti 4800
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x0281
++device.name GeForce4 Ti 4200 with AGP8X
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x0282
++device.name GeForce4 Ti 4800 SE
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x0286
++device.name GeForce4 4200 Go
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x0288
++device.name Quadro4 980 XGL
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x0288
+&subvendor.id pci 0x10de
+&subdevice.id pci 0x0174
++subdevice.name Quadro4 980 XGL DH
+
+ vendor.id pci 0x10de
+&device.id pci 0x0289
++device.name Quadro4 780 XGL
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x028c
++device.name Quadro4 700 GoGL
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x0301
++device.name GeForce FX 5800 Ultra
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x0302
++device.name GeForce FX 5800
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x0308
++device.name Quadro FX 2000
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x0308
+&subvendor.id pci 0x10de
+&subdevice.id pci 0x0183
++subdevice.name Quadro FX2000 DH
+
+ vendor.id pci 0x10de
+&device.id pci 0x0309
++device.name Quadro FX 1000
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x0309
+&subvendor.id pci 0x10de
+&subdevice.id pci 0x0182
++subdevice.name Quadro FX1000 DH
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0311
++device.name GeForce FX 5600 Ultra
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x0312
++device.name GeForce FX 5600
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x0313
++device.name 0x0313
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0314
++device.name GeForce FX 5600XT
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0316
++device.name 0x0316
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x0317
++device.name 0x0317
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x031a
++device.name GeForce FX Go5600
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x031b
++device.name GeForce FX Go5650
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x031c
++device.name Quadro FX Go700
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x031d
++device.name 0x031d
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x031e
++device.name 0x031e
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x031f
++device.name 0x031f
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x0320
++device.name GeForce FX 5200
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0321
++device.name GeForce FX 5200 Ultra
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x0322
++device.name GeForce FX 5200 (0x0322)
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x0322
+&subvendor.id pci 0x10b0
+&subdevice.id pci 0x0431
++subdevice.name GeForce FX 5200 DH
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0323
++device.name GeForce FX 5200LE
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x0324
++device.name GeForce FX Go5200
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0325
++device.name GeForce FX Go5250
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0326
++device.name GeForce FX 5500
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0327
++device.name GeForce FX 5100
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0328
++device.name GeForce FX Go5200 32M/64M
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0329
++device.name GeForce FX 5200 (Mac)
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x032a
++device.name Quadro NVS 280 PCI
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x032b
++device.name Quadro FX 500/600 PCI
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x032c
++device.name GeForce FX Go53xx
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x032d
++device.name GeForce FX Go5100
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x032f
++device.name 0x032F
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0330
++device.name GeForce FX 5900 Ultra
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0331
++device.name GeForce FX 5900
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0332
++device.name GeForce FX 5900XT
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0333
++device.name GeForce FX 5950 Ultra
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0333
+&subvendor.id pci 0x10b0
+&subdevice.id pci 0x0602
++subdevice.name GeForce FX 5950
+
+ vendor.id pci 0x10de
+&device.id pci 0x0334
++device.name GeForce FX 5900ZT
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0338
++device.name Quadro FX 3000
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0338
+&subvendor.id pci 0x10de
+&subdevice.id pci 0x01c2
++subdevice.name Quadro FX 3000 DH
+
+ vendor.id pci 0x10de
+&device.id pci 0x033f
++device.name Quadro FX 700
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0341
++device.name GeForce FX 5700 Ultra
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0341
+&subvendor.id pci 0x270f
+&subdevice.id pci 0x194c
++subdevice.name GeForce FX 5700 Ultra DH
+
+ vendor.id pci 0x10de
+&device.id pci 0x0342
++device.name GeForce FX 5700
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0343
++device.name GeForce FX 5700LE
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0344
++device.name GeForce FX 5700VE
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0345
++device.name 0x0345
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0347
++device.name GeForce FX Go5700
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0348
++device.name GeForce FX Go5700 (0x0348)
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0349
++device.name 0x0349
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x034b
++device.name 0x034b
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x034c
++device.name Quadro FX Go1000
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x034e
++device.name Quadro FX 1100
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x034f
++device.name 0x034f
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10e0
++vendor.name Imstt
+
+ vendor.id pci 0x10e0
+&device.id pci 0x9128
++device.name Imstt128
++driver.xfree 4|imstt
+
+ vendor.id pci 0x10e0
+&device.id pci 0x9135
++device.name Imstt3D
++driver.xfree 4|imstt
+
+ vendor.id pci 0x1106
++vendor.name VIA Technologies, Inc.
+
+ vendor.id pci 0x1106
+&device.id pci 0x3122
++device.name VIA CLE 3122
++driver.xfree 4|via
+
+ vendor.id pci 0x1106
+&device.id pci 0x7205
++device.name VIA VT 7205
++driver.xfree 4|via
+
+ vendor.id pci 0x1106
+&device.id pci 0x7205
+&subvendor.id pci 0x1025
+&subdevice.id pci 0x0033
++subdevice.name Acer Incorporated VIA VT 7205
+
+ vendor.id pci 0x1106
+&device.id pci 0x7205
+&subvendor.id pci 0x1584
+&subdevice.id pci 0x800a
++subdevice.name Uniwill VIA VT 7205
+
+ vendor.id pci 0x1142
++vendor.name Alliance Semiconductor Corporation
+
+ vendor.id pci 0x1142
+&device.id pci 0x6422
++device.name ProVideo 6422
++driver.xfree 4|apm
+
+ vendor.id pci 0x1142
+&device.id pci 0x6424
++device.name ProVideo 6424
++driver.xfree 4|apm
+
+ vendor.id pci 0x1163
++vendor.name Rendition
+
+ vendor.id pci 0x1163
+&device.id pci 0x0001
++device.name Verite 1000
++driver.xfree 4|rendition
+
+ vendor.id pci 0x1163
+&device.id pci 0x2000
++device.name Verite V2000/V2100/V2200
++driver.xfree 4|rendition
+
+ vendor.id pci 0x121a
++vendor.name 3Dfx Interactive, Inc.
+
+ vendor.id pci 0x121a
+&device.id pci 0x0003
++device.name Voodoo Banshee
++driver.xfree 4|tdfx|||||8,16,24
++driver.xfree 4|tdfx|3d||dri||16
+
+ vendor.id pci 0x121a
+&device.id pci 0x0005
++device.name Voodoo 3
++driver.xfree 4|tdfx|||||8,16,24
++driver.xfree 4|tdfx|3d||dri||16
+
+ vendor.id pci 0x121a
+&device.id pci 0x0009
++device.name Voodoo5 5500
++driver.xfree 4|tdfx|||||8,16,24
++driver.xfree 4|tdfx|3d||dri||16
+
+ vendor.id pci 0x126f
++vendor.name Silicon Motion, Inc.
+
+ vendor.id pci 0x126f
+&device.id pci 0x0710
++device.name SM710 LynxEM
++driver.xfree 4|siliconmotion
+
+ vendor.id pci 0x126f
+&device.id pci 0x0712
++device.name SM712 LynxEM+
++driver.xfree 4|siliconmotion
+
+ vendor.id pci 0x126f
+&device.id pci 0x0720
++device.name SM720 Lynx3DM
++driver.xfree 4|siliconmotion
+
+ vendor.id pci 0x126f
+&device.id pci 0x0730
++device.name SMI 731
++driver.xfree 4|siliconmotion
+
+ vendor.id pci 0x126f
+&device.id pci 0x0810
++device.name SM810 LynxE
++driver.xfree 4|siliconmotion
+
+ vendor.id pci 0x126f
+&device.id pci 0x0820
++device.name 820
++driver.xfree 4|siliconmotion
+
+ vendor.id pci 0x126f
+&device.id pci 0x0910
++device.name SM910
++driver.xfree 4|siliconmotion
+
+ vendor.id pci 0x12d2
++vendor.name NVidia / SGS Thomson (Joint Venture)
+
+ vendor.id pci 0x12d2
+&device.id pci 0x0018
++device.name Riva128
++driver.xfree 4|nv|||||15,24
+
+ vendor.id pci 0x15ad
++vendor.name VMWare Inc
+
+ vendor.id pci 0x15ad
+&device.id pci 0x0405
++device.name VMWARE0405
++driver.xfree 4|vmware
+
+ vendor.id pci 0x15ad
+&device.id pci 0x0710
++device.name VMWARE0710
++driver.xfree 4|vmware
+
+ vendor.id pci 0x18ca
++vendor.name XGI Technology Inc.
+
+ vendor.id pci 0x18ca
+&device.id pci 0x0020
++device.name Volari Z7
++driver.xfree 4|xgi
+
+ vendor.id pci 0x18ca
+&device.id pci 0x0040
++device.name Volari V8_V5_V3XT
++driver.xfree 4|xgi
+
+ vendor.id pci 0x3d3d
++vendor.name 3DLabs
+
+ vendor.id pci 0x3d3d
+&device.id pci 0x0002
++device.name GLINT 500TX
++driver.xfree 4|glint
+
+ vendor.id pci 0x3d3d
+&device.id pci 0x0004
++device.name Permedia
++driver.xfree 4|glint
+
+ vendor.id pci 0x3d3d
+&device.id pci 0x0006
++device.name GLINT MX
++driver.xfree 4|glint
+
+ vendor.id pci 0x3d3d
+&device.id pci 0x0007
++device.name 3D Extreme
++driver.xfree 4|glint|||||8,15,16,24
+
+ vendor.id pci 0x3d3d
+&device.id pci 0x0009
++device.name Permedia II 2D+3D
++driver.xfree 4|glint|||||8,15,16,24
+
+ vendor.id pci 0x3d3d
+&device.id pci 0x000a
++device.name GLINT R3
++driver.xfree 4|glint
+
+ vendor.id pci 0x3d3d
+&device.id pci 0x000c
++device.name Permedia 4
++driver.xfree 4|glint
+
+ vendor.id pci 0x3d3d
+&device.id pci 0x000d
++device.name R4
++driver.xfree 4|glint
+
+ vendor.id pci 0x5333
++vendor.name S3 Inc.
+
+ vendor.id pci 0x5333
+&device.id pci 0x5631
++device.name 86c325 [ViRGE]
++driver.xfree 4|s3virge
+
+ vendor.id pci 0x5333
+&device.id pci 0x8811
++device.name 86c764/765 [Trio32/64/64V+]
++driver.xfree 4|s3
+
+ vendor.id pci 0x5333
+&device.id pci 0x8812
++device.name 86cM65 [Aurora64V+]
++driver.xfree 4|s3
+
+ vendor.id pci 0x5333
+&device.id pci 0x8814
++device.name 86c767 [Trio 64UV+]
++driver.xfree 4|s3
+
+ vendor.id pci 0x5333
+&device.id pci 0x883d
++device.name 86c988 [ViRGE/VX]
++driver.xfree 4|s3virge
+
+ vendor.id pci 0x5333
+&device.id pci 0x8901
++device.name Trio 64V2/DX or /GX
++driver.xfree 4|s3
+
+ vendor.id pci 0x5333
+&device.id pci 0x8904
++device.name Integrated Trio3D
++driver.xfree 4|s3virge
+
+ vendor.id pci 0x5333
+&device.id pci 0x8a01
++device.name ViRGE/DX
++driver.xfree 4|s3virge||||noVBE
+
+ vendor.id pci 0x5333
+&device.id pci 0x8a10
++device.name ViRGE/GX2
++driver.xfree 4|s3virge
+
+ vendor.id pci 0x5333
+&device.id pci 0x8a13
++device.name 86c368 [Trio 3D/2X]
++driver.xfree 4|s3virge
+
+ vendor.id pci 0x5333
+&device.id pci 0x8a20
++device.name 86c794 [Savage 3D]
++driver.xfree 4|savage
+
+ vendor.id pci 0x5333
+&device.id pci 0x8a21
++device.name 86c795 [Savage 3D/MV]
++driver.xfree 4|savage
+
+ vendor.id pci 0x5333
+&device.id pci 0x8a22
++device.name Savage 4
++driver.xfree 4|savage
+
+ vendor.id pci 0x5333
+&device.id pci 0x8a25
++device.name ProSavage PM 133
++driver.xfree 4|savage
+
+ vendor.id pci 0x5333
+&device.id pci 0x8a26
++device.name ProSavage KM 133
++driver.xfree 4|savage
+
+ vendor.id pci 0x5333
+&device.id pci 0x8c01
++device.name ViRGE/MX
++driver.xfree 4|s3virge
+
+ vendor.id pci 0x5333
+&device.id pci 0x8c03
++device.name ViRGE/MX+MV
++driver.xfree 4|s3virge
+
+ vendor.id pci 0x5333
+&device.id pci 0x8c10
++device.name 86C270-294 Savage/MX-/IX
++driver.xfree 4|savage
+
+ vendor.id pci 0x5333
+&device.id pci 0x8c11
++device.name Savage MX
++driver.xfree 4|savage
+
+ vendor.id pci 0x5333
+&device.id pci 0x8c12
++device.name Savage IX/MV
++driver.xfree 4|savage
+
+ vendor.id pci 0x5333
+&device.id pci 0x8c12
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x017f
++subdevice.name Savage IX/MV IBM
++driver.xfree 4|savage||||ShadowStatus
+
+ vendor.id pci 0x5333
+&device.id pci 0x8c13
++device.name Savage IX
++driver.xfree 4|savage
+
+ vendor.id pci 0x5333
+&device.id pci 0x8c22
++device.name SuperSavage/MX 128
++driver.xfree 4|savage
+
+ vendor.id pci 0x5333
+&device.id pci 0x8c24
++device.name SuperSavage/MX 64
++driver.xfree 4|savage
+
+ vendor.id pci 0x5333
+&device.id pci 0x8c26
++device.name SuperSavage/MX 64C
++driver.xfree 4|savage
+
+ vendor.id pci 0x5333
+&device.id pci 0x8c2a
++device.name SuperSavage/IX 128 SDR
++driver.xfree 4|savage
+
+ vendor.id pci 0x5333
+&device.id pci 0x8c2b
++device.name SuperSavage/IX 128 DDR
++driver.xfree 4|savage
+
+ vendor.id pci 0x5333
+&device.id pci 0x8c2c
++device.name SuperSavage/IX 64 SDR
++driver.xfree 4|savage
+
+ vendor.id pci 0x5333
+&device.id pci 0x8c2d
++device.name SuperSavage/IX 64 DDR
++driver.xfree 4|savage
+
+ vendor.id pci 0x5333
+&device.id pci 0x8c2e
++device.name SuperSavage/IXC 64 SDR
++driver.xfree 4|savage
+
+ vendor.id pci 0x5333
+&device.id pci 0x8c2f
++device.name SuperSavage/IXC 64 DDR
++driver.xfree 4|savage
+
+ vendor.id pci 0x5333
+&device.id pci 0x8d01
++device.name S3Twister_P
++driver.xfree 4|savage
+
+ vendor.id pci 0x5333
+&device.id pci 0x8d02
++device.name Twister_K
++driver.xfree 4|savage
+
+ vendor.id pci 0x5333
+&device.id pci 0x8d03
++device.name ProSavage DDR
++driver.xfree 4|savage
+
+ vendor.id pci 0x5333
+&device.id pci 0x8d04
++device.name ProSavage DDR-K
++driver.xfree 4|savage
+
+ vendor.id pci 0x5333
+&device.id pci 0x9102
++device.name 86C410 Savage 2000
++driver.xfree 4|savage
+
+ vendor.id pci 0x8086
++vendor.name Intel Corporation
+
+ vendor.id pci 0x8086
+&device.id pci 0x00d1
++device.name i740_PCI
++driver.xfree 4|i740
+
+ vendor.id pci 0x8086
+&device.id pci 0x1132
++device.name I815
++driver.xfree 4|i810|||||8,16,24
++driver.xfree 4|i810|3d||dri||16
+
+ vendor.id pci 0x8086
+&device.id pci 0x2562
++device.name i845
++driver.xfree 4|i810
++driver.xfree.config Option "NoDDC"
++driver.xfree 4|i810|3d||dri
++driver.xfree.config Option "NoDDC"
+
+ vendor.id pci 0x8086
+&device.id pci 0x2572
++device.name 865 G
++driver.xfree 4|i810
++driver.xfree.config Option "NoDDC"
++driver.xfree 4|i810|3d||dri
++driver.xfree.config Option "NoDDC"
+
+ vendor.id pci 0x8086
+&device.id pci 0x2582
++device.name 915 G
++driver.xfree 4|i810
++driver.xfree.config Option "NoDDC"
++driver.xfree 4|i810|3d||dri
++driver.xfree.config Option "NoDDC"
+
+ vendor.id pci 0x8086
+&device.id pci 0x2592
++device.name 915 GM
++driver.xfree 4|i810
++driver.xfree.config Option "NoDDC"
+
+ vendor.id pci 0x8086
+&device.id pci 0x3577
++device.name i830
++driver.xfree 4|i810
++driver.xfree.config Option "NoDDC"
++driver.xfree 4|i810|3d||dri
++driver.xfree.config Option "NoDDC"
+
+ vendor.id pci 0x8086
+&device.id pci 0x3582
++device.name 855 GM
++driver.xfree 4|i810
++driver.xfree.config Option "NoDDC"
++driver.xfree 4|i810|3d||dri
++driver.xfree.config Option "NoDDC"
+
+ vendor.id pci 0x8086
+&device.id pci 0x7121
++device.name 82810 CGC [Chipset Graphics Controller]
++driver.xfree 4|i810|||||8,16,24
++driver.xfree 4|i810|3d||dri||16
+
+ vendor.id pci 0x8086
+&device.id pci 0x7123
++device.name 82810-DC100 CGC [Chipset Graphics Controller]
++driver.xfree 4|i810|||||8,16,24
++driver.xfree 4|i810|3d||dri||16
+
+ vendor.id pci 0x8086
+&device.id pci 0x7125
++device.name 82810E CGC [Chipset Graphics Controller]
++driver.xfree 4|i810|||||8,16,24
++driver.xfree 4|i810|3d||dri||16
+
+ vendor.id pci 0x8086
+&device.id pci 0x7800
++device.name i740
++driver.xfree 4|i740
+
+ vendor.id pci 0xedd8
++vendor.name ARK Logic Inc
+
+ vendor.id pci 0xedd8
+&device.id pci 0xa091
++device.name 1000PV [Stingray]
++driver.xfree 4|ark
+
+ vendor.id pci 0xedd8
+&device.id pci 0xa099
++device.name 2000PV [Stingray]
++driver.xfree 4|ark
+
+ vendor.id pci 0xedd8
+&device.id pci 0xa0a1
++device.name 2000MT
++driver.xfree 4|ark
+
--- /dev/null
+ vendor.id pci 0x1002
++vendor.name ATI Technologies Inc
+
+ vendor.id pci 0x1002
+&device.id pci 0x0084
++device.name RageIIC
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x0088
++device.name Mach64
++driver.xfree 4|ati|||||8,16,24
+
+ vendor.id pci 0x1002
+&device.id pci 0x4354
++device.name 215CT [Mach64 CT]
++driver.xfree 4|ati|||||8,16,24,32
+
+ vendor.id pci 0x1002
+&device.id pci 0x4358
++device.name 210888CX [Mach64 CX]
++driver.xfree 4|ati|||||8,16,24
+
+ vendor.id pci 0x1002
+&device.id pci 0x4554
++device.name 210888ET [Mach64 ET]
++driver.xfree 4|ati|||||8,16,24
+
+ vendor.id pci 0x1002
+&device.id pci 0x4654
++device.name Mach64 VT
++driver.xfree 4|ati|||||8,24
+
+ vendor.id pci 0x1002
+&device.id pci 0x474d
++device.name Rage XL AGP
++driver.xfree 4|ati|||||8,16,24
+
+ vendor.id pci 0x1002
+&device.id pci 0x474e
++device.name Rage XC AGP
++driver.xfree 4|ati|||||8,16,24
+
+ vendor.id pci 0x1002
+&device.id pci 0x4754
++device.name 3D Rage I/II 215GT [Mach64 GT]
++driver.xfree 4|ati||||dpms|8,16,24
+
+ vendor.id pci 0x1002
+&device.id pci 0x4756
++device.name 3D Rage IIC 215IIC [Mach64 GT IIC]
++driver.xfree 4|ati|||||8,16,24
+
+ vendor.id pci 0x1002
+&device.id pci 0x4757
++device.name 3D Rage IIC AGP
++driver.xfree 4|ati|||||8,15,16,24,32
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c42
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x0044
++subdevice.name 3D Rage LT Pro AGP-133
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c44
++device.name 3D Rage LT Pro AGP-66
++driver.xfree 4|ati|||||8,24
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c45
++device.name Rage 128 Mobility LE
++driver.xfree 4|r128|||||8,16,24
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c46
++device.name Mobility M3 AGP 2x
++driver.xfree 4|r128
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c4d
++device.name 3D Rage P/M Mobility AGP 2x
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c52
++device.name 3D Rage P/M Mobility
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c54
++device.name 264LT [Mach64 LT]
++driver.xfree 4|ati|||||8,16,24
+
+ vendor.id pci 0x1002
+&device.id pci 0x4d46
++device.name Rage 128 Mobility MF
++driver.xfree 4|r128|||||8,16,24
+
+ vendor.id pci 0x1002
+&device.id pci 0x4d4c
++device.name Rage 128 Mobility ML
++driver.xfree 4|r128|||||8,16,24
+
+ vendor.id pci 0x1002
+&device.id pci 0x5041
++device.name Rage 128 PA
++driver.xfree 4|r128|||||8,16,24
+
+ vendor.id pci 0x1002
+&device.id pci 0x5042
++device.name Rage 128 PB
++driver.xfree 4|r128|||||8,16,24
+
+ vendor.id pci 0x1002
+&device.id pci 0x5043
++device.name Rage 128 PC
++driver.xfree 4|r128|||||8,16,24
+
+ vendor.id pci 0x1002
+&device.id pci 0x5044
++device.name Rage 128 PD
++driver.xfree 4|r128|||||8,16,24
+
+ vendor.id pci 0x1002
+&device.id pci 0x5045
++device.name Rage 128 PE
++driver.xfree 4|r128|||||8,16,24
+
+ vendor.id pci 0x1002
+&device.id pci 0x5046
++device.name Rage 128 PF
++driver.xfree 4|r128|||||8,16,24
+
+ vendor.id pci 0x1002
+&device.id pci 0x5047
++device.name Rage 128 PG
++driver.xfree 4|r128|||||8,16,24
+
+ vendor.id pci 0x1002
+&device.id pci 0x5048
++device.name Rage 128 PH
++driver.xfree 4|r128|||||8,16,24
+
+ vendor.id pci 0x1002
+&device.id pci 0x5049
++device.name Rage 128 PI
++driver.xfree 4|r128|||||8,16,24
+
+ vendor.id pci 0x1002
+&device.id pci 0x504a
++device.name Rage 128 PJ
++driver.xfree 4|r128|||||8,16,24
+
+ vendor.id pci 0x1002
+&device.id pci 0x504b
++device.name Rage 128 PK
++driver.xfree 4|r128|||||8,16,24
+
+ vendor.id pci 0x1002
+&device.id pci 0x504c
++device.name Rage 128 PL
++driver.xfree 4|r128|||||8,16,24
+
+ vendor.id pci 0x1002
+&device.id pci 0x504d
++device.name Rage 128 PM
++driver.xfree 4|r128|||||8,16,24
+
+ vendor.id pci 0x1002
+&device.id pci 0x504e
++device.name Rage 128 PN
++driver.xfree 4|r128|||||8,16,24
+
+ vendor.id pci 0x1002
+&device.id pci 0x504f
++device.name Rage 128 PO
++driver.xfree 4|r128|||||8,16,24
+
+ vendor.id pci 0x1002
+&device.id pci 0x5050
++device.name Rage 128 PP
++driver.xfree 4|r128|||||8,16,24
+
+ vendor.id pci 0x1002
+&device.id pci 0x5051
++device.name Rage 128 PQ
++driver.xfree 4|r128|||||8,16,24
+
+ vendor.id pci 0x1002
+&device.id pci 0x5052
++device.name Rage 128 PR
++driver.xfree 4|r128|||||8,16,24
+
+ vendor.id pci 0x1002
+&device.id pci 0x5053
++device.name Rage 128 PS
++driver.xfree 4|r128|||||8,16,24
+
+ vendor.id pci 0x1002
+&device.id pci 0x5054
++device.name Rage 128 PT
++driver.xfree 4|r128|||||8,16,24
+
+ vendor.id pci 0x1002
+&device.id pci 0x5055
++device.name Rage 128 PU
++driver.xfree 4|r128|||||8,16,24
+
+ vendor.id pci 0x1002
+&device.id pci 0x5056
++device.name Rage 128 PV
++driver.xfree 4|r128|||||8,16,24
+
+ vendor.id pci 0x1002
+&device.id pci 0x5057
++device.name Rage 128 PW
++driver.xfree 4|r128|||||8,16,24
+
+ vendor.id pci 0x1002
+&device.id pci 0x5058
++device.name Rage 128 PX
++driver.xfree 4|r128|||||8,16,24
+
+ vendor.id pci 0x1002
+&device.id pci 0x5144
++device.name Radeon QD
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x5145
++device.name Radeon QE
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x5146
++device.name Radeon QF
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x5147
++device.name Radeon QG
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x5245
++device.name Rage 128 RE
++driver.xfree 4|r128|||||8,15,16,24
+
+ vendor.id pci 0x1002
+&device.id pci 0x5246
++device.name Rage 128 RF
++driver.xfree 4|r128|||||8,15,16,24
++driver.xfree 4|r128|3d||dri||16||switch2xf86_glx
++requires xf86_glx
+
+ vendor.id pci 0x1002
+&device.id pci 0x5247
++device.name Rage 128 RG
++driver.xfree 4|r128|||||8,16,24
+
+ vendor.id pci 0x1002
+&device.id pci 0x524b
++device.name Rage 128 RK
++driver.xfree 4|r128|||||8,16,24
+
+ vendor.id pci 0x1002
+&device.id pci 0x524c
++device.name Rage 128 RL
++driver.xfree 4|r128|||||8,15,16,24
++driver.xfree 4|r128|3d||dri||16||switch2xf86_glx
++requires xf86_glx
+
+ vendor.id pci 0x1002
+&device.id pci 0x5345
++device.name Rage 128 SE
++driver.xfree 4|r128|||||8,16,24
+
+ vendor.id pci 0x1002
+&device.id pci 0x5346
++device.name Rage 128 SF
++driver.xfree 4|r128|||||8,16,24
+
+ vendor.id pci 0x1002
+&device.id pci 0x5347
++device.name Rage 128 SG
++driver.xfree 4|r128|||||8,16,24
+
+ vendor.id pci 0x1002
+&device.id pci 0x5348
++device.name Rage 128 4x
++driver.xfree 4|r128|||||8,16,24
+
+ vendor.id pci 0x1002
+&device.id pci 0x534b
++device.name Rage 128 SK
++driver.xfree 4|r128|||||8,16,24
+
+ vendor.id pci 0x1002
+&device.id pci 0x534c
++device.name Rage 128 SL
++driver.xfree 4|r128|||||8,16,24
+
+ vendor.id pci 0x1002
+&device.id pci 0x534d
++device.name Rage 128 SM
++driver.xfree 4|r128|||||8,16,24
+
+ vendor.id pci 0x1002
+&device.id pci 0x5354
++device.name Mach 64 VT
++driver.xfree 4|ati|||||8,16,24
+
+ vendor.id pci 0x1002
+&device.id pci 0x5354
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x5654
++subdevice.name Mach 64 reference
+
+ vendor.id pci 0x1002
+&device.id pci 0x5452
++device.name Rage 128 Pro TR (AGP)
++driver.xfree 4||||||8,16,24
+
+ vendor.id pci 0x1002
+&device.id pci 0x5655
++device.name 264VT3 [Mach64 VT3]
++driver.xfree 4|ati|||||8,16,24
+
+ vendor.id pci 0x1002
+&device.id pci 0x5656
++device.name 264VT4 [Mach64 VT4]
++driver.xfree 4|ati|||||8,16,24
+
+ vendor.id pci 0x100c
++vendor.name Tseng Labs Inc
+
+ vendor.id pci 0x100c
+&device.id pci 0x3206
++device.name ET4000/W32p rev C
++driver.xfree 4|tseng
+
+ vendor.id pci 0x1011
++vendor.name Digital Equipment Corporation
+
+ vendor.id pci 0x1011
+&device.id pci 0x0004
++device.name DECchip 21030 [TGA]
++driver.xfree 4|tga|||||8
+
+ vendor.id pci 0x1013
++vendor.name Cirrus Logic
+
+ vendor.id pci 0x1013
+&device.id pci 0x00bc
++device.name GD 5480
++driver.xfree 4|cirrus
+
+ vendor.id pci 0x1014
++vendor.name IBM
+
+ vendor.id pci 0x1014
+&device.id pci 0x00b7
++device.name fgl1
++driver.xfree 4|firegl1|||||24
++driver.xfree.config Option "no_accel" "no"
++driver.xfree.config Option "NumDMABuffers2D" "4"
++driver.xfree.config Option "NumDMABuffers" "24"
++driver.xfree.config Option "NumTMBuffers" "4"
++driver.xfree.config Option "Capabilities" "0x00000000"
++driver.xfree.config Option "Capabilities2" "0x00000000"
++driver.xfree 4|firegl1|3d||dri,fgl1|DDCInfo,accel|24||switch2xf86_glx
++driver.xfree.config Option "no_accel" "no"
++driver.xfree.config Option "NumDMABuffers2D" "4"
++driver.xfree.config Option "NumDMABuffers" "24"
++driver.xfree.config Option "NumTMBuffers" "4"
++driver.xfree.config Option "Capabilities" "0x00000000"
++driver.xfree.config Option "Capabilities2" "0x00000000"
++requires xf86_glx|xfiregl1
+
+ vendor.id pci 0x1014
+&device.id pci 0x0170
++device.name fgl2
++driver.xfree 4|firegl23|||||24
++driver.xfree.config Option "no_accel" "no"
++driver.xfree.config Option "enable DVI" "on"
++driver.xfree.config Option "NumDMABuffers" "24"
++driver.xfree.config Option "NumTMBuffers" "4"
++driver.xfree.config Option "Capabilities" "0x00000000"
++driver.xfree.config Option "Capabilities2" "0x00000000"
++driver.xfree 4|firegl23|3d||dri,fgl23||24||switch2xf86_glx
++driver.xfree.config Option "no_accel" "no"
++driver.xfree.config Option "enable DVI" "on"
++driver.xfree.config Option "NumDMABuffers" "24"
++driver.xfree.config Option "NumTMBuffers" "4"
++driver.xfree.config Option "Capabilities" "0x00000000"
++driver.xfree.config Option "Capabilities2" "0x00000000"
++requires xf86_glx|xfiregl1
+
+ vendor.id pci 0x1023
++vendor.name Trident Microsystems Inc.
+
+ vendor.id pci 0x1023
+&device.id pci 0x8400
++device.name CyberBlade/i7
++driver.xfree 4|trident
+
+ vendor.id pci 0x1023
+&device.id pci 0x8620
++device.name CyberBlade/DSTN/Ai1
++driver.xfree 4|trident
+
+ vendor.id pci 0x1023
+&device.id pci 0x9385
++device.name Cyber 9385 [Reference design]
++driver.xfree 4|trident
+
+ vendor.id pci 0x1023
+&device.id pci 0x9525
++device.name Cyber 9525
++driver.xfree 4|trident
+
+ vendor.id pci 0x1023
+&device.id pci 0x9540
++device.name Cyber 9540
++driver.xfree 4|trident
+
+ vendor.id pci 0x1023
+&device.id pci 0x9750
++device.name 3DIm`age 975
++driver.xfree 4|trident|||||8,15,16,24
+
+ vendor.id pci 0x102b
++vendor.name Matrox Graphics, Inc.
+
+ vendor.id pci 0x102b
+&device.id pci 0x0100
++device.name Millennium II
++driver.xfree 4|mga|||||8,16,24
+
+ vendor.id pci 0x102b
+&device.id pci 0x0518
++device.name MGA-II [Athena]
++driver.xfree 4|mga|||||8,16,24
+
+ vendor.id pci 0x102b
+&device.id pci 0x0519
++device.name MGA 2064W [Millennium]
++driver.xfree 4|mga|||||8,16,24
+
+ vendor.id pci 0x102b
+&device.id pci 0x051a
++device.name MGA 1064SG [Mystique]
++driver.xfree 4|mga|||||8,16,24
+
+ vendor.id pci 0x102b
+&device.id pci 0x051a
+&subvendor.id pci 0x102b
+&subdevice.id pci 0x1100
++subdevice.name MGA-1084SG Mystique
+
+ vendor.id pci 0x102b
+&device.id pci 0x051b
++device.name MGA 2164W [Millennium II]
++driver.xfree 4|mga|||||8,16,24
+
+ vendor.id pci 0x102b
+&device.id pci 0x051e
++device.name MGA 1064SG [Mystique] AGP
++driver.xfree 4|mga|||||8,16,24
+
+ vendor.id pci 0x102b
+&device.id pci 0x051f
++device.name MGA 2164W [Millennium II] AGP
++driver.xfree 4|mga|||||8,16,24
+
+ vendor.id pci 0x102b
+&device.id pci 0x0520
++device.name MGA G200
++driver.xfree 4|mga||||NoHal|8,16,24
++driver.xfree 4|mga|3d||dri|NoHal|16||switch2xf86_glx
++requires xf86_glx
+
+ vendor.id pci 0x102b
+&device.id pci 0x0521
++device.name MGA G200 AGP
++driver.xfree 4|mga||||NoHal|8,16,24
++driver.xfree.config VideoRam 8192
++driver.xfree 4|mga|3d||dri|NoHal|16||switch2xf86_glx
++driver.xfree.config VideoRam 8192
++requires xf86_glx
+
+ vendor.id pci 0x102b
+&device.id pci 0x0525
++device.name MGA G400 AGP
++driver.xfree 4|mga||||NoHal|8,15,16,24
++driver.xfree 4|mga|3d||dri|NoHal|16||switch2xf86_glx
++requires xf86_glx
+
+ vendor.id pci 0x102b
+&device.id pci 0x0d10
++device.name MGA Ultima/Impression
++driver.xfree 4|mga|||||8,16,24
+
+ vendor.id pci 0x102b
+&device.id pci 0x1000
++device.name MGA G100 [Productiva]
++driver.xfree 4|mga|||||8,16,24
+
+ vendor.id pci 0x102b
+&device.id pci 0x1001
++device.name MGA G100 [Productiva] AGP
++driver.xfree 4|mga|||||8,16,24
+
+ vendor.id pci 0x102b
+&device.id pci 0x2007
++device.name MGA Mistral
++driver.xfree 4|mga|||||8
+
+ vendor.id pci 0x102b
+&device.id pci 0xff03
++device.name Millennium G200 SD
++driver.xfree 4|mga||||sw_cursor|8,16,24
+
+ vendor.id pci 0x102c
++vendor.name Chips and Technologies
+
+ vendor.id pci 0x102c
+&device.id pci 0x00e5
++device.name F65555 HiQVPro
++driver.xfree 4|chips
+
+ vendor.id pci 0x1039
++vendor.name Silicon Integrated Systems Corp.
+
+ vendor.id pci 0x1039
+&device.id pci 0x6306
++device.name 6306 3D-AGP
++driver.xfree 4|sis||||FastVRam,Noaccel|8
+
+ vendor.id pci 0x104c
++vendor.name Texas Instruments
+
+ vendor.id pci 0x104c
+&device.id pci 0x3d07
++device.name TVP4020 [Permedia 2]
++driver.xfree 4|glint|||||8,15,16,24
+
+ vendor.id pci 0x105d
++vendor.name Number 9 Computer Company
+
+ vendor.id pci 0x105d
+&device.id pci 0x2309
++device.name Imagine 128
++driver.xfree 4
+
+ vendor.id pci 0x1092
++vendor.name Diamond Multimedia Systems
+
+ vendor.id pci 0x1092
+&device.id pci 0x4820
++device.name Viper V550 with TV out
++driver.xfree 4|nv|||||8,15,16,24
++driver.xfree 4|nvidia|3d||||16||switch2nvidia_glx
++requires NVIDIA_GLX|NVIDIA_kernel
+
+ vendor.id pci 0x10c8
++vendor.name Neomagic Corporation
+
+ vendor.id pci 0x10c8
+&device.id pci 0x0004
++device.name NM2160 [MagicGraph 128XD]
++driver.xfree 4|neomagic|||||8,16
+
+ vendor.id pci 0x10c8
+&device.id pci 0x0005
++device.name MagicMedia 256AV
++driver.xfree 4|neomagic|||||8,16,24
+
+ vendor.id pci 0x10c8
+&device.id pci 0x0006
++device.name NM2360 [MagicMedia 256ZX]
++driver.xfree 4|neomagic|||||16
+
+ vendor.id pci 0x10c8
+&device.id pci 0x0016
++device.name 256XL(2380)
++driver.xfree 4|neomagic|||||8,16,24
++driver.xfree.config VideoRam 4096
+
+ vendor.id pci 0x10c8
+&device.id pci 0x8005
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x00dd
++subdevice.name MagicMedia 256AV Audio Device on BlackTip Thinkpad
++driver.xfree 4|neomagic|||||8,16
+
+ vendor.id pci 0x10de
++vendor.name nVidia Corporation
+
+ vendor.id pci 0x10de
+&device.id pci 0x0020
++device.name RIVA TNT
++driver.xfree 4|nv|||||8,15,16,24
++driver.xfree 4|nvidia|3d||||16||switch2nvidia_glx
++requires NVIDIA_GLX|NVIDIA_kernel
+
+ vendor.id pci 0x10de
+&device.id pci 0x0028
++device.name RIVA TNT2/TNT2 Pro
++driver.xfree 4|nv|||||8,15,16,24
++driver.xfree 4|nvidia|3d||||16||switch2nvidia_glx
++requires NVIDIA_GLX|NVIDIA_kernel
+
+ vendor.id pci 0x10de
+&device.id pci 0x0029
++device.name RIVA TNT2 Ultra
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16||switch2nvidia_glx
++requires NVIDIA_GLX|NVIDIA_kernel
+
+ vendor.id pci 0x10de
+&device.id pci 0x002c
++device.name Vanta/Vanta LT
++driver.xfree 4|nv|||||8,16,24
++driver.xfree 4|nvidia|3d||||16||switch2nvidia_glx
++requires NVIDIA_GLX|NVIDIA_kernel
+
+ vendor.id pci 0x10de
+&device.id pci 0x002d
++device.name RIVA TNT2 Model 64/Model 64 Pro
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16||switch2nvidia_glx
++requires NVIDIA_GLX|NVIDIA_kernel
+
+ vendor.id pci 0x10de
+&device.id pci 0x00a0
++device.name Aladdin TNT2
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16||switch2nvidia_glx
++requires NVIDIA_GLX|NVIDIA_kernel
+
+ vendor.id pci 0x10de
+&device.id pci 0x0100
++device.name GeForce 256
++driver.xfree 4|nv|||||8,15,16,24
++driver.xfree 4|nvidia|3d||||16||switch2nvidia_glx
++requires NVIDIA_GLX|NVIDIA_kernel
+
+ vendor.id pci 0x10de
+&device.id pci 0x0101
++device.name GeForce DDR
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16||switch2nvidia_glx
++requires NVIDIA_GLX|NVIDIA_kernel
+
+ vendor.id pci 0x10de
+&device.id pci 0x0103
++device.name Quadro
++driver.xfree 4|nv|||||8,15,16,24
++driver.xfree 4|nvidia|3d||||16||switch2nvidia_glx
++requires NVIDIA_GLX|NVIDIA_kernel
+
+ vendor.id pci 0x10de
+&device.id pci 0x0110
++device.name GeForce2 MX/MX 400
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16||switch2nvidia_glx
++requires NVIDIA_GLX|NVIDIA_kernel
+
+ vendor.id pci 0x10de
+&device.id pci 0x0111
++device.name GeForce2 MX 100/200
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16||switch2nvidia_glx
++requires NVIDIA_GLX|NVIDIA_kernel
+
+ vendor.id pci 0x10de
+&device.id pci 0x0112
++device.name GeForce2 Go
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16||switch2nvidia_glx
++requires NVIDIA_GLX|NVIDIA_kernel
+
+ vendor.id pci 0x10de
+&device.id pci 0x0113
++device.name Quadro2 MXR/EX/Go
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16||switch2nvidia_glx
++requires NVIDIA_GLX|NVIDIA_kernel
+
+ vendor.id pci 0x10de
+&device.id pci 0x0150
++device.name GeForce2 GTS/GeForce2 Pro
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16||switch2nvidia_glx
++requires NVIDIA_GLX|NVIDIA_kernel
+
+ vendor.id pci 0x10de
+&device.id pci 0x0151
++device.name GeForce2 Ti
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16||switch2nvidia_glx
++requires NVIDIA_GLX|NVIDIA_kernel
+
+ vendor.id pci 0x10de
+&device.id pci 0x0152
++device.name GeForce2 Ultra
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16||switch2nvidia_glx
++requires NVIDIA_GLX|NVIDIA_kernel
+
+ vendor.id pci 0x10de
+&device.id pci 0x0153
++device.name Quadro2 Pro
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16||switch2nvidia_glx
++requires NVIDIA_GLX|NVIDIA_kernel
+
+ vendor.id pci 0x1163
++vendor.name Rendition
+
+ vendor.id pci 0x1163
+&device.id pci 0x2000
++device.name Verite V2000/V2100/V2200
++driver.xfree 4|rendition
+
+ vendor.id pci 0x121a
++vendor.name 3Dfx Interactive, Inc.
+
+ vendor.id pci 0x121a
+&device.id pci 0x0001
++device.name Voodoo
++driver.xfree 4|glide|||||16
++driver.xfree 4||3d||||16||switch2mesa3dfx
++requires dev3dfx|glide_vg|mesa3dfx
+
+ vendor.id pci 0x121a
+&device.id pci 0x0003
++device.name Voodoo Banshee
++driver.xfree 4|tdfx|||||8,16,24
++driver.xfree 4|tdfx|3d||dri||16||switch2xf86_glx
++requires glidedri|xf86_glx
+
+ vendor.id pci 0x121a
+&device.id pci 0x0005
++device.name Voodoo 3
++driver.xfree 4|tdfx|||||8,16
++driver.xfree 4|tdfx|3d||dri||16||switch2xf86_glx
++requires glidedri|xf86_glx
+
+ vendor.id pci 0x121a
+&device.id pci 0x0009
++device.name Voodoo5 5500
++driver.xfree 4|tdfx|||||8,16,24
++driver.xfree 4|tdfx|3d||dri||16||switch2xf86_glx
++requires gldri_v5|xf86_glx
+
+ vendor.id pci 0x126f
++vendor.name Silicon Motion, Inc.
+
+ vendor.id pci 0x126f
+&device.id pci 0x0710
++device.name SM710 LynxEM
++driver.xfree 4|siliconmotion|||||8,15,16,24
+
+ vendor.id pci 0x12d2
++vendor.name NVidia / SGS Thomson (Joint Venture)
+
+ vendor.id pci 0x12d2
+&device.id pci 0x0018
++device.name Riva128
++driver.xfree 4|nv|||||8,15,16,24
+
+ vendor.id pci 0x3d3d
++vendor.name 3DLabs
+
+ vendor.id pci 0x3d3d
+&device.id pci 0x0007
++device.name 3D Extreme
++driver.xfree 4|glint|||||8,15,16,24
+
+ vendor.id pci 0x3d3d
+&device.id pci 0x0009
++device.name Permedia II 2D+3D
++driver.xfree 4|glint|||||8,15,16,24
+
+ vendor.id pci 0x3d3d
+&device.id pci 0x000a
++device.name GLINT R3
++driver.xfree 4|glint|||||8,32
+
+ vendor.id pci 0x5333
++vendor.name S3 Inc.
+
+ vendor.id pci 0x5333
+&device.id pci 0x8a01
++device.name ViRGE/DX or /GX
++driver.xfree 4|s3virge|||||8,15,16,24
+
+ vendor.id pci 0x8086
++vendor.name Intel Corporation
+
+ vendor.id pci 0x8086
+&device.id pci 0x1132
++device.name I815
++driver.xfree 4|i810|||||8,16,24
++driver.xfree 4|i810|3d||dri||16||switch2xf86_glx
++driver.xfree.config VideoRam 16384
++requires xf86_glx
+
+ vendor.id pci 0x8086
+&device.id pci 0x7121
++device.name 82810 CGC [Chipset Graphics Controller]
++driver.xfree 4|i810|||||8,16,24
++driver.xfree 4|i810|3d||dri||16||switch2xf86_glx
++driver.xfree.config VideoRam 16384
++requires xf86_glx
+
+ vendor.id pci 0x8086
+&device.id pci 0x7123
++device.name 82810-DC100 CGC [Chipset Graphics Controller]
++driver.xfree 4|i810|||||8,16,24
++driver.xfree 4|i810|3d||dri||16||switch2xf86_glx
++driver.xfree.config VideoRam 16384
++requires xf86_glx
+
+ vendor.id pci 0x8086
+&device.id pci 0x7125
++device.name 82810E CGC [Chipset Graphics Controller]
++driver.xfree 4|i810|||||8,16,24
++driver.xfree 4|i810|3d||dri||16||switch2xf86_glx
++driver.xfree.config VideoRam 16384
++requires xf86_glx
+
+ vendor.id pci 0x8086
+&device.id pci 0x7800
++device.name i740
++driver.xfree 4|i740
+
--- /dev/null
+ vendor.id pci 0x1002
++vendor.name ATI Technologies Inc
+
+ vendor.id pci 0x1002
+&device.id pci 0x3150
++device.name Radeon Mobility X600 (M24) 3150 (PCIE)
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x3154
++device.name FireGL M24 GL 3154 (PCIE)
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x3e50
++device.name Radeon X600 (RV380) 3E50 (PCIE)
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x3e50
+&subvendor.id pci 0x174b
+&subdevice.id pci 0x0450
++subdevice.name Radeon X600 Pro
++driver.xfree 4|radeon
++driver.xfree 4|fglrx|3d||dri
++driver.xfree.config Option "UseInternalAGPGART" "no"
++driver.xfree.config Option "mtrr" "off"
++driver.xfree.config Option "VideoOverlay" "on"
++driver.xfree.config Option "OpenGLOverlay" "off"
++requires fglrx
+
+ vendor.id pci 0x1002
+&device.id pci 0x3e54
++device.name FireGL V3200 (RV380) 3E54 (PCIE)
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4136
++device.name RS100 4136
++driver.xfree 4|radeon
++driver.xfree 4|radeon|3d||dri
+
+ vendor.id pci 0x1002
+&device.id pci 0x4137
++device.name RS100 4137
++driver.xfree 4|radeon
++driver.xfree 4|radeon|3d||dri
+
+ vendor.id pci 0x1002
+&device.id pci 0x4144
++device.name R300 AD
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4145
++device.name E300 AE
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4146
++device.name R300 AF
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4147
++device.name R300 AG
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4148
++device.name R350 AH
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4149
++device.name R350 AI
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x414a
++device.name R350 AJ
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x414b
++device.name R350 AK
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4150
++device.name RV350 AP
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4151
++device.name RV350 AQ
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4152
++device.name RV350 AR
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4153
++device.name RV350 AS
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4154
++device.name RV350 AT
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4155
++device.name RV350 AU
++driver.xfree 4|radeon
++driver.xfree.config ChipID 0x4154
+
+ vendor.id pci 0x1002
+&device.id pci 0x4156
++device.name RV350 AV
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4157
++device.name RV350 AW
++driver.xfree 4|radeon
++driver.xfree.config ChipID 0x4154
+
+ vendor.id pci 0x1002
+&device.id pci 0x4237
++device.name RS250 4237
++driver.xfree 4|radeon
++driver.xfree 4|radeon|3d||dri
+
+ vendor.id pci 0x1002
+&device.id pci 0x4242
++device.name R200 BB
++driver.xfree 4|radeon
++driver.xfree 4|radeon|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x4243
++device.name R200 BC
++driver.xfree 4|radeon
++driver.xfree 4|radeon|3d||dri
+
+ vendor.id pci 0x1002
+&device.id pci 0x4336
++device.name RS100 4336
++driver.xfree 4|radeon
++driver.xfree 4|radeon|3d||dri
+
+ vendor.id pci 0x1002
+&device.id pci 0x4337
++device.name RS200 4337
++driver.xfree 4|radeon
++driver.xfree 4|radeon|3d||dri
+
+ vendor.id pci 0x1002
+&device.id pci 0x4354
++device.name 215CT [Mach64 CT]
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x4358
++device.name 210888CX [Mach64 CX]
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x4437
++device.name RS250 4437
++driver.xfree 4|radeon
++driver.xfree 4|radeon|3d||dri
+
+ vendor.id pci 0x1002
+&device.id pci 0x4554
++device.name 210888ET [Mach64 ET]
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x4742
++device.name 3D Rage Pro AGP 1X/2X
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x4744
++device.name 3D Rage Pro AGP 1X
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x4749
++device.name Mach64 GI
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x474c
++device.name Rage XC
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x474d
++device.name Rage XL AGP
++driver.xfree 4|ati|||||8,16,24
+
+ vendor.id pci 0x1002
+&device.id pci 0x474e
++device.name Rage XC AGP
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x474f
++device.name Rage XL
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x4750
++device.name 3D Rage Pro 215GP
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x4751
++device.name 3D Rage Pro 215GQ
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x4752
++device.name Mach64 GR
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x4753
++device.name Mach64 GS
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x4754
++device.name 3D Rage I/II 215GT [Mach64 GT]
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x4755
++device.name 3D Rage II+ 215GTB [Mach64 GTB]
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x4756
++device.name 3D Rage IIC 215IIC [Mach64 GT IIC]
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x4757
++device.name 3D Rage IIC AGP
++driver.xfree 4|ati|||||8,15,16,24
+
+ vendor.id pci 0x1002
+&device.id pci 0x4758
++device.name 210888GX [Mach64 GX]
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x4759
++device.name 3D Rage IIC
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x475a
++device.name Mach64 GZ
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x4966
++device.name RV250 If
++driver.xfree 4|radeon
++driver.xfree 4|radeon|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x4966
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x0002
++subdevice.name Radeon 9000
+
+ vendor.id pci 0x1002
+&device.id pci 0x4967
++device.name RV250 Ig
++driver.xfree 4|radeon
++driver.xfree 4|radeon|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x4a48
++device.name R420 JH
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4a49
++device.name R420 JI
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4a4a
++device.name R420 JJ
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4a4b
++device.name R420 JK
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4a4c
++device.name R420 JL
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4a4d
++device.name R420 JM
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4a4e
++device.name R420 JN
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4a50
++device.name R420 JP
++driver.xfree 4|radeon
++driver.xfree 4|fglrx|3d||dri
++driver.xfree.config Option "UseInternalAGPGART" "no"
++driver.xfree.config Option "mtrr" "off"
++driver.xfree.config Option "VideoOverlay" "on"
++driver.xfree.config Option "OpenGLOverlay" "off"
++requires fglrx
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c42
++device.name Mach64 LB
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c42
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x0044
++subdevice.name 3D Rage LT Pro AGP-133
++driver.xfree 4|ati
++driver.xfree.config Option "dpms" "off"
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c44
++device.name 3D Rage LT Pro AGP-66
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c45
++device.name Rage 128 Mobility LE
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c46
++device.name Mobility M3 AGP 2x
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c47
++device.name 3D Rage LT-G 215LG
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c49
++device.name Mach64 LI
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c4d
++device.name 3D Rage P/M Mobility AGP 2x
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c4d
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x00bb
++subdevice.name Mach64LM/Dell
++driver.xfree 4|fbdev
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c4e
++device.name 3D Rage L Mobility AGP 2x
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c50
++device.name 3D Rage LT Pro
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c51
++device.name Mach64 LQ
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c52
++device.name 3D Rage P/M Mobility
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c53
++device.name 3D Rage L Mobility
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c57
++device.name Radeon LW
++driver.xfree 4|radeon
++driver.xfree 4|radeon|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c58
++device.name Radeon LX
++driver.xfree 4|radeon
++driver.xfree 4|radeon|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c59
++device.name Radeon LY
++driver.xfree 4|radeon
++driver.xfree 4|radeon|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c5a
++device.name Radeon LZ
++driver.xfree 4|radeon
++driver.xfree 4|radeon|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c64
++device.name RV250 Ld
++driver.xfree 4|radeon
++driver.xfree 4|radeon|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c66
++device.name RV250 Lf
++driver.xfree 4|radeon
++driver.xfree 4|radeon|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c67
++device.name RV250 Lg
++driver.xfree 4|radeon
++driver.xfree 4|radeon|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x4d46
++device.name Rage 128 Mobility MF
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x4d4c
++device.name Rage 128 Mobility ML
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x4e44
++device.name R300 ND
++driver.xfree 4|radeon
++driver.xfree 4|fglrx|3d||dri
++driver.xfree.config Option "UseInternalAGPGART" "no"
++driver.xfree.config Option "mtrr" "off"
++driver.xfree.config Option "VideoOverlay" "on"
++driver.xfree.config Option "OpenGLOverlay" "off"
++requires fglrx
+
+ vendor.id pci 0x1002
+&device.id pci 0x4e44
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x0002
++subdevice.name Radeon 9700
+
+ vendor.id pci 0x1002
+&device.id pci 0x4e45
++device.name R300 NE
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4e46
++device.name R300 NF
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4e47
++device.name R300 NG
++driver.xfree 4|radeon
++driver.xfree 4|fglrx|3d||dri
++driver.xfree.config Option "UseInternalAGPGART" "no"
++driver.xfree.config Option "mtrr" "off"
++driver.xfree.config Option "VideoOverlay" "on"
++driver.xfree.config Option "OpenGLOverlay" "off"
++requires fglrx
+
+ vendor.id pci 0x1002
+&device.id pci 0x4e47
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x0172
++subdevice.name FireGL X1
+
+ vendor.id pci 0x1002
+&device.id pci 0x4e48
++device.name R350 NH
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4e49
++device.name R350 NI
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4e4a
++device.name R360 NJ
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4e4b
++device.name R350 NK
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4e50
++device.name RV350 NP
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4e51
++device.name RV350 NQ
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4e52
++device.name RV350 NR
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4e53
++device.name RV350 NS
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4e54
++device.name RV350 NT
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4e56
++device.name RV350 NV
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x5041
++device.name Rage 128 PA
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5042
++device.name Rage 128 PB
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5043
++device.name Rage 128 PC
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5044
++device.name Rage 128 PD
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5045
++device.name Rage 128 PE
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5046
++device.name Rage 128 PF
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5047
++device.name Rage 128 PG
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5048
++device.name Rage 128 PH
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5049
++device.name Rage 128 PI
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x504a
++device.name Rage 128 PJ
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x504b
++device.name Rage 128 PK
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x504c
++device.name Rage 128 PL
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x504d
++device.name Rage 128 PM
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x504e
++device.name Rage 128 PN
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x504f
++device.name Rage 128 PO
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5050
++device.name Rage 128 PP
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5051
++device.name Rage 128 PQ
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5052
++device.name Rage 128 PR
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5053
++device.name Rage 128 PS
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5054
++device.name Rage 128 PT
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5055
++device.name Rage 128 PU
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5056
++device.name Rage 128 PV
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5057
++device.name Rage 128 PW
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5058
++device.name Rage 128 PX
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5144
++device.name Radeon QD
++driver.xfree 4|radeon
++driver.xfree 4|radeon|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5145
++device.name Radeon QE
++driver.xfree 4|radeon
++driver.xfree 4|radeon|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5146
++device.name Radeon QF
++driver.xfree 4|radeon
++driver.xfree 4|radeon|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5147
++device.name Radeon QG
++driver.xfree 4|radeon
++driver.xfree 4|radeon|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5148
++device.name fgl8x00
++driver.xfree 4|radeon
++driver.xfree 4|radeon|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5148
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x0152
++subdevice.name FireGL 8800
+
+ vendor.id pci 0x1002
+&device.id pci 0x5148
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x0172
++subdevice.name FireGL 8700
++driver.xfree 4|radeon
++driver.xfree 4|radeon|3d||dri
+
+ vendor.id pci 0x1002
+&device.id pci 0x514c
++device.name R200 QL
++driver.xfree 4|radeon
++driver.xfree 4|radeon|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x514d
++device.name Radeon 9100 QM
++driver.xfree 4|radeon
++driver.xfree 4|radeon|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5157
++device.name RV200 QW
++driver.xfree 4|radeon
++driver.xfree 4|radeon|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5157
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x013a
++subdevice.name Radeon 7500
+
+ vendor.id pci 0x1002
+&device.id pci 0x5157
+&subvendor.id pci 0x174b
+&subdevice.id pci 0x7146
++subdevice.name Radeon 7500-7146
++driver.xfree 4|radeon
++driver.xfree 4|radeon|3d||dri
+
+ vendor.id pci 0x1002
+&device.id pci 0x5157
+&subvendor.id pci 0x174b
+&subdevice.id pci 0x7161
++subdevice.name Radeon 7500 LE
++driver.xfree 4|radeon
++driver.xfree 4|radeon|3d||dri
+
+ vendor.id pci 0x1002
+&device.id pci 0x5158
++device.name RV200 QX
++driver.xfree 4|radeon
++driver.xfree 4|radeon|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5159
++device.name Radeon VE
++driver.xfree 4|radeon
++driver.xfree 4|radeon|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x515a
++device.name Radeon QZ
++driver.xfree 4|radeon
++driver.xfree 4|radeon|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x515e
++device.name ES1000 (1002:515E)
++driver.xfree 4|radeon
++driver.xfree.config ChipID 0x5969
+
+ vendor.id pci 0x1002
+&device.id pci 0x5245
++device.name Rage 128 RE
++driver.xfree 4|r128|||||8,15,16,24
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5246
++device.name Rage 128 RF
++driver.xfree 4|r128|||||8,15,16,24
+
+ vendor.id pci 0x1002
+&device.id pci 0x5247
++device.name Rage 128 RG
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x524b
++device.name Rage 128 RK
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x524c
++device.name Rage 128 RL
++driver.xfree 4|r128|||||8,15,16,24
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5345
++device.name Rage 128 SE
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5346
++device.name Rage 128 SF
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5347
++device.name Rage 128 SG
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5348
++device.name Rage 128 4x
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x534b
++device.name Rage 128 SK
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x534c
++device.name Rage 128 SL
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x534d
++device.name Rage 128 SM
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x534e
++device.name Rage 128 SN
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5446
++device.name Rage 128 Ultra TF
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x544c
++device.name Rage128 TL
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5452
++device.name Rage 128 Pro TR (AGP)
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5453
++device.name Rage 128 TS
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5454
++device.name Rage 128 TT
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5455
++device.name Rage 128 TU
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5460
++device.name Radeon Mobility M300 (M22) 5460 (PCIE)
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x5464
++device.name FireGL M22 GL 5464 (PCIE)
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x5548
++device.name Radeon X800 (R423) UH (PCIE)
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x5549
++device.name Radeon X800PRO (R423) UI (PCIE)
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x554a
++device.name Radeon X800LE (R423) UJ (PCIE)
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x554b
++device.name Radeon X800SE (R423) UK (PCIE)
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x554d
++device.name Radeon X800 XL
++driver.xfree 4|radeon
++driver.xfree.config ChipID 0x554b
+
+ vendor.id pci 0x1002
+&device.id pci 0x554d
+&subvendor.id pci 0x174b
+&subdevice.id pci 0x0600
++subdevice.name Radeon X800 XL
+
+ vendor.id pci 0x1002
+&device.id pci 0x5551
++device.name FireGL V7200 (R423) UQ (PCIE)
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x5552
++device.name FireGL V5100 (R423) UR (PCIE)
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x5554
++device.name FireGL V7100 (R423) UT (PCIE)
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x5654
++device.name Mach64 VT
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x5655
++device.name 264VT3 [Mach64 VT3]
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x5656
++device.name 264VT4 [Mach64 VT4]
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x5834
++device.name RS300 5834
++driver.xfree 4|radeon
++driver.xfree 4|radeon|3d||dri
+
+ vendor.id pci 0x1002
+&device.id pci 0x5835
++device.name RS300 5835
++driver.xfree 4|radeon
++driver.xfree 4|radeon|3d||dri
+
+ vendor.id pci 0x1002
+&device.id pci 0x5960
++device.name RV280 5960
++driver.xfree 4|radeon
++driver.xfree 4|radeon|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5961
++device.name RV280 5961
++driver.xfree 4|radeon
++driver.xfree 4|radeon|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5962
++device.name RV280 5962
++driver.xfree 4|radeon
++driver.xfree 4|radeon|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5964
++device.name RV280 5964
++driver.xfree 4|radeon
++driver.xfree 4|radeon|3d||dri
+
+ vendor.id pci 0x1002
+&device.id pci 0x5964
+&subvendor.id pci 0x17af
+&subdevice.id pci 0x2012
++subdevice.name Radeon 9200 SE (DH)
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x5969
++device.name ES1000 (PCI)
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x5b60
++device.name Radeon X300 (RV370) 5B60 (PCIE)
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x5b60
+&subvendor.id pci 0x174b
+&subdevice.id pci 0x0440
++subdevice.name Radeon X300 SE
++driver.xfree 4|radeon
++driver.xfree 4|fglrx|3d||dri
++driver.xfree.config Option "UseInternalAGPGART" "no"
++driver.xfree.config Option "mtrr" "off"
++driver.xfree.config Option "VideoOverlay" "on"
++driver.xfree.config Option "OpenGLOverlay" "off"
++requires fglrx
+
+ vendor.id pci 0x1002
+&device.id pci 0x5b62
++device.name Radeon X600 (RV370) 5B62 (PCIE)
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x5b64
++device.name FireGL V3100 (RV370) 5B64 (PCIE)
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x5b65
++device.name FireGL D1100 (RV370) 5B65 (PCIE)
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x5c61
++device.name RV280 5c61
++driver.xfree 4|radeon
++driver.xfree 4|radeon|3d||dri
+
+ vendor.id pci 0x1002
+&device.id pci 0x5c63
++device.name RV280 5c63
++driver.xfree 4|radeon
++driver.xfree 4|radeon|3d||dri
+
+ vendor.id pci 0x1002
+&device.id pci 0x5d57
++device.name Radeon X800XT (R423) 5D57 (PCIE)
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x5e4a
++device.name Radeon X700 XT
++driver.xfree 4|radeon
++driver.xfree.config ChipID 0x5D57
+
+ vendor.id pci 0x1002
+&device.id pci 0x5e4b
++device.name Radeon X700 Pro
++driver.xfree 4|radeon
++driver.xfree.config ChipID 0x5549
++driver.xfree 4|fglrx|3d||dri
++requires fglrx
+
+ vendor.id pci 0x1002
+&device.id pci 0x5e4c
++device.name Radeon X700 SE
++driver.xfree 4|radeon
++driver.xfree.config ChipID 0x554B
+
+ vendor.id pci 0x1002
+&device.id pci 0x5e4d
++device.name Radeon X700 (5E4D)
++driver.xfree 4|radeon
++driver.xfree.config ChipID 0x5548
+
+ vendor.id pci 0x1002
+&device.id pci 0x5e4f
++device.name Radeon X700 (5E4F)
++driver.xfree 4|radeon
++driver.xfree.config ChipID 0x5548
+
+ vendor.id pci 0x1002
+&device.id pci 0x7834
++device.name Radeon 9100 PRO IGP 7834
++driver.xfree 4|radeon
++driver.xfree 4|radeon|3d||dri
+
+ vendor.id pci 0x1002
+&device.id pci 0x7835
++device.name Radeon Mobility 9200 IGP 7835
++driver.xfree 4|radeon
++driver.xfree 4|radeon|3d||dri
+
+ vendor.id pci 0x100b
++vendor.name National Semiconductor Corporation
+
+ vendor.id pci 0x100b
+&device.id pci 0x0030
++device.name REDCLOUD
++driver.xfree 4|nsc
+
+ vendor.id pci 0x100b
+&device.id pci 0x0104
++device.name SC1400
++driver.xfree 4|nsc
+
+ vendor.id pci 0x100b
+&device.id pci 0x0504
++device.name SC1200
++driver.xfree 4|nsc
+
+ vendor.id pci 0x100c
++vendor.name Tseng Labs Inc
+
+ vendor.id pci 0x100c
+&device.id pci 0x3202
++device.name ET4000/W32p rev A
++driver.xfree 4|tseng
+
+ vendor.id pci 0x100c
+&device.id pci 0x3205
++device.name ET4000/W32p rev B
++driver.xfree 4|tseng
+
+ vendor.id pci 0x100c
+&device.id pci 0x3206
++device.name ET4000/W32p rev C
++driver.xfree 4|tseng
+
+ vendor.id pci 0x100c
+&device.id pci 0x3207
++device.name ET4000/W32p rev D
++driver.xfree 4|tseng
+
+ vendor.id pci 0x100c
+&device.id pci 0x3208
++device.name ET6000
++driver.xfree 4|tseng
+
+ vendor.id pci 0x1013
++vendor.name Cirrus Logic
+
+ vendor.id pci 0x1013
+&device.id pci 0x0038
++device.name GD 7548
++driver.xfree 4|cirrus
+
+ vendor.id pci 0x1013
+&device.id pci 0x00a0
++device.name GD 5430/40 [Alpine]
++driver.xfree 4|cirrus||||Noaccel
+
+ vendor.id pci 0x1013
+&device.id pci 0x00a4
++device.name GD 5434-4 [Alpine]
++driver.xfree 4|cirrus
+
+ vendor.id pci 0x1013
+&device.id pci 0x00a8
++device.name GD 5434-8 [Alpine]
++driver.xfree 4|cirrus
+
+ vendor.id pci 0x1013
+&device.id pci 0x00ac
++device.name GD 5436 [Alpine]
++driver.xfree 4|cirrus
+
+ vendor.id pci 0x1013
+&device.id pci 0x00b8
++device.name GD 5446
++driver.xfree 4|cirrus
+
+ vendor.id pci 0x1013
+&device.id pci 0x00bc
++device.name GD 5480
++driver.xfree 4|cirrus
+
+ vendor.id pci 0x1013
+&device.id pci 0x00d0
++device.name GD 5462
++driver.xfree 4|cirrus
+
+ vendor.id pci 0x1013
+&device.id pci 0x00d4
++device.name GD 5464 [Laguna]
++driver.xfree 4|cirrus
+
+ vendor.id pci 0x1013
+&device.id pci 0x00d5
++device.name GD5464BD
++driver.xfree 4|cirrus
+
+ vendor.id pci 0x1013
+&device.id pci 0x00d6
++device.name GD 5465 [Laguna]
++driver.xfree 4|cirrus
+
+ vendor.id pci 0x1023
++vendor.name Trident Microsystems Inc.
+
+ vendor.id pci 0x1023
+&device.id pci 0x2100
++device.name CyberBlade/xp4
++driver.xfree 4|trident
+
+ vendor.id pci 0x1023
+&device.id pci 0x8400
++device.name CyberBlade/i7
++driver.xfree 4|trident
+
+ vendor.id pci 0x1023
+&device.id pci 0x8420
++device.name CyberBlade/i7d
++driver.xfree 4|trident
+
+ vendor.id pci 0x1023
+&device.id pci 0x8500
++device.name CyberBlade/i1
++driver.xfree 4|trident||||CyberStretch,sw_cursor
+
+ vendor.id pci 0x1023
+&device.id pci 0x8520
++device.name 8520
++driver.xfree 4|trident
+
+ vendor.id pci 0x1023
+&device.id pci 0x8600
++device.name 8600
++driver.xfree 4|trident
+
+ vendor.id pci 0x1023
+&device.id pci 0x8620
++device.name CyberBlade/DSTN/Ai1
++driver.xfree 4|trident
+
+ vendor.id pci 0x1023
+&device.id pci 0x8820
++device.name 8820
++driver.xfree 4|trident
+
+ vendor.id pci 0x1023
+&device.id pci 0x9320
++device.name 9320
++driver.xfree 4|trident
+
+ vendor.id pci 0x1023
+&device.id pci 0x9388
++device.name Cyber 9388
++driver.xfree 4|trident
+
+ vendor.id pci 0x1023
+&device.id pci 0x9397
++device.name Cyber 9397
++driver.xfree 4|trident
+
+ vendor.id pci 0x1023
+&device.id pci 0x939a
++device.name Cyber 9397DVD
++driver.xfree 4|trident
+
+ vendor.id pci 0x1023
+&device.id pci 0x9420
++device.name TGUI 9420
++driver.xfree 4|trident
+
+ vendor.id pci 0x1023
+&device.id pci 0x9440
++device.name TGUI 9440
++driver.xfree 4|trident
+
+ vendor.id pci 0x1023
+&device.id pci 0x9520
++device.name Cyber 9520
++driver.xfree 4|trident
+
+ vendor.id pci 0x1023
+&device.id pci 0x9525
++device.name Cyber 9525
++driver.xfree 4|trident
+
+ vendor.id pci 0x1023
+&device.id pci 0x9540
++device.name Cyber 9540
++driver.xfree 4|trident
+
+ vendor.id pci 0x1023
+&device.id pci 0x9660
++device.name TGUI 9660/968x/968x
++driver.xfree 4|trident
+
+ vendor.id pci 0x1023
+&device.id pci 0x9750
++device.name 3DIm`age 975
++driver.xfree 4|trident|||||8,15,16,24
+
+ vendor.id pci 0x1023
+&device.id pci 0x9850
++device.name 3DImage 9850
++driver.xfree 4|trident
+
+ vendor.id pci 0x1023
+&device.id pci 0x9880
++device.name 9880
++driver.xfree 4|trident
+
+ vendor.id pci 0x1023
+&device.id pci 0x9910
++device.name 9910
++driver.xfree 4|trident
+
+ vendor.id pci 0x102b
++vendor.name Matrox Graphics, Inc.
+
+ vendor.id pci 0x102b
+&device.id pci 0x0519
++device.name MGA 2064W [Millennium]
++driver.xfree 4|mga||||NoHal|8,16,24
+
+ vendor.id pci 0x102b
+&device.id pci 0x051a
++device.name MGA 1064SG [Mystique]
++driver.xfree 4|mga||||NoHal|8,16,24
+
+ vendor.id pci 0x102b
+&device.id pci 0x051b
++device.name MGA 2164W [Millennium II]
++driver.xfree 4|mga||||NoHal|8,16,24
+
+ vendor.id pci 0x102b
+&device.id pci 0x051f
++device.name MGA 2164W [Millennium II] AGP
++driver.xfree 4|mga||||NoHal
+
+ vendor.id pci 0x102b
+&device.id pci 0x0520
++device.name MGA G200
++driver.xfree 4|mga|||||8,16,24
+
+ vendor.id pci 0x102b
+&device.id pci 0x0521
++device.name MGA G200 AGP
++driver.xfree 4|mga|||||8,16,24
++driver.xfree.config VideoRam 8192
++driver.xfree 4|mga|3d||dri||16
++driver.xfree.config VideoRam 8192
+
+ vendor.id pci 0x102b
+&device.id pci 0x0525
++device.name MGA G400 AGP
++driver.xfree 4|mga
++driver.xfree 4|mga|3d||dri
+
+ vendor.id pci 0x102b
+&device.id pci 0x0525
+&subvendor.id pci 0x102b
+&subdevice.id pci 0x0540
++subdevice.name G450-0540
+
+ vendor.id pci 0x102b
+&device.id pci 0x0525
+&subvendor.id pci 0x102b
+&subdevice.id pci 0x0541
++subdevice.name G450
+
+ vendor.id pci 0x102b
+&device.id pci 0x0525
+&subvendor.id pci 0x102b
+&subdevice.id pci 0x0641
++subdevice.name Matrox G400 DH-0641
+
+ vendor.id pci 0x102b
+&device.id pci 0x0525
+&subvendor.id pci 0x102b
+&subdevice.id pci 0x07c0
++subdevice.name G450 LE
+
+ vendor.id pci 0x102b
+&device.id pci 0x0525
+&subvendor.id pci 0x102b
+&subdevice.id pci 0x0d41
++subdevice.name G450 DH G450
+
+ vendor.id pci 0x102b
+&device.id pci 0x0525
+&subvendor.id pci 0x102b
+&subdevice.id pci 0x0d43
++subdevice.name G450 PCI
++driver.xfree 4|mga
+
+ vendor.id pci 0x102b
+&device.id pci 0x0525
+&subvendor.id pci 0x102b
+&subdevice.id pci 0x2179
++subdevice.name G400 DH
+
+ vendor.id pci 0x102b
+&device.id pci 0x0525
+&subvendor.id pci 0x102b
+&subdevice.id pci 0x23c3
++subdevice.name G450-23c3
+
+ vendor.id pci 0x102b
+&device.id pci 0x1000
++device.name MGA G100 [Productiva]
++driver.xfree 4|mga||||NoHal
+
+ vendor.id pci 0x102b
+&device.id pci 0x1001
++device.name MGA G100 [Productiva] AGP
++driver.xfree 4|mga||||NoHal|8,16,24
+
+ vendor.id pci 0x102b
+&device.id pci 0x2527
++device.name G550
++driver.xfree 4|mga
++driver.xfree 4|mga|3d||dri
+
+ vendor.id pci 0x102c
++vendor.name Chips and Technologies
+
+ vendor.id pci 0x102c
+&device.id pci 0x00c0
++device.name F69000 HiQVideo
++driver.xfree 4|chips
+
+ vendor.id pci 0x102c
+&device.id pci 0x00d8
++device.name F65545
++driver.xfree 4|chips
+
+ vendor.id pci 0x102c
+&device.id pci 0x00dc
++device.name F65548
++driver.xfree 4|chips
+
+ vendor.id pci 0x102c
+&device.id pci 0x00e0
++device.name 65550
++driver.xfree 4|chips
+
+ vendor.id pci 0x102c
+&device.id pci 0x00e4
++device.name F65554
++driver.xfree 4|chips
+
+ vendor.id pci 0x102c
+&device.id pci 0x00e5
++device.name F65555 HiQVPro
++driver.xfree 4|chips
+
+ vendor.id pci 0x102c
+&device.id pci 0x00f4
++device.name F68554 HiQVision
++driver.xfree 4|chips
+
+ vendor.id pci 0x102c
+&device.id pci 0x0c30
++device.name 69030
++driver.xfree 4|chips
+
+ vendor.id pci 0x1039
++vendor.name Silicon Integrated Systems Corp.
+
+ vendor.id pci 0x1039
+&device.id pci 0x0200
++device.name 5597/5598 VGA
++driver.xfree 4|sis|||||16,24
+
+ vendor.id pci 0x1039
+&device.id pci 0x0300
++device.name SIS300
++driver.xfree 4|sis
+
+ vendor.id pci 0x1039
+&device.id pci 0x0310
++device.name SiS315H
++driver.xfree 4|sis
+
+ vendor.id pci 0x1039
+&device.id pci 0x0325
++device.name SiS315PRO
++driver.xfree 4|sis
+
+ vendor.id pci 0x1039
+&device.id pci 0x0330
++device.name SiS330
++driver.xfree 4|sis
+
+ vendor.id pci 0x1039
+&device.id pci 0x0340
++device.name SiS340
++driver.xfree 4|sis
+
+ vendor.id pci 0x1039
+&device.id pci 0x5300
++device.name SiS540 PCI Display Adapter
++driver.xfree 4|sis
+
+ vendor.id pci 0x1039
+&device.id pci 0x5315
++device.name SiS550
++driver.xfree 4|sis
+
+ vendor.id pci 0x1039
+&device.id pci 0x6300
++device.name SiS630 GUI Accelerator+3D
++driver.xfree 4|sis
+
+ vendor.id pci 0x1039
+&device.id pci 0x6306
++device.name 6306 3D-AGP
++driver.xfree 4|sis|||||16
+
+ vendor.id pci 0x1039
+&device.id pci 0x6325
++device.name SiS650
++driver.xfree 4|sis
+
+ vendor.id pci 0x1039
+&device.id pci 0x6326
++device.name 86C326
++driver.xfree 4|sis|||||8,16,24
+
+ vendor.id pci 0x1039
+&device.id pci 0x6330
++device.name SiS 660
++driver.xfree 4|sis
+
+ vendor.id pci 0x104c
++vendor.name Texas Instruments
+
+ vendor.id pci 0x104c
+&device.id pci 0x3d04
++device.name TVP4010 [Permedia]
++driver.xfree 4|glint
+
+ vendor.id pci 0x104c
+&device.id pci 0x3d07
++device.name TVP4020 [Permedia 2]
++driver.xfree 4|glint|||||8,15,16,24
+
+ vendor.id pci 0x105d
++vendor.name Number 9 Computer Company
+
+ vendor.id pci 0x105d
+&device.id pci 0x2309
++device.name Imagine 128
++driver.xfree 4|i128
+
+ vendor.id pci 0x105d
+&device.id pci 0x2339
++device.name Imagine 128-II
++driver.xfree 4|i128
+
+ vendor.id pci 0x105d
+&device.id pci 0x493d
++device.name Imagine 128 T2R [Ticket to Ride]
++driver.xfree 4|i128
+
+ vendor.id pci 0x105d
+&device.id pci 0x5348
++device.name Revolution 4
++driver.xfree 4|i128
+
+ vendor.id pci 0x1078
++vendor.name Cyrix Corporation
+
+ vendor.id pci 0x1078
+&device.id pci 0x0000
++device.name 5510
++driver.xfree 4|cyrix
+
+ vendor.id pci 0x1078
+&device.id pci 0x0002
++device.name 5520 [Cognac]
++driver.xfree 4|cyrix
+
+ vendor.id pci 0x1078
+&device.id pci 0x0104
++device.name 5530 Video [Kahlua]
++driver.xfree 4|cyrix
+
+ vendor.id pci 0x10c8
++vendor.name Neomagic Corporation
+
+ vendor.id pci 0x10c8
+&device.id pci 0x0001
++device.name NM2070 [MagicGraph NM2070]
++driver.xfree 4|neomagic
+
+ vendor.id pci 0x10c8
+&device.id pci 0x0002
++device.name NM2090 [MagicGraph 128V]
++driver.xfree 4|neomagic
+
+ vendor.id pci 0x10c8
+&device.id pci 0x0003
++device.name NM2093 [MagicGraph 128ZV]
++driver.xfree 4|neomagic
+
+ vendor.id pci 0x10c8
+&device.id pci 0x0004
++device.name NM2160 [MagicGraph 128XD]
++driver.xfree 4|neomagic|||||8,16
+
+ vendor.id pci 0x10c8
+&device.id pci 0x0005
++device.name MagicMedia 256AV
++driver.xfree 4|neomagic|||||8,16,24
+
+ vendor.id pci 0x10c8
+&device.id pci 0x0006
++device.name NM2360 [MagicMedia 256ZX]
++driver.xfree 4|neomagic|||||16
+
+ vendor.id pci 0x10c8
+&device.id pci 0x0016
++device.name 256XL(2380)
++driver.xfree 4|neomagic|||||8,16,24
++driver.xfree.config VideoRam 4096
+
+ vendor.id pci 0x10c8
+&device.id pci 0x0025
++device.name NM2230
++driver.xfree 4|neomagic
+
+ vendor.id pci 0x10c8
+&device.id pci 0x0083
++device.name MagicGraph 128ZV Plus
++driver.xfree 4|neomagic
+
+ vendor.id pci 0x10de
++vendor.name nVidia Corporation
+
+ vendor.id pci 0x10de
+&device.id pci 0x0020
++device.name RIVA TNT
++driver.xfree 4|nv|||||8,15,16,24
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x0028
++device.name RIVA TNT2/TNT2 Pro
++driver.xfree 4|nv|||||8,15,16,24
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x0029
++device.name RIVA TNT2 Ultra
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x002a
++device.name Unknown TNT2
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x002c
++device.name Vanta/Vanta LT
++driver.xfree 4|nv|||||8,16,24
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x002d
++device.name RIVA TNT2 Model 64/Model 64 Pro
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x0040
++device.name GeForce 6800 Ultra
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0041
++device.name GeForce 6800
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0042
++device.name GeForce 6800 LE
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0043
++device.name 0x0043
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0045
++device.name GeForce 6800 GT
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0049
++device.name 0x0049
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x004e
++device.name Quadro FX 4000
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x00a0
++device.name Aladdin TNT2
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x00c0
++device.name 0x00c0
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x00c1
++device.name GeForce 6800 (0x00C1)
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x00c2
++device.name 0x00c2
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x00c8
++device.name GeForce Go 6800
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x00c9
++device.name GeForce Go 6800 Ultra
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x00cc
++device.name Quadro FX Go1400
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x00cd
++device.name 0x00CD
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x00ce
++device.name Quadro FX 1400
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x00f0
++device.name GeForce 6800/GeForce 6800 Ultra
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x00f1
++device.name GeForce 6600/GeForce 6600 GT
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x00f2
++device.name GeForce 6600 GT (0x00F2)
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x00f3
++device.name GeForce 6200 (AGP)
++driver.xfree 4|nv
++driver.xfree.config Option "noaccel"
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x00f8
++device.name Quadro FX 3400
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x00f9
++device.name GeForce 6800 Ultra (0x00F9)
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x00fa
++device.name GeForce PCX 5750
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x00fb
++device.name GeForce PCX 5900
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x00fc
++device.name Quadro FX 330/GeForce PCX 5300
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x00fd
++device.name Quadro NVS 280 PCI-E/Quadro FX 330
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x00fe
++device.name Quadro FX 1300
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x00ff
++device.name GeForce PCX 4300
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0100
++device.name GeForce 256
++driver.xfree 4|nv|||||8,15,16,24
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x0101
++device.name GeForce DDR
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x0103
++device.name Quadro
++driver.xfree 4|nv|||||8,15,16,24
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x0110
++device.name GeForce2 MX/MX 400
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x0111
++device.name GeForce2 MX 100/200
++driver.xfree 4|nv||||sw_cursor
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x0112
++device.name GeForce2 Go
++driver.xfree 4|nv
++driver.xfree.config #Option "CrtcNumber" "0"
++driver.xfree 4|nvidia|3d||||16
++driver.xfree.config #Option "CrtcNumber" "0"
+
+ vendor.id pci 0x10de
+&device.id pci 0x0113
++device.name Quadro2 MXR/EX/Go
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x0140
++device.name GeForce 6600 GT
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0141
++device.name GeForce 6600
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0141
+&subvendor.id pci 0x1458
+&subdevice.id pci 0x3124
++subdevice.name GeForce 6600 (Gigabyte)
++driver.xfree 4|nv
++driver.xfree.config Option "XaaNoScreenToScreenCopy"
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0142
++device.name 0x0142
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0143
++device.name 0x0143
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0144
++device.name GeForce Go 6600
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0145
++device.name GeForce 6610 XL
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0146
++device.name GeForce Go 6600 TE/6200 TE
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0147
++device.name 0x0147
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0148
++device.name GeForce Go 6600 (0x0148)
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0149
++device.name 0x0149
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x014b
++device.name 0x014b
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x014c
++device.name 0x014c
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x014d
++device.name 0x014d
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x014e
++device.name Quadro FX 540
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x014f
++device.name GeForce 6200
++driver.xfree 4|nv
++driver.xfree.config Option "XaaNoScreenToScreenCopy"
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0150
++device.name GeForce2 GTS/GeForce2 Pro
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x0151
++device.name GeForce2 Ti
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x0152
++device.name GeForce2 Ultra
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x0153
++device.name Quadro2 Pro
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x0160
++device.name 0x0160
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0161
++device.name GeForce 6200 TurboCache(TM)
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0161
+&subvendor.id pci 0x10de
+&subdevice.id pci 0x025c
++subdevice.name GeForce 6200 TurboCache(TM) (10de:025c)
++driver.xfree 4|nv
++driver.xfree.config Option "XaaNoScreenToScreenCopy"
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0162
++device.name 0x0162
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0163
++device.name 0x0163
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0164
++device.name GeForce Go 6200
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0165
++device.name 0x0165
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0166
++device.name GeForce Go 6250
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0167
++device.name GeForce Go 6200 (0x0167)
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0168
++device.name GeForce Go 6250 (0x0168)
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0169
++device.name 0x0169
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x016b
++device.name 0x016B
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x016c
++device.name 0x016C
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x016d
++device.name 0x016D
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x016e
++device.name 0x016E
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0170
++device.name GeForce4 MX 460
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x0171
++device.name GeForce4 MX 440
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x0172
++device.name GeForce4 MX 420
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x0173
++device.name GeForce4 MX 440-SE
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x0174
++device.name GeForce4 440 Go
++driver.xfree 4|nv
++driver.xfree.config #Option "CrtcNumber" "0"
++driver.xfree.config #Option "CrtcNumber" "1"
++driver.xfree 4|nvidia|3d||||16
++driver.xfree.config #Option "CrtcNumber" "0"
++driver.xfree.config #Option "CrtcNumber" "1"
+
+ vendor.id pci 0x10de
+&device.id pci 0x0175
++device.name GeForce4 420 Go
++driver.xfree 4|nv
++driver.xfree.config #Option "CrtcNumber" "0"
++driver.xfree.config #Option "CrtcNumber" "1"
++driver.xfree 4|nvidia|3d||||16
++driver.xfree.config #Option "CrtcNumber" "0"
++driver.xfree.config #Option "CrtcNumber" "1"
+
+ vendor.id pci 0x10de
+&device.id pci 0x0176
++device.name GeForce4 420 Go 32M
++driver.xfree 4|nv
++driver.xfree.config #Option "CrtcNumber" "0"
++driver.xfree.config #Option "CrtcNumber" "1"
++driver.xfree 4|nvidia|3d||||16
++driver.xfree.config #Option "CrtcNumber" "0"
++driver.xfree.config #Option "CrtcNumber" "1"
+
+ vendor.id pci 0x10de
+&device.id pci 0x0176
+&subvendor.id pci 0x1584
+&subdevice.id pci 0x2241
++subdevice.name GeForce4 Go DH
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x0177
++device.name GeForce4 460 Go
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x0178
++device.name Quadro4 550 XGL
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x0178
+&subvendor.id pci 0x10de
+&subdevice.id pci 0x0151
++subdevice.name Quadro4 550 XGL DH
+
+ vendor.id pci 0x10de
+&device.id pci 0x0179
++device.name GeForce4 440 Go 64M
++driver.xfree 4|nv
++driver.xfree.config #Option "CrtcNumber" "0"
++driver.xfree.config #Option "CrtcNumber" "1"
++driver.xfree 4|nvidia|3d||||16
++driver.xfree.config #Option "CrtcNumber" "0"
++driver.xfree.config #Option "CrtcNumber" "1"
+
+ vendor.id pci 0x10de
+&device.id pci 0x017a
++device.name Quadro4 NVS
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x017c
++device.name Quadro4 500 GoGL
++driver.xfree 4|nv
++driver.xfree.config #Option "CrtcNumber" "0"
++driver.xfree.config #Option "CrtcNumber" "1"
++driver.xfree 4|nvidia|3d||||16
++driver.xfree.config #Option "CrtcNumber" "0"
++driver.xfree.config #Option "CrtcNumber" "1"
+
+ vendor.id pci 0x10de
+&device.id pci 0x017d
++device.name GeForce4 410 Go 16M
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x0181
++device.name GeForce4 MX 440 with AGP8X
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x0182
++device.name GeForce4 MX 440SE with AGP8X
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x0183
++device.name GeForce4 MX 420 with AGP8X
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x0185
++device.name GeForce4 MX 4000
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0186
++device.name GeForce4 448 Go
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x0187
++device.name GeForce4 488 Go
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x0188
++device.name Quadro4 580 XGL
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x0189
++device.name GeForce4 MX with AGP8X (Mac)
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x018a
++device.name Quadro NVS with AGP8X
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x018b
++device.name Quadro4 380 XGL
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x018c
++device.name Quadro NVS 50 PCI
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x018d
++device.name GeForce4 448 Go (0x018D)
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x01a0
++device.name GeForce2 Integrated GPU
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x01f0
++device.name GeForce4 MX Integrated GPU
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x0200
++device.name GeForce3
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x0201
++device.name GeForce3 Ti 200
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x0202
++device.name GeForce3 Ti 500
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x0203
++device.name Quadro DCC
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x0210
++device.name 0x0210
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0211
++device.name GeForce 6800 (0x0211)
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0212
++device.name GeForce 6800 LE (0x0212)
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0215
++device.name GeForce 6800 GT (0x0215)
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0220
++device.name 0x0220
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0221
++device.name 0x0221
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0222
++device.name 0x0222
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0228
++device.name 0x0228
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0250
++device.name GeForce4 Ti 4600
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x0250
+&subvendor.id pci 0x1462
+&subdevice.id pci 0x8725
++subdevice.name GeForce4 Ti 4600 DH
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0251
++device.name GeForce4 Ti 4400
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x0252
++device.name NV25
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x0253
++device.name GeForce4 Ti 4200
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x0258
++device.name Quadro4 900 XGL
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x0258
+&subvendor.id pci 0x10de
+&subdevice.id pci 0x0138
++subdevice.name Quadro4 900 XGL DH
+
+ vendor.id pci 0x10de
+&device.id pci 0x0259
++device.name Quadro4 750 XGL
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x0259
+&subvendor.id pci 0x10de
+&subdevice.id pci 0x0139
++subdevice.name Quadro4 750 XGL DH
+
+ vendor.id pci 0x10de
+&device.id pci 0x025b
++device.name Quadro4 700 XGL
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x025b
+&subvendor.id pci 0x10de
+&subdevice.id pci 0x013b
++subdevice.name Quadro4 700 XGL DH
+
+ vendor.id pci 0x10de
+&device.id pci 0x0280
++device.name GeForce4 Ti 4800
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x0281
++device.name GeForce4 Ti 4200 with AGP8X
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x0282
++device.name GeForce4 Ti 4800 SE
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x0286
++device.name GeForce4 4200 Go
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x0288
++device.name Quadro4 980 XGL
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x0288
+&subvendor.id pci 0x10de
+&subdevice.id pci 0x0174
++subdevice.name Quadro4 980 XGL DH
+
+ vendor.id pci 0x10de
+&device.id pci 0x0289
++device.name Quadro4 780 XGL
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x028c
++device.name Quadro4 700 GoGL
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x0301
++device.name GeForce FX 5800 Ultra
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x0302
++device.name GeForce FX 5800
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x0308
++device.name Quadro FX 2000
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x0308
+&subvendor.id pci 0x10de
+&subdevice.id pci 0x0183
++subdevice.name Quadro FX2000 DH
+
+ vendor.id pci 0x10de
+&device.id pci 0x0309
++device.name Quadro FX 1000
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x0309
+&subvendor.id pci 0x10de
+&subdevice.id pci 0x0182
++subdevice.name Quadro FX1000 DH
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0311
++device.name GeForce FX 5600 Ultra
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x0312
++device.name GeForce FX 5600
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x0313
++device.name 0x0313
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0314
++device.name GeForce FX 5600XT
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0316
++device.name 0x0316
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x0317
++device.name 0x0317
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x031a
++device.name GeForce FX Go5600
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x031b
++device.name GeForce FX Go5650
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x031c
++device.name Quadro FX Go700
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x031d
++device.name 0x031d
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x031e
++device.name 0x031e
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x031f
++device.name 0x031f
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x0320
++device.name GeForce FX 5200
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0321
++device.name GeForce FX 5200 Ultra
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x0322
++device.name GeForce FX 5200 (0x0322)
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x0322
+&subvendor.id pci 0x10b0
+&subdevice.id pci 0x0431
++subdevice.name GeForce FX 5200 DH
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0323
++device.name GeForce FX 5200LE
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x0324
++device.name GeForce FX Go5200
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0325
++device.name GeForce FX Go5250
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0326
++device.name GeForce FX 5500
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0327
++device.name GeForce FX 5100
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0328
++device.name GeForce FX Go5200 32M/64M
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0329
++device.name GeForce FX 5200 (Mac)
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x032a
++device.name Quadro NVS 280 PCI
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x032b
++device.name Quadro FX 500/600 PCI
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x032c
++device.name GeForce FX Go53xx
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x032d
++device.name GeForce FX Go5100
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x032f
++device.name 0x032F
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0330
++device.name GeForce FX 5900 Ultra
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0331
++device.name GeForce FX 5900
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0332
++device.name GeForce FX 5900XT
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0333
++device.name GeForce FX 5950 Ultra
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0333
+&subvendor.id pci 0x10b0
+&subdevice.id pci 0x0602
++subdevice.name GeForce FX 5950
+
+ vendor.id pci 0x10de
+&device.id pci 0x0334
++device.name GeForce FX 5900ZT
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0338
++device.name Quadro FX 3000
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0338
+&subvendor.id pci 0x10de
+&subdevice.id pci 0x01c2
++subdevice.name Quadro FX 3000 DH
+
+ vendor.id pci 0x10de
+&device.id pci 0x033f
++device.name Quadro FX 700
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0341
++device.name GeForce FX 5700 Ultra
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0341
+&subvendor.id pci 0x270f
+&subdevice.id pci 0x194c
++subdevice.name GeForce FX 5700 Ultra DH
+
+ vendor.id pci 0x10de
+&device.id pci 0x0342
++device.name GeForce FX 5700
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0343
++device.name GeForce FX 5700LE
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0344
++device.name GeForce FX 5700VE
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0345
++device.name 0x0345
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0347
++device.name GeForce FX Go5700
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0348
++device.name GeForce FX Go5700 (0x0348)
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0349
++device.name 0x0349
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x034b
++device.name 0x034b
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x034c
++device.name Quadro FX Go1000
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x034e
++device.name Quadro FX 1100
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x034f
++device.name 0x034f
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10e0
++vendor.name Imstt
+
+ vendor.id pci 0x10e0
+&device.id pci 0x9128
++device.name Imstt128
++driver.xfree 4|imstt
+
+ vendor.id pci 0x10e0
+&device.id pci 0x9135
++device.name Imstt3D
++driver.xfree 4|imstt
+
+ vendor.id pci 0x1106
++vendor.name VIA Technologies, Inc.
+
+ vendor.id pci 0x1106
+&device.id pci 0x3122
++device.name VIA CLE 3122
++driver.xfree 4|via
+
+ vendor.id pci 0x1106
+&device.id pci 0x7205
++device.name VIA VT 7205
++driver.xfree 4|via
+
+ vendor.id pci 0x1106
+&device.id pci 0x7205
+&subvendor.id pci 0x1025
+&subdevice.id pci 0x0033
++subdevice.name Acer Incorporated VIA VT 7205
+
+ vendor.id pci 0x1106
+&device.id pci 0x7205
+&subvendor.id pci 0x1584
+&subdevice.id pci 0x800a
++subdevice.name Uniwill VIA VT 7205
+
+ vendor.id pci 0x1142
++vendor.name Alliance Semiconductor Corporation
+
+ vendor.id pci 0x1142
+&device.id pci 0x6422
++device.name ProVideo 6422
++driver.xfree 4|apm
+
+ vendor.id pci 0x1142
+&device.id pci 0x6424
++device.name ProVideo 6424
++driver.xfree 4|apm
+
+ vendor.id pci 0x1163
++vendor.name Rendition
+
+ vendor.id pci 0x1163
+&device.id pci 0x0001
++device.name Verite 1000
++driver.xfree 4|rendition
+
+ vendor.id pci 0x1163
+&device.id pci 0x2000
++device.name Verite V2000/V2100/V2200
++driver.xfree 4|rendition
+
+ vendor.id pci 0x121a
++vendor.name 3Dfx Interactive, Inc.
+
+ vendor.id pci 0x121a
+&device.id pci 0x0003
++device.name Voodoo Banshee
++driver.xfree 4|tdfx|||||8,16,24
++driver.xfree 4|tdfx|3d||dri||16
+
+ vendor.id pci 0x121a
+&device.id pci 0x0005
++device.name Voodoo 3
++driver.xfree 4|tdfx|||||8,16,24
++driver.xfree 4|tdfx|3d||dri||16
+
+ vendor.id pci 0x121a
+&device.id pci 0x0009
++device.name Voodoo5 5500
++driver.xfree 4|tdfx|||||8,16,24
++driver.xfree 4|tdfx|3d||dri||16
+
+ vendor.id pci 0x126f
++vendor.name Silicon Motion, Inc.
+
+ vendor.id pci 0x126f
+&device.id pci 0x0710
++device.name SM710 LynxEM
++driver.xfree 4|siliconmotion
+
+ vendor.id pci 0x126f
+&device.id pci 0x0712
++device.name SM712 LynxEM+
++driver.xfree 4|siliconmotion
+
+ vendor.id pci 0x126f
+&device.id pci 0x0720
++device.name SM720 Lynx3DM
++driver.xfree 4|siliconmotion
+
+ vendor.id pci 0x126f
+&device.id pci 0x0730
++device.name SMI 731
++driver.xfree 4|siliconmotion
+
+ vendor.id pci 0x126f
+&device.id pci 0x0810
++device.name SM810 LynxE
++driver.xfree 4|siliconmotion
+
+ vendor.id pci 0x126f
+&device.id pci 0x0820
++device.name 820
++driver.xfree 4|siliconmotion
+
+ vendor.id pci 0x126f
+&device.id pci 0x0910
++device.name SM910
++driver.xfree 4|siliconmotion
+
+ vendor.id pci 0x12d2
++vendor.name NVidia / SGS Thomson (Joint Venture)
+
+ vendor.id pci 0x12d2
+&device.id pci 0x0018
++device.name Riva128
++driver.xfree 4|nv|||||15,24
+
+ vendor.id pci 0x15ad
++vendor.name VMWare Inc
+
+ vendor.id pci 0x15ad
+&device.id pci 0x0405
++device.name VMWARE0405
++driver.xfree 4|vmware
+
+ vendor.id pci 0x15ad
+&device.id pci 0x0710
++device.name VMWARE0710
++driver.xfree 4|vmware
+
+ vendor.id pci 0x18ca
++vendor.name XGI Technology Inc.
+
+ vendor.id pci 0x18ca
+&device.id pci 0x0020
++device.name Volari Z7
++driver.xfree 4|xgi
+
+ vendor.id pci 0x18ca
+&device.id pci 0x0040
++device.name Volari V8_V5_V3XT
++driver.xfree 4|xgi
+
+ vendor.id pci 0x3d3d
++vendor.name 3DLabs
+
+ vendor.id pci 0x3d3d
+&device.id pci 0x0002
++device.name GLINT 500TX
++driver.xfree 4|glint
+
+ vendor.id pci 0x3d3d
+&device.id pci 0x0004
++device.name Permedia
++driver.xfree 4|glint
+
+ vendor.id pci 0x3d3d
+&device.id pci 0x0006
++device.name GLINT MX
++driver.xfree 4|glint
+
+ vendor.id pci 0x3d3d
+&device.id pci 0x0007
++device.name 3D Extreme
++driver.xfree 4|glint|||||8,15,16,24
+
+ vendor.id pci 0x3d3d
+&device.id pci 0x0009
++device.name Permedia II 2D+3D
++driver.xfree 4|glint|||||8,15,16,24
+
+ vendor.id pci 0x3d3d
+&device.id pci 0x000a
++device.name GLINT R3
++driver.xfree 4|glint
+
+ vendor.id pci 0x3d3d
+&device.id pci 0x000c
++device.name Permedia 4
++driver.xfree 4|glint
+
+ vendor.id pci 0x3d3d
+&device.id pci 0x000d
++device.name R4
++driver.xfree 4|glint
+
+ vendor.id pci 0x5333
++vendor.name S3 Inc.
+
+ vendor.id pci 0x5333
+&device.id pci 0x5631
++device.name 86c325 [ViRGE]
++driver.xfree 4|s3virge
+
+ vendor.id pci 0x5333
+&device.id pci 0x8811
++device.name 86c764/765 [Trio32/64/64V+]
++driver.xfree 4|s3
+
+ vendor.id pci 0x5333
+&device.id pci 0x8812
++device.name 86cM65 [Aurora64V+]
++driver.xfree 4|s3
+
+ vendor.id pci 0x5333
+&device.id pci 0x8814
++device.name 86c767 [Trio 64UV+]
++driver.xfree 4|s3
+
+ vendor.id pci 0x5333
+&device.id pci 0x883d
++device.name 86c988 [ViRGE/VX]
++driver.xfree 4|s3virge
+
+ vendor.id pci 0x5333
+&device.id pci 0x8901
++device.name Trio 64V2/DX or /GX
++driver.xfree 4|s3
+
+ vendor.id pci 0x5333
+&device.id pci 0x8904
++device.name Integrated Trio3D
++driver.xfree 4|s3virge
+
+ vendor.id pci 0x5333
+&device.id pci 0x8a01
++device.name ViRGE/DX
++driver.xfree 4|s3virge||||noVBE
+
+ vendor.id pci 0x5333
+&device.id pci 0x8a10
++device.name ViRGE/GX2
++driver.xfree 4|s3virge
+
+ vendor.id pci 0x5333
+&device.id pci 0x8a13
++device.name 86c368 [Trio 3D/2X]
++driver.xfree 4|s3virge
+
+ vendor.id pci 0x5333
+&device.id pci 0x8a20
++device.name 86c794 [Savage 3D]
++driver.xfree 4|savage
+
+ vendor.id pci 0x5333
+&device.id pci 0x8a21
++device.name 86c795 [Savage 3D/MV]
++driver.xfree 4|savage
+
+ vendor.id pci 0x5333
+&device.id pci 0x8a22
++device.name Savage 4
++driver.xfree 4|savage
+
+ vendor.id pci 0x5333
+&device.id pci 0x8a25
++device.name ProSavage PM 133
++driver.xfree 4|savage
+
+ vendor.id pci 0x5333
+&device.id pci 0x8a26
++device.name ProSavage KM 133
++driver.xfree 4|savage
+
+ vendor.id pci 0x5333
+&device.id pci 0x8c01
++device.name ViRGE/MX
++driver.xfree 4|s3virge
+
+ vendor.id pci 0x5333
+&device.id pci 0x8c03
++device.name ViRGE/MX+MV
++driver.xfree 4|s3virge
+
+ vendor.id pci 0x5333
+&device.id pci 0x8c10
++device.name 86C270-294 Savage/MX-/IX
++driver.xfree 4|savage
+
+ vendor.id pci 0x5333
+&device.id pci 0x8c11
++device.name Savage MX
++driver.xfree 4|savage
+
+ vendor.id pci 0x5333
+&device.id pci 0x8c12
++device.name Savage IX/MV
++driver.xfree 4|savage
+
+ vendor.id pci 0x5333
+&device.id pci 0x8c12
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x017f
++subdevice.name Savage IX/MV IBM
++driver.xfree 4|savage||||ShadowStatus
+
+ vendor.id pci 0x5333
+&device.id pci 0x8c13
++device.name Savage IX
++driver.xfree 4|savage
+
+ vendor.id pci 0x5333
+&device.id pci 0x8c22
++device.name SuperSavage/MX 128
++driver.xfree 4|savage
+
+ vendor.id pci 0x5333
+&device.id pci 0x8c24
++device.name SuperSavage/MX 64
++driver.xfree 4|savage
+
+ vendor.id pci 0x5333
+&device.id pci 0x8c26
++device.name SuperSavage/MX 64C
++driver.xfree 4|savage
+
+ vendor.id pci 0x5333
+&device.id pci 0x8c2a
++device.name SuperSavage/IX 128 SDR
++driver.xfree 4|savage
+
+ vendor.id pci 0x5333
+&device.id pci 0x8c2b
++device.name SuperSavage/IX 128 DDR
++driver.xfree 4|savage
+
+ vendor.id pci 0x5333
+&device.id pci 0x8c2c
++device.name SuperSavage/IX 64 SDR
++driver.xfree 4|savage
+
+ vendor.id pci 0x5333
+&device.id pci 0x8c2d
++device.name SuperSavage/IX 64 DDR
++driver.xfree 4|savage
+
+ vendor.id pci 0x5333
+&device.id pci 0x8c2e
++device.name SuperSavage/IXC 64 SDR
++driver.xfree 4|savage
+
+ vendor.id pci 0x5333
+&device.id pci 0x8c2f
++device.name SuperSavage/IXC 64 DDR
++driver.xfree 4|savage
+
+ vendor.id pci 0x5333
+&device.id pci 0x8d01
++device.name S3Twister_P
++driver.xfree 4|savage
+
+ vendor.id pci 0x5333
+&device.id pci 0x8d02
++device.name Twister_K
++driver.xfree 4|savage
+
+ vendor.id pci 0x5333
+&device.id pci 0x8d03
++device.name ProSavage DDR
++driver.xfree 4|savage
+
+ vendor.id pci 0x5333
+&device.id pci 0x8d04
++device.name ProSavage DDR-K
++driver.xfree 4|savage
+
+ vendor.id pci 0x5333
+&device.id pci 0x9102
++device.name 86C410 Savage 2000
++driver.xfree 4|savage
+
+ vendor.id pci 0x8086
++vendor.name Intel Corporation
+
+ vendor.id pci 0x8086
+&device.id pci 0x00d1
++device.name i740_PCI
++driver.xfree 4|i740
+
+ vendor.id pci 0x8086
+&device.id pci 0x1132
++device.name I815
++driver.xfree 4|i810|||||8,16,24
++driver.xfree 4|i810|3d||dri||16
+
+ vendor.id pci 0x8086
+&device.id pci 0x2562
++device.name i845
++driver.xfree 4|i810
++driver.xfree.config Option "NoDDC"
++driver.xfree 4|i810|3d||dri
++driver.xfree.config Option "NoDDC"
+
+ vendor.id pci 0x8086
+&device.id pci 0x2572
++device.name 865 G
++driver.xfree 4|i810
++driver.xfree.config Option "NoDDC"
++driver.xfree 4|i810|3d||dri
++driver.xfree.config Option "NoDDC"
+
+ vendor.id pci 0x8086
+&device.id pci 0x2582
++device.name 915 G
++driver.xfree 4|i810
++driver.xfree.config Option "NoDDC"
++driver.xfree 4|i810|3d||dri
++driver.xfree.config Option "NoDDC"
+
+ vendor.id pci 0x8086
+&device.id pci 0x2592
++device.name 915 GM
++driver.xfree 4|i810
++driver.xfree.config Option "NoDDC"
+
+ vendor.id pci 0x8086
+&device.id pci 0x3577
++device.name i830
++driver.xfree 4|i810
++driver.xfree.config Option "NoDDC"
++driver.xfree 4|i810|3d||dri
++driver.xfree.config Option "NoDDC"
+
+ vendor.id pci 0x8086
+&device.id pci 0x3582
++device.name 855 GM
++driver.xfree 4|i810
++driver.xfree.config Option "NoDDC"
++driver.xfree 4|i810|3d||dri
++driver.xfree.config Option "NoDDC"
+
+ vendor.id pci 0x8086
+&device.id pci 0x7121
++device.name 82810 CGC [Chipset Graphics Controller]
++driver.xfree 4|i810|||||8,16,24
++driver.xfree 4|i810|3d||dri||16
+
+ vendor.id pci 0x8086
+&device.id pci 0x7123
++device.name 82810-DC100 CGC [Chipset Graphics Controller]
++driver.xfree 4|i810|||||8,16,24
++driver.xfree 4|i810|3d||dri||16
+
+ vendor.id pci 0x8086
+&device.id pci 0x7125
++device.name 82810E CGC [Chipset Graphics Controller]
++driver.xfree 4|i810|||||8,16,24
++driver.xfree 4|i810|3d||dri||16
+
+ vendor.id pci 0x8086
+&device.id pci 0x7800
++device.name i740
++driver.xfree 4|i740
+
+ vendor.id pci 0xedd8
++vendor.name ARK Logic Inc
+
+ vendor.id pci 0xedd8
+&device.id pci 0xa091
++device.name 1000PV [Stingray]
++driver.xfree 4|ark
+
+ vendor.id pci 0xedd8
+&device.id pci 0xa099
++device.name 2000PV [Stingray]
++driver.xfree 4|ark
+
+ vendor.id pci 0xedd8
+&device.id pci 0xa0a1
++device.name 2000MT
++driver.xfree 4|ark
+
--- /dev/null
+ vendor.id pci 0x1002
++vendor.name ATI Technologies Inc
+
+ vendor.id pci 0x1002
+&device.id pci 0x4136
++device.name RS100 4136
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4137
++device.name RS100 4137
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4144
++device.name R300 AD
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4145
++device.name E300 AE
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4146
++device.name R300 AF
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4147
++device.name R300 AG
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4148
++device.name R350 AH
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4149
++device.name R350 AI
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x414a
++device.name R350 AJ
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x414b
++device.name R350 AK
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4150
++device.name RV350 AP
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4151
++device.name RV350 AQ
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4152
++device.name RV350 AR
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4153
++device.name RV350 AS
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4154
++device.name RV350 AT
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4155
++device.name RV350 AU
++driver.xfree 4|radeon
++driver.xfree.config ChipID 0x4154
+
+ vendor.id pci 0x1002
+&device.id pci 0x4156
++device.name RV350 AV
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4157
++device.name RV350 AW
++driver.xfree 4|radeon
++driver.xfree.config ChipID 0x4154
+
+ vendor.id pci 0x1002
+&device.id pci 0x4237
++device.name RS250 4237
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4242
++device.name R200 BB
++driver.xfree 4|radeon
++driver.xfree 4|radeon|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x4243
++device.name R200 BC
++driver.xfree 4|radeon
++driver.xfree 4|radeon|3d||dri
+
+ vendor.id pci 0x1002
+&device.id pci 0x4336
++device.name RS100 4336
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4337
++device.name RS200 4337
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4354
++device.name 215CT [Mach64 CT]
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x4358
++device.name 210888CX [Mach64 CX]
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x4437
++device.name RS250 4437
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4554
++device.name 210888ET [Mach64 ET]
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x4742
++device.name 3D Rage Pro AGP 1X/2X
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x4744
++device.name 3D Rage Pro AGP 1X
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x4749
++device.name Mach64 GI
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x474c
++device.name Rage XC
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x474d
++device.name Rage XL AGP
++driver.xfree 4|ati|||||8,16,24
+
+ vendor.id pci 0x1002
+&device.id pci 0x474e
++device.name Rage XC AGP
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x474f
++device.name Rage XL
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x4750
++device.name 3D Rage Pro 215GP
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x4751
++device.name 3D Rage Pro 215GQ
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x4752
++device.name Mach64 GR
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x4753
++device.name Mach64 GS
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x4754
++device.name 3D Rage I/II 215GT [Mach64 GT]
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x4755
++device.name 3D Rage II+ 215GTB [Mach64 GTB]
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x4756
++device.name 3D Rage IIC 215IIC [Mach64 GT IIC]
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x4757
++device.name 3D Rage IIC AGP
++driver.xfree 4|ati|||||8,15,16,24
+
+ vendor.id pci 0x1002
+&device.id pci 0x4758
++device.name 210888GX [Mach64 GX]
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x4759
++device.name 3D Rage IIC
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x475a
++device.name Mach64 GZ
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x4966
++device.name RV250 If
++driver.xfree 4|radeon
++driver.xfree 4|radeon|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x4966
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x0002
++subdevice.name Radeon 9000
+
+ vendor.id pci 0x1002
+&device.id pci 0x4967
++device.name RV250 Ig
++driver.xfree 4|radeon
++driver.xfree 4|radeon|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c42
++device.name Mach64 LB
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c42
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x0044
++subdevice.name 3D Rage LT Pro AGP-133
++driver.xfree 4|ati
++driver.xfree.config Option "dpms" "off"
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c44
++device.name 3D Rage LT Pro AGP-66
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c45
++device.name Rage 128 Mobility LE
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c46
++device.name Mobility M3 AGP 2x
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c47
++device.name 3D Rage LT-G 215LG
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c49
++device.name Mach64 LI
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c4d
++device.name 3D Rage P/M Mobility AGP 2x
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c4d
+&subvendor.id pci 0x1028
+&subdevice.id pci 0x00bb
++subdevice.name Mach64LM/Dell
++driver.xfree 4|fbdev
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c4e
++device.name 3D Rage L Mobility AGP 2x
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c50
++device.name 3D Rage LT Pro
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c51
++device.name Mach64 LQ
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c52
++device.name 3D Rage P/M Mobility
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c53
++device.name 3D Rage L Mobility
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c57
++device.name Radeon LW
++driver.xfree 4|radeon
++driver.xfree 4|radeon|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c58
++device.name Radeon LX
++driver.xfree 4|radeon
++driver.xfree 4|radeon|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c59
++device.name Radeon LY
++driver.xfree 4|radeon
++driver.xfree 4|radeon|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c5a
++device.name Radeon LZ
++driver.xfree 4|radeon
++driver.xfree 4|radeon|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c64
++device.name RV250 Ld
++driver.xfree 4|radeon
++driver.xfree 4|radeon|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c66
++device.name RV250 Lf
++driver.xfree 4|radeon
++driver.xfree 4|radeon|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c67
++device.name RV250 Lg
++driver.xfree 4|radeon
++driver.xfree 4|radeon|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x4d46
++device.name Rage 128 Mobility MF
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x4d4c
++device.name Rage 128 Mobility ML
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x4e44
++device.name R300 ND
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4e44
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x0002
++subdevice.name Radeon 9700
+
+ vendor.id pci 0x1002
+&device.id pci 0x4e45
++device.name R300 NE
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4e46
++device.name R300 NF
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4e47
++device.name R300 NG
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4e47
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x0172
++subdevice.name FireGL X1
+
+ vendor.id pci 0x1002
+&device.id pci 0x4e48
++device.name R350 NH
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4e49
++device.name R350 NI
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4e4a
++device.name R360 NJ
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4e4b
++device.name R350 NK
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4e50
++device.name RV350 NP
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4e51
++device.name RV350 NQ
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4e52
++device.name RV350 NR
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4e53
++device.name RV350 NS
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4e54
++device.name RV350 NT
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4e56
++device.name RV350 NV
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x5041
++device.name Rage 128 PA
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5042
++device.name Rage 128 PB
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5043
++device.name Rage 128 PC
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5044
++device.name Rage 128 PD
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5045
++device.name Rage 128 PE
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5046
++device.name Rage 128 PF
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5047
++device.name Rage 128 PG
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5048
++device.name Rage 128 PH
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5049
++device.name Rage 128 PI
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x504a
++device.name Rage 128 PJ
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x504b
++device.name Rage 128 PK
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x504c
++device.name Rage 128 PL
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x504d
++device.name Rage 128 PM
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x504e
++device.name Rage 128 PN
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x504f
++device.name Rage 128 PO
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5050
++device.name Rage 128 PP
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5051
++device.name Rage 128 PQ
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5052
++device.name Rage 128 PR
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5053
++device.name Rage 128 PS
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5054
++device.name Rage 128 PT
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5055
++device.name Rage 128 PU
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5056
++device.name Rage 128 PV
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5057
++device.name Rage 128 PW
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5058
++device.name Rage 128 PX
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5144
++device.name Radeon QD
++driver.xfree 4|radeon
++driver.xfree 4|radeon|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5145
++device.name Radeon QE
++driver.xfree 4|radeon
++driver.xfree 4|radeon|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5146
++device.name Radeon QF
++driver.xfree 4|radeon
++driver.xfree 4|radeon|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5147
++device.name Radeon QG
++driver.xfree 4|radeon
++driver.xfree 4|radeon|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5148
++device.name fgl8x00
++driver.xfree 4|radeon
++driver.xfree 4|radeon|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5148
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x0152
++subdevice.name FireGL 8800
+
+ vendor.id pci 0x1002
+&device.id pci 0x5148
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x0172
++subdevice.name FireGL 8700
++driver.xfree 4|radeon
++driver.xfree 4|radeon|3d||dri
+
+ vendor.id pci 0x1002
+&device.id pci 0x514c
++device.name R200 QL
++driver.xfree 4|radeon
++driver.xfree 4|radeon|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x514d
++device.name Radeon 9100 QM
++driver.xfree 4|radeon
++driver.xfree 4|radeon|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5157
++device.name RV200 QW
++driver.xfree 4|radeon
++driver.xfree 4|radeon|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5157
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x013a
++subdevice.name Radeon 7500
+
+ vendor.id pci 0x1002
+&device.id pci 0x5157
+&subvendor.id pci 0x174b
+&subdevice.id pci 0x7146
++subdevice.name Radeon 7500-7146
++driver.xfree 4|radeon
++driver.xfree 4|radeon|3d||dri
+
+ vendor.id pci 0x1002
+&device.id pci 0x5157
+&subvendor.id pci 0x174b
+&subdevice.id pci 0x7161
++subdevice.name Radeon 7500 LE
++driver.xfree 4|radeon
++driver.xfree 4|radeon|3d||dri
+
+ vendor.id pci 0x1002
+&device.id pci 0x5158
++device.name RV200 QX
++driver.xfree 4|radeon
++driver.xfree 4|radeon|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5159
++device.name Radeon VE
++driver.xfree 4|radeon
++driver.xfree 4|radeon|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5159
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x010a
++subdevice.name Radeon VE (0x010a)
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x5159
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x013a
++subdevice.name Radeon VE (0x013a)
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x515a
++device.name Radeon QZ
++driver.xfree 4|radeon
++driver.xfree 4|radeon|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5245
++device.name Rage 128 RE
++driver.xfree 4|r128|||||8,15,16,24
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5246
++device.name Rage 128 RF
++driver.xfree 4|r128|||||8,15,16,24
+
+ vendor.id pci 0x1002
+&device.id pci 0x5247
++device.name Rage 128 RG
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x524b
++device.name Rage 128 RK
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x524c
++device.name Rage 128 RL
++driver.xfree 4|r128|||||8,15,16,24
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5345
++device.name Rage 128 SE
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5346
++device.name Rage 128 SF
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5347
++device.name Rage 128 SG
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5348
++device.name Rage 128 4x
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x534b
++device.name Rage 128 SK
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x534c
++device.name Rage 128 SL
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x534d
++device.name Rage 128 SM
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x534e
++device.name Rage 128 SN
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5446
++device.name Rage 128 Ultra TF
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x544c
++device.name Rage128 TL
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5452
++device.name Rage 128 Pro TR (AGP)
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5453
++device.name Rage 128 TS
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5454
++device.name Rage 128 TT
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5455
++device.name Rage 128 TU
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5654
++device.name Mach64 VT
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x5655
++device.name 264VT3 [Mach64 VT3]
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x5656
++device.name 264VT4 [Mach64 VT4]
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x5834
++device.name RS300 5834
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x5835
++device.name RS300 5835
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x5960
++device.name RV280 5960
++driver.xfree 4|radeon
++driver.xfree 4|radeon|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5961
++device.name RV280 5961
++driver.xfree 4|radeon
++driver.xfree 4|radeon|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5962
++device.name RV280 5962
++driver.xfree 4|radeon
++driver.xfree 4|radeon|3d||dri||16
+
+ vendor.id pci 0x1002
+&device.id pci 0x5964
++device.name RV280 5964
++driver.xfree 4|radeon
++driver.xfree 4|radeon|3d||dri
+
+ vendor.id pci 0x1002
+&device.id pci 0x5964
+&subvendor.id pci 0x17af
+&subdevice.id pci 0x2012
++subdevice.name Radeon 9200 SE (DH)
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x5c61
++device.name RV280 5c61
++driver.xfree 4|radeon
++driver.xfree 4|radeon|3d||dri
+
+ vendor.id pci 0x1002
+&device.id pci 0x5c63
++device.name RV280 5c63
++driver.xfree 4|radeon
++driver.xfree 4|radeon|3d||dri
+
+ vendor.id pci 0x100b
++vendor.name National Semiconductor Corporation
+
+ vendor.id pci 0x100b
+&device.id pci 0x0030
++device.name REDCLOUD
++driver.xfree 4|nsc
+
+ vendor.id pci 0x100b
+&device.id pci 0x0104
++device.name SC1400
++driver.xfree 4|nsc
+
+ vendor.id pci 0x100b
+&device.id pci 0x0504
++device.name SC1200
++driver.xfree 4|nsc
+
+ vendor.id pci 0x100c
++vendor.name Tseng Labs Inc
+
+ vendor.id pci 0x100c
+&device.id pci 0x3202
++device.name ET4000/W32p rev A
++driver.xfree 4|tseng
+
+ vendor.id pci 0x100c
+&device.id pci 0x3205
++device.name ET4000/W32p rev B
++driver.xfree 4|tseng
+
+ vendor.id pci 0x100c
+&device.id pci 0x3206
++device.name ET4000/W32p rev C
++driver.xfree 4|tseng
+
+ vendor.id pci 0x100c
+&device.id pci 0x3207
++device.name ET4000/W32p rev D
++driver.xfree 4|tseng
+
+ vendor.id pci 0x100c
+&device.id pci 0x3208
++device.name ET6000
++driver.xfree 4|tseng
+
+ vendor.id pci 0x1013
++vendor.name Cirrus Logic
+
+ vendor.id pci 0x1013
+&device.id pci 0x0038
++device.name GD 7548
++driver.xfree 4|cirrus
+
+ vendor.id pci 0x1013
+&device.id pci 0x00a0
++device.name GD 5430/40 [Alpine]
++driver.xfree 4|cirrus||||Noaccel
+
+ vendor.id pci 0x1013
+&device.id pci 0x00a4
++device.name GD 5434-4 [Alpine]
++driver.xfree 4|cirrus
+
+ vendor.id pci 0x1013
+&device.id pci 0x00a8
++device.name GD 5434-8 [Alpine]
++driver.xfree 4|cirrus
+
+ vendor.id pci 0x1013
+&device.id pci 0x00ac
++device.name GD 5436 [Alpine]
++driver.xfree 4|cirrus
+
+ vendor.id pci 0x1013
+&device.id pci 0x00b8
++device.name GD 5446
++driver.xfree 4|cirrus
+
+ vendor.id pci 0x1013
+&device.id pci 0x00bc
++device.name GD 5480
++driver.xfree 4|cirrus
+
+ vendor.id pci 0x1013
+&device.id pci 0x00d0
++device.name GD 5462
++driver.xfree 4|cirrus
+
+ vendor.id pci 0x1013
+&device.id pci 0x00d4
++device.name GD 5464 [Laguna]
++driver.xfree 4|cirrus
+
+ vendor.id pci 0x1013
+&device.id pci 0x00d5
++device.name GD5464BD
++driver.xfree 4|cirrus
+
+ vendor.id pci 0x1013
+&device.id pci 0x00d6
++device.name GD 5465 [Laguna]
++driver.xfree 4|cirrus
+
+ vendor.id pci 0x1023
++vendor.name Trident Microsystems Inc.
+
+ vendor.id pci 0x1023
+&device.id pci 0x2100
++device.name CyberBlade/xp4
++driver.xfree 4|trident
+
+ vendor.id pci 0x1023
+&device.id pci 0x8400
++device.name CyberBlade/i7
++driver.xfree 4|trident
+
+ vendor.id pci 0x1023
+&device.id pci 0x8420
++device.name CyberBlade/i7d
++driver.xfree 4|trident
+
+ vendor.id pci 0x1023
+&device.id pci 0x8500
++device.name CyberBlade/i1
++driver.xfree 4|trident||||CyberStretch,sw_cursor
+
+ vendor.id pci 0x1023
+&device.id pci 0x8520
++device.name 8520
++driver.xfree 4|trident
+
+ vendor.id pci 0x1023
+&device.id pci 0x8600
++device.name 8600
++driver.xfree 4|trident
+
+ vendor.id pci 0x1023
+&device.id pci 0x8620
++device.name CyberBlade/DSTN/Ai1
++driver.xfree 4|trident
+
+ vendor.id pci 0x1023
+&device.id pci 0x8820
++device.name 8820
++driver.xfree 4|trident
+
+ vendor.id pci 0x1023
+&device.id pci 0x9320
++device.name 9320
++driver.xfree 4|trident
+
+ vendor.id pci 0x1023
+&device.id pci 0x9388
++device.name Cyber 9388
++driver.xfree 4|trident
+
+ vendor.id pci 0x1023
+&device.id pci 0x9397
++device.name Cyber 9397
++driver.xfree 4|trident
+
+ vendor.id pci 0x1023
+&device.id pci 0x939a
++device.name Cyber 9397DVD
++driver.xfree 4|trident
+
+ vendor.id pci 0x1023
+&device.id pci 0x9420
++device.name TGUI 9420
++driver.xfree 4|trident
+
+ vendor.id pci 0x1023
+&device.id pci 0x9440
++device.name TGUI 9440
++driver.xfree 4|trident
+
+ vendor.id pci 0x1023
+&device.id pci 0x9520
++device.name Cyber 9520
++driver.xfree 4|trident
+
+ vendor.id pci 0x1023
+&device.id pci 0x9525
++device.name Cyber 9525
++driver.xfree 4|trident
+
+ vendor.id pci 0x1023
+&device.id pci 0x9540
++device.name Cyber 9540
++driver.xfree 4|trident
+
+ vendor.id pci 0x1023
+&device.id pci 0x9660
++device.name TGUI 9660/968x/968x
++driver.xfree 4|trident
+
+ vendor.id pci 0x1023
+&device.id pci 0x9750
++device.name 3DIm`age 975
++driver.xfree 4|trident|||||8,15,16,24
+
+ vendor.id pci 0x1023
+&device.id pci 0x9850
++device.name 3DImage 9850
++driver.xfree 4|trident
+
+ vendor.id pci 0x1023
+&device.id pci 0x9880
++device.name 9880
++driver.xfree 4|trident
+
+ vendor.id pci 0x1023
+&device.id pci 0x9910
++device.name 9910
++driver.xfree 4|trident
+
+ vendor.id pci 0x102b
++vendor.name Matrox Graphics, Inc.
+
+ vendor.id pci 0x102b
+&device.id pci 0x0519
++device.name MGA 2064W [Millennium]
++driver.xfree 4|mga||||NoHal|8,16,24
+
+ vendor.id pci 0x102b
+&device.id pci 0x051a
++device.name MGA 1064SG [Mystique]
++driver.xfree 4|mga||||NoHal|8,16,24
+
+ vendor.id pci 0x102b
+&device.id pci 0x051b
++device.name MGA 2164W [Millennium II]
++driver.xfree 4|mga||||NoHal|8,16,24
+
+ vendor.id pci 0x102b
+&device.id pci 0x051f
++device.name MGA 2164W [Millennium II] AGP
++driver.xfree 4|mga||||NoHal
+
+ vendor.id pci 0x102b
+&device.id pci 0x0520
++device.name MGA G200
++driver.xfree 4|mga|||||8,16,24
+
+ vendor.id pci 0x102b
+&device.id pci 0x0521
++device.name MGA G200 AGP
++driver.xfree 4|mga|||||8,16,24
++driver.xfree.config VideoRam 8192
++driver.xfree 4|mga|3d||dri||16
++driver.xfree.config VideoRam 8192
+
+ vendor.id pci 0x102b
+&device.id pci 0x0525
++device.name MGA G400 AGP
++driver.xfree 4|mga
++driver.xfree 4|mga|3d||dri
+
+ vendor.id pci 0x102b
+&device.id pci 0x0525
+&subvendor.id pci 0x102b
+&subdevice.id pci 0x0540
++subdevice.name G450-0540
+
+ vendor.id pci 0x102b
+&device.id pci 0x0525
+&subvendor.id pci 0x102b
+&subdevice.id pci 0x0541
++subdevice.name G450
+
+ vendor.id pci 0x102b
+&device.id pci 0x0525
+&subvendor.id pci 0x102b
+&subdevice.id pci 0x0641
++subdevice.name Matrox G400 DH-0641
+
+ vendor.id pci 0x102b
+&device.id pci 0x0525
+&subvendor.id pci 0x102b
+&subdevice.id pci 0x07c0
++subdevice.name G450 LE
+
+ vendor.id pci 0x102b
+&device.id pci 0x0525
+&subvendor.id pci 0x102b
+&subdevice.id pci 0x0d41
++subdevice.name G450 DH G450
+
+ vendor.id pci 0x102b
+&device.id pci 0x0525
+&subvendor.id pci 0x102b
+&subdevice.id pci 0x0d43
++subdevice.name G450 PCI
++driver.xfree 4|mga
+
+ vendor.id pci 0x102b
+&device.id pci 0x0525
+&subvendor.id pci 0x102b
+&subdevice.id pci 0x2179
++subdevice.name G400 DH
+
+ vendor.id pci 0x102b
+&device.id pci 0x0525
+&subvendor.id pci 0x102b
+&subdevice.id pci 0x23c3
++subdevice.name G450-23c3
+
+ vendor.id pci 0x102b
+&device.id pci 0x1000
++device.name MGA G100 [Productiva]
++driver.xfree 4|mga||||NoHal
+
+ vendor.id pci 0x102b
+&device.id pci 0x1001
++device.name MGA G100 [Productiva] AGP
++driver.xfree 4|mga||||NoHal|8,16,24
+
+ vendor.id pci 0x102b
+&device.id pci 0x2527
++device.name G550
++driver.xfree 4|mga
++driver.xfree 4|mga|3d||dri
+
+ vendor.id pci 0x102c
++vendor.name Chips and Technologies
+
+ vendor.id pci 0x102c
+&device.id pci 0x00c0
++device.name F69000 HiQVideo
++driver.xfree 4|chips
+
+ vendor.id pci 0x102c
+&device.id pci 0x00d8
++device.name F65545
++driver.xfree 4|chips
+
+ vendor.id pci 0x102c
+&device.id pci 0x00dc
++device.name F65548
++driver.xfree 4|chips
+
+ vendor.id pci 0x102c
+&device.id pci 0x00e0
++device.name 65550
++driver.xfree 4|chips
+
+ vendor.id pci 0x102c
+&device.id pci 0x00e4
++device.name F65554
++driver.xfree 4|chips
+
+ vendor.id pci 0x102c
+&device.id pci 0x00e5
++device.name F65555 HiQVPro
++driver.xfree 4|chips
+
+ vendor.id pci 0x102c
+&device.id pci 0x00f4
++device.name F68554 HiQVision
++driver.xfree 4|chips
+
+ vendor.id pci 0x102c
+&device.id pci 0x0c30
++device.name 69030
++driver.xfree 4|chips
+
+ vendor.id pci 0x1039
++vendor.name Silicon Integrated Systems Corp.
+
+ vendor.id pci 0x1039
+&device.id pci 0x0200
++device.name 5597/5598 VGA
++driver.xfree 4|sis|||||16,24
+
+ vendor.id pci 0x1039
+&device.id pci 0x0300
++device.name SIS300
++driver.xfree 4|sis
+
+ vendor.id pci 0x1039
+&device.id pci 0x0310
++device.name SiS315H
++driver.xfree 4|sis
+
+ vendor.id pci 0x1039
+&device.id pci 0x0325
++device.name SiS315PRO
++driver.xfree 4|sis
+
+ vendor.id pci 0x1039
+&device.id pci 0x0330
++device.name SiS330
++driver.xfree 4|sis
+
+ vendor.id pci 0x1039
+&device.id pci 0x5300
++device.name SiS540 PCI Display Adapter
++driver.xfree 4|sis
+
+ vendor.id pci 0x1039
+&device.id pci 0x5315
++device.name SiS550
++driver.xfree 4|sis
+
+ vendor.id pci 0x1039
+&device.id pci 0x6300
++device.name SiS630 GUI Accelerator+3D
++driver.xfree 4|sis
+
+ vendor.id pci 0x1039
+&device.id pci 0x6306
++device.name 6306 3D-AGP
++driver.xfree 4|sis|||||16
+
+ vendor.id pci 0x1039
+&device.id pci 0x6325
++device.name SiS650
++driver.xfree 4|sis
+
+ vendor.id pci 0x1039
+&device.id pci 0x6326
++device.name 86C326
++driver.xfree 4|sis|||||8,16,24
+
+ vendor.id pci 0x1039
+&device.id pci 0x6330
++device.name SiS 660
++driver.xfree 4|sis
+
+ vendor.id pci 0x104c
++vendor.name Texas Instruments
+
+ vendor.id pci 0x104c
+&device.id pci 0x3d04
++device.name TVP4010 [Permedia]
++driver.xfree 4|glint
+
+ vendor.id pci 0x104c
+&device.id pci 0x3d07
++device.name TVP4020 [Permedia 2]
++driver.xfree 4|glint|||||8,15,16,24
+
+ vendor.id pci 0x105d
++vendor.name Number 9 Computer Company
+
+ vendor.id pci 0x105d
+&device.id pci 0x2309
++device.name Imagine 128
++driver.xfree 4|i128
+
+ vendor.id pci 0x105d
+&device.id pci 0x2339
++device.name Imagine 128-II
++driver.xfree 4|i128
+
+ vendor.id pci 0x105d
+&device.id pci 0x493d
++device.name Imagine 128 T2R [Ticket to Ride]
++driver.xfree 4|i128
+
+ vendor.id pci 0x105d
+&device.id pci 0x5348
++device.name Revolution 4
++driver.xfree 4|i128
+
+ vendor.id pci 0x1078
++vendor.name Cyrix Corporation
+
+ vendor.id pci 0x1078
+&device.id pci 0x0000
++device.name 5510
++driver.xfree 4|cyrix
+
+ vendor.id pci 0x1078
+&device.id pci 0x0002
++device.name 5520 [Cognac]
++driver.xfree 4|cyrix
+
+ vendor.id pci 0x1078
+&device.id pci 0x0104
++device.name 5530 Video [Kahlua]
++driver.xfree 4|cyrix
+
+ vendor.id pci 0x10c8
++vendor.name Neomagic Corporation
+
+ vendor.id pci 0x10c8
+&device.id pci 0x0001
++device.name NM2070 [MagicGraph NM2070]
++driver.xfree 4|neomagic
+
+ vendor.id pci 0x10c8
+&device.id pci 0x0002
++device.name NM2090 [MagicGraph 128V]
++driver.xfree 4|neomagic
+
+ vendor.id pci 0x10c8
+&device.id pci 0x0003
++device.name NM2093 [MagicGraph 128ZV]
++driver.xfree 4|neomagic
+
+ vendor.id pci 0x10c8
+&device.id pci 0x0004
++device.name NM2160 [MagicGraph 128XD]
++driver.xfree 4|neomagic|||||8,16
+
+ vendor.id pci 0x10c8
+&device.id pci 0x0005
++device.name MagicMedia 256AV
++driver.xfree 4|neomagic|||||8,16,24
+
+ vendor.id pci 0x10c8
+&device.id pci 0x0006
++device.name NM2360 [MagicMedia 256ZX]
++driver.xfree 4|neomagic|||||16
+
+ vendor.id pci 0x10c8
+&device.id pci 0x0016
++device.name 256XL(2380)
++driver.xfree 4|neomagic|||||8,16,24
++driver.xfree.config VideoRam 4096
+
+ vendor.id pci 0x10c8
+&device.id pci 0x0025
++device.name NM2230
++driver.xfree 4|neomagic
+
+ vendor.id pci 0x10c8
+&device.id pci 0x0083
++device.name MagicGraph 128ZV Plus
++driver.xfree 4|neomagic
+
+ vendor.id pci 0x10de
++vendor.name nVidia Corporation
+
+ vendor.id pci 0x10de
+&device.id pci 0x0020
++device.name RIVA TNT
++driver.xfree 4|nv|||||8,15,16,24
+
+ vendor.id pci 0x10de
+&device.id pci 0x0028
++device.name RIVA TNT2/TNT2 Pro
++driver.xfree 4|nv|||||8,15,16,24
+
+ vendor.id pci 0x10de
+&device.id pci 0x0029
++device.name RIVA TNT2 Ultra
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x002a
++device.name Unknown TNT2
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x002c
++device.name Vanta/Vanta LT
++driver.xfree 4|nv|||||8,16,24
+
+ vendor.id pci 0x10de
+&device.id pci 0x002d
++device.name RIVA TNT2 Model 64/Model 64 Pro
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x00a0
++device.name Aladdin TNT2
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0100
++device.name GeForce 256
++driver.xfree 4|nv|||||8,15,16,24
+
+ vendor.id pci 0x10de
+&device.id pci 0x0101
++device.name GeForce DDR
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0103
++device.name Quadro
++driver.xfree 4|nv|||||8,15,16,24
+
+ vendor.id pci 0x10de
+&device.id pci 0x0110
++device.name GeForce2 MX/MX 400
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0111
++device.name GeForce2 MX 100/200
++driver.xfree 4|nv||||sw_cursor
+
+ vendor.id pci 0x10de
+&device.id pci 0x0112
++device.name GeForce2 Go
++driver.xfree 4|nv
++driver.xfree.config #Option "CrtcNumber" "0"
+
+ vendor.id pci 0x10de
+&device.id pci 0x0113
++device.name Quadro2 MXR/EX/Go
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0150
++device.name GeForce2 GTS/GeForce2 Pro
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0151
++device.name GeForce2 Ti
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0152
++device.name GeForce2 Ultra
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0153
++device.name Quadro2 Pro
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0170
++device.name GeForce4 MX 460
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0171
++device.name GeForce4 MX 440
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0172
++device.name GeForce4 MX 420
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0173
++device.name GeForce4 MX 440-SE
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0174
++device.name GeForce4 440 Go
++driver.xfree 4|nv
++driver.xfree.config #Option "CrtcNumber" "0"
++driver.xfree.config #Option "CrtcNumber" "1"
+
+ vendor.id pci 0x10de
+&device.id pci 0x0175
++device.name GeForce4 420 Go
++driver.xfree 4|nv
++driver.xfree.config #Option "CrtcNumber" "0"
++driver.xfree.config #Option "CrtcNumber" "1"
+
+ vendor.id pci 0x10de
+&device.id pci 0x0176
++device.name GeForce4 420 Go 32M
++driver.xfree 4|nv
++driver.xfree.config #Option "CrtcNumber" "0"
++driver.xfree.config #Option "CrtcNumber" "1"
+
+ vendor.id pci 0x10de
+&device.id pci 0x0176
+&subvendor.id pci 0x1584
+&subdevice.id pci 0x2241
++subdevice.name GeForce4 Go DH
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d||||16
+
+ vendor.id pci 0x10de
+&device.id pci 0x0177
++device.name GeForce4 460 Go
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0178
++device.name Quadro4 550 XGL
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0178
+&subvendor.id pci 0x10de
+&subdevice.id pci 0x0151
++subdevice.name Quadro4 550 XGL DH
+
+ vendor.id pci 0x10de
+&device.id pci 0x0179
++device.name GeForce4 440 Go 64M
++driver.xfree 4|nv
++driver.xfree.config #Option "CrtcNumber" "0"
++driver.xfree.config #Option "CrtcNumber" "1"
+
+ vendor.id pci 0x10de
+&device.id pci 0x017a
++device.name Quadro4 NVS
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x017c
++device.name Quadro4 500 GoGL
++driver.xfree 4|nv
++driver.xfree.config #Option "CrtcNumber" "0"
++driver.xfree.config #Option "CrtcNumber" "1"
+
+ vendor.id pci 0x10de
+&device.id pci 0x017d
++device.name GeForce4 410 Go 16M
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0181
++device.name GeForce4 MX 440 with AGP8X
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0182
++device.name GeForce4 MX 440SE with AGP8X
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0183
++device.name GeForce4 MX 420 with AGP8X
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0186
++device.name GeForce4 448 Go
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0187
++device.name GeForce4 488 Go
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0188
++device.name Quadro4 580 XGL
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0189
++device.name GeForce4 MX with AGP8X (Mac)
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x018a
++device.name Quadro NVS with AGP8X
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x018b
++device.name Quadro4 380 XGL
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x01a0
++device.name GeForce2 Integrated GPU
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x01f0
++device.name GeForce4 MX Integrated GPU
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0200
++device.name GeForce3
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0201
++device.name GeForce3 Ti 200
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0202
++device.name GeForce3 Ti 500
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0203
++device.name Quadro DCC
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0250
++device.name GeForce4 Ti 4600
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0250
+&subvendor.id pci 0x1462
+&subdevice.id pci 0x8725
++subdevice.name GeForce4 Ti 4600 DH
++driver.xfree 4|nv
++driver.xfree 4|nvidia|3d
+
+ vendor.id pci 0x10de
+&device.id pci 0x0251
++device.name GeForce4 Ti 4400
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0252
++device.name NV25
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0253
++device.name GeForce4 Ti 4200
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0258
++device.name Quadro4 900 XGL
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0258
+&subvendor.id pci 0x10de
+&subdevice.id pci 0x0138
++subdevice.name Quadro4 900 XGL DH
+
+ vendor.id pci 0x10de
+&device.id pci 0x0259
++device.name Quadro4 750 XGL
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0259
+&subvendor.id pci 0x10de
+&subdevice.id pci 0x0139
++subdevice.name Quadro4 750 XGL DH
+
+ vendor.id pci 0x10de
+&device.id pci 0x025b
++device.name Quadro4 700 XGL
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x025b
+&subvendor.id pci 0x10de
+&subdevice.id pci 0x013b
++subdevice.name Quadro4 700 XGL DH
+
+ vendor.id pci 0x10de
+&device.id pci 0x0280
++device.name GeForce4 Ti 4800
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0281
++device.name GeForce4 Ti 4200 with AGP8X
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0282
++device.name GeForce4 Ti 4800 SE
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0286
++device.name GeForce4 4200 Go
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0288
++device.name Quadro4 980 XGL
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0288
+&subvendor.id pci 0x10de
+&subdevice.id pci 0x0174
++subdevice.name Quadro4 980 XGL DH
+
+ vendor.id pci 0x10de
+&device.id pci 0x0289
++device.name Quadro4 780 XGL
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x028c
++device.name Quadro4 700 GoGL
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0301
++device.name GeForce FX 5800 Ultra
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0302
++device.name GeForce FX 5800
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0308
++device.name Quadro FX 2000
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0308
+&subvendor.id pci 0x10de
+&subdevice.id pci 0x0183
++subdevice.name Quadro FX2000 DH
+
+ vendor.id pci 0x10de
+&device.id pci 0x0309
++device.name Quadro FX 1000
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0309
+&subvendor.id pci 0x10de
+&subdevice.id pci 0x0182
++subdevice.name Quadro FX1000 DH
+
+ vendor.id pci 0x10de
+&device.id pci 0x0311
++device.name GeForce FX 5600 Ultra
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0312
++device.name GeForce FX 5600
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0313
++device.name 0x0313
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0314
++device.name GeForce FX 5600XT
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0316
++device.name 0x0316
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0317
++device.name 0x0317
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x031a
++device.name GeForce FX Go5600
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x031b
++device.name GeForce FX Go5650
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x031c
++device.name Quadro FX Go700
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x031d
++device.name 0x031d
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x031e
++device.name 0x031e
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x031f
++device.name 0x031f
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0320
++device.name GeForce FX 5200
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0321
++device.name GeForce FX 5200 Ultra
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0322
++device.name GeForce FX 5200 (0x0322)
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0323
++device.name GeForce FX 5200LE
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0324
++device.name GeForce FX Go5200
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0325
++device.name GeForce FX Go5250
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0328
++device.name GeForce FX Go5200 32M/64M
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0329
++device.name GeForce FX 5200 (Mac)
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x032a
++device.name Quadro NVS 280 PCI
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x032b
++device.name Quadro FX 500/600 PCI
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x032c
++device.name GeForce FX Go53xx
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x032d
++device.name GeForce FX Go5100
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x032f
++device.name 0x032F
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0330
++device.name GeForce FX 5900 Ultra
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0331
++device.name GeForce FX 5900
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0332
++device.name GeForce FX 5900XT
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0333
++device.name GeForce FX 5950 Ultra
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0333
+&subvendor.id pci 0x10b0
+&subdevice.id pci 0x0602
++subdevice.name GeForce FX 5950
+
+ vendor.id pci 0x10de
+&device.id pci 0x0334
++device.name GeForce FX 5900ZT
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0338
++device.name Quadro FX 3000
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0338
+&subvendor.id pci 0x10de
+&subdevice.id pci 0x01c2
++subdevice.name Quadro FX 3000 DH
+
+ vendor.id pci 0x10de
+&device.id pci 0x0341
++device.name GeForce FX 5700 Ultra
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0341
+&subvendor.id pci 0x270f
+&subdevice.id pci 0x194c
++subdevice.name GeForce FX 5700 Ultra DH
+
+ vendor.id pci 0x10de
+&device.id pci 0x0342
++device.name GeForce FX 5700
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0343
++device.name GeForce FX 5700LE
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0344
++device.name GeForce FX 5700VE
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0345
++device.name 0x0345
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0347
++device.name GeForce FX Go5700
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0348
++device.name GeForce FX Go5700 (0x0348)
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0349
++device.name 0x0349
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x034b
++device.name 0x034b
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x034c
++device.name Quadro FX Go1000
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x034e
++device.name Quadro FX 1100
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x034f
++device.name 0x034f
++driver.xfree 4|nv
+
+ vendor.id pci 0x10e0
++vendor.name Imstt
+
+ vendor.id pci 0x10e0
+&device.id pci 0x9128
++device.name Imstt128
++driver.xfree 4|imstt
+
+ vendor.id pci 0x10e0
+&device.id pci 0x9135
++device.name Imstt3D
++driver.xfree 4|imstt
+
+ vendor.id pci 0x1106
++vendor.name VIA Technologies, Inc.
+
+ vendor.id pci 0x1106
+&device.id pci 0x3022
++device.name VIA CLE 3022
++driver.xfree 4|via
+
+ vendor.id pci 0x1106
+&device.id pci 0x3122
++device.name VIA CLE 3122
++driver.xfree 4|via
+
+ vendor.id pci 0x1106
+&device.id pci 0x7205
++device.name VIA VT 7205
++driver.xfree 4|via
+
+ vendor.id pci 0x1142
++vendor.name Alliance Semiconductor Corporation
+
+ vendor.id pci 0x1142
+&device.id pci 0x6422
++device.name ProVideo 6422
++driver.xfree 4|apm
+
+ vendor.id pci 0x1142
+&device.id pci 0x6424
++device.name ProVideo 6424
++driver.xfree 4|apm
+
+ vendor.id pci 0x1163
++vendor.name Rendition
+
+ vendor.id pci 0x1163
+&device.id pci 0x0001
++device.name Verite 1000
++driver.xfree 4|rendition
+
+ vendor.id pci 0x1163
+&device.id pci 0x2000
++device.name Verite V2000/V2100/V2200
++driver.xfree 4|rendition
+
+ vendor.id pci 0x121a
++vendor.name 3Dfx Interactive, Inc.
+
+ vendor.id pci 0x121a
+&device.id pci 0x0003
++device.name Voodoo Banshee
++driver.xfree 4|tdfx|||||8,16,24
++driver.xfree 4|tdfx|3d||dri||16
+
+ vendor.id pci 0x121a
+&device.id pci 0x0005
++device.name Voodoo 3
++driver.xfree 4|tdfx|||||8,16,24
++driver.xfree 4|tdfx|3d||dri||16
+
+ vendor.id pci 0x121a
+&device.id pci 0x0009
++device.name Voodoo5 5500
++driver.xfree 4|tdfx|||||8,16,24
++driver.xfree 4|tdfx|3d||dri||16
+
+ vendor.id pci 0x126f
++vendor.name Silicon Motion, Inc.
+
+ vendor.id pci 0x126f
+&device.id pci 0x0710
++device.name SM710 LynxEM
++driver.xfree 4|siliconmotion
+
+ vendor.id pci 0x126f
+&device.id pci 0x0712
++device.name SM712 LynxEM+
++driver.xfree 4|siliconmotion
+
+ vendor.id pci 0x126f
+&device.id pci 0x0720
++device.name SM720 Lynx3DM
++driver.xfree 4|siliconmotion
+
+ vendor.id pci 0x126f
+&device.id pci 0x0730
++device.name SMI 731
++driver.xfree 4|siliconmotion
+
+ vendor.id pci 0x126f
+&device.id pci 0x0810
++device.name SM810 LynxE
++driver.xfree 4|siliconmotion
+
+ vendor.id pci 0x126f
+&device.id pci 0x0820
++device.name 820
++driver.xfree 4|siliconmotion
+
+ vendor.id pci 0x126f
+&device.id pci 0x0910
++device.name SM910
++driver.xfree 4|siliconmotion
+
+ vendor.id pci 0x12d2
++vendor.name NVidia / SGS Thomson (Joint Venture)
+
+ vendor.id pci 0x12d2
+&device.id pci 0x0018
++device.name Riva128
++driver.xfree 4|nv|||||15,24
+
+ vendor.id pci 0x15ad
++vendor.name VMWare Inc
+
+ vendor.id pci 0x15ad
+&device.id pci 0x0405
++device.name VMWARE0405
++driver.xfree 4|vmware
+
+ vendor.id pci 0x15ad
+&device.id pci 0x0710
++device.name VMWARE0710
++driver.xfree 4|vmware
+
+ vendor.id pci 0x3d3d
++vendor.name 3DLabs
+
+ vendor.id pci 0x3d3d
+&device.id pci 0x0002
++device.name GLINT 500TX
++driver.xfree 4|glint
+
+ vendor.id pci 0x3d3d
+&device.id pci 0x0004
++device.name Permedia
++driver.xfree 4|glint
+
+ vendor.id pci 0x3d3d
+&device.id pci 0x0006
++device.name GLINT MX
++driver.xfree 4|glint
+
+ vendor.id pci 0x3d3d
+&device.id pci 0x0007
++device.name 3D Extreme
++driver.xfree 4|glint|||||8,15,16,24
+
+ vendor.id pci 0x3d3d
+&device.id pci 0x0009
++device.name Permedia II 2D+3D
++driver.xfree 4|glint|||||8,15,16,24
+
+ vendor.id pci 0x3d3d
+&device.id pci 0x000a
++device.name GLINT R3
++driver.xfree 4|glint
+
+ vendor.id pci 0x3d3d
+&device.id pci 0x000c
++device.name Permedia 4
++driver.xfree 4|glint
+
+ vendor.id pci 0x3d3d
+&device.id pci 0x000d
++device.name R4
++driver.xfree 4|glint
+
+ vendor.id pci 0x5333
++vendor.name S3 Inc.
+
+ vendor.id pci 0x5333
+&device.id pci 0x5631
++device.name 86c325 [ViRGE]
++driver.xfree 4|s3virge
+
+ vendor.id pci 0x5333
+&device.id pci 0x8811
++device.name 86c764/765 [Trio32/64/64V+]
++driver.xfree 4|s3
+
+ vendor.id pci 0x5333
+&device.id pci 0x8812
++device.name 86cM65 [Aurora64V+]
++driver.xfree 4|s3
+
+ vendor.id pci 0x5333
+&device.id pci 0x8814
++device.name 86c767 [Trio 64UV+]
++driver.xfree 4|s3
+
+ vendor.id pci 0x5333
+&device.id pci 0x883d
++device.name 86c988 [ViRGE/VX]
++driver.xfree 4|s3virge
+
+ vendor.id pci 0x5333
+&device.id pci 0x8901
++device.name Trio 64V2/DX or /GX
++driver.xfree 4|s3
+
+ vendor.id pci 0x5333
+&device.id pci 0x8904
++device.name Integrated Trio3D
++driver.xfree 4|s3virge
+
+ vendor.id pci 0x5333
+&device.id pci 0x8a01
++device.name ViRGE/DX
++driver.xfree 4|s3virge||||noVBE
+
+ vendor.id pci 0x5333
+&device.id pci 0x8a10
++device.name ViRGE/GX2
++driver.xfree 4|s3virge
+
+ vendor.id pci 0x5333
+&device.id pci 0x8a13
++device.name 86c368 [Trio 3D/2X]
++driver.xfree 4|s3virge
+
+ vendor.id pci 0x5333
+&device.id pci 0x8a20
++device.name 86c794 [Savage 3D]
++driver.xfree 4|savage
+
+ vendor.id pci 0x5333
+&device.id pci 0x8a21
++device.name 86c795 [Savage 3D/MV]
++driver.xfree 4|savage
+
+ vendor.id pci 0x5333
+&device.id pci 0x8a22
++device.name Savage 4
++driver.xfree 4|savage
+
+ vendor.id pci 0x5333
+&device.id pci 0x8a25
++device.name ProSavage PM 133
++driver.xfree 4|savage
+
+ vendor.id pci 0x5333
+&device.id pci 0x8a26
++device.name ProSavage KM 133
++driver.xfree 4|savage
+
+ vendor.id pci 0x5333
+&device.id pci 0x8c01
++device.name ViRGE/MX
++driver.xfree 4|s3virge
+
+ vendor.id pci 0x5333
+&device.id pci 0x8c03
++device.name ViRGE/MX+MV
++driver.xfree 4|s3virge
+
+ vendor.id pci 0x5333
+&device.id pci 0x8c10
++device.name 86C270-294 Savage/MX-/IX
++driver.xfree 4|savage
+
+ vendor.id pci 0x5333
+&device.id pci 0x8c11
++device.name Savage MX
++driver.xfree 4|savage
+
+ vendor.id pci 0x5333
+&device.id pci 0x8c12
++device.name Savage IX/MV
++driver.xfree 4|savage
+
+ vendor.id pci 0x5333
+&device.id pci 0x8c12
+&subvendor.id pci 0x1014
+&subdevice.id pci 0x017f
++subdevice.name Savage IX/MV IBM
++driver.xfree 4|savage||||ShadowStatus
+
+ vendor.id pci 0x5333
+&device.id pci 0x8c13
++device.name Savage IX
++driver.xfree 4|savage
+
+ vendor.id pci 0x5333
+&device.id pci 0x8c22
++device.name SuperSavage/MX 128
++driver.xfree 4|savage
+
+ vendor.id pci 0x5333
+&device.id pci 0x8c24
++device.name SuperSavage/MX 64
++driver.xfree 4|savage
+
+ vendor.id pci 0x5333
+&device.id pci 0x8c26
++device.name SuperSavage/MX 64C
++driver.xfree 4|savage
+
+ vendor.id pci 0x5333
+&device.id pci 0x8c2a
++device.name SuperSavage/IX 128 SDR
++driver.xfree 4|savage
+
+ vendor.id pci 0x5333
+&device.id pci 0x8c2b
++device.name SuperSavage/IX 128 DDR
++driver.xfree 4|savage
+
+ vendor.id pci 0x5333
+&device.id pci 0x8c2c
++device.name SuperSavage/IX 64 SDR
++driver.xfree 4|savage
+
+ vendor.id pci 0x5333
+&device.id pci 0x8c2d
++device.name SuperSavage/IX 64 DDR
++driver.xfree 4|savage
+
+ vendor.id pci 0x5333
+&device.id pci 0x8c2e
++device.name SuperSavage/IXC 64 SDR
++driver.xfree 4|savage
+
+ vendor.id pci 0x5333
+&device.id pci 0x8c2f
++device.name SuperSavage/IXC 64 DDR
++driver.xfree 4|savage
+
+ vendor.id pci 0x5333
+&device.id pci 0x8d01
++device.name S3Twister_P
++driver.xfree 4|savage
+
+ vendor.id pci 0x5333
+&device.id pci 0x8d02
++device.name Twister_K
++driver.xfree 4|savage
+
+ vendor.id pci 0x5333
+&device.id pci 0x8d03
++device.name ProSavage DDR
++driver.xfree 4|savage
+
+ vendor.id pci 0x5333
+&device.id pci 0x8d04
++device.name ProSavage DDR-K
++driver.xfree 4|savage
+
+ vendor.id pci 0x5333
+&device.id pci 0x9102
++device.name 86C410 Savage 2000
++driver.xfree 4|savage
+
+ vendor.id pci 0x8086
++vendor.name Intel Corporation
+
+ vendor.id pci 0x8086
+&device.id pci 0x00d1
++device.name i740_PCI
++driver.xfree 4|i740
+
+ vendor.id pci 0x8086
+&device.id pci 0x1132
++device.name I815
++driver.xfree 4|i810|||||8,16,24
++driver.xfree 4|i810|3d||dri||16
++driver.xfree.config VideoRam 16384
+
+ vendor.id pci 0x8086
+&device.id pci 0x2562
++device.name i845
++driver.xfree 4|i810
++driver.xfree 4|i810|3d||dri||16
++driver.xfree.config VideoRam 16384
+
+ vendor.id pci 0x8086
+&device.id pci 0x2572
++device.name 865 G
++driver.xfree 4|i810
++driver.xfree 4|i810|3d||dri||16
++driver.xfree.config VideoRam 16384
+
+ vendor.id pci 0x8086
+&device.id pci 0x3577
++device.name i830
++driver.xfree 4|i810
++driver.xfree 4|i810|3d||dri||16
++driver.xfree.config VideoRam 16384
+
+ vendor.id pci 0x8086
+&device.id pci 0x3582
++device.name 855 GM
++driver.xfree 4|i810
++driver.xfree 4|i810|3d||dri||16
++driver.xfree.config VideoRam 16384
+
+ vendor.id pci 0x8086
+&device.id pci 0x7121
++device.name 82810 CGC [Chipset Graphics Controller]
++driver.xfree 4|i810|||||8,16,24
++driver.xfree 4|i810|3d||dri||16
++driver.xfree.config VideoRam 16384
+
+ vendor.id pci 0x8086
+&device.id pci 0x7123
++device.name 82810-DC100 CGC [Chipset Graphics Controller]
++driver.xfree 4|i810|||||8,16,24
++driver.xfree 4|i810|3d||dri||16
++driver.xfree.config VideoRam 16384
+
+ vendor.id pci 0x8086
+&device.id pci 0x7125
++device.name 82810E CGC [Chipset Graphics Controller]
++driver.xfree 4|i810|||||8,16,24
++driver.xfree 4|i810|3d||dri||16
++driver.xfree.config VideoRam 16384
+
+ vendor.id pci 0x8086
+&device.id pci 0x7800
++device.name i740
++driver.xfree 4|i740
+
+ vendor.id pci 0xedd8
++vendor.name ARK Logic Inc
+
+ vendor.id pci 0xedd8
+&device.id pci 0xa091
++device.name 1000PV [Stingray]
++driver.xfree 4|ark
+
+ vendor.id pci 0xedd8
+&device.id pci 0xa099
++device.name 2000PV [Stingray]
++driver.xfree 4|ark
+
+ vendor.id pci 0xedd8
+&device.id pci 0xa0a1
++device.name 2000MT
++driver.xfree 4|ark
+
--- /dev/null
+ vendor.id pci 0x1002
++vendor.name ATI Technologies Inc
+
+ vendor.id pci 0x1002
+&device.id pci 0x4136
++device.name RS100 4136
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4137
++device.name RS100 4137
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4144
++device.name R300 AD
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4145
++device.name E300 AE
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4146
++device.name R300 AF
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4147
++device.name R300 AG
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4148
++device.name R350 AH
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4149
++device.name R350 AI
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x414a
++device.name R350 AJ
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x414b
++device.name R350 AK
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4150
++device.name RV350 AP
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4151
++device.name RV350 AQ
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4152
++device.name RV350 AR
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4153
++device.name RV350 AS
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4154
++device.name RV350 AT
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4155
++device.name RV350 AU
++driver.xfree 4|radeon
++driver.xfree.config ChipID 0x4154
+
+ vendor.id pci 0x1002
+&device.id pci 0x4156
++device.name RV350 AV
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4157
++device.name RV350 AW
++driver.xfree 4|radeon
++driver.xfree.config ChipID 0x4154
+
+ vendor.id pci 0x1002
+&device.id pci 0x4237
++device.name RS250 4237
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4242
++device.name R200 BB
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4243
++device.name R200 BC
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4336
++device.name RS100 4336
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4337
++device.name RS200 4337
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4354
++device.name 215CT [Mach64 CT]
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x4358
++device.name 210888CX [Mach64 CX]
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x4437
++device.name RS250 4437
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4554
++device.name 210888ET [Mach64 ET]
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x4742
++device.name 3D Rage Pro AGP 1X/2X
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x4744
++device.name 3D Rage Pro AGP 1X
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x4749
++device.name Mach64 GI
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x474c
++device.name Rage XC
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x474d
++device.name Rage XL AGP
++driver.xfree 4|ati|||||8,16,24
+
+ vendor.id pci 0x1002
+&device.id pci 0x474e
++device.name Rage XC AGP
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x474f
++device.name Rage XL
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x4750
++device.name 3D Rage Pro 215GP
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x4751
++device.name 3D Rage Pro 215GQ
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x4752
++device.name Mach64 GR
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x4753
++device.name Mach64 GS
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x4754
++device.name 3D Rage I/II 215GT [Mach64 GT]
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x4755
++device.name 3D Rage II+ 215GTB [Mach64 GTB]
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x4756
++device.name 3D Rage IIC 215IIC [Mach64 GT IIC]
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x4757
++device.name 3D Rage IIC AGP
++driver.xfree 4|ati|||||8,15,16,24
+
+ vendor.id pci 0x1002
+&device.id pci 0x4758
++device.name 210888GX [Mach64 GX]
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x4759
++device.name 3D Rage IIC
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x475a
++device.name Mach64 GZ
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x4966
++device.name RV250 If
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4966
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x0002
++subdevice.name Radeon 9000
+
+ vendor.id pci 0x1002
+&device.id pci 0x4967
++device.name RV250 Ig
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c42
++device.name Mach64 LB
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c42
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x0044
++subdevice.name 3D Rage LT Pro AGP-133
++driver.xfree 4|ati
++driver.xfree.config Option "dpms" "off"
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c44
++device.name 3D Rage LT Pro AGP-66
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c45
++device.name Rage 128 Mobility LE
++driver.xfree 4|r128
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c46
++device.name Mobility M3 AGP 2x
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri|dpms,usefbdev|16||switch2xf86_glx
++requires xf86_glx
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c47
++device.name 3D Rage LT-G 215LG
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c49
++device.name Mach64 LI
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c4d
++device.name 3D Rage P/M Mobility AGP 2x
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c4e
++device.name 3D Rage L Mobility AGP 2x
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c50
++device.name 3D Rage LT Pro
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c51
++device.name Mach64 LQ
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c52
++device.name 3D Rage P/M Mobility
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c53
++device.name 3D Rage L Mobility
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c57
++device.name Radeon LW
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c58
++device.name Radeon LX
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c59
++device.name Radeon LY
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c5a
++device.name Radeon LZ
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c64
++device.name RV250 Ld
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c66
++device.name RV250 Lf
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c67
++device.name RV250 Lg
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4d46
++device.name Rage 128 Mobility MF
++driver.xfree 4|r128
+
+ vendor.id pci 0x1002
+&device.id pci 0x4d4c
++device.name Rage 128 Mobility ML
++driver.xfree 4|r128
+
+ vendor.id pci 0x1002
+&device.id pci 0x4e44
++device.name R300 ND
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4e44
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x0002
++subdevice.name Radeon 9700
+
+ vendor.id pci 0x1002
+&device.id pci 0x4e45
++device.name R300 NE
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4e46
++device.name R300 NF
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4e47
++device.name R300 NG
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4e47
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x0172
++subdevice.name FireGL X1
+
+ vendor.id pci 0x1002
+&device.id pci 0x4e48
++device.name R350 NH
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4e49
++device.name R350 NI
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4e4a
++device.name R360 NJ
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4e4b
++device.name R350 NK
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4e50
++device.name RV350 NP
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4e51
++device.name RV350 NQ
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4e52
++device.name RV350 NR
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4e53
++device.name RV350 NS
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4e54
++device.name RV350 NT
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x4e56
++device.name RV350 NV
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x5041
++device.name Rage 128 PA
++driver.xfree 4|r128
+
+ vendor.id pci 0x1002
+&device.id pci 0x5042
++device.name Rage 128 PB
++driver.xfree 4|r128
+
+ vendor.id pci 0x1002
+&device.id pci 0x5043
++device.name Rage 128 PC
++driver.xfree 4|r128
+
+ vendor.id pci 0x1002
+&device.id pci 0x5044
++device.name Rage 128 PD
++driver.xfree 4|r128
+
+ vendor.id pci 0x1002
+&device.id pci 0x5045
++device.name Rage 128 PE
++driver.xfree 4|r128
+
+ vendor.id pci 0x1002
+&device.id pci 0x5046
++device.name Rage 128 PF
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri|dpms,usefbdev|16,24||switch2xf86_glx
++requires xf86_glx
+
+ vendor.id pci 0x1002
+&device.id pci 0x5047
++device.name Rage 128 PG
++driver.xfree 4|r128
+
+ vendor.id pci 0x1002
+&device.id pci 0x5048
++device.name Rage 128 PH
++driver.xfree 4|r128
+
+ vendor.id pci 0x1002
+&device.id pci 0x5049
++device.name Rage 128 PI
++driver.xfree 4|r128
+
+ vendor.id pci 0x1002
+&device.id pci 0x504a
++device.name Rage 128 PJ
++driver.xfree 4|r128
+
+ vendor.id pci 0x1002
+&device.id pci 0x504b
++device.name Rage 128 PK
++driver.xfree 4|r128
+
+ vendor.id pci 0x1002
+&device.id pci 0x504c
++device.name Rage 128 PL
++driver.xfree 4|r128
+
+ vendor.id pci 0x1002
+&device.id pci 0x504d
++device.name Rage 128 PM
++driver.xfree 4|r128
+
+ vendor.id pci 0x1002
+&device.id pci 0x504e
++device.name Rage 128 PN
++driver.xfree 4|r128
+
+ vendor.id pci 0x1002
+&device.id pci 0x504f
++device.name Rage 128 PO
++driver.xfree 4|r128
+
+ vendor.id pci 0x1002
+&device.id pci 0x5050
++device.name Rage 128 PP
++driver.xfree 4|r128
+
+ vendor.id pci 0x1002
+&device.id pci 0x5051
++device.name Rage 128 PQ
++driver.xfree 4|r128
+
+ vendor.id pci 0x1002
+&device.id pci 0x5052
++device.name Rage 128 PR
++driver.xfree 4|r128
++driver.xfree 4|r128|3d||dri|dpms,usefbdev|16||switch2xf86_glx
++driver.xfree.config ati_r128_rl
++requires xf86_glx
+
+ vendor.id pci 0x1002
+&device.id pci 0x5053
++device.name Rage 128 PS
++driver.xfree 4|r128
+
+ vendor.id pci 0x1002
+&device.id pci 0x5054
++device.name Rage 128 PT
++driver.xfree 4|r128
+
+ vendor.id pci 0x1002
+&device.id pci 0x5055
++device.name Rage 128 PU
++driver.xfree 4|r128
+
+ vendor.id pci 0x1002
+&device.id pci 0x5056
++device.name Rage 128 PV
++driver.xfree 4|r128
+
+ vendor.id pci 0x1002
+&device.id pci 0x5057
++device.name Rage 128 PW
++driver.xfree 4|r128
+
+ vendor.id pci 0x1002
+&device.id pci 0x5058
++device.name Rage 128 PX
++driver.xfree 4|r128
+
+ vendor.id pci 0x1002
+&device.id pci 0x5144
++device.name Radeon QD
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x5145
++device.name Radeon QE
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x5146
++device.name Radeon QF
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x5147
++device.name Radeon QG
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x5148
++device.name fgl8x00
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x5148
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x0152
++subdevice.name FireGL 8800
+
+ vendor.id pci 0x1002
+&device.id pci 0x5148
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x0172
++subdevice.name FireGL 8700
+
+ vendor.id pci 0x1002
+&device.id pci 0x514c
++device.name R200 QL
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x514d
++device.name Radeon 9100 QM
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x5157
++device.name RV200 QW
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x5157
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x013a
++subdevice.name Radeon 7500
+
+ vendor.id pci 0x1002
+&device.id pci 0x5157
+&subvendor.id pci 0x174b
+&subdevice.id pci 0x7146
++subdevice.name Radeon 7500-7146
+
+ vendor.id pci 0x1002
+&device.id pci 0x5157
+&subvendor.id pci 0x174b
+&subdevice.id pci 0x7161
++subdevice.name Radeon 7500 LE
+
+ vendor.id pci 0x1002
+&device.id pci 0x5158
++device.name RV200 QX
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x5159
++device.name Radeon VE
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x515a
++device.name Radeon QZ
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x5245
++device.name Rage 128 RE
++driver.xfree 4|r128|||||8,15,16,24
++driver.xfree 4|r128|3d||dri|dpms,usefbdev|16,24||switch2xf86_glx
++requires xf86_glx
+
+ vendor.id pci 0x1002
+&device.id pci 0x5246
++device.name Rage 128 RF
++driver.xfree 4|r128|||||8,15,16,24
+
+ vendor.id pci 0x1002
+&device.id pci 0x5247
++device.name Rage 128 RG
++driver.xfree 4|r128
+
+ vendor.id pci 0x1002
+&device.id pci 0x524b
++device.name Rage 128 RK
++driver.xfree 4|r128
+
+ vendor.id pci 0x1002
+&device.id pci 0x524c
++device.name Rage 128 RL
++driver.xfree 4|r128|||||8,15,16,24
+
+ vendor.id pci 0x1002
+&device.id pci 0x5345
++device.name Rage 128 SE
++driver.xfree 4|r128
+
+ vendor.id pci 0x1002
+&device.id pci 0x5346
++device.name Rage 128 SF
++driver.xfree 4|r128
+
+ vendor.id pci 0x1002
+&device.id pci 0x5347
++device.name Rage 128 SG
++driver.xfree 4|r128
+
+ vendor.id pci 0x1002
+&device.id pci 0x5348
++device.name Rage 128 4x
++driver.xfree 4|r128
+
+ vendor.id pci 0x1002
+&device.id pci 0x534b
++device.name Rage 128 SK
++driver.xfree 4|r128
+
+ vendor.id pci 0x1002
+&device.id pci 0x534c
++device.name Rage 128 SL
++driver.xfree 4|r128
+
+ vendor.id pci 0x1002
+&device.id pci 0x534d
++device.name Rage 128 SM
++driver.xfree 4|r128
+
+ vendor.id pci 0x1002
+&device.id pci 0x534e
++device.name Rage 128 SN
++driver.xfree 4|r128
+
+ vendor.id pci 0x1002
+&device.id pci 0x5446
++device.name Rage 128 Ultra TF
++driver.xfree 4|r128
+
+ vendor.id pci 0x1002
+&device.id pci 0x544c
++device.name Rage128 TL
++driver.xfree 4|r128
+
+ vendor.id pci 0x1002
+&device.id pci 0x5452
++device.name Rage 128 Pro TR (AGP)
++driver.xfree 4|r128
+
+ vendor.id pci 0x1002
+&device.id pci 0x5453
++device.name Rage 128 TS
++driver.xfree 4|r128
+
+ vendor.id pci 0x1002
+&device.id pci 0x5454
++device.name Rage 128 TT
++driver.xfree 4|r128
+
+ vendor.id pci 0x1002
+&device.id pci 0x5455
++device.name Rage 128 TU
++driver.xfree 4|r128
+
+ vendor.id pci 0x1002
+&device.id pci 0x5654
++device.name Mach64 VT
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x5655
++device.name 264VT3 [Mach64 VT3]
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x5656
++device.name 264VT4 [Mach64 VT4]
++driver.xfree 4|ati
+
+ vendor.id pci 0x1002
+&device.id pci 0x5834
++device.name RS300 5834
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x5835
++device.name RS300 5835
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x5960
++device.name RV280 5960
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x5961
++device.name RV280 5961
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x5962
++device.name RV280 5962
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x5964
++device.name RV280 5964
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x5964
+&subvendor.id pci 0x17af
+&subdevice.id pci 0x2012
++subdevice.name Radeon 9200 SE (DH)
+
+ vendor.id pci 0x1002
+&device.id pci 0x5c61
++device.name RV280 5c61
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1002
+&device.id pci 0x5c63
++device.name RV280 5c63
++driver.xfree 4|radeon
+
+ vendor.id pci 0x1013
++vendor.name Cirrus Logic
+
+ vendor.id pci 0x1013
+&device.id pci 0x00b8
++device.name GD 5446
++driver.xfree 4|fbdev||||dpms,usefbdev
+
+ vendor.id pci 0x102b
++vendor.name Matrox Graphics, Inc.
+
+ vendor.id pci 0x102b
+&device.id pci 0x0519
++device.name MGA 2064W [Millennium]
++driver.xfree 4|mga||||DDCInfo,dpms,hw_cursor|8,15,16,24,32
+
+ vendor.id pci 0x102b
+&device.id pci 0x051a
++device.name MGA 1064SG [Mystique]
++driver.xfree 4|fbdev||||dpms,hw_cursor|16,24
++driver.xfree.config DacSpeed 200
+
+ vendor.id pci 0x102b
+&device.id pci 0x0520
++device.name MGA G200
++driver.xfree 4|fbdev||||dpms,hw_cursor|16,24
++driver.xfree.config DacSpeed 200 200 200 200
+
+ vendor.id pci 0x10de
++vendor.name nVidia Corporation
+
+ vendor.id pci 0x10de
+&device.id pci 0x0020
++device.name RIVA TNT
++driver.xfree 4|nv|||||8,15,16,24
+
+ vendor.id pci 0x10de
+&device.id pci 0x0028
++device.name RIVA TNT2/TNT2 Pro
++driver.xfree 4|nv|||||8,15,16,24
+
+ vendor.id pci 0x10de
+&device.id pci 0x0029
++device.name RIVA TNT2 Ultra
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x002a
++device.name Unknown TNT2
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x002c
++device.name Vanta/Vanta LT
++driver.xfree 4|nv|||||8,16,24
+
+ vendor.id pci 0x10de
+&device.id pci 0x002d
++device.name RIVA TNT2 Model 64/Model 64 Pro
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x00a0
++device.name Aladdin TNT2
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0100
++device.name GeForce 256
++driver.xfree 4|nv|||||8,15,16,24
+
+ vendor.id pci 0x10de
+&device.id pci 0x0101
++device.name GeForce DDR
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0103
++device.name Quadro
++driver.xfree 4|nv|||||8,15,16,24
+
+ vendor.id pci 0x10de
+&device.id pci 0x0110
++device.name GeForce2 MX/MX 400
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0111
++device.name GeForce2 MX 100/200
++driver.xfree 4|nv||||sw_cursor
+
+ vendor.id pci 0x10de
+&device.id pci 0x0112
++device.name GeForce2 Go
++driver.xfree 4|nv
++driver.xfree.config #Option "CrtcNumber" "0"
+
+ vendor.id pci 0x10de
+&device.id pci 0x0113
++device.name Quadro2 MXR/EX/Go
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0150
++device.name GeForce2 GTS/GeForce2 Pro
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0151
++device.name GeForce2 Ti
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0152
++device.name GeForce2 Ultra
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0153
++device.name Quadro2 Pro
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0170
++device.name GeForce4 MX 460
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0171
++device.name GeForce4 MX 440
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0172
++device.name GeForce4 MX 420
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0173
++device.name GeForce4 MX 440-SE
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0174
++device.name GeForce4 440 Go
++driver.xfree 4|nv
++driver.xfree.config #Option "CrtcNumber" "0"
++driver.xfree.config #Option "CrtcNumber" "1"
+
+ vendor.id pci 0x10de
+&device.id pci 0x0175
++device.name GeForce4 420 Go
++driver.xfree 4|nv
++driver.xfree.config #Option "CrtcNumber" "0"
++driver.xfree.config #Option "CrtcNumber" "1"
+
+ vendor.id pci 0x10de
+&device.id pci 0x0176
++device.name GeForce4 420 Go 32M
++driver.xfree 4|nv
++driver.xfree.config #Option "CrtcNumber" "0"
++driver.xfree.config #Option "CrtcNumber" "1"
+
+ vendor.id pci 0x10de
+&device.id pci 0x0177
++device.name GeForce4 460 Go
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0178
++device.name Quadro4 550 XGL
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0178
+&subvendor.id pci 0x10de
+&subdevice.id pci 0x0151
++subdevice.name Quadro4 550 XGL DH
+
+ vendor.id pci 0x10de
+&device.id pci 0x0179
++device.name GeForce4 440 Go 64M
++driver.xfree 4|nv
++driver.xfree.config #Option "CrtcNumber" "0"
++driver.xfree.config #Option "CrtcNumber" "1"
+
+ vendor.id pci 0x10de
+&device.id pci 0x017a
++device.name Quadro4 NVS
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x017c
++device.name Quadro4 500 GoGL
++driver.xfree 4|nv
++driver.xfree.config #Option "CrtcNumber" "0"
++driver.xfree.config #Option "CrtcNumber" "1"
+
+ vendor.id pci 0x10de
+&device.id pci 0x017d
++device.name GeForce4 410 Go 16M
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0181
++device.name GeForce4 MX 440 with AGP8X
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0182
++device.name GeForce4 MX 440SE with AGP8X
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0183
++device.name GeForce4 MX 420 with AGP8X
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0186
++device.name GeForce4 448 Go
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0187
++device.name GeForce4 488 Go
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0188
++device.name Quadro4 580 XGL
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0189
++device.name GeForce4 MX with AGP8X (Mac)
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x018a
++device.name Quadro NVS with AGP8X
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x018b
++device.name Quadro4 380 XGL
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x01a0
++device.name GeForce2 Integrated GPU
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x01f0
++device.name GeForce4 MX Integrated GPU
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0200
++device.name GeForce3
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0201
++device.name GeForce3 Ti 200
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0202
++device.name GeForce3 Ti 500
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0203
++device.name Quadro DCC
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0250
++device.name GeForce4 Ti 4600
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0251
++device.name GeForce4 Ti 4400
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0252
++device.name NV25
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0253
++device.name GeForce4 Ti 4200
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0258
++device.name Quadro4 900 XGL
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0258
+&subvendor.id pci 0x10de
+&subdevice.id pci 0x0138
++subdevice.name Quadro4 900 XGL DH
+
+ vendor.id pci 0x10de
+&device.id pci 0x0259
++device.name Quadro4 750 XGL
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0259
+&subvendor.id pci 0x10de
+&subdevice.id pci 0x0139
++subdevice.name Quadro4 750 XGL DH
+
+ vendor.id pci 0x10de
+&device.id pci 0x025b
++device.name Quadro4 700 XGL
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x025b
+&subvendor.id pci 0x10de
+&subdevice.id pci 0x013b
++subdevice.name Quadro4 700 XGL DH
+
+ vendor.id pci 0x10de
+&device.id pci 0x0280
++device.name GeForce4 Ti 4800
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0281
++device.name GeForce4 Ti 4200 with AGP8X
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0282
++device.name GeForce4 Ti 4800 SE
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0286
++device.name GeForce4 4200 Go
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0288
++device.name Quadro4 980 XGL
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0288
+&subvendor.id pci 0x10de
+&subdevice.id pci 0x0174
++subdevice.name Quadro4 980 XGL DH
+
+ vendor.id pci 0x10de
+&device.id pci 0x0289
++device.name Quadro4 780 XGL
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x028c
++device.name Quadro4 700 GoGL
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0301
++device.name GeForce FX 5800 Ultra
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0302
++device.name GeForce FX 5800
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0308
++device.name Quadro FX 2000
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0308
+&subvendor.id pci 0x10de
+&subdevice.id pci 0x0183
++subdevice.name Quadro FX2000 DH
+
+ vendor.id pci 0x10de
+&device.id pci 0x0309
++device.name Quadro FX 1000
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0309
+&subvendor.id pci 0x10de
+&subdevice.id pci 0x0182
++subdevice.name Quadro FX1000 DH
+
+ vendor.id pci 0x10de
+&device.id pci 0x0311
++device.name GeForce FX 5600 Ultra
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0312
++device.name GeForce FX 5600
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0313
++device.name 0x0313
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0314
++device.name GeForce FX 5600XT
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0316
++device.name 0x0316
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0317
++device.name 0x0317
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x031a
++device.name GeForce FX Go5600
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x031b
++device.name GeForce FX Go5650
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x031c
++device.name Quadro FX Go700
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x031d
++device.name 0x031d
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x031e
++device.name 0x031e
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x031f
++device.name 0x031f
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0320
++device.name GeForce FX 5200
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0321
++device.name GeForce FX 5200 Ultra
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0322
++device.name GeForce FX 5200 (0x0322)
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0323
++device.name GeForce FX 5200LE
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0324
++device.name GeForce FX Go5200
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0325
++device.name GeForce FX Go5250
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0328
++device.name GeForce FX Go5200 32M/64M
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0329
++device.name GeForce FX 5200 (Mac)
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x032a
++device.name Quadro NVS 280 PCI
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x032b
++device.name Quadro FX 500/600 PCI
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x032c
++device.name GeForce FX Go53xx
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x032d
++device.name GeForce FX Go5100
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x032f
++device.name 0x032F
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0330
++device.name GeForce FX 5900 Ultra
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0331
++device.name GeForce FX 5900
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0332
++device.name GeForce FX 5900XT
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0333
++device.name GeForce FX 5950 Ultra
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0333
+&subvendor.id pci 0x10b0
+&subdevice.id pci 0x0602
++subdevice.name GeForce FX 5950
+
+ vendor.id pci 0x10de
+&device.id pci 0x0334
++device.name GeForce FX 5900ZT
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0338
++device.name Quadro FX 3000
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0338
+&subvendor.id pci 0x10de
+&subdevice.id pci 0x01c2
++subdevice.name Quadro FX 3000 DH
+
+ vendor.id pci 0x10de
+&device.id pci 0x0341
++device.name GeForce FX 5700 Ultra
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0341
+&subvendor.id pci 0x270f
+&subdevice.id pci 0x194c
++subdevice.name GeForce FX 5700 Ultra DH
+
+ vendor.id pci 0x10de
+&device.id pci 0x0342
++device.name GeForce FX 5700
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0343
++device.name GeForce FX 5700LE
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0344
++device.name GeForce FX 5700VE
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0345
++device.name 0x0345
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0347
++device.name GeForce FX Go5700
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0348
++device.name GeForce FX Go5700 (0x0348)
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x0349
++device.name 0x0349
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x034b
++device.name 0x034b
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x034c
++device.name Quadro FX Go1000
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x034e
++device.name Quadro FX 1100
++driver.xfree 4|nv
+
+ vendor.id pci 0x10de
+&device.id pci 0x034f
++device.name 0x034f
++driver.xfree 4|nv
+
+ vendor.id pci 0x121a
++vendor.name 3Dfx Interactive, Inc.
+
+ vendor.id pci 0x121a
+&device.id pci 0x0003
++device.name Voodoo Banshee
++driver.xfree 4|fbdev|||||24
+
+ vendor.id pci 0x12d2
++vendor.name NVidia / SGS Thomson (Joint Venture)
+
+ vendor.id pci 0x12d2
+&device.id pci 0x0018
++device.name Riva128
++driver.xfree 4|nv|||||15,24
+
--- /dev/null
+# x11 ppc data not in CDB
+
+ vendor.id pci 0x106b
+&device.id pci 0x0003
++driver.xfree 4|fbdev
+
+ vendor.id special 0x0401
+&device.id special 0x3000
++driver.xfree 4|fbdev
+
+ vendor.id special 0x0401
+&device.id special 0x3001
++driver.xfree 3|FBDev
+
--- /dev/null
+ vendor.id pci 0x1002
++vendor.name ATI Technologies Inc
+
+ vendor.id pci 0x1002
+&device.id pci 0x0084
++device.name RageIIC
++driver.xfree 4|ati|||||8,15,16,24
+
+ vendor.id pci 0x1002
+&device.id pci 0x0088
++device.name Mach64
++driver.xfree 4|ati|||||8,15,16,24
+
+ vendor.id pci 0x1002
+&device.id pci 0x4158
++device.name 68800AX [Mach32]
++driver.xfree 4|ati|||||8,15,16,24
+
+ vendor.id pci 0x1002
+&device.id pci 0x4354
++device.name 215CT [Mach64 CT]
++driver.xfree 4|ati|||||8,15,16,24
+
+ vendor.id pci 0x1002
+&device.id pci 0x4358
++device.name 210888CX [Mach64 CX]
++driver.xfree 4|ati|||||8,15,16,24
+
+ vendor.id pci 0x1002
+&device.id pci 0x4554
++device.name 210888ET [Mach64 ET]
++driver.xfree 4|ati|||||8,15,16,24
+
+ vendor.id pci 0x1002
+&device.id pci 0x4654
++device.name Mach64 VT
++driver.xfree 4|ati|||||8,15,16,24
+
+ vendor.id pci 0x1002
+&device.id pci 0x4747
++device.name 3D Rage Pro
++driver.xfree 4|ati|||||8,15,16,24
+
+ vendor.id pci 0x1002
+&device.id pci 0x474c
++device.name Rage XC
++driver.xfree 4|ati|||||8,15,16,24
+
+ vendor.id pci 0x1002
+&device.id pci 0x474f
++device.name Rage XL
++driver.xfree 4|ati|||||8,15,16,24
+
+ vendor.id pci 0x1002
+&device.id pci 0x4750
++device.name 3D Rage Pro 215GP
++driver.xfree 4|ati|||||8,16,24
+
+ vendor.id pci 0x1002
+&device.id pci 0x4751
++device.name 3D Rage Pro 215GQ
++driver.xfree 4|ati|||||8,15,16,24
+
+ vendor.id pci 0x1002
+&device.id pci 0x4754
++device.name 3D Rage I/II 215GT [Mach64 GT]
++driver.xfree 4|ati|||||8,15,16,24
+
+ vendor.id pci 0x1002
+&device.id pci 0x4755
++device.name 3D Rage II+ 215GTB [Mach64 GTB]
++driver.xfree 4|ati|||||8,16,24
+
+ vendor.id pci 0x1002
+&device.id pci 0x4756
++device.name 3D Rage IIC 215IIC [Mach64 GT IIC]
++driver.xfree 4|ati|||||8,15,16,24
+
+ vendor.id pci 0x1002
+&device.id pci 0x4758
++device.name 210888GX [Mach64 GX]
++driver.xfree 4|ati|||||8,15,16,24
+
+ vendor.id pci 0x1002
+&device.id pci 0x4759
++device.name 3D Rage IIC
++driver.xfree 4|ati|||||8,15,16,24
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c47
++device.name 3D Rage LT-G 215LG
++driver.xfree 4|ati|||||8,15,16,24
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c50
++device.name 3D Rage LT Pro
++driver.xfree 4|ati|||||8,15,16,24
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c52
++device.name 3D Rage P/M Mobility
++driver.xfree 4|ati|||||8,15,16,24
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c53
++device.name 3D Rage L Mobility
++driver.xfree 4|ati|||||8,15,16,24
+
+ vendor.id pci 0x1002
+&device.id pci 0x4c54
++device.name 264LT [Mach64 LT]
++driver.xfree 4|ati|||||8,15,16,24
+
+ vendor.id pci 0x1002
+&device.id pci 0x5354
++device.name Mach 64 VT
++driver.xfree 4|ati|||||8,15,16,24
+
+ vendor.id pci 0x1002
+&device.id pci 0x5354
+&subvendor.id pci 0x1002
+&subdevice.id pci 0x5654
++subdevice.name Mach 64 reference
+
+ vendor.id pci 0x1002
+&device.id pci 0x5655
++device.name 264VT3 [Mach64 VT3]
++driver.xfree 4|ati|||||8,15,16,24
+
+ vendor.id pci 0x1002
+&device.id pci 0x5656
++device.name 264VT4 [Mach64 VT4]
++driver.xfree 4|ati|||||8,15,16,24
+
+ vendor.id pci 0x104c
++vendor.name Texas Instruments
+
+ vendor.id pci 0x104c
+&device.id pci 0x3d04
++device.name TVP4010 [Permedia]
++driver.xfree 4|glint|||||8,15,16,24
+
+ vendor.id pci 0x104c
+&device.id pci 0x3d07
++device.name TVP4020 [Permedia 2]
++driver.xfree 4|glint|||||8,15,16,24
+
+ vendor.id pci 0x3d3d
++vendor.name 3DLabs
+
+ vendor.id pci 0x3d3d
+&device.id pci 0x0004
++device.name Permedia
++driver.xfree 4|glint|||||8,15,16,24
+
+ vendor.id pci 0x3d3d
+&device.id pci 0x0007
++device.name 3D Extreme
++driver.xfree 4|glint|||||8,15,16,24
+
+ vendor.id pci 0x3d3d
+&device.id pci 0x0009
++device.name Permedia II 2D+3D
++driver.xfree 4|glint|||||8,15,16,24
+
+ vendor.id special 0x4001
++vendor.name Sun Microsystems
+
+ vendor.id special 0x4001
+&device.id special 0x0001
++device.name Sun|Monochrome (bwtwo)
++driver.xfree 4|sunbw2
+
+ vendor.id special 0x4001
+&device.id special 0x0002
++device.name Sun|Color3 (cgthree)
++driver.xfree 4|suncg3|||||8
+
+ vendor.id special 0x4001
+&device.id special 0x0008
++device.name Sun|Double width GX (cgsix)
++driver.xfree 4|suncg6|||||8
+
+ vendor.id special 0x4001
+&device.id special 0x0009
++device.name Sun|Single width GX (cgsix)
++driver.xfree 4|suncg6|||||8
+
+ vendor.id special 0x4001
+&device.id special 0x000a
++device.name Sun|Turbo GX with 1M VSIMM (cgsix)
++driver.xfree 4|suncg6|||||8
+
+ vendor.id special 0x4001
+&device.id special 0x000b
++device.name Sun|Turbo GX Plus (cgsix)
++driver.xfree 4|suncg6|||||8
+
+ vendor.id special 0x4001
+&device.id special 0x000c
++device.name Sun|Turbo GX (cgsix)
++driver.xfree 4|suncg6
+
+ vendor.id special 0x4001
+&device.id special 0x000d
++device.name Sun|Unknown GX (cgsix)
++driver.xfree 4|suncg6|||||8
+
+ vendor.id special 0x4001
+&device.id special 0x000e
++device.name Sun|SX with 4M VSIMM (cgfourteen)
++driver.xfree 4|suncg14|||||32
+
+ vendor.id special 0x4001
+&device.id special 0x000f
++device.name Sun|SX with 8M VSIMM (cgfourteen)
++driver.xfree 4|suncg14|||||32
+
+ vendor.id special 0x4001
+&device.id special 0x0010
++device.name Sun|SX (cgfourteen)
++driver.xfree 4|suncg14|||||32
+
+ vendor.id special 0x4001
+&device.id special 0x0011
++device.name Sun|ZX or Turbo ZX (leo)
++driver.xfree 4|sunleo|||||32
+
+ vendor.id special 0x4001
+&device.id special 0x0012
++device.name Sun|Turbo ZX (leo)
++driver.xfree 4|sunleo|||||32
+
+ vendor.id special 0x4001
+&device.id special 0x0013
++device.name Sun|TCX (8bit)
++driver.xfree 4|suntcx|||||8
+
+ vendor.id special 0x4001
+&device.id special 0x0014
++device.name Sun|TCX (S24)
++driver.xfree 4|suntcx
+
+ vendor.id special 0x4001
+&device.id special 0x0015
++device.name Sun|Elite3D-M6 Horizontal (afb)
++driver.xfree 4|sunffb|||||24
+
+ vendor.id special 0x4001
+&device.id special 0x0016
++device.name Sun|Elite3D (afb)
++driver.xfree 4|sunffb|||||24
+
+ vendor.id special 0x4001
+&device.id special 0x0017
++device.name Sun|FFB 67MHz Creator (ffb)
++driver.xfree 4|sunffb|||||8,24
++driver.xfree 4|sunffb|3d||dri||8,24||switch2xf86_glx
++requires xf86_glx
+
+ vendor.id special 0x4001
+&device.id special 0x0018
++device.name Sun|FFB 67MHz Creator 3D (ffb)
++driver.xfree 4|sunffb|||||8,24
++driver.xfree 4|sunffb|3d||dri||8,24||switch2xf86_glx
++requires xf86_glx
+
+ vendor.id special 0x4001
+&device.id special 0x0019
++device.name Sun|FFB 75MHz Creator 3D (ffb)
++driver.xfree 4|sunffb|||||8,24
++driver.xfree 4|sunffb|3d||dri||8,24||switch2xf86_glx
++requires xf86_glx
+
+ vendor.id special 0x4001
+&device.id special 0x001a
++device.name Sun|FFB2 Vertical Creator (ffb)
++driver.xfree 4|sunffb|||||8,24
++driver.xfree 4|sunffb|3d||dri||8,24||switch2xf86_glx
++requires xf86_glx
+
+ vendor.id special 0x4001
+&device.id special 0x001b
++device.name Sun|FFB2 Vertical Creator 3D (ffb)
++driver.xfree 4|sunffb|||||8,24
++driver.xfree 4|sunffb|3d||dri||8,24||switch2xf86_glx
++requires xf86_glx
+
+ vendor.id special 0x4001
+&device.id special 0x001c
++device.name Sun|FFB2+ Vertical Creator (ffb)
++driver.xfree 4|sunffb|||||8,24
++driver.xfree 4|sunffb|3d||dri||8,24||switch2xf86_glx
++requires xf86_glx
+
+ vendor.id special 0x4001
+&device.id special 0x001d
++device.name Sun|FFB2+ Vertical Creator 3D (ffb)
++driver.xfree 4|sunffb|||||8,24
++driver.xfree 4|sunffb|3d||dri||8,24||switch2xf86_glx
++requires xf86_glx
+
+ vendor.id special 0x4001
+&device.id special 0x001e
++device.name Sun|FFB2 Horizontal Creator (ffb)
++driver.xfree 4|sunffb|||||8,24
++driver.xfree 4|sunffb|3d||dri||8,24||switch2xf86_glx
++requires xf86_glx
+
+ vendor.id special 0x4001
+&device.id special 0x001f
++device.name Sun|FFB2 Horizontal Creator 3D (ffb)
++driver.xfree 4|sunffb|||||8,24
++driver.xfree 4|sunffb|3d||dri||8,24||switch2xf86_glx
++requires xf86_glx
+
+ vendor.id special 0x4001
+&device.id special 0x0020
++device.name Sun|FFB [unknown type] (ffb)
++driver.xfree 4|sunffb|||||8,24
++driver.xfree 4|sunffb|3d||dri||8,24||switch2xf86_glx
++requires xf86_glx
+
--- /dev/null
+#! /usr/bin/perl
+
+mkdir "tmp", 0755;
+
+system "./cdb_x11";
+
+unlink "tmp/x11.hwinfo.all", "tmp/x11.hwinfo.s390";
+
+chdir "tmp";
+
+for (<x11.hwinfo.*>) {
+ chomp;
+ $in = $_;
+ s/hwinfo\.//;
+ $out = $_;
+ system "../convert_hd $in";
+ system "../check_hd --sort --check --join-keys-first --split --log=$out.log --out=$out hd.ids";
+ rename $out, "../src/$out";
+}
+
+chdir "..";
+
+system "rm -rf tmp";
--- /dev/null
+/* $XConsortium: AsmMacros.h /main/13 1996/10/25 11:33:12 kaleb $ */
+/*
+ * (c) Copyright 1993,1994 by David Wexelblat <dwex@xfree86.org>
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * DAVID WEXELBLAT BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
+ * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *
+ * Except as contained in this notice, the name of David Wexelblat shall not be
+ * used in advertising or otherwise to promote the sale, use or other dealings
+ * in this Software without prior written authorization from David Wexelblat.
+ *
+ */
+/*
+ * Copyright 1997
+ * Digital Equipment Corporation. All rights reserved.
+ * This software is furnished under license and may be used and copied only in
+ * accordance with the following terms and conditions. Subject to these
+ * conditions, you may download, copy, install, use, modify and distribute
+ * this software in source and/or binary form. No title or ownership is
+ * transferred hereby.
+ *
+ * 1) Any source code used, modified or distributed must reproduce and retain
+ * this copyright notice and list of conditions as they appear in the source
+ * file.
+ *
+ * 2) No right is granted to use any trade name, trademark, or logo of Digital
+ * Equipment Corporation. Neither the "Digital Equipment Corporation" name
+ * nor any trademark or logo of Digital Equipment Corporation may be used
+ * to endorse or promote products derived from this software without the
+ * prior written permission of Digital Equipment Corporation.
+ *
+ * 3) This software is provided "AS-IS" and any express or implied warranties,
+ * including but not limited to, any implied warranties of merchantability,
+ * fitness for a particular purpose, or non-infringement are disclaimed. In
+ * no event shall DIGITAL be liable for any damages whatsoever, and in
+ * particular, DIGITAL shall not be liable for special, indirect,
+ * consequential, or incidental damages or damages for
+ * lost profits, loss of revenue or loss of use, whether such damages arise
+ * in contract,
+ * negligence, tort, under statute, in equity, at law or otherwise, even if
+ * advised of the possibility of such damage.
+ *
+ */
+
+/* $XFree86: xc/programs/Xserver/hw/xfree86/SuperProbe/AsmMacros.h,v 3.14 1999/09/25 14:36:58 dawes Exp $ */
+
+
+#if defined(__GNUC__)
+
+#if defined(linux) && (defined(__alpha__) || defined(__ia64__))
+
+#include <sys/io.h>
+
+#undef inb
+#undef inw
+#undef inl
+#undef outb
+#undef outw
+#undef outl
+
+static __inline__ unsigned int inb(unsigned long int p) { return _inb(p); };
+static __inline__ unsigned int inw(unsigned long int p) { return _inw(p); };
+static __inline__ unsigned int inl(unsigned long int p) { return _inl(p); };
+static __inline__ void outb(unsigned long int p, unsigned char v) { _outb(v,p); };
+static __inline__ void outw(unsigned long int p, unsigned short v) { _outw(v,p); };
+static __inline__ void outl(unsigned long int p, unsigned int v) { _outl(v,p); };
+
+#else
+
+#if defined(__sparc__)
+#ifndef ASI_PL
+#define ASI_PL 0x88
+#endif
+
+static __inline__ void
+outb(port, val)
+unsigned long port;
+char val;
+{
+ __asm__ __volatile__("stba %0, [%1] %2" : : "r" (val), "r" (port), "i" (ASI_PL));
+}
+
+static __inline__ void
+outw(port, val)
+unsigned long port;
+char val;
+{
+ __asm__ __volatile__("stha %0, [%1] %2" : : "r" (val), "r" (port), "i" (ASI_PL));
+}
+
+static __inline__ void
+outl(port, val)
+unsigned long port;
+char val;
+{
+ __asm__ __volatile__("sta %0, [%1] %2" : : "r" (val), "r" (port), "i" (ASI_PL));
+}
+
+static __inline__ unsigned int
+inb(port)
+unsigned long port;
+{
+ unsigned char ret;
+ __asm__ __volatile__("lduba [%1] %2, %0" : "=r" (ret) : "r" (port), "i" (ASI_PL));
+ return ret;
+}
+
+static __inline__ unsigned int
+inw(port)
+unsigned long port;
+{
+ unsigned char ret;
+ __asm__ __volatile__("lduha [%1] %2, %0" : "=r" (ret) : "r" (port), "i" (ASI_PL));
+ return ret;
+}
+
+static __inline__ unsigned int
+inl(port)
+unsigned long port;
+{
+ unsigned char ret;
+ __asm__ __volatile__("lda [%1] %2, %0" : "=r" (ret) : "r" (port), "i" (ASI_PL));
+ return ret;
+}
+#else
+#ifdef __arm32__
+unsigned int IOPortBase; /* Memory mapped I/O port area */
+
+static __inline__ void
+outb(port, val)
+ short port;
+ char val;
+{
+ if ((unsigned short)port >= 0x400) return;
+
+ *(volatile unsigned char*)(((unsigned short)(port))+IOPortBase) = val;
+}
+
+static __inline__ void
+outw(port, val)
+ short port;
+ short val;
+{
+ if ((unsigned short)port >= 0x400) return;
+
+ *(volatile unsigned short*)(((unsigned short)(port))+IOPortBase) = val;
+}
+
+static __inline__ void
+outl(port, val)
+ short port;
+ int val;
+{
+ if ((unsigned short)port >= 0x400) return;
+
+ *(volatile unsigned long*)(((unsigned short)(port))+IOPortBase) = val;
+}
+
+static __inline__ unsigned int
+inb(port)
+ short port;
+{
+ if ((unsigned short)port >= 0x400) return((unsigned int)-1);
+
+ return(*(volatile unsigned char*)(((unsigned short)(port))+IOPortBase));
+}
+
+static __inline__ unsigned int
+inw(port)
+ short port;
+{
+ if ((unsigned short)port >= 0x400) return((unsigned int)-1);
+
+ return(*(volatile unsigned short*)(((unsigned short)(port))+IOPortBase));
+}
+
+static __inline__ unsigned int
+inl(port)
+ short port;
+{
+ if ((unsigned short)port >= 0x400) return((unsigned int)-1);
+
+ return(*(volatile unsigned long*)(((unsigned short)(port))+IOPortBase));
+}
+#else /* __arm32__ */
+#if defined(Lynx) && defined(__powerpc__)
+extern unsigned char *ioBase;
+
+static volatile void
+eieio()
+{
+ __asm__ __volatile__ ("eieio");
+}
+
+static void
+outb(port, value)
+short port;
+unsigned char value;
+{
+ *(uchar *)(ioBase + port) = value; eieio();
+}
+
+static void
+outw(port, value)
+short port;
+unsigned short value;
+{
+ *(unsigned short *)(ioBase + port) = value; eieio();
+}
+
+static void
+outl(port, value)
+short port;
+unsigned long value;
+{
+ *(unsigned long *)(ioBase + port) = value; eieio();
+}
+
+static unsigned char
+inb(port)
+short port;
+{
+ unsigned char val;
+
+ val = *((unsigned char *)(ioBase + port)); eieio();
+ return(val);
+}
+
+static unsigned short
+inw(port)
+short port;
+{
+ unsigned short val;
+
+ val = *((unsigned short *)(ioBase + port)); eieio();
+ return(val);
+}
+
+static unsigned long
+inl(port)
+short port;
+{
+ unsigned long val;
+
+ val = *((unsigned long *)(ioBase + port)); eieio();
+ return(val);
+}
+
+#else
+#if defined(__FreeBSD__) && defined(__alpha__)
+
+#include <sys/types.h>
+
+extern void outb(u_int32_t port, u_int8_t val);
+extern void outw(u_int32_t port, u_int16_t val);
+extern void outl(u_int32_t port, u_int32_t val);
+extern u_int8_t inb(u_int32_t port);
+extern u_int16_t inw(u_int32_t port);
+extern u_int32_t inl(u_int32_t port);
+
+#else
+#ifdef GCCUSESGAS
+static __inline__ void
+outb(port, val)
+short port;
+char val;
+{
+ __asm__ __volatile__("outb %0,%1" : :"a" (val), "d" (port));
+}
+
+static __inline__ void
+outw(port, val)
+short port;
+short val;
+{
+ __asm__ __volatile__("outw %0,%1" : :"a" (val), "d" (port));
+}
+
+static __inline__ void
+outl(port, val)
+short port;
+unsigned int val;
+{
+ __asm__ __volatile__("outl %0,%1" : :"a" (val), "d" (port));
+}
+
+static __inline__ unsigned int
+inb(port)
+short port;
+{
+ unsigned char ret;
+ __asm__ __volatile__("inb %1,%0" :
+ "=a" (ret) :
+ "d" (port));
+ return ret;
+}
+
+static __inline__ unsigned int
+inw(port)
+short port;
+{
+ unsigned short ret;
+ __asm__ __volatile__("inw %1,%0" :
+ "=a" (ret) :
+ "d" (port));
+ return ret;
+}
+
+static __inline__ unsigned int
+inl(port)
+short port;
+{
+ unsigned int ret;
+ __asm__ __volatile__("inl %1,%0" :
+ "=a" (ret) :
+ "d" (port));
+ return ret;
+}
+
+#else /* GCCUSESGAS */
+
+static __inline__ void
+outb(port, val)
+ short port;
+ char val;
+{
+ __asm__ __volatile__("out%B0 (%1)" : :"a" (val), "d" (port));
+}
+
+static __inline__ void
+outw(port, val)
+ short port;
+ short val;
+{
+ __asm__ __volatile__("out%W0 (%1)" : :"a" (val), "d" (port));
+}
+
+static __inline__ void
+outl(port, val)
+ short port;
+ unsigned int val;
+{
+ __asm__ __volatile__("out%L0 (%1)" : :"a" (val), "d" (port));
+}
+
+static __inline__ unsigned int
+inb(port)
+ short port;
+{
+ unsigned int ret;
+ __asm__ __volatile__("in%B0 (%1)" :
+ "=a" (ret) :
+ "d" (port));
+ return ret;
+}
+
+static __inline__ unsigned int
+inw(port)
+ short port;
+{
+ unsigned int ret;
+ __asm__ __volatile__("in%W0 (%1)" :
+ "=a" (ret) :
+ "d" (port));
+ return ret;
+}
+
+static __inline__ unsigned int
+inl(port)
+ short port;
+{
+ unsigned int ret;
+ __asm__ __volatile__("in%L0 (%1)" :
+ "=a" (ret) :
+ "d" (port));
+ return ret;
+}
+
+#endif /* GCCUSESGAS */
+#endif /* Lynx && __powerpc__ */
+#endif /* arm32 */
+#endif /* linux && __sparc__ */
+#endif /* linux && __alpha__ */
+#endif /* __FreeBSD__ && __alpha__ */
+
+#if defined(linux) || defined(__arm32__) || (defined(Lynx) && defined(__powerpc__))
+
+#define intr_disable()
+#define intr_enable()
+
+#else
+
+static __inline__ void
+intr_disable()
+{
+ __asm__ __volatile__("cli");
+}
+
+static __inline__ void
+intr_enable()
+{
+ __asm__ __volatile__("sti");
+}
+
+#endif /* else !linux && !__arm32__ */
+
+#else /* __GNUC__ */
+
+#if defined(_MINIX) && defined(_ACK)
+
+/* inb, outb, inw and outw are defined in the library */
+/* ... but I've no idea if the same is true for inl & outl */
+
+u8_t inb(U16_t);
+void outb(U16_t, U8_t);
+u16_t inw(U16_t);
+void outw(U16_t, U16_t);
+u32_t inl(U16_t);
+void outl(U16_t, U32_t);
+
+#else /* not _MINIX and _ACK */
+
+# if defined(__STDC__) && (__STDC__ == 1)
+# ifndef NCR
+# define asm __asm
+# endif
+# endif
+# ifdef SVR4
+# include <sys/types.h>
+# ifndef __USLC__
+# define __USLC__
+# endif
+# endif
+#ifndef SCO325
+# include <sys/inline.h>
+#else
+# include "../common/scoasm.h"
+#endif
+#define intr_disable() asm("cli")
+#define intr_enable() asm("sti")
+
+#endif /* _MINIX and _ACK */
+#endif /* __GNUC__ */
--- /dev/null
+TOPDIR = ../..
+TARGETS = $(LIBHD_D)
+
+include $(TOPDIR)/Makefile.common
+
+$(LIBHD_D): $(OBJS)
+ ar r $(LIBHD) $?
--- /dev/null
+
+This is a preliminary version of a VGA softbooter for LINUX.
+
+It makes use of the of the vm86() call and is therefore only
+usable on ix86 systems.
+There are plans to port this program to use a x86 emulator
+like x86emu. Also it may be ported to other operating systems.
+
+So far it has been tested on a small number of cards. It might
+well be that it will fail on your card.
+
+If you need to make modifications to the programs to be able
+to boot your card please let the author know.
+
+So far there is no command line interface. All options need
+to be hardcoded. You can do this by editing debug.h. You can
+turn on a bunch of debug output. Other options allow you to
+boot the primary card (CONFIG_ACTIVE_DEVICE), save the bios
+to a file (SAVE_BIOS), and map the original system bios
+(MAP_SYS_BIOS).
+
+The author wants to thank
+ Hans Lermen (dosemu)
+ and
+ Kendall Bennett (x86emu)
+for their support.
+
+Parts of the code - especially in v86.c and io.c - are based on code
+taken from dosemu. Parts of the code in int.c are based on code taken
+from x86emu
+
+Egbert Eich. <Egbert.Eich@Physik.TU-Darmstadt.DE>
+
+
+
--- /dev/null
+#include <stdio.h>
+#include <stdarg.h>
+#ifdef __i386__
+#include <sys/vm86.h>
+#else
+#include "vm86_struct.h"
+#endif
+
+#define INT2PTR(a) ((a) + (unsigned char *) 0)
+
+#include "../x86emu/include/x86emu.h"
+#include "AsmMacros.h"
+
+int emu_vm86_ret;
+
+static u8 Mem_rb(u32 addr) {
+ return *(u8 *)(INT2PTR(addr));
+}
+static void Mem_wb(u32 addr, u8 val) {
+ *(u8 *)INT2PTR(addr) = val;
+}
+#ifdef __ia64__
+
+static u16 Mem_rw(u32 addr) {
+ return *(u8 *)INT2PTR(addr) | *(u8 *)INT2PTR(addr + 1) << 8;
+}
+static u32 Mem_rl(u32 addr) {
+ return *(u8 *)INT2PTR(addr) | *(u8 *)INT2PTR(addr + 1) << 8 |
+ *(u8 *)INT2PTR(addr + 2) << 16 | *(u8 *)INT2PTR(addr + 3) << 24;
+}
+static void Mem_ww(u32 addr, u16 val) {
+ *(u8 *)INT2PTR(addr) = val;
+ *(u8 *)INT2PTR(addr + 1) = val >> 8;
+}
+static void Mem_wl(u32 addr, u32 val) {
+ *(u8 *)INT2PTR(addr) = val;
+ *(u8 *)INT2PTR(addr + 1) = val >> 8;
+ *(u8 *)INT2PTR(addr + 2) = val >> 16;
+ *(u8 *)INT2PTR(addr + 3) = val >> 24;
+}
+
+#else
+
+static u16 Mem_rw(u32 addr) {
+ return *(u16 *)INT2PTR(addr);
+}
+static u32 Mem_rl(u32 addr) {
+ return *(u32 *)INT2PTR(addr);
+}
+static void Mem_ww(u32 addr, u16 val) {
+ *(u16 *)INT2PTR(addr) = val;
+}
+static void Mem_wl(u32 addr, u32 val) {
+ *(u32 *)INT2PTR(addr) = val;
+}
+
+#endif
+
+static void do_int(int num) {
+ emu_vm86_ret = VM86_INTx | (num << 8);
+ M.x86.intr = INTR_HALTED;
+}
+
+
+static u8 deb_inb(X86EMU_pioAddr addr)
+{
+ u8 u;
+
+ u = inb(addr);
+ fprintf(stderr, "%04x:%04x inb %04x = %02x\n", M.x86.R_CS, (unsigned) M.x86.R_EIP, addr, u);
+
+ return u;
+}
+
+static u16 deb_inw(X86EMU_pioAddr addr)
+{
+ u16 u;
+
+ u = inw(addr);
+ fprintf(stderr, "%04x:%04x inw %04x = %04x\n", M.x86.R_CS, (unsigned) M.x86.R_EIP, addr, u);
+
+ return u;
+}
+
+static u32 deb_inl(X86EMU_pioAddr addr)
+{
+ u32 u;
+
+ u = inl(addr);
+ fprintf(stderr, "%04x:%04x inl %04x = %08x\n", M.x86.R_CS, (unsigned) M.x86.R_EIP, addr, (unsigned) u);
+
+ return u;
+}
+
+static void deb_outb(X86EMU_pioAddr addr, u8 val)
+{
+ fprintf(stderr, "%04x:%04x outb %04x, %02x\n", M.x86.R_CS, (unsigned) M.x86.R_EIP, addr, val);
+ outb(addr, val);
+}
+
+static void deb_outw(X86EMU_pioAddr addr, u16 val)
+{
+ fprintf(stderr, "%04x:%04x outw %04x, %04x\n", M.x86.R_CS, (unsigned) M.x86.R_EIP, addr, val);
+ outw(addr, val);
+}
+
+static void deb_outl(X86EMU_pioAddr addr, u32 val)
+{
+ fprintf(stderr, "%04x:%04x outl %04x, %08x\n", M.x86.R_CS, (unsigned) M.x86.R_EIP, addr, (unsigned) val);
+ outl(addr, val);
+}
+
+int
+emu_vm86(struct vm86_struct *vm, unsigned debug)
+{
+ int i;
+ unsigned timeout;
+
+ X86EMU_memFuncs memFuncs;
+ X86EMU_intrFuncs intFuncs[256];
+ X86EMU_pioFuncs pioFuncs;
+
+ memFuncs.rdb = Mem_rb;
+ memFuncs.rdw = Mem_rw;
+ memFuncs.rdl = Mem_rl;
+ memFuncs.wrb = Mem_wb;
+ memFuncs.wrw = Mem_ww;
+ memFuncs.wrl = Mem_wl;
+ X86EMU_setupMemFuncs(&memFuncs);
+
+if(debug) {
+ pioFuncs.inb = deb_inb;
+ pioFuncs.inw = deb_inw;
+ pioFuncs.inl = deb_inl;
+ pioFuncs.outb = deb_outb;
+ pioFuncs.outw = deb_outw;
+ pioFuncs.outl = deb_outl;
+} else {
+ pioFuncs.inb = (u8(*)(u16))inb;
+ pioFuncs.inw = (u16(*)(u16))inw;
+ pioFuncs.inl = (u32(*)(u16))inl;
+ pioFuncs.outb = (void(*)(u16, u8))outb;
+ pioFuncs.outw = (void(*)(u16, u16))outw;
+ pioFuncs.outl = (void(*)(u16, u32))outl;
+}
+ X86EMU_setupPioFuncs(&pioFuncs);
+
+ for (i=0;i<256;i++)
+ intFuncs[i] = do_int;
+ X86EMU_setupIntrFuncs(intFuncs);
+
+ M.mem_base = 0;
+ M.mem_size = 1024*1024 + 1024;
+
+ M.x86.R_EAX = vm->regs.eax;
+ M.x86.R_EBX = vm->regs.ebx;
+ M.x86.R_ECX = vm->regs.ecx;
+ M.x86.R_EDX = vm->regs.edx;
+
+ M.x86.R_ESP = vm->regs.esp;
+ M.x86.R_EBP = vm->regs.ebp;
+ M.x86.R_ESI = vm->regs.esi;
+ M.x86.R_EDI = vm->regs.edi;
+ M.x86.R_EIP = vm->regs.eip;
+ M.x86.R_EFLG = vm->regs.eflags;
+
+ M.x86.R_CS = vm->regs.cs;
+ M.x86.R_DS = vm->regs.ds;
+ M.x86.R_SS = vm->regs.ss;
+ M.x86.R_ES = vm->regs.es;
+ M.x86.R_FS = vm->regs.fs;
+ M.x86.R_GS = vm->regs.gs;
+
+ emu_vm86_ret = 0;
+ /* set timeout, 20s normal, 60s for debugging */
+ timeout = debug ? (1 << 31) + 60 : 20;
+ X86EMU_exec(timeout);
+
+ vm->regs.eax = M.x86.R_EAX;
+ vm->regs.ebx = M.x86.R_EBX;
+ vm->regs.ecx = M.x86.R_ECX;
+ vm->regs.edx = M.x86.R_EDX;
+
+ vm->regs.esp = M.x86.R_ESP;
+ vm->regs.ebp = M.x86.R_EBP;
+ vm->regs.esi = M.x86.R_ESI;
+ vm->regs.edi = M.x86.R_EDI;
+ vm->regs.eip = M.x86.R_EIP;
+ vm->regs.eflags = M.x86.R_EFLG;
+
+ vm->regs.cs = M.x86.R_CS;
+ vm->regs.ds = M.x86.R_DS;
+ vm->regs.ss = M.x86.R_SS;
+ vm->regs.es = M.x86.R_ES;
+ vm->regs.fs = M.x86.R_FS;
+ vm->regs.gs = M.x86.R_GS;
+
+ if (emu_vm86_ret == 0 && *(unsigned char *)INT2PTR(((u32)M.x86.R_CS << 4) + (M.x86.R_IP - 1)) == 0xf4)
+ {
+ vm->regs.eip--;
+ return VM86_UNKNOWN;
+ }
+ return emu_vm86_ret ? emu_vm86_ret : -1;
+}
+
+void
+printk(const char *fmt, ...)
+{
+ va_list argptr;
+ va_start(argptr, fmt);
+ vfprintf(stderr, fmt, argptr);
+ va_end(argptr);
+}
+
--- /dev/null
+/*
+ * Copyright 1999 Egbert Eich
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of the authors not be used in
+ * advertising or publicity pertaining to distribution of the software without
+ * specific, written prior permission. The authors makes no representations
+ * about the suitability of this software for any purpose. It is provided
+ * "as is" without express or implied warranty.
+ *
+ * THE AUTHORS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+#if defined(__alpha__) || defined (__ia64__)
+#include <sys/io.h>
+#endif
+
+#include "v86bios.h"
+#include "AsmMacros.h"
+#include "pci.h"
+
+static int int1A_handler(struct regs86 *regs);
+static int int42_handler(int num, struct regs86 *regs);
+
+int
+int_handler(int num, struct regs86 *regs)
+{
+ switch (num) {
+ case 0x10:
+ case 0x42:
+ return (int42_handler(num,regs));
+ case 0x1A:
+ return (int1A_handler(regs));
+ default:
+ return 0;
+ }
+ return 0;
+}
+
+static int
+int42_handler(int num,struct regs86 *regs)
+{
+ unsigned char c;
+ CARD32 val;
+
+ /*
+ * video bios has modified these -
+ * leave it to the video bios to do this
+ */
+
+ val = getIntVect(num);
+ if (val != 0xF000F065)
+ return 0;
+
+ if ((regs->ebx & 0xff) == 0x32) {
+ switch (regs->eax & 0xFFFF) {
+ case 0x1200:
+ c = inb(0x3cc);
+ c |= 0x02;
+ outb(0x3c2,c);
+ return 1;
+ case 0x1201:
+ c = inb(0x3cc);
+ c &= ~0x02;
+ outb(0x3c2,c);
+ return 1;
+ }
+ }
+ if (num == 0x42)
+ return 1;
+ else
+ return 0;
+}
+
+#define SUCCESSFUL 0x00
+#define DEVICE_NOT_FOUND 0x86
+#define BAD_REGISTER_NUMBER 0x87
+
+static int
+int1A_handler(struct regs86 *regs)
+{
+ CARD32 Slot;
+// PciStructPtr pPci;
+
+ if (! CurrentPci) return 0; /* oops */
+
+ switch (regs->eax & 0xFFFF) {
+ case 0xb101:
+ regs->eax &= 0xFF00; /* no config space/special cycle support */
+ regs->edx = 0x20494350; /* " ICP" */
+ regs->ebx = 0x0210; /* Version 2.10 */
+ regs->ecx &= 0xFF00;
+ regs->ecx |= (pciMaxBus & 0xFF); /* Max bus number in system */
+ regs->eflags &= ~((unsigned long)0x01); /* clear carry flag */
+ return 1;
+ case 0xb102:
+ if (((regs->edx & 0xFFFF) == CurrentPci->VendorID) &&
+ ((regs->ecx & 0xFFFF) == CurrentPci->DeviceID) &&
+ (regs->esi == 0)) {
+ regs->eax = (regs->eax & 0x00FF) | (SUCCESSFUL << 8);
+ regs->eflags &= ~((unsigned long)0x01); /* clear carry flag */
+ regs->ebx = pciSlotBX(CurrentPci);
+ } else {
+ regs->eax = (regs->eax & 0x00FF) | (DEVICE_NOT_FOUND << 8);
+ regs->eflags |= ((unsigned long)0x01); /* set carry flag */
+ }
+ return 1;
+ case 0xb103:
+ if (((regs->ecx & 0xFF) == CurrentPci->Interface) &&
+ (((regs->ecx & 0xFF00) >> 8) == CurrentPci->SubClass) &&
+ (((regs->ecx & 0xFFFF0000) >> 16) == CurrentPci->BaseClass) &&
+ ((regs->esi & 0xff) == 0)) {
+ regs->eax = (regs->eax & 0x00FF) | (SUCCESSFUL << 8);
+ regs->ebx = pciSlotBX(CurrentPci);
+ regs->eflags &= ~((unsigned long)0x01); /* clear carry flag */
+ } else {
+ regs->eax = (regs->eax & 0x00FF) | (DEVICE_NOT_FOUND << 8);
+ regs->eflags |= ((unsigned long)0x01); /* set carry flag */
+ }
+ return 1;
+ case 0xb108:
+ if ((Slot = findPci(regs->ebx))) {
+ regs->ecx &= 0xFFFFFF00;
+ regs->ecx |= PciRead8(regs->edi,Slot);
+ regs->eax = (regs->eax & 0x00FF) | (SUCCESSFUL << 8);
+ regs->eflags &= ~((unsigned long)0x01); /* clear carry flag */
+ } else {
+ regs->eax = (regs->eax & 0x00FF) | (BAD_REGISTER_NUMBER << 8);
+ regs->eflags |= ((unsigned long)0x01); /* set carry flag */
+ }
+ return 1;
+ case 0xb109:
+ if ((Slot = findPci(regs->ebx))) {
+ regs->ecx &= 0xFFFF0000;
+ regs->ecx |= PciRead16(regs->edi,Slot);
+ regs->eax = (regs->eax & 0x00FF) | (SUCCESSFUL << 8);
+ regs->eflags &= ~((unsigned long)0x01); /* clear carry flag */
+ } else {
+ regs->eax = (regs->eax & 0x00FF) | (BAD_REGISTER_NUMBER << 8);
+ regs->eflags |= ((unsigned long)0x01); /* set carry flag */
+ }
+ return 1;
+ case 0xb10a:
+ if ((Slot = findPci(regs->ebx))) {
+ regs->ecx &= 0;
+ regs->ecx |= PciRead32(regs->edi,Slot);
+ regs->eax = (regs->eax & 0x00FF) | (SUCCESSFUL << 8);
+ regs->eflags &= ~((unsigned long)0x01); /* clear carry flag */
+ } else {
+ regs->eax = (regs->eax & 0x00FF) | (BAD_REGISTER_NUMBER << 8);
+ regs->eflags |= ((unsigned long)0x01); /* set carry flag */
+ }
+ return 1;
+ case 0xb10b:
+ if ((Slot = findPci(regs->ebx))) {
+ PciWrite8(regs->edi,(CARD8)regs->ecx,Slot);
+ regs->eax = (regs->eax & 0x00FF) | (SUCCESSFUL << 8);
+ regs->eflags &= ~((unsigned long)0x01); /* clear carry flag */
+ } else {
+ regs->eax = (regs->eax & 0x00FF) | (BAD_REGISTER_NUMBER << 8);
+ regs->eflags |= ((unsigned long)0x01); /* set carry flag */
+ }
+ return 1;
+ case 0xb10c:
+ if ((Slot = findPci(regs->ebx))) {
+ PciWrite16(regs->edi,(CARD16)regs->ecx,Slot);
+ regs->eax = (regs->eax & 0x00FF) | (SUCCESSFUL << 8);
+ regs->eflags &= ~((unsigned long)0x01); /* clear carry flag */
+ } else {
+ regs->eax = (regs->eax & 0x00FF) | (BAD_REGISTER_NUMBER << 8);
+ regs->eflags |= ((unsigned long)0x01); /* set carry flag */
+ }
+ return 1;
+ case 0xb10d:
+ if ((Slot = findPci(regs->ebx))) {
+ PciWrite32(regs->edi,(CARD32)regs->ecx,Slot);
+ regs->eax = (regs->eax & 0x00FF) | (SUCCESSFUL << 8);
+ regs->eflags &= ~((unsigned long)0x01); /* clear carry flag */
+ } else {
+ regs->eax = (regs->eax & 0x00FF) | (BAD_REGISTER_NUMBER << 8);
+ regs->eflags |= ((unsigned long)0x01); /* set carry flag */
+ }
+ return 1;
+ default:
+ return 0;
+ }
+}
--- /dev/null
+/*
+ * Copyright 1999 Egbert Eich
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of the authors not be used in
+ * advertising or publicity pertaining to distribution of the software without
+ * specific, written prior permission. The authors makes no representations
+ * about the suitability of this software for any purpose. It is provided
+ * "as is" without express or implied warranty.
+ *
+ * THE AUTHORS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include <stdio.h>
+#if defined(__alpha__) || defined (__ia64__)
+#include <sys/io.h>
+#endif
+#include "AsmMacros.h"
+#include "v86bios.h"
+#include "pci.h"
+
+
+int
+port_rep_inb(CARD16 port, CARD8 *base, int d_f, CARD32 count)
+{
+ register int inc = d_f ? -1 : 1;
+ CARD8 *dst = base;
+
+ while (count--) {
+ *dst = inb(port);
+ dst += inc;
+ }
+ return (dst-base);
+}
+
+int
+port_rep_inw(CARD16 port, CARD16 *base, int d_f, CARD32 count)
+{
+ register int inc = d_f ? -1 : 1;
+ CARD16 *dst = base;
+
+ while (count--) {
+ *dst = inw(port);
+ dst += inc;
+ }
+ return (dst-base);
+}
+
+int
+port_rep_inl(CARD16 port, CARD32 *base, int d_f, CARD32 count)
+{
+ register int inc = d_f ? -1 : 1;
+ CARD32 *dst = base;
+
+ while (count--) {
+ *dst = inl(port);
+ dst += inc;
+ }
+ return (dst-base);
+}
+
+int
+port_rep_outb(CARD16 port, CARD8 *base, int d_f, CARD32 count)
+{
+ register int inc = d_f ? -1 : 1;
+ CARD8 *dst = base;
+
+ while (count--) {
+ outb(port,*dst);
+ dst += inc;
+ }
+ return (dst-base);
+}
+
+int
+port_rep_outw(CARD16 port, CARD16 *base, int d_f, CARD32 count)
+{
+ register int inc = d_f ? -1 : 1;
+ CARD16 *dst = base;
+
+ while (count--) {
+ outw(port,*dst);
+ dst += inc;
+ }
+ return (dst-base);
+}
+
+int
+port_rep_outl(CARD16 port, CARD32 *base, int d_f, CARD32 count)
+{
+ register int inc = d_f ? -1 : 1;
+ CARD32 *dst = base;
+
+ while (count--) {
+ outl(port,*dst);
+ dst += inc;
+ }
+ return (dst-base);
+}
--- /dev/null
+/*
+ * Copyright 1999 Egbert Eich
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of the authors not be used in
+ * advertising or publicity pertaining to distribution of the software without
+ * specific, written prior permission. The authors makes no representations
+ * about the suitability of this software for any purpose. It is provided
+ * "as is" without express or implied warranty.
+ *
+ * THE AUTHORS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+#include <fcntl.h>
+#include <unistd.h>
+#include <malloc.h>
+#include <stdio.h>
+#include <sys/mman.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <string.h>
+#if defined (__alpha__) || defined (__ia64__)
+#include <sys/io.h>
+#endif
+#include "AsmMacros.h"
+
+#include "pci.h"
+
+#define RESORT 1
+#define FIX_ROM 0
+
+/*
+ * I'm rather simple mindend - therefore I do a poor man's
+ * pci scan without all the fancy stuff that is done in
+ * scanpci. However that's all we need.
+ */
+
+PciStructPtr PciStruct = NULL;
+PciBusPtr PciBuses = NULL;
+PciStructPtr CurrentPci = NULL;
+PciStructPtr PciList = NULL;
+int pciMaxBus = 0;
+
+static CARD32 PciCfg1Addr;
+
+static void readConfigSpaceCfg1(CARD32 bus, CARD32 dev, CARD32 func,
+ CARD32 *reg);
+static int checkSlotCfg1(CARD32 bus, CARD32 dev, CARD32 func);
+static int checkSlotCfg2(CARD32 bus, int dev);
+static void readConfigSpaceCfg2(CARD32 bus, int dev, CARD32 *reg);
+static CARD8 interpretConfigSpace(CARD32 *reg, int busidx,
+ CARD8 dev, CARD8 func);
+static CARD32 findBIOSMap(PciStructPtr pciP, CARD32 *biosSize);
+static void restoreMem(PciStructPtr pciP);
+
+
+#ifdef __alpha__
+#define PCI_BUS_FROM_TAG(tag) (((tag) & 0x00ff0000) >> 16)
+#define PCI_DFN_FROM_TAG(tag) (((tag) & 0x0000ff00) >> 8)
+
+#include <asm/unistd.h>
+
+CARD32
+axpPciCfgRead(CARD32 tag)
+{
+ int bus, dfn;
+ CARD32 val = 0xffffffff;
+
+ bus = PCI_BUS_FROM_TAG(tag);
+ dfn = PCI_DFN_FROM_TAG(tag);
+
+ syscall(__NR_pciconfig_read, bus, dfn, tag & 0xff, 4, &val);
+ return(val);
+}
+
+void
+axpPciCfgWrite(CARD32 tag, CARD32 val)
+{
+ int bus, dfn;
+
+ bus = PCI_BUS_FROM_TAG(tag);
+ dfn = PCI_DFN_FROM_TAG(tag);
+
+ syscall(__NR_pciconfig_write, bus, dfn, tag & 0xff, 4, &val);
+}
+
+static CARD32 (*readPci)(CARD32 reg) = axpPciCfgRead;
+static void (*writePci)(CARD32 reg, CARD32 val) = axpPciCfgWrite;
+#else
+static CARD32 readPciCfg1(CARD32 reg);
+static void writePciCfg1(CARD32 reg, CARD32 val);
+#ifndef __ia64__
+static CARD32 readPciCfg2(CARD32 reg);
+static void writePciCfg2(CARD32 reg, CARD32 val);
+#endif
+
+static CARD32 (*readPci)(CARD32 reg) = readPciCfg1;
+static void (*writePci)(CARD32 reg, CARD32 val) = writePciCfg1;
+#endif
+
+#if defined(__alpha__) || defined(__sparc__)
+#define PCI_EN 0x00000000
+#else
+#define PCI_EN 0x80000000
+#endif
+
+
+static int numbus;
+static int hostbridges = 1;
+static unsigned long pciMinMemReg = ~0;
+
+
+
+void
+scan_pci(int pci_cfg_method)
+{
+ unsigned short configtype;
+
+ CARD32 reg[64];
+ int busidx;
+ CARD8 cardnum;
+ CARD8 func;
+ int idx;
+
+ PciStructPtr pci1;
+ PciBusPtr pci_b1,pci_b2;
+
+ if(pci_cfg_method) {
+ configtype = pci_cfg_method;
+ }
+ else {
+#if defined(__alpha__) || defined(__powerpc__) || defined(__sparc__) || defined(__ia64__)
+ configtype = 1;
+#else
+ CARD8 tmp1, tmp2;
+ CARD32 tmp32_1, tmp32_2;
+ outb(PCI_MODE2_ENABLE_REG, 0x00);
+ outb(PCI_MODE2_FORWARD_REG, 0x00);
+ tmp1 = inb(PCI_MODE2_ENABLE_REG);
+ tmp2 = inb(PCI_MODE2_FORWARD_REG);
+ if ((tmp1 == 0x00) && (tmp2 == 0x00)) {
+ configtype = 2;
+ readPci = readPciCfg2;
+ writePci = writePciCfg2;
+ } else {
+ tmp32_1 = inl(PCI_MODE1_ADDRESS_REG);
+ outl(PCI_MODE1_ADDRESS_REG, PCI_EN);
+ tmp32_2 = inl(PCI_MODE1_ADDRESS_REG);
+ outl(PCI_MODE1_ADDRESS_REG, tmp32_1);
+ if (tmp32_2 == PCI_EN) {
+ configtype = 1;
+ } else {
+ return;
+ }
+ }
+#endif
+ }
+
+ if (configtype == 1) {
+ busidx = 0;
+ numbus = 1;
+ idx = 0;
+ do {
+ for (cardnum = 0; cardnum < MAX_DEV_PER_VENDOR_CFG1; cardnum++) {
+ func = 0;
+ do {
+ /* loop over the different functions, if present */
+ if (!checkSlotCfg1(busidx,cardnum,func)) {
+ if (!func)
+ break;
+ else {
+ func++;
+ continue;
+ }
+ }
+ readConfigSpaceCfg1(busidx,cardnum,func,reg);
+
+ func = interpretConfigSpace(reg,busidx,
+ cardnum,func);
+
+ if (++idx >= MAX_PCI_DEVICES)
+ break;
+ } while (func < 8);
+ if (idx >= MAX_PCI_DEVICES)
+ break;
+ }
+ if (idx >= MAX_PCI_DEVICES)
+ break;
+ } while (++busidx < PCI_MAXBUS);
+#if defined(__alpha__) || defined(__powerpc__) || defined(__sparc__) || defined(__ia64__)
+ /* don't use outl() ;-) */
+#else
+ outl(PCI_MODE1_ADDRESS_REG, 0);
+#endif
+ } else {
+ int slot;
+
+ busidx = 0;
+ numbus = 1;
+ idx = 0;
+ do {
+ for (slot=0xc0; slot<0xd0; slot++) {
+ if (!checkSlotCfg2(busidx,slot))
+ break;
+ readConfigSpaceCfg2(busidx,slot,reg);
+
+ interpretConfigSpace(reg,busidx,
+ slot,0);
+ if (++idx >= MAX_PCI_DEVICES)
+ break;
+ }
+ if (idx >= MAX_PCI_DEVICES)
+ break;
+ } while (++busidx < PCI_MAXBUS);
+ }
+
+
+ pciMaxBus = numbus - 1;
+
+ /* link buses */
+ pci_b1 = PciBuses;
+ while (pci_b1) {
+ pci_b2 = PciBuses;
+ pci_b1->pBus = NULL;
+ while (pci_b2) {
+ if (pci_b1->primary == pci_b2->secondary)
+ pci_b1->pBus = pci_b2;
+ pci_b2 = pci_b2->next;
+ }
+ pci_b1 = pci_b1->next;
+ }
+ pci1 = PciStruct;
+ while (pci1) {
+ pci_b2 = PciBuses;
+ pci1->pBus = NULL;
+ while (pci_b2) {
+ if (pci1->bus == pci_b2->secondary)
+ pci1->pBus = pci_b2;
+ pci_b2 = pci_b2->next;
+ }
+ pci1 = pci1->next;
+ }
+ if (RESORT) {
+ PciStructPtr tmp = PciStruct, tmp1;
+ PciStruct = NULL;
+ while (tmp) {
+ tmp1 = tmp->next;
+ tmp->next = PciStruct;
+ PciStruct = tmp;
+ tmp = tmp1;
+ }
+ }
+ PciList = CurrentPci = PciStruct;
+}
+
+#ifndef __alpha__
+static CARD32
+readPciCfg1(CARD32 reg)
+{
+ CARD32 val;
+
+ outl(PCI_MODE1_ADDRESS_REG, reg);
+ val = inl(PCI_MODE1_DATA_REG);
+ outl(PCI_MODE1_ADDRESS_REG, 0);
+ return val;
+}
+
+static void
+writePciCfg1(CARD32 reg, CARD32 val)
+{
+ outl(PCI_MODE1_ADDRESS_REG, reg);
+ outl(PCI_MODE1_DATA_REG,val);
+ outl(PCI_MODE1_ADDRESS_REG, 0);
+}
+
+#ifndef __ia64__
+static CARD32
+readPciCfg2(CARD32 reg)
+{
+ CARD32 val;
+ CARD8 bus = (reg >> 16) & 0xff;
+ CARD8 dev = (reg >> 11) & 0x1f;
+ CARD8 num = reg & 0xff;
+
+ outb(PCI_MODE2_ENABLE_REG, 0xF1);
+ outb(PCI_MODE2_FORWARD_REG, bus);
+ val = inl((dev << 8) + num);
+ outb(PCI_MODE2_ENABLE_REG, 0x00);
+ return val;
+}
+
+static void
+writePciCfg2(CARD32 reg, CARD32 val)
+{
+ CARD8 bus = (reg >> 16) & 0xff;
+ CARD8 dev = (reg >> 11) & 0x1f;
+ CARD8 num = reg & 0xff;
+
+ outb(PCI_MODE2_ENABLE_REG, 0xF1);
+ outb(PCI_MODE2_FORWARD_REG, bus);
+ outl((dev << 8) + num,val);
+ outb(PCI_MODE2_ENABLE_REG, 0x00);
+}
+#endif
+#endif
+
+void
+pciVideoDisable(void)
+{
+ /* disable VGA routing on bridges */
+ PciBusPtr pbp = PciBuses;
+ PciStructPtr pcp = PciStruct;
+
+ while (pbp) {
+ writePci(pbp->Slot.l | 0x3c, pbp->bctl & ~(CARD32)(8<<16));
+ pbp = pbp->next;
+ }
+ /* disable display devices */
+ while (pcp) {
+ writePci(pcp->Slot.l | 0x04, pcp->cmd_st & ~(CARD32)3);
+ writePci(pcp->Slot.l | 0x30, pcp->RomBase & ~(CARD32)1);
+ pcp = pcp->next;
+ }
+}
+
+void
+pciVideoRestore(void)
+{
+ /* disable VGA routing on bridges */
+ PciBusPtr pbp = PciBuses;
+ PciStructPtr pcp = PciStruct;
+
+ while (pbp) {
+ writePci(pbp->Slot.l | 0x3c, pbp->bctl);
+ pbp = pbp->next;
+ }
+ /* disable display devices */
+ while (pcp) {
+ writePci(pcp->Slot.l | 0x04, pcp->cmd_st);
+ writePci(pcp->Slot.l | 0x30, pcp->RomBase);
+ pcp = pcp->next;
+ }
+}
+
+void
+EnableCurrent()
+{
+ PciBusPtr pbp;
+ PciStructPtr pcp = CurrentPci;
+
+ pciVideoDisable();
+
+ pbp = pcp->pBus;
+ while (pbp) { /* enable bridges */
+ writePci(pbp->Slot.l | 0x3c, pbp->bctl | (CARD32)(8<<16));
+ pbp = pbp->pBus;
+ }
+ writePci(pcp->Slot.l | 0x04, pcp->cmd_st | (CARD32)3);
+ writePci(pcp->Slot.l | 0x30, pcp->RomBase | (CARD32)1);
+}
+
+CARD8
+PciRead8(int offset, CARD32 Slot)
+{
+ int shift = offset & 0x3;
+ offset = offset & 0xFC;
+ return ((readPci(Slot | offset) >> (shift << 3)) & 0xff);
+}
+
+CARD16
+PciRead16(int offset, CARD32 Slot)
+{
+ int shift = offset & 0x2;
+ offset = offset & 0xFC;
+ return ((readPci(Slot | offset) >> (shift << 3)) & 0xffff);
+}
+
+CARD32
+PciRead32(int offset, CARD32 Slot)
+{
+ offset = offset & 0xFC;
+ return (readPci(Slot | offset));
+}
+
+void
+PciWrite8(int offset, CARD8 byte, CARD32 Slot)
+{
+ CARD32 val;
+ int shift = offset & 0x3;
+ offset = offset & 0xFC;
+ val = readPci(Slot | offset);
+ val &= ~(CARD32)(0xff << (shift << 3));
+ val |= byte << (shift << 3);
+ writePci(Slot | offset, val);
+}
+
+void
+PciWrite16(int offset, CARD16 word, CARD32 Slot)
+{
+ CARD32 val;
+ int shift = offset & 0x2;
+ offset = offset & 0xFC;
+ val = readPci(Slot | offset);
+ val &= ~(CARD32)(0xffff << (shift << 3));
+ val |= word << (shift << 3);
+ writePci(Slot | offset, val);
+}
+
+void
+PciWrite32(int offset, CARD32 lg, CARD32 Slot)
+{
+ offset = offset & 0xFC;
+ writePci(Slot | offset, lg);
+}
+
+int
+mapPciRom(PciStructPtr pciP)
+{
+ unsigned long RomBase = 0;
+ int mem_fd;
+ unsigned char *mem, *ptr;
+ unsigned char *scratch = NULL;
+ int length = 0;
+ CARD32 biosSize = 0x1000000;
+ CARD32 enablePci = 0; /* to keep gcc happy */
+
+ if (!pciP)
+ pciP = CurrentPci;
+
+ if (FIX_ROM) {
+ RomBase = findBIOSMap(pciP, &biosSize);
+ if (!RomBase) {
+ RomBase = pciP->RomBase & ~(CARD32)0xFF;
+ }
+ } else {
+ RomBase = pciP->RomBase & ~(CARD32)0xFF;
+ if (~RomBase + 1 < biosSize || !RomBase)
+ RomBase = findBIOSMap(pciP, &biosSize);
+ }
+
+ if ((mem_fd = open(MEM_FILE,O_RDONLY))<0) {
+ perror("opening memory");
+ restoreMem(pciP);
+ return (0);
+ }
+
+ PciWrite32(0x30,RomBase | 1,pciP->Slot.l);
+
+#ifdef __alpha__
+ mem = ptr = (unsigned char *)mmap(0, biosSize, PROT_READ,
+ MAP_SHARED, mem_fd, RomBase | _bus_base());
+#else
+ mem = ptr = (unsigned char *)mmap(0, biosSize, PROT_READ,
+ MAP_SHARED, mem_fd, RomBase);
+#endif
+ if (pciP != CurrentPci) {
+ enablePci = PciRead32(0x4,pciP->Slot.l);
+ PciWrite32(0x4,enablePci | 0x2,pciP->Slot.l);
+ }
+
+ while ( *ptr == 0x55 && *(ptr+1) == 0xAA) {
+ unsigned short data_off = *(ptr+0x18) | (*(ptr+0x19)<< 8);
+ unsigned char *data = ptr + data_off;
+ unsigned char type;
+ int i;
+
+ if (*data!='P' || *(data+1)!='C' || *(data+2)!='I' || *(data+3)!='R') {
+ break;
+ }
+ type = *(data + 0x14);
+
+ if (type != 0) { /* not PC-AT image: find next one */
+ unsigned int image_length;
+ unsigned char indicator = *(data + 0x15);
+ if (indicator & 0x80) /* last image */
+ break;
+ image_length = (*(data + 0x10)
+ | (*(data + 0x11) << 8)) << 9;
+ ptr = ptr + image_length;
+ continue;
+ }
+ /* OK, we have a PC Image */
+ length = (*(ptr + 2) << 9);
+ scratch = (unsigned char *)malloc(length);
+ /* don't use memcpy() here: Reading from bus! */
+ for (i=0;i<length;i++)
+ *(scratch + i)=*(ptr + i);
+ break;
+ }
+
+ if (pciP != CurrentPci)
+ PciWrite32(0x4,enablePci,pciP->Slot.l);
+
+ /* unmap/close/disable PCI bios mem */
+ munmap(mem, biosSize);
+ close(mem_fd);
+ /* disable and restore mapping */
+ writePci(pciP->Slot.l | 0x30, pciP->RomBase & ~(CARD32)1);
+
+ if (scratch && length) {
+ memcpy((unsigned char *)V_BIOS, scratch, length);
+ free(scratch);
+ }
+
+ restoreMem(pciP);
+ return length;
+}
+
+CARD32
+findPci(CARD16 slotBX)
+{
+ CARD32 slot = slotBX << 8;
+
+ if (slot == (CurrentPci->Slot.l & ~PCI_EN))
+ return (CurrentPci->Slot.l | PCI_EN);
+ else {
+#if !SHOW_ALL_DEV
+ PciBusPtr pBus = CurrentPci->pBus;
+ while (pBus) {
+ if (slot == (pBus->Slot.l & ~PCI_EN))
+ return pBus->Slot.l | PCI_EN;
+ pBus = pBus->next;
+ }
+#else
+ PciStructPtr pPci = PciStruct;
+ while (pPci) {
+ if (slot == (pPci->Slot.l & ~PCI_EN))
+ return pPci->Slot.l | PCI_EN;
+ pPci = pPci->next;
+ }
+#endif
+ }
+ return 0;
+}
+
+CARD16
+pciSlotBX(PciStructPtr pPci)
+{
+ return (CARD16)((pPci->Slot.l >> 8) & 0xFFFF);
+}
+
+PciStructPtr
+findPciDevice(CARD16 vendorID, CARD16 deviceID, char n)
+{
+ PciStructPtr pPci = CurrentPci;
+ n++;
+
+ while (pPci) {
+ if ((pPci->VendorID == vendorID) && (pPci->DeviceID == deviceID)) {
+ if (!(--n)) break;
+ }
+ pPci = pPci->next;
+ }
+ return pPci;
+}
+
+PciStructPtr
+findPciClass(CARD8 intf, CARD8 subClass, CARD16 class, char n)
+{
+ PciStructPtr pPci = CurrentPci;
+ n++;
+
+ while (pPci) {
+ if ((pPci->Interface == intf) && (pPci->SubClass == subClass)
+ && (pPci->BaseClass == class)) {
+ if (!(--n)) break;
+ }
+ pPci = pPci->next;
+ }
+ return pPci;
+}
+
+static void
+readConfigSpaceCfg1(CARD32 bus, CARD32 dev, CARD32 func, CARD32 *reg)
+{
+ CARD32 config_cmd = PCI_EN | (bus<<16) |
+ (dev<<11) | (func<<8);
+ int i;
+
+ for (i = 0; i<64;i+=4) {
+#ifdef __alpha__
+ reg[i] = axpPciCfgRead(config_cmd | i);
+#else
+ outl(PCI_MODE1_ADDRESS_REG, config_cmd | i);
+ reg[i] = inl(PCI_MODE1_DATA_REG);
+#endif
+
+ }
+}
+
+static int
+checkSlotCfg1(CARD32 bus, CARD32 dev, CARD32 func)
+{
+ CARD32 config_cmd = PCI_EN | (bus<<16) |
+ (dev<<11) | (func<<8);
+ CARD32 reg;
+#ifdef __alpha__
+ reg = axpPciCfgRead(config_cmd);
+#else
+ outl(PCI_MODE1_ADDRESS_REG, config_cmd);
+ reg = inl(PCI_MODE1_DATA_REG);
+#endif
+ if (reg != 0xFFFFFFFF)
+ return 1;
+ else
+ return 0;
+}
+
+static int
+checkSlotCfg2(CARD32 bus, int dev)
+{
+ CARD32 val;
+
+ outb(PCI_MODE2_ENABLE_REG, 0xF1);
+ outb(PCI_MODE2_FORWARD_REG, bus);
+ val = inl(dev << 8);
+ outb(PCI_MODE2_FORWARD_REG, 0x00);
+ outb(PCI_MODE2_ENABLE_REG, 0x00);
+ if (val == 0xFFFFFFFF)
+ return 0;
+ if (val == 0xF0F0F0F0)
+ return 0;
+ return 1;
+}
+
+static void
+readConfigSpaceCfg2(CARD32 bus, int dev, CARD32 *reg)
+{
+ int i;
+
+ outb(PCI_MODE2_ENABLE_REG, 0xF1);
+ outb(PCI_MODE2_FORWARD_REG, bus);
+ for (i = 0; i<64;i+=4) {
+ reg[i] = inl((dev << 8) + i);
+ }
+ outb(PCI_MODE2_ENABLE_REG, 0x00);
+}
+
+static CARD8
+interpretConfigSpace(CARD32 *reg, int busidx, CARD8 dev, CARD8 func)
+{
+ CARD32 config_cmd;
+ CARD16 vendor, device;
+ CARD8 baseclass, subclass;
+ CARD8 primary, secondary;
+ CARD8 header, interface;
+ int i;
+
+ config_cmd = PCI_EN | busidx<<16 |
+ (dev<<11) | (func<<8);
+
+ for (i = 0x10; i < 0x28; i+=4) {
+ if (IS_MEM32(reg[i]))
+ if ((reg[i] & 0xFFFFFFF0) < pciMinMemReg)
+ pciMinMemReg = (reg[i] & 0xFFFFFFF0);
+#ifdef __alpha__
+ if (IS_MEM64(reg[i])) {
+ unsigned long addr = reg[i] |
+ (unsigned long)(reg[i+4]) << 32;
+ if ((addr & ~0xfL) < pciMinMemReg)
+ pciMinMemReg = (addr & ~0xfL);
+ i+=4;
+ }
+#endif
+ }
+ vendor = reg[0] & 0xFFFF;
+ device = reg[0] >> 16;
+ baseclass = reg[8] >> 24;
+ subclass = (reg[8] >> 16) & 0xFF;
+ interface = (reg[8] >> 8) & 0xFF;
+
+ header = (reg[0x0c] >> 16) & 0xff;
+ if (BRIDGE_CLASS(baseclass)) {
+ if (BRIDGE_PCI_CLASS(subclass)) {
+ PciBusPtr pbp = malloc(sizeof(PciBusRec));
+ primary = reg[0x18] & 0xFF;
+ secondary = (reg[0x18] >> 8) & 0xFF;
+ pbp->bctl = reg[0x3c];
+ pbp->primary = primary;
+ pbp->secondary = secondary;
+ pbp->Slot.l = config_cmd;
+ pbp->next = PciBuses;
+ PciBuses = pbp;
+ numbus++;
+ } else if (BRIDGE_HOST_CLASS(subclass)
+ && (hostbridges++ > 1)) {
+ numbus++;
+ }
+ } else if (VIDEO_CLASS(baseclass,subclass)) {
+ PciStructPtr pcp = malloc(sizeof(PciStructRec));
+ pcp->RomBase = reg[0x30];
+ pcp->cmd_st = reg[4];
+ pcp->active = (reg[4] & 0x03) == 3 ? 1 : 0;
+ pcp->VendorID = vendor;
+ pcp->DeviceID = device;
+ pcp->Interface = interface;
+ pcp->BaseClass = baseclass;
+ pcp->SubClass = subclass;
+ pcp->Slot.l = config_cmd;
+ pcp->bus = busidx;
+ pcp->dev = dev;
+ pcp->func = func;
+ pcp->next = PciStruct;
+ PciStruct = pcp;
+ }
+ if ((func == 0)
+ && ((header & PCI_MULTIFUNC_DEV) == 0))
+ func = 8;
+ else
+ func++;
+ return func;
+}
+
+static CARD32 remapMEM_val;
+static int remapMEM_num;
+
+static int /* map it on some other video device */
+remapMem(PciStructPtr pciP, int num, CARD32 size)
+{
+ PciStructPtr pciPtr = PciStruct;
+ int i;
+ CARD32 org;
+ CARD32 val;
+ CARD32 size_n;
+
+ org = PciRead32(num + 0x10,pciP->Slot.l);
+
+ while (pciPtr) {
+ for (i = 0; i < 20; i=i+4) {
+
+ val = PciRead32(i + 0x10,pciPtr->Slot.l);
+ /* don't map it on itself */
+ if ((org & 0xfffffff0) == (val & 0xfffffff0))
+ continue;
+ if (val && !(val & 1))
+ PciWrite32(i + 0x10,0xffffffff,pciPtr->Slot.l);
+ else
+ continue;
+ size_n = PciRead32(i + 0x10,pciPtr->Slot.l);
+ PciWrite32(i + 0x10,val,pciPtr->Slot.l);
+ size_n = ~(CARD32)(size_n & 0xfffffff0) + 1;
+
+ if (size_n >= size) {
+ PciWrite32(num + 0x10,val,pciP->Slot.l);
+ return 1;
+ }
+ }
+ pciPtr = pciPtr->next;
+ }
+ /* last resort: try to go below lowest PCI mem address */
+ val = ((pciMinMemReg & ~(CARD32)(size - 1)) - size);
+ if (val > 0x7fffffff) {
+ PciWrite32(num + 0x10,val, pciP->Slot.l);
+ return 1;
+ }
+
+ return 0;
+}
+
+static void
+restoreMem(PciStructPtr pciP)
+{
+ if (remapMEM_val == 0) return;
+ PciWrite32(remapMEM_num + 0x10,remapMEM_val,pciP->Slot.l);
+ return;
+}
+
+static CARD32
+findBIOSMap(PciStructPtr pciP, CARD32 *biosSize)
+{
+ PciStructPtr pciPtr = PciStruct;
+ int i;
+ CARD32 val;
+ CARD32 size = 4*1024; /* should be fixed: size seems _really_ to be undefined below */
+
+ PciWrite32(0x30,0xffffffff,pciP->Slot.l);
+ *biosSize = PciRead32(0x30,pciP->Slot.l);
+ PciWrite32(0x30,pciP->RomBase,pciP->Slot.l);
+ *biosSize = ~(*biosSize & 0xFFFFFF00) + 1;
+ if (*biosSize > (1024 * 1024 * 16)) {
+ *biosSize = 1024 * 1024 * 16;
+ }
+ while (pciPtr) {
+ if (pciPtr->bus != pciP->bus) {
+ pciPtr = pciPtr->next;
+ continue;
+ }
+ for (i = 0; i < 20; i=i+4) {
+
+ val = PciRead32(i + 0x10,pciPtr->Slot.l);
+ if (!(val & 1))
+
+ PciWrite32(i + 0x10,0xffffffff,pciPtr->Slot.l);
+ else
+ continue;
+ size = PciRead32(i + 0x10,pciPtr->Slot.l);
+ PciWrite32(i + 0x10,val,pciPtr->Slot.l);
+ size = ~(CARD32)(size & 0xFFFFFFF0) + 1;
+ if (size >= *biosSize) {
+ if (pciP == pciPtr) { /* if same device remap ram*/
+ if (!(remapMem(pciP,i,size)))
+ continue;
+ remapMEM_val = val;
+ remapMEM_num = i;
+ } else {
+ remapMEM_val = 0;
+ }
+ return val & 0xFFFFFF00;
+ }
+ }
+ pciPtr = pciPtr->next;
+ }
+ remapMEM_val = 0;
+ /* very last resort */
+ if (pciP->bus == 0 && (pciMinMemReg > *biosSize))
+ return (pciMinMemReg - size) & ~(size - 1);
+
+ return 0;
+}
+
+int
+cfg1out(CARD16 addr, CARD32 val)
+{
+ if (addr == 0xCF8) {
+ PciCfg1Addr = val;
+ return 1;
+ } else if (addr == 0xCFC) {
+ writePci(PciCfg1Addr, val);
+ return 1;
+ }
+ return 0;
+}
+
+int
+cfg1in(CARD16 addr, CARD32 *val)
+{
+ if (addr == 0xCF8) {
+ *val = PciCfg1Addr;
+ return 1;
+ } else if (addr == 0xCFC) {
+ *val = readPci(PciCfg1Addr);
+ return 1;
+ }
+ return 0;
+}
+
+PciStructPtr
+findPciByIDs(int bus, int dev, int func)
+{
+ PciStructPtr pciP = PciList;
+
+ while (pciP) {
+ if (pciP->bus == (unsigned) bus && pciP->dev == (unsigned) dev && pciP->func == (unsigned) func)
+ return pciP;
+ pciP = pciP->next;
+ }
+ return NULL;
+}
--- /dev/null
+/*
+ * Copyright 1999 Egbert Eich
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of the authors not be used in
+ * advertising or publicity pertaining to distribution of the software without
+ * specific, written prior permission. The authors makes no representations
+ * about the suitability of this software for any purpose. It is provided
+ * "as is" without express or implied warranty.
+ *
+ * THE AUTHORS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include <unistd.h>
+#include <errno.h>
+#include <asm/unistd.h>
+#include <stdio.h>
+#include <string.h>
+#ifdef __i386__
+#include <sys/vm86.h>
+#else
+#include "vm86_struct.h"
+#endif
+#include <signal.h>
+#include "v86bios.h"
+#include "AsmMacros.h"
+
+extern int emu_vm86(struct vm86_struct *vm, unsigned debug);
+
+#define INT2PTR(a) ((a) + (unsigned char *) 0)
+
+void log_err(char *format, ...) __attribute__ ((format (printf, 1, 2)));
+
+struct vm86_struct vm86s;
+
+static int vm86_GP_fault(void);
+static int vm86_do_int(int num);
+#ifdef __i386__
+static int vm86_rep(struct vm86_struct *ptr);
+#endif
+void log_registers(void);
+
+#define CPU_REG(x) (vm86s.regs.x)
+#define CPU_REG_LW(reg) (*((CARD16 *)&CPU_REG(reg)))
+#define CPU_REG_HW(reg) (*((CARD16 *)&CPU_REG(reg) + 1))
+#define CPU_REG_LB(reg) (*(CARD8 *)&CPU_REG(e##reg))
+#define SEG_ADR(type, seg, reg) type((CPU_REG_LW(seg) << 4) + CPU_REG_LW(e##reg) + (unsigned char *) 0)
+#define DF (1 << 10)
+
+struct pio P;
+
+void
+setup_io(void)
+{
+ P.inb = (CARD8(*)(CARD16))inb;
+ P.inw = (CARD16(*)(CARD16))inw;
+ P.inl = (CARD32(*)(CARD16))inl;
+ P.outb = (void(*)(CARD16,CARD8))outb;
+ P.outw = (void(*)(CARD16,CARD16))outw;
+ P.outl = (void(*)(CARD16,CARD32))outl;
+}
+
+
+static void
+setup_vm86(unsigned long bios_start, i86biosRegsPtr regs)
+{
+ CARD32 eip;
+ CARD16 cs;
+
+ vm86s.flags = VM86_SCREEN_BITMAP;
+ vm86s.flags = 0;
+ vm86s.screen_bitmap = 0;
+ vm86s.cpu_type = CPU_586;
+ memset(&vm86s.int_revectored, 0xff,sizeof(vm86s.int_revectored)) ;
+ memset(&vm86s.int21_revectored, 0xff,sizeof(vm86s.int21_revectored)) ;
+
+ eip = bios_start & 0xFFFF;
+ cs = (bios_start & 0xFF0000) >> 4;
+
+ CPU_REG(eax) = regs->ax;
+ CPU_REG(ebx) = regs->bx;
+ CPU_REG(ecx) = regs->cx;
+ CPU_REG(edx) = regs->dx;
+ CPU_REG(esi) = 0;
+ CPU_REG(edi) = regs->di;
+ CPU_REG(ebp) = 0;
+ CPU_REG(eip) = eip;
+ CPU_REG(cs) = cs;
+ CPU_REG(esp) = 0x100;
+ CPU_REG(ss) = 0x30; /* This is the standard pc bios stack */
+ CPU_REG(es) = regs->es;
+ CPU_REG(ds) = 0x40; /* standard pc ds */
+ CPU_REG(fs) = 0;
+ CPU_REG(gs) = 0;
+ CPU_REG(eflags) |= (VIF_MASK | VIP_MASK);
+}
+
+void
+collect_bios_regs(i86biosRegsPtr regs)
+{
+ regs->ax = CPU_REG(eax);
+ regs->bx = CPU_REG(ebx);
+ regs->cx = CPU_REG(ecx);
+ regs->dx = CPU_REG(edx);
+ regs->es = CPU_REG(es);
+ regs->ds = CPU_REG(ds);
+ regs->di = CPU_REG(edi);
+ regs->si = CPU_REG(esi);
+}
+
+static int do_vm86(int cpuemu)
+{
+ int retval;
+
+#ifdef V86BIOS_DEBUG
+ dump_registers();
+#endif
+
+#ifdef __i386__
+ if(cpuemu) {
+ retval = emu_vm86(&vm86s, cpuemu & 2);
+ }
+ else {
+ retval = vm86_rep(&vm86s);
+ }
+#else
+ retval = emu_vm86(&vm86s, cpuemu & 2);
+#endif
+
+ switch (VM86_TYPE(retval)) {
+ case VM86_UNKNOWN:
+ if (!vm86_GP_fault())
+ return 0;
+ break;
+ case VM86_STI:
+ log_err("vm86_sti :-((\n");
+ log_registers();
+ return 0;
+ case VM86_INTx:
+ if (!vm86_do_int(VM86_ARG(retval))) {
+ log_err("Unknown vm86_int: %X\n",VM86_ARG(retval));
+ log_registers();
+ return 0;
+ }
+ /* I'm not sure yet what to do if we can handle ints */
+ break;
+ case VM86_SIGNAL:
+ log_err("VBE: received a signal!\n");
+ log_registers();
+ return 0;
+ default:
+ log_err("unknown type(0x%x)=0x%x\n",
+ VM86_ARG(retval),VM86_TYPE(retval));
+ log_registers();
+ return 0;
+ }
+
+ return 1;
+}
+
+void
+do_x86(unsigned long bios_start, i86biosRegsPtr regs, int cpuemu)
+{
+ setup_vm86(bios_start, regs);
+ while(do_vm86(cpuemu)) {};
+ collect_bios_regs(regs);
+}
+
+/* get the linear address */
+#define LIN_PREF_SI ((pref_seg << 4) + CPU_REG_LW(esi))
+
+#define LWECX (prefix66 ^ prefix67 ? CPU_REG(ecx) : CPU_REG_LW(ecx))
+
+static int
+vm86_GP_fault(void)
+{
+ unsigned char *csp, *lina;
+ CARD32 org_eip;
+ int pref_seg;
+ int done,is_rep,prefix66,prefix67;
+
+
+ csp = lina = SEG_ADR((unsigned char *), cs, ip);
+#ifdef V86BIOS_DEBUG
+ printf("exception: \n");
+ dump_code();
+#endif
+
+ is_rep = 0;
+ prefix66 = prefix67 = 0;
+ pref_seg = -1;
+
+ /* eat up prefixes */
+ done = 0;
+ do {
+ switch (*(csp++)) {
+ case 0x66: /* operand prefix */ prefix66=1; break;
+ case 0x67: /* address prefix */ prefix67=1; break;
+ case 0x2e: /* CS */ pref_seg=CPU_REG(cs); break;
+ case 0x3e: /* DS */ pref_seg=CPU_REG(ds); break;
+ case 0x26: /* ES */ pref_seg=CPU_REG(es); break;
+ case 0x36: /* SS */ pref_seg=CPU_REG(ss); break;
+ case 0x65: /* GS */ pref_seg=CPU_REG(gs); break;
+ case 0x64: /* FS */ pref_seg=CPU_REG(fs); break;
+ case 0xf2: /* repnz */
+ case 0xf3: /* rep */ is_rep=1; break;
+ default: done=1;
+ }
+ } while (!done);
+ csp--; /* oops one too many */
+ org_eip = CPU_REG(eip);
+ CPU_REG_LW(eip) += (csp - lina);
+
+ switch (*csp) {
+
+ case 0x6c: /* insb */
+ /* NOTE: ES can't be overwritten; prefixes 66,67 should use esi,edi,ecx
+ * but is anyone using extended regs in real mode? */
+ /* WARNING: no test for DI wrapping! */
+ CPU_REG_LW(edi) += port_rep_inb(CPU_REG_LW(edx),
+ SEG_ADR((CARD8 *),es,di),
+ CPU_REG_LW(eflags)&DF,
+ (is_rep? LWECX:1));
+ if (is_rep) LWECX = 0;
+ CPU_REG_LW(eip)++;
+ break;
+
+ case 0x6d: /* (rep) insw / insd */
+ /* NOTE: ES can't be overwritten */
+ /* WARNING: no test for _DI wrapping! */
+ if (prefix66) {
+ CPU_REG_LW(edi) += port_rep_inl(CPU_REG_LW(edx),
+ SEG_ADR((CARD32 *),es,di),
+ CPU_REG_LW(eflags)&DF,
+ (is_rep? LWECX:1));
+ }
+ else {
+ CPU_REG_LW(edi) += port_rep_inw(CPU_REG_LW(edx),
+ SEG_ADR((CARD16 *),es,di),
+ CPU_REG_LW(eflags)&DF,
+ (is_rep? LWECX:1));
+ }
+ if (is_rep) LWECX = 0;
+ CPU_REG_LW(eip)++;
+ break;
+
+ case 0x6e: /* (rep) outsb */
+ if (pref_seg < 0) pref_seg = CPU_REG_LW(ds);
+ /* WARNING: no test for _SI wrapping! */
+ CPU_REG_LW(esi) += port_rep_outb(CPU_REG_LW(edx),(CARD8*)INT2PTR(LIN_PREF_SI),
+ CPU_REG_LW(eflags)&DF,
+ (is_rep? LWECX:1));
+ if (is_rep) LWECX = 0;
+ CPU_REG_LW(eip)++;
+ break;
+
+ case 0x6f: /* (rep) outsw / outsd */
+ if (pref_seg < 0) pref_seg = CPU_REG_LW(ds);
+ /* WARNING: no test for _SI wrapping! */
+ if (prefix66) {
+ CPU_REG_LW(esi) += port_rep_outl(CPU_REG_LW(edx),
+ (CARD32 *)INT2PTR(LIN_PREF_SI),
+ CPU_REG_LW(eflags)&DF,
+ (is_rep? LWECX:1));
+ }
+ else {
+ CPU_REG_LW(esi) += port_rep_outw(CPU_REG_LW(edx),
+ (CARD16 *)INT2PTR(LIN_PREF_SI),
+ CPU_REG_LW(eflags)&DF,
+ (is_rep? LWECX:1));
+ }
+ if (is_rep) LWECX = 0;
+ CPU_REG_LW(eip)++;
+ break;
+
+ case 0xe5: /* inw xx, inl xx */
+ if (prefix66) CPU_REG(eax) = P.inl((int) csp[1]);
+ else CPU_REG_LW(eax) = P.inw((int) csp[1]);
+ CPU_REG_LW(eip) += 2;
+ break;
+ case 0xe4: /* inb xx */
+ CPU_REG_LW(eax) &= ~(CARD32)0xff;
+ CPU_REG_LB(ax) |= P.inb((int) csp[1]);
+ CPU_REG_LW(eip) += 2;
+ break;
+ case 0xed: /* inw dx, inl dx */
+ if (prefix66) CPU_REG(eax) = P.inl(CPU_REG_LW(edx));
+ else CPU_REG_LW(eax) = P.inw(CPU_REG_LW(edx));
+ CPU_REG_LW(eip) += 1;
+ break;
+ case 0xec: /* inb dx */
+ CPU_REG_LW(eax) &= ~(CARD32)0xff;
+ CPU_REG_LB(ax) |= P.inb(CPU_REG_LW(edx));
+ CPU_REG_LW(eip) += 1;
+ break;
+
+ case 0xe7: /* outw xx */
+ if (prefix66) P.outl((int)csp[1], CPU_REG(eax));
+ else P.outw((int)csp[1], CPU_REG_LW(eax));
+ CPU_REG_LW(eip) += 2;
+ break;
+ case 0xe6: /* outb xx */
+ P.outb((int) csp[1], CPU_REG_LB(ax));
+ CPU_REG_LW(eip) += 2;
+ break;
+ case 0xef: /* outw dx */
+ if (prefix66) P.outl(CPU_REG_LW(edx), CPU_REG(eax));
+ else P.outw(CPU_REG_LW(edx), CPU_REG_LW(eax));
+ CPU_REG_LW(eip) += 1;
+ break;
+ case 0xee: /* outb dx */
+ P.outb(CPU_REG_LW(edx), CPU_REG_LB(ax));
+ CPU_REG_LW(eip) += 1;
+ break;
+
+ case 0xf4:
+#ifdef V86BIOS_DEBUG
+ printf("hlt at %p\n", lina);
+#endif
+ return 0;
+
+ case 0x0f:
+ log_err("CPU 0x0f Trap at eip=0x%lx\n",CPU_REG(eip));
+ goto op0ferr;
+ break;
+
+ case 0xf0: /* lock */
+ default:
+ log_err("unknown reason for exception\n");
+ log_registers();
+ op0ferr:
+ log_err("cannot continue\n");
+ return 0;
+ } /* end of switch() */
+ return 1;
+}
+
+static int
+vm86_do_int(int num)
+{
+ int val;
+ struct regs86 regs;
+
+ /* try to run bios interrupt */
+
+ /* if not installed fall back */
+#define COPY(x) regs.x = CPU_REG(x)
+#define COPY_R(x) CPU_REG(x) = regs.x
+
+ COPY(eax);
+ COPY(ebx);
+ COPY(ecx);
+ COPY(edx);
+ COPY(esi);
+ COPY(edi);
+ COPY(ebp);
+ COPY(eip);
+ COPY(esp);
+ COPY(cs);
+ COPY(ss);
+ COPY(ds);
+ COPY(es);
+ COPY(fs);
+ COPY(gs);
+ COPY(eflags);
+
+ if (!(val = int_handler(num,®s)))
+ if (!(val = run_bios_int(num,®s)))
+ return val;
+
+ COPY_R(eax);
+ COPY_R(ebx);
+ COPY_R(ecx);
+ COPY_R(edx);
+ COPY_R(esi);
+ COPY_R(edi);
+ COPY_R(ebp);
+ COPY_R(eip);
+ COPY_R(esp);
+ COPY_R(cs);
+ COPY_R(ss);
+ COPY_R(ds);
+ COPY_R(es);
+ COPY_R(fs);
+ COPY_R(gs);
+ COPY_R(eflags);
+
+ return val;
+#undef COPY
+#undef COPY_R
+}
+
+#ifdef __i386__
+
+static int
+vm86_rep(struct vm86_struct *ptr)
+{
+
+ int __res;
+
+ /* stay away from %ebx */
+ __asm__ __volatile__("push %%ebx\n\tmov %%ecx,%%ebx\n\tpush %%gs\n\tint $0x80\n\tpop %%gs\n\tpop %%ebx\n"
+ :"=a" (__res):"a" ((int)113),
+ "c" ((struct vm86_struct *)ptr));
+
+ if ((__res) < 0) {
+ errno = -__res;
+ __res=-1;
+ }
+ else errno = 0;
+ return __res;
+}
+
+#endif
+
+#ifdef __i386__
+
+#define pushw(base, ptr, val) \
+__asm__ __volatile__( \
+ "decw %w0\n\t" \
+ "movb %h2,(%1,%0)\n\t" \
+ "decw %w0\n\t" \
+ "movb %b2,(%1,%0)" \
+ : "=r" (ptr) \
+ : "r" (base), "q" (val), "0" (ptr))
+
+#else
+
+#define pushw(base, ptr, val) { \
+ ptr = ((ptr) - 1) & 0xffff; \
+ *((unsigned char *)(base) + (ptr)) = (val) >> 8; \
+ ptr = ((ptr) - 1) & 0xffff; \
+ *((unsigned char *)(base) + (ptr)) = (val); \
+ }
+
+#endif
+
+int
+run_bios_int(int num, struct regs86 *regs)
+{
+ CARD16 *ssp;
+ CARD32 sp;
+ CARD32 eflags;
+
+#ifdef V86BIOS_DEBUG
+ static int firsttime = 1;
+#endif
+ /* check if bios vector is initialized */
+ if (((CARD16*)0)[(num<<1)+1] == 0x0000) { /* SYS_BIOS_SEG ?*/
+ return 0;
+ }
+
+#ifdef V86BIOS_DEBUG
+ if (firsttime) {
+ dprint(0,0x3D0);
+ firsttime = 0;
+ }
+#endif
+
+ ssp = (CARD16*)INT2PTR(CPU_REG(ss)<<4);
+ sp = (CARD32) CPU_REG_LW(esp);
+
+ eflags = regs->eflags;
+ eflags = ((eflags & VIF_MASK) != 0)
+ ? (eflags | IF_MASK) : (eflags & ~(CARD32) IF_MASK);
+ pushw(ssp, sp, eflags);
+ pushw(ssp, sp, regs->cs);
+ pushw(ssp, sp, (CARD16)regs->eip);
+ regs->esp -= 6;
+ regs->cs = ((CARD16 *) 0)[(num << 1) + 1];
+ regs->eip = (regs->eip & 0xFFFF0000) | ((CARD16 *) 0)[num << 1];
+#ifdef V86BIOS_DEBUG
+ dump_code();
+#endif
+ regs->eflags = regs->eflags
+ & ~(VIF_MASK | TF_MASK | IF_MASK | NT_MASK);
+ return 1;
+}
+
+CARD32
+getIntVect(int num)
+{
+ return ((CARD32*)0)[num];
+}
+
+CARD32
+getIP(void)
+{
+ return (CPU_REG(cs) << 4) + CPU_REG(eip);
+}
+
+void log_registers()
+{
+ log_err(
+ " eax %08x, ebx %08x, ecx %08x, edx %08x\n"
+ " esi %08x, edi %08x, ebp %08x, esp %08x\n"
+ " ds %04x, es %04x, fs %04x, gs %04x, ss %04x\n"
+ " cs:eip %04x:%08x\n",
+ (unsigned) CPU_REG(eax), (unsigned) CPU_REG(ebx), (unsigned) CPU_REG(ecx), (unsigned) CPU_REG(edx),
+ (unsigned) CPU_REG(esi), (unsigned) CPU_REG(edi), (unsigned) CPU_REG(ebp), (unsigned) CPU_REG(esp),
+ (unsigned) CPU_REG(ds), (unsigned) CPU_REG(es),
+ (unsigned) CPU_REG(fs), (unsigned) CPU_REG(gs), (unsigned) CPU_REG(ss),
+ (unsigned) CPU_REG(cs), (unsigned) CPU_REG(eip)
+ );
+}
+
--- /dev/null
+/*
+ * Copyright 1999 Egbert Eich
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of the authors not be used in
+ * advertising or publicity pertaining to distribution of the software without
+ * specific, written prior permission. The authors makes no representations
+ * about the suitability of this software for any purpose. It is provided
+ * "as is" without express or implied warranty.
+ *
+ * THE AUTHORS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+#include <unistd.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <errno.h>
+#include <sys/mman.h>
+#include <sys/types.h>
+#include <string.h>
+#include <stdlib.h>
+#include <signal.h>
+#include <sys/stat.h>
+#include <setjmp.h>
+#if defined(__alpha__) || defined (__ia64__)
+#include <sys/io.h>
+//#elif defined(HAVE_SYS_PERM)
+#else
+#include <sys/perm.h>
+#endif
+#include "v86bios.h"
+#include "pci.h"
+#include "AsmMacros.h"
+#include "vbios.h"
+
+void log_err(char *format, ...) __attribute__ ((format (printf, 1, 2)));
+
+#define SIZE 0x100000
+#define VRAM_START 0xA0000
+#define VRAM_SIZE 0x1FFFF
+#define V_BIOS_SIZE 0x1FFFF
+#define BIOS_START 0x7C00 /* default BIOS entry */
+
+static CARD8 code[] = { 0xcd, 0x10, 0xf4 }; /* int 0x10, hlt */
+// static CARD8 code13[] = { 0xcd, 0x13, 0xf4 }; /* int 0x13, hlt */
+
+static int int10_bios_ok(void);
+static int map(void);
+static void unmap(void);
+static int map_vram(void);
+static void unmap_vram(void);
+static int copy_vbios(hd_data_t *hd_data);
+// static int copy_sbios(void);
+#if MAP_SYS_BIOS
+static int copy_sys_bios(hd_data_t *hd_data);
+#endif
+static int copy_bios_ram(hd_data_t *hd_data);
+static int setup_system_bios(hd_data_t *hd_data);
+static void setup_int_vect(void);
+static int chksum(CARD8 *start);
+
+void loadCodeToMem(unsigned char *ptr, CARD8 *code);
+
+static int vram_mapped = 0;
+static int int10inited = 0;
+
+static sigjmp_buf longjmp_buf;
+
+static void sigsegv_handler(int);
+
+int InitInt10(hd_data_t *hd_data, int pci_cfg_method)
+{
+ if(geteuid()) return -1;
+
+ if(!map()) return -1;
+
+ if(!setup_system_bios(hd_data)) {
+ unmap();
+ return -1;
+ }
+
+ setup_io();
+
+ if(iopl(3) < 0) {
+ unmap();
+ return -1;
+ }
+
+ scan_pci(pci_cfg_method);
+
+ for(; CurrentPci; CurrentPci = CurrentPci->next) {
+ if(CurrentPci->active) break;
+ }
+
+ iopl(0);
+
+ setup_int_vect();
+
+ if(!copy_vbios(hd_data)) {
+ unmap();
+ return -1;
+ }
+
+ if(!map_vram() || !copy_bios_ram(hd_data)) {
+ unmap();
+ return -1;
+ }
+
+ if(!int10_bios_ok()) {
+ unmap();
+ return -1;
+ }
+
+ int10inited = 1;
+
+ return 0;
+}
+
+
+void FreeInt10()
+{
+ if(!int10inited) return;
+
+ unmap_vram();
+ unmap();
+
+ int10inited = 0;
+}
+
+
+/*
+ * Check whether int 0x10 points to some useful code.
+ */
+int int10_bios_ok()
+{
+ unsigned cs, ip;
+ unsigned char *p;
+
+ ip = ((uint16_t *) 0)[0x10 * 2];
+ cs = ((uint16_t *) 0)[0x10 * 2 + 1];
+
+ p = (unsigned char *) ((cs << 4) + ip);
+
+ log_err(
+ " vbe: int 10h points to %04x:%04x: %02x %02x %02x %02x %02x %02x %02x %02x\n",
+ cs, ip,
+ p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7]
+ );
+
+ /* It can't possibly start with all zeros. */
+ if(!*(uint32_t *) p) {
+ log_err(" vbe: oops, int 10h points into nirvana!\n");
+
+ return 0;
+ }
+
+ return 1;
+}
+
+
+void sigsegv_handler(int num)
+{
+ siglongjmp(longjmp_buf, num + 1000);
+}
+
+
+int CallInt10(int *ax, int *bx, int *cx, unsigned char *buf, int len, int cpuemu)
+{
+ i86biosRegs bRegs;
+ void (*old_sigsegv_handler)(int) = SIG_DFL;
+ void (*old_sigill_handler)(int) = SIG_DFL;
+ void (*old_sigtrap_handler)(int) = SIG_DFL;
+ int jmp;
+
+ if(!int10inited) return -1;
+ memset(&bRegs, 0, sizeof bRegs);
+ bRegs.ax = *ax;
+ bRegs.bx = *bx;
+ bRegs.cx = *cx;
+ bRegs.dx = 0;
+ bRegs.es = 0x7e0;
+ bRegs.di = 0x0;
+ if(buf) memcpy((unsigned char *) 0x7e00, buf, len);
+
+ iopl(3);
+
+ jmp = sigsetjmp(longjmp_buf, 1);
+
+ if(!jmp) {
+ old_sigsegv_handler = signal(SIGSEGV, sigsegv_handler);
+ old_sigill_handler = signal(SIGILL, sigsegv_handler);
+ old_sigtrap_handler = signal(SIGTRAP, sigsegv_handler);
+
+ loadCodeToMem((unsigned char *) BIOS_START, code);
+ do_x86(BIOS_START, &bRegs, cpuemu);
+ }
+ else {
+ int10inited = 0;
+ log_err("oops: got signal %d in vm86() code\n", jmp - 1000);
+ }
+
+ signal(SIGTRAP, old_sigtrap_handler);
+ signal(SIGILL, old_sigill_handler);
+ signal(SIGSEGV, old_sigsegv_handler);
+
+ iopl(0);
+
+ if(buf) memcpy(buf, (unsigned char *) 0x7e00, len);
+
+ *ax = bRegs.ax;
+ *bx = bRegs.bx;
+ *cx = bRegs.cx;
+
+ return bRegs.ax;
+}
+
+
+#if 0
+int CallInt13(int *ax, int *bx, int *cx, int *dx, unsigned char *buf, int len, int cpuemu)
+{
+ i86biosRegs bRegs;
+
+ if(!int10inited) return -1;
+ memset(&bRegs, 0, sizeof bRegs);
+ bRegs.ax = *ax;
+ bRegs.bx = *bx;
+ bRegs.cx = *cx;
+ bRegs.dx = *dx;
+ bRegs.es = 0x7e0;
+ bRegs.ds = 0x7e0;
+ bRegs.di = 0x0;
+ bRegs.si = 0x0;
+ if(buf) memcpy((unsigned char *) 0x7e00, buf, len);
+
+ iopl(3);
+
+ loadCodeToMem((unsigned char *) BIOS_START, code13);
+ do_x86(BIOS_START, &bRegs, cpuemu);
+
+ iopl(0);
+
+ if(buf) memcpy(buf, (unsigned char *) 0x7e00, len);
+
+ *ax = bRegs.ax;
+ *bx = bRegs.bx;
+ *cx = bRegs.cx;
+ *dx = bRegs.dx;
+
+ return bRegs.ax;
+}
+#endif
+
+
+int map()
+{
+ void* mem;
+
+ mem = mmap(0, (size_t) SIZE, PROT_EXEC | PROT_READ | PROT_WRITE, MAP_FIXED | MAP_PRIVATE | MAP_ANON, -1, 0);
+
+ if(mem) {
+ perror("anonymous map");
+ return 0;
+ }
+
+ memset(mem, 0, SIZE);
+
+ loadCodeToMem((unsigned char *) BIOS_START, code);
+
+ return 1;
+}
+
+
+void unmap()
+{
+ munmap(0, SIZE);
+}
+
+
+static int
+map_vram(void)
+{
+ int mem_fd;
+
+#ifdef __ia64__
+ if ((mem_fd = open(MEM_FILE,O_RDWR | O_SYNC))<0)
+#else
+ if ((mem_fd = open(MEM_FILE,O_RDWR))<0)
+#endif
+ {
+ perror("opening memory");
+ return 0;
+ }
+
+#ifndef __alpha__
+ if (mmap((void *) VRAM_START, (size_t) VRAM_SIZE,
+ PROT_EXEC | PROT_READ | PROT_WRITE, MAP_SHARED | MAP_FIXED,
+ mem_fd, VRAM_START) == (void *) -1)
+#else
+ if (!_bus_base()) sparse_shift = 7; /* Uh, oh, JENSEN... */
+ if (!_bus_base_sparse()) sparse_shift = 0;
+ if ((vram_map = mmap(0,(size_t) (VRAM_SIZE << sparse_shift),
+ PROT_READ | PROT_WRITE,
+ MAP_SHARED,
+ mem_fd, (VRAM_START << sparse_shift)
+ | _bus_base_sparse())) == (void *) -1)
+#endif
+ {
+ perror("mmap error in map_hardware_ram");
+ close(mem_fd);
+ return (0);
+ }
+ vram_mapped = 1;
+ close(mem_fd);
+ return (1);
+}
+
+
+void unmap_vram()
+{
+ if(!vram_mapped) return;
+
+ munmap((void*) VRAM_START, VRAM_SIZE);
+
+ vram_mapped = 0;
+}
+
+
+/*
+ * Read video BIOS from /dev/mem.
+ *
+ * Return:
+ * 0: failed
+ * 1: ok
+ */
+int copy_vbios(hd_data_t *hd_data)
+{
+ unsigned size;
+ unsigned char tmp[3];
+
+ if(!hd_read_mmap(hd_data, MEM_FILE, tmp, V_BIOS, sizeof tmp)) {
+ log_err("vbe: failed to read %u bytes at 0x%x\n", (unsigned) sizeof tmp, V_BIOS);
+ return 0;
+ }
+
+ if(tmp[0] != 0x55 || tmp[1] != 0xAA ) {
+ log_err("vbe: no bios found at: 0x%x\n", V_BIOS);
+ return 0;
+ }
+
+ size = tmp[2] * 0x200;
+
+ if(!hd_read_mmap(hd_data, MEM_FILE, (unsigned char *) V_BIOS, V_BIOS, size)) {
+ log_err("vbe: failed to read %d bytes at 0x%x\n", size, V_BIOS);
+ return 0;
+ }
+
+ return chksum((CARD8 *) V_BIOS) ? 1 : 0;
+}
+
+
+#if MAP_SYS_BIOS
+static int
+copy_sys_bios(hd_data_t *hd_data)
+{
+ return hd_read_mmap(hd_data, MEM_FILE, (unsigned char *) 0xf0000, 0xf0000, 0xffff);
+}
+#endif
+
+
+static int copy_bios_ram(hd_data_t *hd_data)
+{
+ return hd_read_mmap(hd_data, MEM_FILE, (unsigned char *) 0, 0, 0x1000);
+}
+
+void loadCodeToMem(unsigned char *ptr, CARD8 *code)
+{
+ while((*ptr++ = *code++) != 0xf4 /* hlt */);
+
+ return;
+}
+
+
+/*
+ * here we are really paranoid about faking a "real"
+ * BIOS. Most of this information was pulled from
+ * dosem.
+ */
+static void
+setup_int_vect(void)
+{
+ const CARD16 cs = 0x0000;
+ const CARD16 ip = 0x0;
+ int i;
+
+ /* let the int vects point to the SYS_BIOS seg */
+ for (i=0; i<0x80; i++) {
+ ((CARD16*)0)[i<<1] = ip;
+ ((CARD16*)0)[(i<<1)+1] = cs;
+ }
+ /* video interrupts default location */
+ ((CARD16*)0)[(0x42<<1)+1] = 0xf000;
+ ((CARD16*)0)[0x42<<1] = 0xf065;
+ ((CARD16*)0)[(0x10<<1)+1] = 0xf000;
+ ((CARD16*)0)[0x10<<1] = 0xf065;
+ /* video param table default location (int 1d) */
+ ((CARD16*)0)[(0x1d<<1)+1] = 0xf000;
+ ((CARD16*)0)[0x1d<<1] = 0xf0A4;
+ /* font tables default location (int 1F) */
+ ((CARD16*)0)[(0x1f<<1)+1] = 0xf000;
+ ((CARD16*)0)[0x1f<<1] = 0xfa6e;
+
+ /* int 11 default location */
+ ((CARD16*)0)[(0x11<1)+1] = 0xf000;
+ ((CARD16*)0)[0x11<<1] = 0xf84d;
+ /* int 12 default location */
+ ((CARD16*)0)[(0x12<<1)+1] = 0xf000;
+ ((CARD16*)0)[0x12<<1] = 0xf841;
+ /* int 15 default location */
+ ((CARD16*)0)[(0x15<<1)+1] = 0xf000;
+ ((CARD16*)0)[0x15<<1] = 0xf859;
+ /* int 1A default location */
+ ((CARD16*)0)[(0x1a<<1)+1] = 0xf000;
+ ((CARD16*)0)[0x1a<<1] = 0xff6e;
+ /* int 05 default location */
+ ((CARD16*)0)[(0x05<<1)+1] = 0xf000;
+ ((CARD16*)0)[0x05<<1] = 0xff54;
+ /* int 08 default location */
+ ((CARD16*)0)[(0x8<<1)+1] = 0xf000;
+ ((CARD16*)0)[0x8<<1] = 0xfea5;
+ /* int 13 default location (fdd) */
+ ((CARD16*)0)[(0x13<<1)+1] = 0xf000;
+ ((CARD16*)0)[0x13<<1] = 0xec59;
+ /* int 0E default location */
+ ((CARD16*)0)[(0xe<<1)+1] = 0xf000;
+ ((CARD16*)0)[0xe<<1] = 0xef57;
+ /* int 17 default location */
+ ((CARD16*)0)[(0x17<<1)+1] = 0xf000;
+ ((CARD16*)0)[0x17<<1] = 0xefd2;
+ /* fdd table default location (int 1e) */
+ ((CARD16*)0)[(0x1e<<1)+1] = 0xf000;
+ ((CARD16*)0)[0x1e<<1] = 0xefc7;
+}
+
+static int
+setup_system_bios(hd_data_t *hd_data)
+{
+ char *date = "06/01/99";
+ char *eisa_ident = "PCI/ISA";
+
+#if MAP_SYS_BIOS
+ if (!copy_sys_bios(hd_data)) return 0;
+ return 1;
+#endif
+// memset((void *)0xF0000,0xf4,0xfff7);
+
+ /*
+ * we trap the "industry standard entry points" to the BIOS
+ * and all other locations by filling them with "hlt"
+ * TODO: implement hlt-handler for these
+ */
+ memset((void *)0xF0000,0xf4,0x10000);
+
+ /*
+ * TODO: we should copy the fdd table (0xfec59-0xfec5b)
+ * the video parameter table (0xf0ac-0xf0fb)
+ * and the font tables (0xfa6e-0xfe6d)
+ * from the original bios here
+ */
+
+ /* set bios date */
+ strcpy((char *)0xFFFF5,date);
+ /* set up eisa ident string */
+ strcpy((char *)0xFFFD9,eisa_ident);
+ /* write system model id for IBM-AT */
+ ((char *)0)[0xFFFFE] = 0xfc;
+
+ return 1;
+}
+
+
+/*
+ * Check BIOS CRC.
+ *
+ * Return:
+ * 0: failed
+ * 1: ok
+ */
+int chksum(CARD8 *start)
+{
+ CARD16 size;
+ CARD8 val = 0;
+ int i;
+
+ size = start[2] * 0x200;
+ for(i = 0; i < size; i++) val += start[i];
+
+ if(!val) return 1;
+
+ log_err("vbe: BIOS chksum wrong\n");
+
+ return 0;
+}
+
--- /dev/null
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <stdarg.h>
+
+#include "vbios.h"
+
+#include "hd.h"
+#include "hd_int.h"
+#include "bios.h"
+
+static unsigned segofs2addr(unsigned char *segofs);
+static unsigned get_data(unsigned char *buf, unsigned buf_size, unsigned addr);
+static void read_vbe_info(hd_data_t *hd_data, vbe_info_t *vbe, unsigned char *vbeinfo, unsigned cpuemu);
+
+static hd_data_t *log_hd_data;
+void log_err(char *format, ...) __attribute__ ((format (printf, 1, 2)));
+
+void get_vbe_info(hd_data_t *hd_data, vbe_info_t *vbe)
+{
+ int i;
+ unsigned char vbeinfo[0x200];
+ int ax, bx, cx;
+ unsigned cpuemu = hd_data->flags.cpuemu;
+
+ log_hd_data = hd_data;
+
+ if(InitInt10(hd_data, hd_data->pci_config_type)) {
+ ADD2LOG("VBE: Could not init Int10\n");
+ return;
+ }
+
+ memset(vbeinfo, 0, sizeof vbeinfo);
+ strcpy(vbeinfo, "VBE2");
+
+ PROGRESS(4, 1, "vbe info");
+
+ if(hd_probe_feature(hd_data, pr_cpuemu_debug)) cpuemu |= 2;
+
+#ifdef __i386__
+ if(hd_data->flags.cpuemu)
+#endif
+ ADD2LOG("vm86: using CPU emulation\n");
+
+ ax = 0x4f00; bx = 0; cx = 0;
+ i = CallInt10(&ax, &bx, &cx, vbeinfo, sizeof vbeinfo, cpuemu) & 0xffff;
+
+ if(i != 0x4f) {
+ ADD2LOG("VBE: Error (0x4f00): 0x%04x\n", i);
+ FreeInt10();
+ return;
+ }
+
+ if(hd_probe_feature(hd_data, pr_bios_fb)) {
+ PROGRESS(4, 2, "mode info");
+
+ read_vbe_info(hd_data, vbe, vbeinfo, cpuemu);
+ }
+
+ if(hd_probe_feature(hd_data, pr_bios_ddc)) {
+ PROGRESS(4, 3, "ddc info");
+
+ memset(vbeinfo, 0, sizeof vbeinfo);
+ ax = 0x4f15; bx = 1; cx = 0;
+ i = CallInt10(&ax, &bx, &cx, vbeinfo, sizeof vbeinfo, cpuemu) & 0xffff;
+
+ if(i != 0x4f) {
+ ADD2LOG("Error (0x4f15): 0x%04x\n", i);
+ } else {
+ vbe->ok = 1;
+ memcpy(vbe->ddc, vbeinfo, sizeof vbe->ddc);
+
+ ADD2LOG("edid record:\n");
+ for(i = 0; (unsigned) i < sizeof vbe->ddc; i += 0x10) {
+ ADD2LOG(" ");
+ hexdump(&hd_data->log, 1, 0x10, vbe->ddc + i);
+ ADD2LOG("\n");
+ }
+ }
+ }
+
+ if(hd_probe_feature(hd_data, pr_bios_mode)) {
+ PROGRESS(4, 4, "gfx mode");
+
+ ax = 0x4f03; bx = 0; cx = 0;
+ i = CallInt10(&ax, &bx, &cx, vbeinfo, sizeof vbeinfo, cpuemu) & 0xffff;
+
+ if(i != 0x4f) {
+ ADD2LOG("Error (0x4f03): 0x%04x\n", i);
+ } else {
+ vbe->current_mode = bx;
+ vbe->ok = 1;
+ }
+ }
+
+ FreeInt10();
+}
+
+
+unsigned segofs2addr(unsigned char *segofs)
+{
+ return segofs[0] + (segofs[1] << 8) + (segofs[2] << 4)+ (segofs[3] << 12);
+}
+
+
+unsigned get_data(unsigned char *buf, unsigned buf_size, unsigned addr)
+{
+ unsigned bufferaddr = 0x7e00;
+ unsigned len;
+
+ *buf = 0;
+ len = 0;
+
+ if(addr >= bufferaddr && addr < bufferaddr + 0x200) {
+ len = bufferaddr + 0x200 - addr;
+ if(len >= buf_size) len = buf_size - 1;
+ memcpy(buf, addr + (char *) 0, len);
+ }
+ else if(addr >= 0x0c0000 && addr < 0x100000) {
+ len = 0x100000 - addr;
+ if(len >= buf_size) len = buf_size - 1;
+ memcpy(buf, addr + (char *) 0, len);
+ }
+
+ buf[len] = 0;
+
+ return len;
+}
+
+
+void read_vbe_info(hd_data_t *hd_data, vbe_info_t *vbe, unsigned char *v, unsigned cpuemu)
+{
+ unsigned char tmp[1024], s[64];
+ unsigned i, l, u;
+ unsigned modelist[0x100];
+ unsigned bpp, res_bpp, fb, clock;
+ vbe_mode_info_t *mi;
+ int ax, bx, cx;
+
+ vbe->ok = 1;
+
+ vbe->version = v[0x04] + (v[0x05] << 8);
+ vbe->oem_version = v[0x14] + (v[0x15] << 8);
+ vbe->memory = (v[0x12] + (v[0x13] << 8)) << 16;
+
+ ADD2LOG(
+ "version = %u.%u, oem version = %u.%u\n",
+ vbe->version >> 8, vbe->version & 0xff, vbe->oem_version >> 8, vbe->oem_version & 0xff
+ );
+
+ ADD2LOG("memory = %uk\n", vbe->memory >> 10);
+
+ l = get_data(tmp, sizeof tmp, u = segofs2addr(v + 0x06));
+ vbe->oem_name = canon_str(tmp, l);
+ ADD2LOG("oem name [0x%05x] = \"%s\"\n", u, vbe->oem_name);
+
+ l = get_data(tmp, sizeof tmp, u = segofs2addr(v + 0x16));
+ vbe->vendor_name = canon_str(tmp, l);
+ ADD2LOG("vendor name [0x%05x] = \"%s\"\n", u, vbe->vendor_name);
+
+ l = get_data(tmp, sizeof tmp, u = segofs2addr(v + 0x1a));
+ vbe->product_name = canon_str(tmp, l);
+ ADD2LOG("product name [0x%05x] = \"%s\"\n", u, vbe->product_name);
+
+ l = get_data(tmp, sizeof tmp, u = segofs2addr(v + 0x1e));
+ vbe->product_revision = canon_str(tmp, l);
+ ADD2LOG("product revision [0x%05x] = \"%s\"\n", u, vbe->product_revision);
+
+ l = get_data(tmp, sizeof tmp, u = segofs2addr(v + 0x0e)) >> 1;
+
+ for(i = vbe->modes = 0; i < l && i < sizeof modelist / sizeof *modelist; i++) {
+ u = tmp[2 * i] + (tmp[2 * i + 1] << 8);
+ if(u != 0xffff)
+ modelist[vbe->modes++] = u;
+ else
+ break;
+ }
+
+ ADD2LOG("%u video modes:\n", vbe->modes);
+
+ vbe->mode = new_mem(vbe->modes * sizeof *vbe->mode);
+
+ if(!vbe->mode) return;
+
+ for(i = 0; i < vbe->modes; i++) {
+
+ mi = vbe->mode + i;
+
+ mi->number = modelist[i];
+
+ ax = 0x4f01; bx = 0; cx = modelist[i];
+ l = CallInt10(&ax, &bx, &cx, tmp, sizeof tmp, cpuemu) & 0xffff;
+
+ if(l != 0x4f) {
+ ADD2LOG("0x%04x: no mode info\n", modelist[i]);
+ continue;
+ }
+
+ mi->attributes = tmp[0x00] + (tmp[0x01] << 8);
+
+ mi->width = tmp[0x12] + (tmp[0x13] << 8);
+ mi->height = tmp[0x14] + (tmp[0x15] << 8);
+ mi->bytes_p_line = tmp[0x10] + (tmp[0x11] << 8);
+
+ mi->win_A_start = (tmp[0x08] + (tmp[0x09] << 8)) << 4;
+ mi->win_B_start = (tmp[0x0a] + (tmp[0x0b] << 8)) << 4;
+
+ mi->win_A_attr = tmp[0x02];
+ mi->win_B_attr = tmp[0x03];
+
+ mi->win_gran = (tmp[0x04] + (tmp[0x05] << 8)) << 10;
+ mi->win_size = (tmp[0x06] + (tmp[0x07] << 8)) << 10;
+
+ bpp = res_bpp = 0;
+ switch(tmp[0x1b]) {
+ case 0:
+ bpp = -1;
+ break;
+
+ case 1:
+ bpp = 2;
+ break;
+
+ case 2:
+ bpp = 1;
+ break;
+
+ case 3:
+ bpp = 4;
+ break;
+
+ case 4:
+ bpp = 8;
+ break;
+
+ case 6:
+ bpp = tmp[0x19] - tmp[0x25];
+ res_bpp = tmp[0x25];
+ }
+
+ fb = 0;
+ if(vbe->version >= 0x0200) {
+ mi->fb_start = tmp[0x28] + (tmp[0x29] << 8) + (tmp[0x2a] << 16) + (tmp[0x2b] << 24);
+ }
+
+ clock = 0;
+ if(vbe->version >= 0x0300) {
+ mi->pixel_clock = tmp[0x3e] + (tmp[0x3f] << 8) + (tmp[0x40] << 16) + (tmp[0x41] << 24);
+ }
+
+ mi->pixel_size = bpp;
+
+ if(bpp == -1u) {
+ ADD2LOG(" 0x%04x[%02x]: %ux%u, text\n", mi->number, mi->attributes, mi->width, mi->height);
+ }
+ else {
+ if(
+ (mi->attributes & 1) && /* mode is supported */
+ mi->fb_start
+ ) {
+ if(!vbe->fb_start) vbe->fb_start = mi->fb_start;
+ }
+ *s = 0;
+ if(res_bpp) sprintf(s, "+%u", res_bpp);
+ ADD2LOG(
+ " 0x%04x[%02x]: %ux%u+%u, %u%s bpp",
+ mi->number, mi->attributes, mi->width, mi->height, mi->bytes_p_line, mi->pixel_size, s
+ );
+
+ if(mi->pixel_clock) ADD2LOG(", max. %u MHz", mi->pixel_clock/1000000);
+
+ if(mi->fb_start) ADD2LOG(", fb: 0x%08x", mi->fb_start);
+
+ ADD2LOG(", %04x.%x", mi->win_A_start, mi->win_A_attr);
+
+ if(mi->win_B_start || mi->win_B_attr) ADD2LOG("/%04x.%x", mi->win_B_start, mi->win_B_attr);
+
+ ADD2LOG(": %uk", mi->win_size >> 10);
+
+ if(mi->win_gran != mi->win_size) ADD2LOG("/%uk", mi->win_gran >> 10);
+
+ ADD2LOG("\n");
+ }
+ }
+
+}
+
+void log_err(char *format, ...)
+{
+ va_list args;
+ char buf[1024];
+
+ va_start(args, format);
+ vsnprintf(buf, sizeof buf, format, args);
+ str_printf(&log_hd_data->log, -2, "%s", buf);
+ va_end(args);
+}
+
--- /dev/null
+/*
+ * Copyright 1999 Egbert Eich
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of the authors not be used in
+ * advertising or publicity pertaining to distribution of the software without
+ * specific, written prior permission. The authors makes no representations
+ * about the suitability of this software for any purpose. It is provided
+ * "as is" without express or implied warranty.
+ *
+ * THE AUTHORS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+#include "v86bios.h"
+
+#ifndef V86_PCI_H
+#define V86_PCI_H
+
+typedef union {
+ struct {
+ unsigned int zero:2;
+ unsigned int reg:6;
+ unsigned int func:3;
+ unsigned int dev:5;
+ unsigned int bus:8;
+ unsigned int reserved:7;
+ unsigned int enable:1;
+ } pci;
+ CARD32 l;
+} PciSlot;
+
+typedef struct pciBusRec {
+ CARD8 primary;
+ CARD8 secondary;
+ CARD32 bctl;
+ PciSlot Slot;
+ struct pciBusRec *next;
+ struct pciBusRec *pBus;
+} PciBusRec, *PciBusPtr;
+
+typedef struct pciStructRec {
+ CARD16 VendorID;
+ CARD16 DeviceID;
+ CARD8 Interface;
+ CARD8 BaseClass;
+ CARD8 SubClass;
+ CARD32 RomBase;
+ CARD32 bus;
+ CARD8 dev;
+ CARD8 func;
+ CARD32 cmd_st;
+ int active;
+ PciSlot Slot;
+ struct pciStructRec *next;
+ PciBusPtr pBus;
+} PciStructRec , *PciStructPtr;
+
+
+extern PciStructPtr CurrentPci;
+extern PciStructPtr PciList;
+extern PciStructPtr BootBios;
+extern int pciMaxBus;
+
+extern CARD32 findPci(CARD16 slotBX);
+extern CARD16 pciSlotBX(PciStructPtr);
+PciStructPtr findPciDevice(CARD16 vendorID, CARD16 deviceID, char n);
+PciStructPtr findPciClass(CARD8 intf, CARD8 subClass, CARD16 class, char n);
+
+extern CARD8 PciRead8(int offset, CARD32 slot);
+extern CARD16 PciRead16(int offset, CARD32 slot);
+extern CARD32 PciRead32(int offset, CARD32 slot);
+
+extern void PciWrite8(int offset,CARD8 byte, CARD32 slot);
+extern void PciWrite16(int offset,CARD16 word, CARD32 slot);
+extern void PciWrite32(int offset,CARD32 lg, CARD32 slot);
+
+extern void scan_pci(int);
+extern void pciVideoDisable(void);
+extern void pciVideoRestore(void);
+extern void EnableCurrent(void);
+extern int mapPciRom(PciStructPtr pciP);
+extern int cfg1out(CARD16 addr, CARD32 val);
+extern int cfg1in(CARD16 addr, CARD32 *val);
+extern void list_pci(void);
+extern PciStructPtr findPciByIDs(int bus, int dev, int func);
+
+#define PCI_MODE2_ENABLE_REG 0xCF8
+#define PCI_MODE2_FORWARD_REG 0xCFA
+#define PCI_MODE1_ADDRESS_REG 0xCF8
+#define PCI_MODE1_DATA_REG 0xCFC
+#if defined(__alpha__) || defined(__sparc__)
+#define PCI_EN 0x00000000
+#else
+#define PCI_EN 0x80000000
+#endif
+#define MAX_DEV_PER_VENDOR_CFG1 32
+#define BRIDGE_CLASS(x) (x == 0x06)
+#define BRIDGE_PCI_CLASS(x) (x == 0x04)
+#define BRIDGE_HOST_CLASS(x) (x == 0x00)
+#define PCI_CLASS_PREHISTORIC 0x00
+#define PCI_SUBCLASS_PREHISTORIC_VGA 0x01
+#define PCI_CLASS_DISPLAY 0x03
+#define PCI_SUBCLASS_DISPLAY_VGA 0x00
+#define PCI_SUBCLASS_DISPLAY_XGA 0x01
+#define PCI_SUBCLASS_DISPLAY_MISC 0x80
+#define VIDEO_CLASS(b,s) \
+ (((b) == PCI_CLASS_PREHISTORIC && (s) == PCI_SUBCLASS_PREHISTORIC_VGA) || \
+ ((b) == PCI_CLASS_DISPLAY && (s) == PCI_SUBCLASS_DISPLAY_VGA) ||\
+ ((b) == PCI_CLASS_DISPLAY && (s) == PCI_SUBCLASS_DISPLAY_XGA) ||\
+ ((b) == PCI_CLASS_DISPLAY && (s) == PCI_SUBCLASS_DISPLAY_MISC))
+#define PCI_MULTIFUNC_DEV 0x80
+#define MAX_PCI_DEVICES 64
+#define PCI_MAXBUS 16
+#define PCI_IS_MEM 0x00000001
+#define MAX_PCI_ROM_SIZE (1024 * 1024 * 16)
+
+#define IS_MEM32(x) ((x & 0x7) == 0 && x != 0)
+#define IS_MEM64(x) ((x & 0x7) == 0x4)
+#endif
--- /dev/null
+/*
+ * Copyright 1999 Egbert Eich
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of the authors not be used in
+ * advertising or publicity pertaining to distribution of the software without
+ * specific, written prior permission. The authors makes no representations
+ * about the suitability of this software for any purpose. It is provided
+ * "as is" without express or implied warranty.
+ *
+ * THE AUTHORS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+#ifndef V86_BIOS_H
+#define V86_BIOS_H
+
+#if defined (__i386__) || defined (__i486__) || defined (__i586__) || defined (__i686__) || defined (__k6__)
+# ifndef __ia32__
+# define __ia32__
+# endif
+#endif
+
+#include <stdio.h>
+
+#define p_printf(f,a...) do {if (Config.PrintPort) lprintf(f,##a);} \
+ while(0)
+#define i_printf(f,a...) do {if (Config.PrintIrq) lprintf(f,##a);} \
+ while(0)
+#define P_printf(f,a...) do {if (Config.PrintPci) lprintf(f,##a);} \
+ while(0)
+
+typedef unsigned char CARD8;
+typedef unsigned short CARD16;
+typedef unsigned int CARD32;
+#if defined (__alpha__) || defined (__ia64__)
+typedef unsigned long memType;
+#else
+typedef unsigned int memType;
+#endif
+
+typedef int Bool;
+
+#define FALSE 0
+#define TRUE 1
+
+struct config {
+ Bool PrintPort;
+ Bool IoStatistics;
+ Bool PrintIrq;
+ Bool PrintPci;
+ Bool ShowAllDev;
+ Bool PrintIp;
+ Bool SaveBios;
+ Bool Trace;
+ Bool ConfigActiveOnly;
+ Bool ConfigActiveDevice;
+ Bool MapSysBios;
+ Bool Resort;
+ Bool FixRom;
+ Bool NoConsole;
+ Bool BootOnly;
+ int Verbose;
+};
+
+struct pio {
+ CARD8 (*inb)(CARD16);
+ CARD16 (*inw)(CARD16);
+ CARD32 (*inl)(CARD16);
+ void (*outb)(CARD16,CARD8);
+ void (*outw)(CARD16,CARD16);
+ void (*outl)(CARD16,CARD32);
+};
+
+struct regs86 {
+ long ebx;
+ long ecx;
+ long edx;
+ long esi;
+ long edi;
+ long ebp;
+ long eax;
+ long eip;
+ long esp;
+ unsigned short cs;
+ unsigned short ss;
+ unsigned short es;
+ unsigned short ds;
+ unsigned short fs;
+ unsigned short gs;
+ long eflags;
+};
+
+typedef struct {
+ CARD32 ax;
+ CARD32 bx;
+ CARD32 cx;
+ CARD32 dx;
+ CARD32 cs;
+ CARD32 es;
+ CARD32 ds;
+ CARD32 si;
+ CARD32 di;
+} i86biosRegs, *i86biosRegsPtr;
+
+typedef struct {
+ int fd;
+ int vt;
+} console;
+
+typedef struct {
+ void* address;
+ CARD8 orgval;
+} haltpoints;
+
+enum dev_type { NONE, ISA, PCI };
+struct device {
+ Bool booted;
+ enum dev_type type;
+ union {
+ int none;
+ struct pci {
+ int bus;
+ int dev;
+ int func;
+ } pci;
+ } loc;
+};
+
+extern struct device Device;
+
+#ifdef __alpha__
+unsigned long _bus_base(void);
+extern void* vram_map;
+extern int sparse_shift;
+#endif
+
+extern struct pio P;
+extern struct config Config;
+#define IOPERM_BITS 1024
+extern int ioperm_list[IOPERM_BITS];
+
+extern void setup_io(void);
+extern void do_x86(unsigned long bios_start,i86biosRegsPtr regs, int cpuemu);
+extern int run_bios_int(int num, struct regs86 *regs);
+extern CARD32 getIntVect(int num);
+CARD32 getIP(void);
+
+extern void call_boot(struct device *dev);
+extern void runINT(int num,i86biosRegsPtr Regs);
+extern void add_hlt(unsigned long addr);
+extern void del_hlt(int addr);
+extern void list_hlt();
+
+extern int port_rep_inb(CARD16 port, CARD8 *base, int d_f, CARD32 count);
+extern int port_rep_inw(CARD16 port, CARD16 *base, int d_f, CARD32 count);
+extern int port_rep_inl(CARD16 port, CARD32 *base, int d_f, CARD32 count);
+extern int port_rep_outb(CARD16 port, CARD8 *base, int d_f, CARD32 count);
+extern int port_rep_outw(CARD16 port, CARD16 *base, int d_f, CARD32 count);
+extern int port_rep_outl(CARD16 port, CARD32 *base, int d_f, CARD32 count);
+extern CARD8 p_inb(CARD16 port);
+extern CARD16 p_inw(CARD16 port);
+extern CARD32 p_inl(CARD16 port);
+extern void p_outb(CARD16 port, CARD8 val);
+extern void p_outw(CARD16 port, CARD16 val);
+extern void p_outl(CARD16 port, CARD32 val);
+#ifdef __alpha__
+extern CARD8 a_inb(CARD16 port);
+extern CARD16 a_inw(CARD16 port);
+extern void a_outb(CARD16 port, CARD8 val);
+extern void a_outw(CARD16 port, CARD16 val);
+#endif
+#ifdef __alpha__
+CARD8 mem_rb(CARD32 addr);
+CARD16 mem_rw(CARD32 addr);
+CARD32 mem_rl(CARD32 addr);
+void mem_wb(CARD32 addr, CARD8 val);
+void mem_ww(CARD32 addr, CARD16 val);
+void mem_wl(CARD32 addr, CARD32 val);
+#endif
+extern void io_statistics(void);
+extern void clear_stat(void);
+extern int int_handler(int num, struct regs86 *regs);
+
+extern console open_console(void);
+extern void close_console(console);
+
+extern void dprint(unsigned long start, unsigned long size);
+
+extern Bool logging;
+extern Bool nostdout;
+extern char* logfile;
+extern void logon(void* ptr);
+extern void logoff();
+extern void lprintf(const char *f, ...);
+
+#define MEM_FILE "/dev/mem"
+#define DEFAULT_V_BIOS 0xc0000
+#ifndef V_BIOS
+#define V_BIOS DEFAULT_V_BIOS
+#endif
+
+#ifdef __alpha__
+#define NEED_PCI_IO
+#endif
+
+#endif
+
--- /dev/null
+#include "hd.h"
+
+int InitInt10(hd_data_t *, int);
+int CallInt10(int *ax, int *bx, int *cx, unsigned char *buf, int len, int cpuemu);
+int CallInt13(int *ax, int *bx, int *cx, int *dx, unsigned char *buf, int len, int cpuemu);
+void FreeInt10(void);
--- /dev/null
+#ifndef _LINUX_VM86_H
+#define _LINUX_VM86_H
+
+/*
+ * I'm guessing at the VIF/VIP flag usage, but hope that this is how
+ * the Pentium uses them. Linux will return from vm86 mode when both
+ * VIF and VIP is set.
+ *
+ * On a Pentium, we could probably optimize the virtual flags directly
+ * in the eflags register instead of doing it "by hand" in vflags...
+ *
+ * Linus
+ */
+
+#define TF_MASK 0x00000100
+#define IF_MASK 0x00000200
+#define IOPL_MASK 0x00003000
+#define NT_MASK 0x00004000
+#define VM_MASK 0x00020000
+#define AC_MASK 0x00040000
+#define VIF_MASK 0x00080000 /* virtual interrupt flag */
+#define VIP_MASK 0x00100000 /* virtual interrupt pending */
+#define ID_MASK 0x00200000
+
+#define BIOSSEG 0x0f000
+
+#define CPU_086 0
+#define CPU_186 1
+#define CPU_286 2
+#define CPU_386 3
+#define CPU_486 4
+#define CPU_586 5
+
+/*
+ * Return values for the 'vm86()' system call
+ */
+#define VM86_TYPE(retval) ((retval) & 0xff)
+#define VM86_ARG(retval) ((retval) >> 8)
+
+#define VM86_SIGNAL 0 /* return due to signal */
+#define VM86_UNKNOWN 1 /* unhandled GP fault - IO-instruction or similar */
+#define VM86_INTx 2 /* int3/int x instruction (ARG = x) */
+#define VM86_STI 3 /* sti/popf/iret instruction enabled virtual interrupts */
+
+/*
+ * Additional return values when invoking new vm86()
+ */
+#define VM86_PICRETURN 4 /* return due to pending PIC request */
+#define VM86_TRAP 6 /* return due to DOS-debugger request */
+
+/*
+ * function codes when invoking new vm86()
+ */
+#define VM86_PLUS_INSTALL_CHECK 0
+#define VM86_ENTER 1
+#define VM86_ENTER_NO_BYPASS 2
+#define VM86_REQUEST_IRQ 3
+#define VM86_FREE_IRQ 4
+#define VM86_GET_IRQ_BITS 5
+#define VM86_GET_AND_RESET_IRQ 6
+
+/*
+ * This is the stack-layout seen by the user space program when we have
+ * done a translation of "SAVE_ALL" from vm86 mode. The real kernel layout
+ * is 'kernel_vm86_regs' (see below).
+ */
+
+struct vm86_regs {
+/*
+ * normal regs, with special meaning for the segment descriptors..
+ */
+ long ebx;
+ long ecx;
+ long edx;
+ long esi;
+ long edi;
+ long ebp;
+ long eax;
+ long __null_ds;
+ long __null_es;
+ long __null_fs;
+ long __null_gs;
+ long orig_eax;
+ long eip;
+ unsigned short cs, __csh;
+ long eflags;
+ long esp;
+ unsigned short ss, __ssh;
+/*
+ * these are specific to v86 mode:
+ */
+ unsigned short es, __esh;
+ unsigned short ds, __dsh;
+ unsigned short fs, __fsh;
+ unsigned short gs, __gsh;
+};
+
+struct revectored_struct {
+ unsigned long __map[8]; /* 256 bits */
+};
+
+struct vm86_struct {
+ struct vm86_regs regs;
+ unsigned long flags;
+ unsigned long screen_bitmap;
+ unsigned long cpu_type;
+ struct revectored_struct int_revectored;
+ struct revectored_struct int21_revectored;
+};
+
+/*
+ * flags masks
+ */
+#define VM86_SCREEN_BITMAP 0x0001
+
+struct vm86plus_info_struct {
+ unsigned long force_return_for_pic:1;
+ unsigned long vm86dbg_active:1; /* for debugger */
+ unsigned long vm86dbg_TFpendig:1; /* for debugger */
+ unsigned long unused:28;
+ unsigned long is_vm86pus:1; /* for vm86 internal use */
+ unsigned char vm86dbg_intxxtab[32]; /* for debugger */
+};
+
+struct vm86plus_struct {
+ struct vm86_regs regs;
+ unsigned long flags;
+ unsigned long screen_bitmap;
+ unsigned long cpu_type;
+ struct revectored_struct int_revectored;
+ struct revectored_struct int21_revectored;
+ struct vm86plus_info_struct vm86plus;
+};
+
+#endif
--- /dev/null
+TOPDIR = ../..
+TARGETS = $(LIBHD_D)
+SUBDIRS = cdb
+
+include $(TOPDIR)/Makefile.common
+
+$(LIBHD_D): $(OBJS)
+ ar r $(LIBHD) $?
+
--- /dev/null
+#
+# CDB data export for subclass: ISDN Single Basic Rate
+# Generated at : Sat Aug 30 17:22:29 2003
+#
+# Exported combinations:
+# arch=axp dist=Stable lang=de_DE vario=HiSax driver
+# arch=axp dist=Stable lang=de_DE vario=I4L driver
+# arch=axp dist=Stable lang=de_DE vario=CAPI 2.0 driver
+#
+# Author: dhess@suse.de (13.02.2003)
+# Author: didge@suse.de (04.08.2003)
+#
+#
+# Export format: |Vendorname|Productname|Subclass|Bus|Variation|topic=value|topic=value|...|Variation|topic=value|topic=value|...|
+#
+
+
+|vendor=Billion|device=B009|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x1397|device_id=0xb009|subvendor_id=0xffff|subdevice_id=0xffff|vario=HiSax driver|SMP=Yes|drv_id=0x50023|drv_subtyp=5|drv_typ=35|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=ITH|device=ith mic|device_class=ISDN Single Basic Rate|bus_type=ISA|vario=HiSax driver|IO=0x200|IRQ=10|IRQ=11|IRQ=12|IRQ=15|IRQ=3|IRQ=4|IRQ=5|IRQ=7|SMP=Yes|drv_id=0x11|drv_subtyp=0|drv_typ=17|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=High Soft Tech|device=Saphir|device_class=ISDN Single Basic Rate|bus_type=ISA|vario=HiSax driver|IO=0x250|IO=0x270|IO=0x290|IO=0x2b0|IO=0x2d0|IO=0x350|IO=0x370|IRQ=11|IRQ=12|IRQ=15|IRQ=3|IRQ=5|SMP=Yes|drv_id=0x1f|drv_subtyp=0|drv_typ=31|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Billion|device=B00C|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x1397|device_id=0xb00c|subvendor_id=0xffff|subdevice_id=0xffff|vario=HiSax driver|SMP=Yes|drv_id=0x80023|drv_subtyp=8|drv_typ=35|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Cologne Chip AG|device=HFCS+ based card|device_class=ISDN Single Basic Rate|bus_type=ISA|vendor_id=0x0000|device_id=0x0000|vario=HiSax driver|SMP=Yes|drv_id=0x10025|drv_subtyp=1|drv_typ=37|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Telekom AG|device=A1T|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x0871|device_id=0xffa1|subvendor_id=0xffff|subdevice_id=0xffff|vario=HiSax driver|SMP=Yes|drv_id=0xd0023|drv_subtyp=13|drv_typ=35|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Sagem|device=Niccy PCI|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x1267|device_id=0x1016|subvendor_id=0xffff|subdevice_id=0xffff|vario=HiSax driver|SMP=Yes|drv_id=0x20018|drv_subtyp=2|drv_typ=24|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Cologne Chip AG|device=HFC 2BDS0|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x1397|device_id=0x2bd0|subvendor_id=0xffff|subdevice_id=0xffff|vario=HiSax driver|SMP=Yes|drv_id=0x110023|drv_subtyp=17|drv_typ=35|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Formula-n|device=enter:now|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0xe159|device_id=0x0001|subvendor_id=0x0055|subdevice_id=0x0002|vario=HiSax driver|SMP=Yes|drv_id=0x10029|drv_subtyp=1|drv_typ=41|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|short_description=under development|supported=full|
+|vendor=ICN|device=2B|device_class=ISDN Single Basic Rate|bus_type=ISA|vario=I4L driver|IO=0x300|IO=0x308|IO=0x310|IO=0x318|IO=0x320|IO=0x328|IO=0x330|IO=0x338|IO=0x340|IO=0x348|IO=0x350|IO=0x358|IO=0x360|IO=0x368|MEMBASE=0xc0000|MEMBASE=0xc2000|MEMBASE=0xc4000|MEMBASE=0xc6000|MEMBASE=0xc8000|MEMBASE=0xca000|MEMBASE=0xcc000|MEMBASE=0xce000|MEMBASE=0xd0000|MEMBASE=0xd2000|MEMBASE=0xd4000|MEMBASE=0xd6000|MEMBASE=0xd8000|MEMBASE=0xda000|MEMBASE=0xdc000|MEMBASE=0xde000|SMP=Yes|drv_id=0x1f5e|drv_subtyp=0|drv_typ=8030|firmware=pc-%{PROTO}.bin|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=icn|need_packages=i4l-base|supported=full|
+|vendor=TigerJet|device=NetJet PCI|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0xe159|device_id=0x0001|subvendor_id=0x00ff|subdevice_id=0x000f|vario=HiSax driver|SMP=Yes|drv_id=0x10014|drv_subtyp=1|drv_typ=20|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Scitel|device=Quadro|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x10b5|device_id=0x9050|subvendor_id=0x0871|subdevice_id=0xffa8|vario=HiSax driver|SMP=Yes|drv_id=0x21|drv_subtyp=0|drv_typ=33|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Elsa AG|device=ML PCC-16|device_class=ISDN Single Basic Rate|bus_type=ISA|vario=HiSax driver|IO=0x160|IO=0x170|IO=0x260|IO=0x360|IRQ=10|IRQ=11|IRQ=15|IRQ=3|IRQ=5|IRQ=9|SMP=Yes|drv_id=0x30006|drv_subtyp=3|drv_typ=6|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Teles AG|device=16.3c v.2.1|device_class=ISDN Single Basic Rate|bus_type=ISA|vendor_id=0x2750|device_id=0x2026|vario=HiSax driver|SMP=Yes|drv_id=0x25|drv_subtyp=0|drv_typ=37|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Sedlbauer AG|device=Speed Win|device_class=ISDN Single Basic Rate|bus_type=ISA|vendor_id=0x274c|device_id=0x0100|vario=HiSax driver|SMP=Yes|drv_id=0x1000f|drv_subtyp=1|drv_typ=15|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Teles AG|device=S0Box|device_class=ISDN Single Basic Rate|bus_type=Parallel|vario=HiSax driver|IO=0x278|IO=0x378|IO=0x3bc|IRQ=5|IRQ=7|SMP=Yes|drv_id=0x19|drv_subtyp=0|drv_typ=25|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Eicon Networks|device=Diva 2.0U PCI|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x1133|device_id=0xe004|subvendor_id=0xffff|subdevice_id=0xffff|vario=HiSax driver|SMP=Yes|drv_id=0xc000b|drv_subtyp=12|drv_typ=11|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=CREATIX Creative Information eXchange|device=16.3 PNP|device_class=ISDN Single Basic Rate|bus_type=ISA|vendor_id=0x980e|device_id=0x0000|vario=HiSax driver|SMP=Yes|drv_id=0x10004|drv_subtyp=1|drv_typ=4|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Teles AG|device=iSTAR PnP|device_class=ISDN Single Basic Rate|bus_type=ISA|vendor_id=0x2750|device_id=0x1074|vario=HiSax driver|SMP=Yes|drv_id=0x1000e|drv_subtyp=1|drv_typ=14|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Siemens|device=ISURF|device_class=ISDN Single Basic Rate|bus_type=ISA|vendor_id=0x254d|device_id=0x1000|vario=HiSax driver|SMP=Yes|drv_id=0x1d|drv_subtyp=0|drv_typ=29|feature=Fax|firmware=ISAR.BIN|interface=FCLASS1|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Auerswald|device=Comfort 1200 System Telephone|device_class=ISDN Single Basic Rate|bus_type=USB|vendor_id=0x09bf|device_id=0x00f2|vario=HiSax driver|SMP=Yes|drv_id=0x3002a|drv_subtyp=3|drv_typ=42|interface=I4L|line_cnt=1|line_protocol=DSS1|module=auerswald|need_packages=i4l-base|need_packages=i4l-isdnlog|supported=full|
+|vendor=AsKey|device=PCI (CCD HFC)|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x1397|device_id=0x2bd0|subvendor_id=0x144f|subdevice_id=0x1704|vario=HiSax driver|SMP=Yes|drv_id=0xc0023|drv_subtyp=12|drv_typ=35|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=AVM Computersysteme Vertriebs GmbH|device=B1 PCMCIA|device_class=ISDN Single Basic Rate|bus_type=PCMCIA|vario=CAPI 2.0 driver|SMP=Yes|drv_id=0x21f41|drv_subtyp=2|drv_typ=8001|feature=Fax|firmware=b1-%{PROTO}.t4|interface=CAPI20|interface=CAPI20 Fax|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=b1pcmcia|need_packages=capi4linux|need_packages=i4l-base|need_packages=i4l-isdnlog|need_packages=i4lfirm|supported=full|
+|vendor=Billion|device=BIPAC-D1|device_class=ISDN Single Basic Rate|bus_type=ISA|vendor_id=0x2c09|device_id=0x0100|vario=HiSax driver|SMP=Yes|drv_id=0x2001e|drv_subtyp=2|drv_typ=30|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Auerswald|device=COMpact 2104 USB|device_class=ISDN Single Basic Rate|bus_type=USB|vendor_id=0x09bf|device_id=0x00c0|vario=HiSax driver|SMP=Yes|drv_id=0x2002a|drv_subtyp=2|drv_typ=42|interface=I4L|line_cnt=1|line_protocol=DSS1|module=auerswald|need_packages=i4l-base|need_packages=i4l-isdnlog|supported=full|
+|vendor=Gazel|device=R685|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x10b5|device_id=0x1030|subvendor_id=0xffff|subdevice_id=0xffff|vario=HiSax driver|SMP=Yes|drv_id=0x22|drv_subtyp=0|drv_typ=34|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=ASUSCOM|device=PCI (CCD HFC)|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x1043|device_id=0x0675|subvendor_id=0x0675|subdevice_id=0x1704|vario=HiSax driver|SMP=Yes|drv_id=0xa0023|drv_subtyp=10|drv_typ=35|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=ASUSCOM|device=PCI (W6692)|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x1050|device_id=0x6692|subvendor_id=0x1043|subdevice_id=0x1702|vario=HiSax driver|SMP=Yes|drv_id=0x24|drv_subtyp=0|drv_typ=36|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Teles AG|device=16.3 PNP|device_class=ISDN Single Basic Rate|bus_type=ISA PnP|vendor_id=0x2750|device_id=0x1021|vario=HiSax driver|SMP=Yes|drv_id=0x4|drv_subtyp=0|drv_typ=4|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Sedlbauer AG|device=Speed Star|device_class=ISDN Single Basic Rate|bus_type=PCMCIA|vario=HiSax driver|SMP=Yes|drv_id=0x20016|drv_subtyp=2|drv_typ=22|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=AVM Computersysteme Vertriebs GmbH|device=FRITZ!X seriell|device_class=ISDN Single Basic Rate|bus_type=Serial|vario=HiSax driver|line_cnt=1|supported=not|
+|vendor=Elsa AG|device=ML PCF-Pro|device_class=ISDN Single Basic Rate|bus_type=ISA|vario=HiSax driver|IO=0x160|IO=0x170|IO=0x260|IO=0x360|IRQ=10|IRQ=11|IRQ=15|IRQ=3|IRQ=5|IRQ=9|SMP=Yes|drv_id=0x50006|drv_subtyp=5|drv_typ=6|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Digi|device=DataFire Micro V IOM2 (Europe)|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x114f|device_id=0x0070|subvendor_id=0xffff|subdevice_id=0xffff|vario=HiSax driver|SMP=Yes|drv_id=0x120023|drv_subtyp=18|drv_typ=35|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Elsa AG|device=Quickstep 3000|device_class=ISDN Single Basic Rate|bus_type=ISA|vendor_id=0x9315|device_id=0x3401|vario=HiSax driver|SMP=Yes|drv_id=0x80007|drv_subtyp=8|drv_typ=7|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Genius|device=Speed Surfer|device_class=ISDN Single Basic Rate|bus_type=ISA|vendor_id=0x252f|device_id=0x0100|vario=HiSax driver|SMP=Yes|drv_id=0x3001e|drv_subtyp=3|drv_typ=30|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Digi|device=DataFire Micro V (North America)|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x114f|device_id=0x0073|subvendor_id=0xffff|subdevice_id=0xffff|vario=HiSax driver|SMP=Yes|drv_id=0x150023|drv_subtyp=21|drv_typ=35|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Berkom|device=A4T|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x11de|device_id=0x6120|subvendor_id=0x0871|subdevice_id=0xffa4|vario=HiSax driver|SMP=Yes|drv_id=0x20|drv_subtyp=0|drv_typ=32|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Siemens|device=ISurf 2|device_class=ISDN Single Basic Rate|bus_type=ISA|vendor_id=0x254d|device_id=0x2000|vario=HiSax driver|SMP=Yes|drv_id=0x3000c|drv_subtyp=3|drv_typ=12|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Digi|device=DataFire Micro V (Europe)|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x114f|device_id=0x0071|subvendor_id=0xffff|subdevice_id=0xffff|vario=HiSax driver|SMP=Yes|drv_id=0x130023|drv_subtyp=19|drv_typ=35|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=U.S.Robotics|device=Sportster|device_class=ISDN Single Basic Rate|bus_type=ISA|vario=HiSax driver|IO=0x268|IRQ=10|IRQ=11|IRQ=12|IRQ=14|IRQ=15|IRQ=5|IRQ=7|SMP=Yes|drv_id=0x10|drv_subtyp=0|drv_typ=16|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Zolltrix|device=2BDS0|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x15b0|device_id=0x2bd0|subvendor_id=0xffff|subdevice_id=0xffff|vario=HiSax driver|SMP=Yes|drv_id=0x100023|drv_subtyp=16|drv_typ=35|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Eicon Networks|device=Diva Piccola|device_class=ISDN Single Basic Rate|bus_type=ISA|vendor_id=0x891c|device_id=0x5100|vario=HiSax driver|SMP=Yes|drv_id=0xb000b|drv_subtyp=11|drv_typ=11|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Motorola|device=MC145575|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x1051|device_id=0x0100|subvendor_id=0xffff|subdevice_id=0xffff|vario=HiSax driver|SMP=Yes|drv_id=0xf0023|drv_subtyp=15|drv_typ=35|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=AVM Computersysteme Vertriebs GmbH|device=FRITZ!Card PnP|device_class=ISDN Single Basic Rate|bus_type=ISA|vendor_id=0xcd06|device_id=0x0009|vario=HiSax driver|SMP=Yes|drv_id=0x2001b|drv_subtyp=2|drv_typ=27|feature=Fax|info=This card has multiple drivers, some functions are only available on the binonly driver|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|short_description=OpenSource without Fax G3|supported=full|
+|vendor=Teles AG|device=16.0 AB|device_class=ISDN Single Basic Rate|bus_type=ISA|vario=HiSax driver|IO=0xd80|IO=0xe80|IO=0xf80|IRQ=10|IRQ=11|IRQ=12|IRQ=15|IRQ=3|IRQ=4|IRQ=5|IRQ=9|MEMBASE=0xc0000|MEMBASE=0xc2000|MEMBASE=0xc4000|MEMBASE=0xc6000|MEMBASE=0xc8000|MEMBASE=0xca000|MEMBASE=0xcc000|MEMBASE=0xce000|MEMBASE=0xd0000|MEMBASE=0xd2000|MEMBASE=0xd4000|MEMBASE=0xd6000|MEMBASE=0xd8000|MEMBASE=0xda000|MEMBASE=0xdc000|MEMBASE=0xde000|SMP=Yes|drv_id=0x10001|drv_subtyp=1|drv_typ=1|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Elsa AG|device=PCMCIA IPAC|device_class=ISDN Single Basic Rate|bus_type=PCMCIA|vario=HiSax driver|SMP=Yes|drv_id=0xb000a|drv_subtyp=11|drv_typ=10|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Billion|device=B006|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x1397|device_id=0xb006|subvendor_id=0xffff|subdevice_id=0xffff|vario=HiSax driver|SMP=Yes|drv_id=0x20023|drv_subtyp=2|drv_typ=35|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=AVM Computersysteme Vertriebs GmbH|device=FRITZ!Card PCMCIA|device_class=ISDN Single Basic Rate|bus_type=PCMCIA|vario=HiSax driver|SMP=Yes|drv_id=0x1a|drv_subtyp=0|drv_typ=26|feature=Fax|info=This card has multiple drivers, some functions are only available on the binonly driver|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|short_description=OpenSource without Fax G3|supported=full|
+|vendor=Winbond|device=W6692 card|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x1050|device_id=0x6692|subvendor_id=0xffff|subdevice_id=0xffff|vario=HiSax driver|SMP=Yes|drv_id=0x60024|drv_subtyp=6|drv_typ=36|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=ASUSCOM|device=ISA IPAC|device_class=ISDN Single Basic Rate|bus_type=ISA|vendor_id=0x7506|device_id=0x9016|vario=HiSax driver|SMP=Yes|drv_id=0x2000c|drv_subtyp=2|drv_typ=12|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=AVM Computersysteme Vertriebs GmbH|device=A1 PCMCIA|device_class=ISDN Single Basic Rate|bus_type=PCMCIA|vario=HiSax driver|SMP=Yes|drv_id=0x1001a|drv_subtyp=1|drv_typ=26|feature=Fax|info=This card has multiple drivers, some functions are only available on the binonly driver|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|short_description=OpenSource without Fax G3|supported=full|
+|vendor=AsKey|device=PCI + Voice (W6692)|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x1050|device_id=0x6692|subvendor_id=0x144f|subdevice_id=0x1703|vario=HiSax driver|SMP=Yes|drv_id=0x30024|drv_subtyp=3|drv_typ=36|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Eicon Networks|device=Diva 2.0 PCI|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x1133|device_id=0xe002|subvendor_id=0xffff|subdevice_id=0xffff|vario=HiSax driver|SMP=Yes|drv_id=0x2000b|drv_subtyp=2|drv_typ=11|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Sedlbauer AG|device=Speed PCI|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0xe159|device_id=0x0002|subvendor_id=0x0053|subdevice_id=0x0001|vario=HiSax driver|SMP=Yes|drv_id=0x6000f|drv_subtyp=6|drv_typ=15|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=ITK|device=ISDN PnP|device_class=ISDN Single Basic Rate|bus_type=ISA|vendor_id=0x8b26|device_id=0x2900|vario=HiSax driver|SMP=Yes|drv_id=0x20009|drv_subtyp=2|drv_typ=9|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Dynalink|device=PCI (W6692)|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x1043|device_id=0x0675|subvendor_id=0x0675|subdevice_id=0x1702|vario=HiSax driver|SMP=Yes|drv_id=0x40024|drv_subtyp=4|drv_typ=36|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Elsa AG|device=ML PC|device_class=ISDN Single Basic Rate|bus_type=ISA|vario=HiSax driver|IO=0x160|IO=0x170|IO=0x260|IO=0x360|IRQ=3|IRQ=5|IRQ=7|IRQ=9|SMP=Yes|drv_id=0x10006|drv_subtyp=1|drv_typ=6|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Eicon Networks|device=Diva 2.01 PCI|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x1133|device_id=0xe005|subvendor_id=0xffff|subdevice_id=0xffff|vario=HiSax driver|SMP=Yes|drv_id=0x4000b|drv_subtyp=4|drv_typ=11|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=U.S.Robotics|device=ISDN PCI Card TA|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x1050|device_id=0x6692|subvendor_id=0x16ec|subdevice_id=0x3409|vario=HiSax driver|SMP=Yes|drv_id=0x70024|drv_subtyp=7|drv_typ=36|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Sagem|device=Niccy ISA|device_class=ISDN Single Basic Rate|bus_type=ISA|vendor_id=0x814c|device_id=0x5001|vario=HiSax driver|SMP=Yes|drv_id=0x10018|drv_subtyp=1|drv_typ=24|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Elsa AG|device=ML PCF|device_class=ISDN Single Basic Rate|bus_type=ISA|vario=HiSax driver|IO=0x160|IO=0x170|IO=0x260|IO=0x360|IRQ=10|IRQ=11|IRQ=15|IRQ=3|IRQ=5|IRQ=9|SMP=Yes|drv_id=0x40006|drv_subtyp=4|drv_typ=6|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Teles AG|device=16.3 AB|device_class=ISDN Single Basic Rate|bus_type=ISA|vario=HiSax driver|IO=0x180|IO=0x280|IO=0x380|IRQ=10|IRQ=11|IRQ=12|IRQ=15|IRQ=3|IRQ=5|IRQ=9|SMP=Yes|drv_id=0x10003|drv_subtyp=1|drv_typ=3|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Dynalink|device=6692 PCI|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x0675|device_id=0x1702|subvendor_id=0xffff|subdevice_id=0xffff|vario=HiSax driver|SMP=Yes|drv_id=0x50024|drv_subtyp=5|drv_typ=36|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=ITK|device=ISDN 3.0|device_class=ISDN Single Basic Rate|bus_type=ISA|vendor_id=0x8b26|device_id=0x2500|vario=HiSax driver|SMP=Yes|drv_id=0x10009|drv_subtyp=1|drv_typ=9|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Teles AG|device=PCI|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x11de|device_id=0x6120|subvendor_id=0x0000|subdevice_id=0x0000|vario=HiSax driver|SMP=Yes|drv_id=0x15|drv_subtyp=0|drv_typ=21|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Sedlbauer AG|device=Speed Win2 PC104|device_class=ISDN Single Basic Rate|bus_type=PC104|vendor_id=0x0000|device_id=0x0000|subvendor_id=0x0000|subdevice_id=0x0000|vario=HiSax driver|SMP=Yes|drv_id=0x4000f|drv_subtyp=4|drv_typ=15|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=AVM Computersysteme Vertriebs GmbH|device=B1 PCI|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x1244|device_id=0x0700|vario=CAPI 2.0 driver|SMP=Yes|drv_id=0x11f41|drv_subtyp=1|drv_typ=8001|feature=Fax|firmware=b1-%{PROTO}.t4|interface=CAPI20|interface=CAPI20 Fax|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=b1pci|need_packages=capi4linux|need_packages=i4l-base|need_packages=i4l-isdnlog|need_packages=i4lfirm|supported=full|
+|vendor=Sedlbauer AG|device=Speed Star2|device_class=ISDN Single Basic Rate|bus_type=PCMCIA|vario=HiSax driver|SMP=Yes|drv_id=0x50016|drv_subtyp=5|drv_typ=22|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Telekom AG|device=Teledat USB 2a/b|device_class=ISDN Single Basic Rate|bus_type=USB|vario=HiSax driver|line_cnt=1|supported=not|
+|vendor=AsKey|device=PCI (W6692)|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x1050|device_id=0x6692|subvendor_id=0x144f|subdevice_id=0x1702|vario=HiSax driver|SMP=Yes|drv_id=0x10024|drv_subtyp=1|drv_typ=36|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=High Soft Tech|device=saphir III|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0xe159|device_id=0x0002|subvendor_id=0x0052|subdevice_id=0x0001|vario=HiSax driver|SMP=Yes|drv_id=0x9000f|drv_subtyp=9|drv_typ=15|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Digi|device=DataFire Micro V IOM2 (North America)|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x114f|device_id=0x0072|subvendor_id=0xffff|subdevice_id=0xffff|vario=HiSax driver|SMP=Yes|drv_id=0x140023|drv_subtyp=20|drv_typ=35|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Dynalink|device=PCI (CCD HFC)|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x1397|device_id=0x2bd0|subvendor_id=0x1043|subdevice_id=0x1704|vario=HiSax driver|SMP=Yes|drv_id=0xb0023|drv_subtyp=11|drv_typ=35|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Elsa AG|device=Quickstep 1000|device_class=ISDN Single Basic Rate|bus_type=ISA|vendor_id=0x9315|device_id=0x3301|vario=HiSax driver|SMP=Yes|drv_id=0x70007|drv_subtyp=7|drv_typ=7|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=ITK|device=ix1-micro Rev.2|device_class=ISDN Single Basic Rate|bus_type=ISA|vario=HiSax driver|IO=0x390|IO=0x398|IO=0x3a0|IO=0x3a8|IRQ=10|IRQ=11|IRQ=5|IRQ=9|SMP=Yes|drv_id=0x9|drv_subtyp=0|drv_typ=9|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Teles AG|device=16.3c|device_class=ISDN Single Basic Rate|bus_type=ISA|vendor_id=0x2750|device_id=0x1026|vario=HiSax driver|SMP=Yes|drv_id=0xe|drv_subtyp=0|drv_typ=14|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=SGS Thomson Microelectronics|device=ST5481 USB Adapter|device_class=ISDN Single Basic Rate|bus_type=USB|vendor_id=0x0483|device_id=0x4810|vario=HiSax driver|SMP=Yes|drv_id=0x103e9|drv_subtyp=1|drv_typ=1001|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax_st5481|need_packages=i4l-base|supported=full|
+|vendor=AVM Computersysteme Vertriebs GmbH|device=FRITZ!Card PCI|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x1244|device_id=0x0a00|subvendor_id=0xffff|subdevice_id=0xffff|vario=HiSax driver|SMP=Yes|alternative_name=Telekom AG,Teledat 150|drv_id=0x1001b|drv_subtyp=1|drv_typ=27|feature=Fax|info=This card has multiple drivers, some functions are only available on the binonly driver|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|short_description=OpenSource without Fax G3|supported=full|
+|vendor=AVM Computersysteme Vertriebs GmbH|device=A1|device_class=ISDN Single Basic Rate|bus_type=ISA|vario=HiSax driver|IO=0x200|IO=0x240|IO=0x300|IO=0x340|IRQ=10|IRQ=11|IRQ=12|IRQ=15|IRQ=3|IRQ=4|IRQ=5|IRQ=7|IRQ=9|SMP=Yes|drv_id=0x10005|drv_subtyp=1|drv_typ=5|feature=Fax|info=This card has multiple drivers, some functions are only available on the binonly driver|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|short_description=OpenSource without Fax G3|supported=full|
+|vendor=Elsa AG|device=PCMCIA|device_class=ISDN Single Basic Rate|bus_type=PCMCIA|vario=HiSax driver|SMP=Yes|drv_id=0x6000a|drv_subtyp=6|drv_typ=10|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Iscas|device=TE320|device_class=ISDN Single Basic Rate|bus_type=ISA|vendor_id=0x8615|device_id=0x0000|vario=HiSax driver|SMP=Yes|drv_id=0x4000c|drv_subtyp=4|drv_typ=12|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Eicon Networks|device=Diva 2.02 PCI|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x1133|device_id=0xe00b|subvendor_id=0xffff|subdevice_id=0xffff|vario=HiSax driver|SMP=Yes|drv_id=0xd000b|drv_subtyp=13|drv_typ=11|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=ASUSCOM|device=ISA ISAC|device_class=ISDN Single Basic Rate|bus_type=ISA|vendor_id=0x7506|device_id=0x8816|vario=HiSax driver|SMP=Yes|drv_id=0x1000c|drv_subtyp=1|drv_typ=12|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Sedlbauer AG|device=Speed Fax+|device_class=ISDN Single Basic Rate|bus_type=ISA|vendor_id=0x274c|device_id=0x0200|vario=HiSax driver|SMP=Yes|drv_id=0x3001c|drv_subtyp=3|drv_typ=28|feature=Fax|firmware=ISAR.BIN|interface=FCLASS1|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Billion|device=B008|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x1397|device_id=0xb008|subvendor_id=0xffff|subdevice_id=0xffff|vario=HiSax driver|SMP=Yes|drv_id=0x40023|drv_subtyp=4|drv_typ=35|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Billion|device=B00B|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x1397|device_id=0xb00b|subvendor_id=0xffff|subdevice_id=0xffff|vario=HiSax driver|SMP=Yes|drv_id=0x70023|drv_subtyp=7|drv_typ=35|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=TigerJet|device=300 PCI|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0xe159|device_id=0x0001|subvendor_id=0xffff|subdevice_id=0xffff|vario=HiSax driver|SMP=Yes|drv_id=0x14|drv_subtyp=0|drv_typ=20|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Seyon|device=B100|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x1397|device_id=0xb100|subvendor_id=0xffff|subdevice_id=0xffff|vario=HiSax driver|SMP=Yes|drv_id=0x90023|drv_subtyp=9|drv_typ=35|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=TigerJet|device=NetSpider-U PCI|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0xe159|device_id=0x0001|subvendor_id=0xffff|subdevice_id=0xffff|vario=HiSax driver|SMP=Yes|drv_id=0x26|drv_subtyp=0|drv_typ=38|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Sedlbauer AG|device=Speed Fax+ PCI|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0xe159|device_id=0x0002|subvendor_id=0x0054|subdevice_id=0x0001|vario=HiSax driver|SMP=Yes|drv_id=0x8001c|drv_subtyp=8|drv_typ=28|feature=Fax|firmware=ISAR.BIN|interface=FCLASS1|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Acer|device=P10|device_class=ISDN Single Basic Rate|bus_type=ISA|vendor_id=0xd805|device_id=0x1411|vario=HiSax driver|SMP=Yes|drv_id=0x1e|drv_subtyp=0|drv_typ=30|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Elsa AG|device=Quickstep 3000 PCI|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x1048|device_id=0x3000|subvendor_id=0xffff|subdevice_id=0xffff|vario=HiSax driver|SMP=Yes|drv_id=0xa0012|drv_subtyp=10|drv_typ=18|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=TeleInt|device=SA1|device_class=ISDN Single Basic Rate|bus_type=ISA|vario=HiSax driver|IO=0x300|IRQ=10|IRQ=11|IRQ=3|IRQ=4|IRQ=5|IRQ=7|SMP=Yes|drv_id=0xd|drv_subtyp=0|drv_typ=13|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Billion|device=B000|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x1397|device_id=0xb000|subvendor_id=0xffff|subdevice_id=0xffff|vario=HiSax driver|SMP=Yes|drv_id=0x10023|drv_subtyp=1|drv_typ=35|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Teles AG|device=8.0|device_class=ISDN Single Basic Rate|bus_type=ISA|vario=HiSax driver|IRQ=3|IRQ=4|IRQ=5|IRQ=6|IRQ=7|IRQ=9|MEMBASE=0xc0000|MEMBASE=0xc2000|MEMBASE=0xc4000|MEMBASE=0xc6000|MEMBASE=0xc8000|MEMBASE=0xca000|MEMBASE=0xcc000|MEMBASE=0xce000|MEMBASE=0xd0000|MEMBASE=0xd2000|MEMBASE=0xd4000|MEMBASE=0xd6000|MEMBASE=0xd8000|MEMBASE=0xda000|MEMBASE=0xdc000|MEMBASE=0xde000|SMP=Yes|drv_id=0x2|drv_subtyp=0|drv_typ=2|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Elsa AG|device=Microlink ISDN USB|device_class=ISDN Single Basic Rate|bus_type=USB|vario=HiSax driver|line_cnt=1|supported=not|
+|vendor=Teles AG|device=16.0|device_class=ISDN Single Basic Rate|bus_type=ISA|vario=HiSax driver|IO=0xd80|IO=0xe80|IO=0xf80|IRQ=10|IRQ=11|IRQ=12|IRQ=15|IRQ=3|IRQ=4|IRQ=5|IRQ=9|MEMBASE=0xc0000|MEMBASE=0xc2000|MEMBASE=0xc4000|MEMBASE=0xc6000|MEMBASE=0xc8000|MEMBASE=0xca000|MEMBASE=0xcc000|MEMBASE=0xce000|MEMBASE=0xd0000|MEMBASE=0xd2000|MEMBASE=0xd4000|MEMBASE=0xd6000|MEMBASE=0xd8000|MEMBASE=0xda000|MEMBASE=0xdc000|MEMBASE=0xde000|SMP=Yes|drv_id=0x1|drv_subtyp=0|drv_typ=1|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Auerswald|device=Comfort 2000 System Telephone|device_class=ISDN Single Basic Rate|bus_type=USB|vendor_id=0x09bf|device_id=0x00f1|vario=HiSax driver|SMP=Yes|drv_id=0x4002a|drv_subtyp=4|drv_typ=42|interface=I4L|line_cnt=1|line_protocol=DSS1|module=auerswald|need_packages=i4l-base|need_packages=i4l-isdnlog|supported=full|
+|vendor=Sedlbauer AG|device=Speed Card|device_class=ISDN Single Basic Rate|bus_type=ISA|vario=HiSax driver|IO=0x270|IRQ=10|IRQ=11|IRQ=12|IRQ=15|IRQ=3|IRQ=4|IRQ=5|IRQ=7|SMP=Yes|alternative_name=Telekom AG,Teledat 100 ISA|drv_id=0xf|drv_subtyp=0|drv_typ=15|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Billion|device=B007|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x1397|device_id=0xb007|subvendor_id=0xffff|subdevice_id=0xffff|vario=HiSax driver|SMP=Yes|drv_id=0x30023|drv_subtyp=3|drv_typ=35|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Elsa AG|device=Quickstep 1000 PCI|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x1048|device_id=0x1000|subvendor_id=0xffff|subdevice_id=0xffff|vario=HiSax driver|SMP=Yes|drv_id=0x90012|drv_subtyp=9|drv_typ=18|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Teles AG|device=16.3|device_class=ISDN Single Basic Rate|bus_type=ISA|vario=HiSax driver|IO=0x180|IO=0x280|IO=0x380|IRQ=10|IRQ=12|IRQ=15|IRQ=5|IRQ=9|SMP=Yes|drv_id=0x3|drv_subtyp=0|drv_typ=3|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Elsa AG|device=Microlink PCI|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x1048|device_id=0x1000|subvendor_id=0xffff|subdevice_id=0xffff|vario=HiSax driver|SMP=Yes|drv_id=0xc0012|drv_subtyp=12|drv_typ=18|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Gazel|device=Djinn Itoo|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x10b5|device_id=0x1151|subvendor_id=0xffff|subdevice_id=0xffff|vario=HiSax driver|SMP=Yes|drv_id=0x20022|drv_subtyp=2|drv_typ=34|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Pyramid|device=Speed Fax+ PCI|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0xe159|device_id=0x0002|subvendor_id=0x0051|subdevice_id=0x0001|vario=HiSax driver|SMP=Yes|drv_id=0x7001c|drv_subtyp=7|drv_typ=28|feature=Fax|firmware=ISAR.BIN|interface=FCLASS1|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=AVM Computersysteme Vertriebs GmbH|device=FRITZ!Card PCI v2.0|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x1244|device_id=0x0e00|subvendor_id=0x1244|subdevice_id=0x0e00|vario=HiSax driver|SMP=Yes|alternative_name=Telekom AG,Teledat 150 v2.0|drv_id=0x3e8|drv_subtyp=0|drv_typ=1000|feature=Fax|info=This card has multiple drivers, some functions are only available on the binonly driver|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax_fcpcipnp|need_packages=i4l-base|short_description=OpenSource without Fax G3|supported=full|
+|vendor=Compaq Computer Corporation|device=ISDN S0 ISA|device_class=ISDN Single Basic Rate|bus_type=ISA|vendor_id=0x110e|device_id=0x0210|vario=HiSax driver|SMP=Yes|drv_id=0x13|drv_subtyp=0|drv_typ=19|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Billion|device=BIPAC-D|device_class=ISDN Single Basic Rate|bus_type=ISA|vendor_id=0x2c09|device_id=0x0200|vario=HiSax driver|SMP=Yes|drv_id=0x1001e|drv_subtyp=1|drv_typ=30|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Auerswald|device=COMpact 2206 USB|device_class=ISDN Single Basic Rate|bus_type=USB|vendor_id=0x09bf|device_id=0x00db|vario=HiSax driver|SMP=Yes|drv_id=0x1002a|drv_subtyp=1|drv_typ=42|interface=I4L|line_cnt=1|line_protocol=DSS1|module=auerswald|supported=full|
+|vendor=ASUSCOM|device=PCI + Voice (W6692)|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x1050|device_id=0x6692|subvendor_id=0x1043|subdevice_id=0x1703|vario=HiSax driver|SMP=Yes|drv_id=0x20024|drv_subtyp=2|drv_typ=36|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Teles AG|device=PCMCIA|device_class=ISDN Single Basic Rate|bus_type=PCMCIA|vario=HiSax driver|SMP=Yes|drv_id=0x8|drv_subtyp=0|drv_typ=8|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Gazel|device=R753|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x10b5|device_id=0x1152|subvendor_id=0xffff|subdevice_id=0xffff|vario=HiSax driver|SMP=Yes|drv_id=0x10022|drv_subtyp=1|drv_typ=34|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Elsa AG|device=ML PCC-8|device_class=ISDN Single Basic Rate|bus_type=ISA|vario=HiSax driver|IO=0x160|IO=0x170|IO=0x260|IO=0x360|IRQ=3|IRQ=5|IRQ=7|IRQ=9|SMP=Yes|drv_id=0x20006|drv_subtyp=2|drv_typ=6|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Billion|device=Tornado Tipac|device_class=ISDN Single Basic Rate|bus_type=ISA|vendor_id=0xcd4c|device_id=0x0100|vario=HiSax driver|SMP=Yes|drv_id=0x4001e|drv_subtyp=4|drv_typ=30|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Abocom/Magitek|device=2BD1|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x13d1|device_id=0x2bd1|subvendor_id=0xffff|subdevice_id=0xffff|vario=HiSax driver|SMP=Yes|drv_id=0x160023|drv_subtyp=22|drv_typ=35|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Billion|device=B00A|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x1397|device_id=0xb00a|subvendor_id=0xffff|subdevice_id=0xffff|vario=HiSax driver|SMP=Yes|drv_id=0x60023|drv_subtyp=6|drv_typ=35|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Eicon Networks|device=Diva 2.01 ISA|device_class=ISDN Single Basic Rate|bus_type=ISA|vendor_id=0x891c|device_id=0xa100|vario=HiSax driver|SMP=Yes|drv_id=0x3000b|drv_subtyp=3|drv_typ=11|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Teles AG|device=PCI v2|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0xe159|device_id=0x0001|subvendor_id=0x00a7|subdevice_id=0x0001|vario=HiSax driver|SMP=Yes|drv_id=0x20014|drv_subtyp=2|drv_typ=20|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Telekom AG|device=Concept|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x0871|device_id=0xffa2|subvendor_id=0xffff|subdevice_id=0xffff|vario=HiSax driver|SMP=Yes|drv_id=0xe0023|drv_subtyp=14|drv_typ=35|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=AVM Computersysteme Vertriebs GmbH|device=FRITZ!Card Classic|device_class=ISDN Single Basic Rate|bus_type=ISA|vario=HiSax driver|IO=0x200|IO=0x240|IO=0x300|IO=0x340|IRQ=10|IRQ=11|IRQ=12|IRQ=15|IRQ=3|IRQ=4|IRQ=5|IRQ=7|IRQ=9|SMP=Yes|drv_id=0x5|drv_subtyp=0|drv_typ=5|feature=Fax|info=This card has multiple drivers, some functions are only available on the binonly driver|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|short_description=OpenSource without Fax G3|supported=full|
+|vendor=Eicon Networks|device=Diva 2.0 ISA|device_class=ISDN Single Basic Rate|bus_type=ISA|vendor_id=0x891c|device_id=0x7100|vario=HiSax driver|SMP=Yes|drv_id=0x1000b|drv_subtyp=1|drv_typ=11|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=AVM Computersysteme Vertriebs GmbH|device=C4|device_class=ISDN Multiple Basic Rate|bus_type=PCI|vendor_id=0x1011|device_id=0x1065|subvendor_id=0x1244|subdevice_id=0x0800|vario=CAPI 2.0 driver|SMP=Yes|drv_id=0x31f41|drv_subtyp=3|drv_typ=8001|feature=Fax|firmware=c4.bin|interface=CAPI20|interface=CAPI20 Fax|interface=I4L|line_cnt=4|line_protocol=DSS1|line_protocol=LEASED|module=c4|need_packages=capi4linux|need_packages=i4l-base|need_packages=i4l-isdnlog|need_packages=i4lfirm|supported=full|
+|vendor=ICN|device=4B|device_class=ISDN Multiple Basic Rate|bus_type=ISA|vario=I4L driver|IO=0x300|IO=0x308|IO=0x310|IO=0x318|IO=0x320|IO=0x328|IO=0x330|IO=0x338|IO=0x340|IO=0x348|IO=0x350|IO=0x358|IO=0x360|IO=0x368|MEMBASE=0xc0000|MEMBASE=0xc2000|MEMBASE=0xc4000|MEMBASE=0xc6000|MEMBASE=0xc8000|MEMBASE=0xca000|MEMBASE=0xcc000|MEMBASE=0xce000|MEMBASE=0xd0000|MEMBASE=0xd2000|MEMBASE=0xd4000|MEMBASE=0xd6000|MEMBASE=0xd8000|MEMBASE=0xda000|MEMBASE=0xdc000|MEMBASE=0xde000|SMP=Yes|drv_id=0x11f5e|drv_subtyp=1|drv_typ=8030|firmware=pc-%{PROTO}.bin|interface=I4L|line_cnt=2|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=icn|need_packages=i4l-base|supported=full|
+|vendor=AVM Computersysteme Vertriebs GmbH|device=C2|device_class=ISDN Multiple Basic Rate|bus_type=PCI|vendor_id=0x1011|device_id=0x1065|subvendor_id=0x1244|subdevice_id=0x1100|vario=CAPI 2.0 driver|SMP=Yes|drv_id=0x61f41|drv_subtyp=6|drv_typ=8001|firmware=c2.bin|interface=CAPI20|interface=CAPI20 Fax|interface=I4L|line_cnt=2|line_protocol=DSS1|line_protocol=LEASED|module=c4|need_packages=capi4linux|need_packages=i4l-base|need_packages=i4l-isdnlog|need_packages=i4lfirm|supported=full|
+|vendor=AVM Computersysteme Vertriebs GmbH|device=T1 PCI|device_class=ISDN Primary Rate|bus_type=PCI|vendor_id=0x1244|device_id=0x1200|vario=CAPI 2.0 driver|SMP=Yes|drv_id=0x21f45|drv_subtyp=2|drv_typ=8005|firmware=t1-{PROF}.t4|interface=CAPI20|interface=CAPI20 Fax|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|module=t1pci|need_packages=capi4linux|need_packages=i4l-base|need_packages=i4l-isdnlog|need_packages=i4lfirm|special=B version|supported=full|
+|vendor=AVM Computersysteme Vertriebs GmbH|device=BlueFRITZ!USB|device_class=Others|bus_type=USB|vendor_id=0x057c|device_id=0x2200|vario=CAPI 2.0 driver|Interface=CAPI20|SMP=Yes|drv_id=0x11f46|drv_subtyp=1|drv_typ=8006|feature=BLUETOOTH|feature=Basic Rate|firmware=bfubase.frm|line_cnt=1|line_protocol=DSS1|module=bfusb|need_packages=bluez-firmware|need_packages=bluez-libs|need_packages=bluez-utils|need_packages=capi4linux|need_packages=i4l-base|need_packages=i4l-isdnlog|supported=full|
+|vendor=AVM Computersysteme Vertriebs GmbH|device=FRITZ!Box SL|device_class=DSL|bus_type=USB|vendor_id=0x057c|device_id=0x3701|vario=other|SMP=yes|drv_id=0xffff0001|drv_subtyp=1|drv_typ=9999|feature=DSLONLY|feature=PPPOE|interface=pppoe|line_cnt=0|line_protocol=none|need_packages=ppp|need_packages=smpppd|module=usbnet|supported=full|
+|vendor=AVM Computersysteme Vertriebs GmbH|device=FRITZ!Box|device_class=DSL|bus_type=USB|vendor_id=0x057c|device_id=0x3702|vario=other|SMP=yes|drv_id=0xffff0002|drv_subtyp=2|drv_typ=9999|feature=DSLONLY|feature=PPPOE|interface=pppoe|line_cnt=0|line_protocol=none|need_packages=ppp|need_packages=smpppd|module=usbnet|supported=full|
+|vendor=AVM Computersysteme Vertriebs GmbH|device=FRITZ!Box SL WLAN|device_class=DSL|bus_type=USB|vendor_id=0x057c|device_id=0x3c00|vario=other|SMP=yes|drv_id=0xffff0003|drv_subtyp=3|drv_typ=9999|feature=DSLONLY|feature=PPPOE|interface=pppoe|line_cnt=0|line_protocol=none|need_packages=ppp|need_packages=smpppd|module=usbnet|supported=full|
+|vendor=AVM Computersysteme Vertriebs GmbH|device=FRITZ!Box Fon WLAN|device_class=DSL|bus_type=USB|vendor_id=0x057c|device_id=0x4001|vario=other|SMP=yes|drv_id=0xffff0004|drv_subtyp=4|drv_typ=9999|feature=DSLONLY|feature=PPPOE|interface=pppoe|line_cnt=0|line_protocol=none|need_packages=ppp|need_packages=smpppd|module=usbnet|supported=full|
+|vendor=AVM Computersysteme Vertriebs GmbH|device=FRITZ!Box Fon (Annex A)|device_class=DSL|bus_type=USB|vendor_id=0x057c|device_id=0x3c00|vario=other|SMP=yes|drv_id=0xffff0005|drv_subtyp=5|drv_typ=9999|feature=DSLONLY|feature=PPPOE|interface=pppoe|line_cnt=0|line_protocol=none|need_packages=ppp|need_packages=smpppd|module=usbnet|supported=full|
+|vendor=AVM Computersysteme Vertriebs GmbH|device=FRITZ!Box (Annex A)|device_class=DSL|bus_type=USB|vendor_id=0x057c|device_id=0x3e01|vario=other|SMP=yes|drv_id=0xffff0006|drv_subtyp=6|drv_typ=9999|feature=DSLONLY|feature=PPPOE|interface=pppoe|line_cnt=0|line_protocol=none|need_packages=ppp|need_packages=smpppd|module=usbnet|supported=full|
+|vendor=AVM Computersysteme Vertriebs GmbH|device=AVM FRITZ!Box Fon|device_class=DSL|bus_type=USB|vendor_id=0x057c|device_id=0x3a00|vario=other|SMP=yes|drv_id=0xffff0007|drv_subtyp=7|drv_typ=9999|feature=DSLONLY|feature=PPPOE|interface=pppoe|line_cnt=0|line_protocol=none|need_packages=ppp|need_packages=smpppd|module=usbnet|supported=full|
--- /dev/null
+#
+# CDB data export for subclass: ISDN Single Basic Rate
+# Generated at : Sat Sep 13 01:19:56 2003
+#
+# Exported combinations:
+# arch=i386 dist=Stable lang=de_DE vario=HiSax driver
+# arch=i386 dist=Stable lang=de_DE vario=I4L driver
+# arch=i386 dist=Stable lang=de_DE vario=CAPI 2.0 driver
+#
+# Author: dhess@suse.de (13.02.2003)
+# Author: didge@suse.de (04.08.2003)
+#
+#
+# Export format: |Vendorname|Productname|Subclass|Bus|Variation|topic=value|topic=value|...|Variation|topic=value|topic=value|...|
+#
+
+
+|vendor=Billion|device=B009|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x1397|device_id=0xb009|subvendor_id=0xffff|subdevice_id=0xffff|vario=HiSax driver|SMP=Yes|drv_id=0x50023|drv_subtyp=5|drv_typ=35|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|need_packages=i4l-isdnlog|supported=full|
+|vendor=AVM Computersysteme Vertriebs GmbH|device=B1|device_class=ISDN Single Basic Rate|bus_type=ISA|vario=CAPI 2.0 driver|IO=0x150|IO=0x250|IO=0x300|IO=0x340|IRQ=10|IRQ=11|IRQ=12|IRQ=15|IRQ=3|IRQ=4|IRQ=5|IRQ=6|IRQ=7|IRQ=9|SMP=Yes|drv_id=0x1f41|drv_subtyp=0|drv_typ=8001|feature=Fax|firmware=b1-%{PROTO}.t4|interface=CAPI20|interface=CAPI20 Fax|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=b1isa|need_packages=capi4linux|need_packages=i4l-base|need_packages=i4l-isdnlog|need_packages=i4lfirm|supported=full|
+|vendor=ITH|device=ith mic|device_class=ISDN Single Basic Rate|bus_type=ISA|vario=HiSax driver|IO=0x200|IRQ=10|IRQ=11|IRQ=12|IRQ=15|IRQ=3|IRQ=4|IRQ=5|IRQ=7|SMP=Yes|drv_id=0x11|drv_subtyp=0|drv_typ=17|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|need_packages=i4l-isdnlog|supported=full|
+|vendor=High Soft Tech|device=Saphir|device_class=ISDN Single Basic Rate|bus_type=ISA|vario=HiSax driver|IO=0x250|IO=0x270|IO=0x290|IO=0x2b0|IO=0x2d0|IO=0x350|IO=0x370|IRQ=11|IRQ=12|IRQ=15|IRQ=3|IRQ=5|SMP=Yes|drv_id=0x1f|drv_subtyp=0|drv_typ=31|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|need_packages=i4l-isdnlog|supported=full|
+|vendor=Billion|device=B00C|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x1397|device_id=0xb00c|subvendor_id=0xffff|subdevice_id=0xffff|vario=HiSax driver|SMP=Yes|drv_id=0x80023|drv_subtyp=8|drv_typ=35|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|need_packages=i4l-isdnlog|supported=full|
+|vendor=Cologne Chip AG|device=HFCS+ based card|device_class=ISDN Single Basic Rate|bus_type=ISA|vendor_id=0x0000|device_id=0x0000|vario=HiSax driver|SMP=Yes|drv_id=0x10025|drv_subtyp=1|drv_typ=37|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|need_packages=i4l-isdnlog|supported=full|
+|vendor=AVM Computersysteme Vertriebs GmbH|device=FRITZ!Card USB v2.0|device_class=ISDN Single Basic Rate|bus_type=USB|vendor_id=0x057c|device_id=0x1000|vario=CAPI 2.0 driver|SMP=No|drv_id=0x21f43|drv_subtyp=2|drv_typ=8003|feature=Fax|info=This card is supported with binonly drivers from the manufacturer|interface=CAPI20|interface=CAPI20 Fax|line_cnt=1|line_protocol=DSS1|module=fcusb2|need_packages=capi4linux|need_packages=i4l-base|need_packages=i4l-isdnlog|short_description=binary only CAPI with FAX G3|supported=full|
+|vendor=Telekom AG|device=A1T|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x0871|device_id=0xffa1|subvendor_id=0xffff|subdevice_id=0xffff|vario=HiSax driver|SMP=Yes|drv_id=0xd0023|drv_subtyp=13|drv_typ=35|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|need_packages=i4l-isdnlog|supported=full|
+|vendor=Sagem|device=Niccy PCI|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x1267|device_id=0x1016|subvendor_id=0xffff|subdevice_id=0xffff|vario=HiSax driver|SMP=Yes|drv_id=0x20018|drv_subtyp=2|drv_typ=24|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|need_packages=i4l-isdnlog|supported=full|
+|vendor=Cologne Chip AG|device=HFC 2BDS0|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x1397|device_id=0x2bd0|subvendor_id=0xffff|subdevice_id=0xffff|vario=HiSax driver|SMP=Yes|drv_id=0x110023|drv_subtyp=17|drv_typ=35|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|need_packages=i4l-isdnlog|supported=full|
+|vendor=Formula-n|device=enter:now|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0xe159|device_id=0x0001|subvendor_id=0x0055|subdevice_id=0x0002|vario=HiSax driver|SMP=Yes|drv_id=0x10029|drv_subtyp=1|drv_typ=41|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|need_packages=i4l-isdnlog|short_description=under development|supported=full|
+|vendor=ICN|device=2B|device_class=ISDN Single Basic Rate|bus_type=ISA|vario=I4L driver|IO=0x300|IO=0x308|IO=0x310|IO=0x318|IO=0x320|IO=0x328|IO=0x330|IO=0x338|IO=0x340|IO=0x348|IO=0x350|IO=0x358|IO=0x360|IO=0x368|MEMBASE=0xc0000|MEMBASE=0xc2000|MEMBASE=0xc4000|MEMBASE=0xc6000|MEMBASE=0xc8000|MEMBASE=0xca000|MEMBASE=0xcc000|MEMBASE=0xce000|MEMBASE=0xd0000|MEMBASE=0xd2000|MEMBASE=0xd4000|MEMBASE=0xd6000|MEMBASE=0xd8000|MEMBASE=0xda000|MEMBASE=0xdc000|MEMBASE=0xde000|SMP=Yes|drv_id=0x1f5e|drv_subtyp=0|drv_typ=8030|firmware=pc-%{PROTO}.bin|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=icn|need_packages=i4l-base|need_packages=i4l-isdnlog|need_packages=i4lfirm|supported=full|
+|vendor=TigerJet|device=NetJet PCI|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0xe159|device_id=0x0001|subvendor_id=0x00ff|subdevice_id=0x000f|vario=HiSax driver|SMP=Yes|drv_id=0x10014|drv_subtyp=1|drv_typ=20|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|need_packages=i4l-isdnlog|supported=full|
+|vendor=Scitel|device=Quadro|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x10b5|device_id=0x9050|subvendor_id=0x0871|subdevice_id=0xffa8|vario=HiSax driver|SMP=Yes|drv_id=0x21|drv_subtyp=0|drv_typ=33|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|need_packages=i4l-isdnlog|supported=full|
+|vendor=Elsa AG|device=ML PCC-16|device_class=ISDN Single Basic Rate|bus_type=ISA|vario=HiSax driver|IO=0x160|IO=0x170|IO=0x260|IO=0x360|IRQ=10|IRQ=11|IRQ=15|IRQ=3|IRQ=5|IRQ=9|SMP=Yes|drv_id=0x30006|drv_subtyp=3|drv_typ=6|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|need_packages=i4l-isdnlog|supported=full|
+|vendor=Teles AG|device=16.3c v.2.1|device_class=ISDN Single Basic Rate|bus_type=ISA|vendor_id=0x2750|device_id=0x2026|vario=HiSax driver|SMP=Yes|drv_id=0x25|drv_subtyp=0|drv_typ=37|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|need_packages=i4l-isdnlog|supported=full|
+|vendor=Sedlbauer AG|device=Speed Win|device_class=ISDN Single Basic Rate|bus_type=ISA|vendor_id=0x274c|device_id=0x0100|vario=HiSax driver|SMP=Yes|drv_id=0x1000f|drv_subtyp=1|drv_typ=15|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|need_packages=i4l-isdnlog|supported=full|
+|vendor=Teles AG|device=S0Box|device_class=ISDN Single Basic Rate|bus_type=Parallel|vario=HiSax driver|IO=0x278|IO=0x378|IO=0x3bc|IRQ=5|IRQ=7|SMP=Yes|drv_id=0x19|drv_subtyp=0|drv_typ=25|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|need_packages=i4l-isdnlog|supported=full|
+|vendor=Eicon Networks|device=Diva 2.0U PCI|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x1133|device_id=0xe004|subvendor_id=0xffff|subdevice_id=0xffff|vario=HiSax driver|SMP=Yes|drv_id=0xc000b|drv_subtyp=12|drv_typ=11|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|need_packages=i4l-isdnlog|supported=full|
+|vendor=CREATIX Creative Information eXchange|device=16.3 PNP|device_class=ISDN Single Basic Rate|bus_type=ISA|vendor_id=0x980e|device_id=0x0000|vario=HiSax driver|SMP=Yes|drv_id=0x10004|drv_subtyp=1|drv_typ=4|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|need_packages=i4l-isdnlog|supported=full|
+|vendor=Teles AG|device=iSTAR PnP|device_class=ISDN Single Basic Rate|bus_type=ISA|vendor_id=0x2750|device_id=0x1074|vario=HiSax driver|SMP=Yes|drv_id=0x1000e|drv_subtyp=1|drv_typ=14|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|need_packages=i4l-isdnlog|supported=full|
+|vendor=Siemens|device=ISURF|device_class=ISDN Single Basic Rate|bus_type=ISA|vendor_id=0x254d|device_id=0x1000|vario=HiSax driver|SMP=Yes|drv_id=0x1d|drv_subtyp=0|drv_typ=29|feature=Fax|firmware=ISAR.BIN|interface=FCLASS1|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|need_packages=i4l-isdnlog|supported=full|
+|vendor=Auerswald|device=Comfort 1200 System Telephone|device_class=ISDN Single Basic Rate|bus_type=USB|vendor_id=0x09bf|device_id=0x00f2|vario=HiSax driver|SMP=Yes|drv_id=0x3002a|drv_subtyp=3|drv_typ=42|interface=I4L|line_cnt=1|line_protocol=DSS1|module=auerswald|need_packages=i4l-base|need_packages=i4l-isdnlog|supported=full|
+|vendor=AsKey|device=PCI (CCD HFC)|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x1397|device_id=0x2bd0|subvendor_id=0x144f|subdevice_id=0x1704|vario=HiSax driver|SMP=Yes|drv_id=0xc0023|drv_subtyp=12|drv_typ=35|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|need_packages=i4l-isdnlog|supported=full|
+|vendor=AVM Computersysteme Vertriebs GmbH|device=B1 PCMCIA|device_class=ISDN Single Basic Rate|bus_type=PCMCIA|vario=CAPI 2.0 driver|SMP=Yes|drv_id=0x21f41|drv_subtyp=2|drv_typ=8001|feature=Fax|firmware=b1-%{PROTO}.t4|interface=CAPI20|interface=CAPI20 Fax|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=b1pcmcia|need_packages=capi4linux|need_packages=i4l-base|need_packages=i4l-isdnlog|need_packages=i4lfirm|supported=full|
+|vendor=Billion|device=BIPAC-D1|device_class=ISDN Single Basic Rate|bus_type=ISA|vendor_id=0x2c09|device_id=0x0100|vario=HiSax driver|SMP=Yes|drv_id=0x2001e|drv_subtyp=2|drv_typ=30|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|need_packages=i4l-isdnlog|supported=full|
+|vendor=Auerswald|device=COMpact 2104 USB|device_class=ISDN Single Basic Rate|bus_type=USB|vendor_id=0x09bf|device_id=0x00c0|vario=HiSax driver|SMP=Yes|alternative_name=COMpact 2104 DSL|drv_id=0x2002a|drv_subtyp=2|drv_typ=42|interface=I4L|line_cnt=1|line_protocol=DSS1|module=auerswald|need_packages=i4l-base|need_packages=i4l-isdnlog|supported=full|
+|vendor=Gazel|device=R685|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x10b5|device_id=0x1030|subvendor_id=0xffff|subdevice_id=0xffff|vario=HiSax driver|SMP=Yes|drv_id=0x22|drv_subtyp=0|drv_typ=34|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|need_packages=i4l-isdnlog|supported=full|
+|vendor=ASUSCOM|device=PCI (CCD HFC)|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x1043|device_id=0x0675|subvendor_id=0x0675|subdevice_id=0x1704|vario=HiSax driver|SMP=Yes|drv_id=0xa0023|drv_subtyp=10|drv_typ=35|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|need_packages=i4l-isdnlog|supported=full|
+|vendor=ASUSCOM|device=PCI (W6692)|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x1050|device_id=0x6692|subvendor_id=0x1043|subdevice_id=0x1702|vario=HiSax driver|SMP=Yes|drv_id=0x24|drv_subtyp=0|drv_typ=36|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|need_packages=i4l-isdnlog|supported=full|
+|vendor=Teles AG|device=16.3 PNP|device_class=ISDN Single Basic Rate|bus_type=ISA PnP|vendor_id=0x2750|device_id=0x1021|vario=HiSax driver|SMP=Yes|drv_id=0x4|drv_subtyp=0|drv_typ=4|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|need_packages=i4l-isdnlog|supported=full|
+|vendor=Sedlbauer AG|device=Speed Star|device_class=ISDN Single Basic Rate|bus_type=PCMCIA|vario=HiSax driver|SMP=Yes|drv_id=0x20016|drv_subtyp=2|drv_typ=22|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|need_packages=i4l-isdnlog|supported=full|
+|vendor=AVM Computersysteme Vertriebs GmbH|device=FRITZ!X seriell|device_class=ISDN Single Basic Rate|bus_type=Serial|vario=HiSax driver|line_cnt=1|supported=not|
+|vendor=Elsa AG|device=ML PCF-Pro|device_class=ISDN Single Basic Rate|bus_type=ISA|vario=HiSax driver|IO=0x160|IO=0x170|IO=0x260|IO=0x360|IRQ=10|IRQ=11|IRQ=15|IRQ=3|IRQ=5|IRQ=9|SMP=Yes|drv_id=0x50006|drv_subtyp=5|drv_typ=6|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|need_packages=i4l-isdnlog|supported=full|
+|vendor=Digi|device=DataFire Micro V IOM2 (Europe)|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x114f|device_id=0x0070|subvendor_id=0xffff|subdevice_id=0xffff|vario=HiSax driver|SMP=Yes|drv_id=0x120023|drv_subtyp=18|drv_typ=35|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|need_packages=i4l-isdnlog|supported=full|
+|vendor=Elsa AG|device=Quickstep 3000|device_class=ISDN Single Basic Rate|bus_type=ISA|vendor_id=0x9315|device_id=0x3401|vario=HiSax driver|SMP=Yes|drv_id=0x80007|drv_subtyp=8|drv_typ=7|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|need_packages=i4l-isdnlog|supported=full|
+|vendor=Genius|device=Speed Surfer|device_class=ISDN Single Basic Rate|bus_type=ISA|vendor_id=0x252f|device_id=0x0100|vario=HiSax driver|SMP=Yes|drv_id=0x3001e|drv_subtyp=3|drv_typ=30|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|need_packages=i4l-isdnlog|supported=full|
+|vendor=Digi|device=DataFire Micro V (North America)|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x114f|device_id=0x0073|subvendor_id=0xffff|subdevice_id=0xffff|vario=HiSax driver|SMP=Yes|drv_id=0x150023|drv_subtyp=21|drv_typ=35|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|need_packages=i4l-isdnlog|supported=full|
+|vendor=Berkom|device=A4T|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x11de|device_id=0x6120|subvendor_id=0x0871|subdevice_id=0xffa4|vario=HiSax driver|SMP=Yes|drv_id=0x20|drv_subtyp=0|drv_typ=32|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|need_packages=i4l-isdnlog|supported=full|
+|vendor=Siemens|device=ISurf 2|device_class=ISDN Single Basic Rate|bus_type=ISA|vendor_id=0x254d|device_id=0x2000|vario=HiSax driver|SMP=Yes|drv_id=0x3000c|drv_subtyp=3|drv_typ=12|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|need_packages=i4l-isdnlog|supported=full|
+|vendor=Digi|device=DataFire Micro V (Europe)|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x114f|device_id=0x0071|subvendor_id=0xffff|subdevice_id=0xffff|vario=HiSax driver|SMP=Yes|drv_id=0x130023|drv_subtyp=19|drv_typ=35|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|need_packages=i4l-isdnlog|supported=full|
+|vendor=U.S.Robotics|device=Sportster|device_class=ISDN Single Basic Rate|bus_type=ISA|vario=HiSax driver|IO=0x268|IRQ=10|IRQ=11|IRQ=12|IRQ=14|IRQ=15|IRQ=5|IRQ=7|SMP=Yes|drv_id=0x10|drv_subtyp=0|drv_typ=16|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|need_packages=i4l-isdnlog|supported=full|
+|vendor=Zolltrix|device=2BDS0|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x15b0|device_id=0x2bd0|subvendor_id=0xffff|subdevice_id=0xffff|vario=HiSax driver|SMP=Yes|drv_id=0x100023|drv_subtyp=16|drv_typ=35|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|need_packages=i4l-isdnlog|supported=full|
+|vendor=Eicon Networks|device=Diva Piccola|device_class=ISDN Single Basic Rate|bus_type=ISA|vendor_id=0x891c|device_id=0x5100|vario=HiSax driver|SMP=Yes|drv_id=0xb000b|drv_subtyp=11|drv_typ=11|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|need_packages=i4l-isdnlog|supported=full|
+|vendor=Motorola|device=MC145575|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x1051|device_id=0x0100|subvendor_id=0xffff|subdevice_id=0xffff|vario=HiSax driver|SMP=Yes|drv_id=0xf0023|drv_subtyp=15|drv_typ=35|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|need_packages=i4l-isdnlog|supported=full|
+|vendor=Telekom AG|device=Teledat X120|device_class=ISDN Single Basic Rate|bus_type=USB|vendor_id=0x057c|device_id=0x2800|vario=CAPI 2.0 driver|SMP=No|alternative_name=Teledat USB 2a/b|drv_id=0x61f43|drv_subtyp=6|drv_typ=8003|feature=Fax|info=This card is supported with binonly drivers from the manufacturer|interface=CAPI20|interface=CAPI20 Fax|line_cnt=1|line_protocol=DSS1|module=fxusb_CZ|need_packages=capi4linux|need_packages=i4l-base|need_packages=i4l-isdnlog|short_description=binary only CAPI with FAX G3|supported=full|
+|vendor=AVM Computersysteme Vertriebs GmbH|device=FRITZ!Card PnP|device_class=ISDN Single Basic Rate|bus_type=ISA|vendor_id=0xcd06|device_id=0x0009|vario=CAPI 2.0 driver|SMP=No|drv_id=0x71f42|drv_subtyp=7|drv_typ=8002|feature=Fax|info=This card has multiple drivers, some functions are only available on the binonly driver|interface=CAPI20|interface=CAPI20 Fax|line_cnt=1|line_protocol=DSS1|module=fcpnp|need_packages=capi4linux|need_packages=i4l-base|need_packages=i4l-isdnlog|short_description=binary only CAPI with FAX G3|supported=full|vario=HiSax driver|SMP=Yes|drv_id=0x2001b|drv_subtyp=2|drv_typ=27|feature=Fax|info=This card has multiple drivers, some functions are only available on the binonly driver|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=capi4linux|need_packages=i4l-base|need_packages=i4l-isdnlog|short_description=OpenSource without Fax G3|supported=full|
+|vendor=Teles AG|device=16.0 AB|device_class=ISDN Single Basic Rate|bus_type=ISA|vario=HiSax driver|IO=0xd80|IO=0xe80|IO=0xf80|IRQ=10|IRQ=11|IRQ=12|IRQ=15|IRQ=3|IRQ=4|IRQ=5|IRQ=9|MEMBASE=0xc0000|MEMBASE=0xc2000|MEMBASE=0xc4000|MEMBASE=0xc6000|MEMBASE=0xc8000|MEMBASE=0xca000|MEMBASE=0xcc000|MEMBASE=0xce000|MEMBASE=0xd0000|MEMBASE=0xd2000|MEMBASE=0xd4000|MEMBASE=0xd6000|MEMBASE=0xd8000|MEMBASE=0xda000|MEMBASE=0xdc000|MEMBASE=0xde000|SMP=Yes|drv_id=0x10001|drv_subtyp=1|drv_typ=1|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|need_packages=i4l-isdnlog|supported=full|
+|vendor=Elsa AG|device=PCMCIA IPAC|device_class=ISDN Single Basic Rate|bus_type=PCMCIA|vario=HiSax driver|SMP=Yes|drv_id=0xb000a|drv_subtyp=11|drv_typ=10|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|need_packages=i4l-isdnlog|supported=full|
+|vendor=Billion|device=B006|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x1397|device_id=0xb006|subvendor_id=0xffff|subdevice_id=0xffff|vario=HiSax driver|SMP=Yes|drv_id=0x20023|drv_subtyp=2|drv_typ=35|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|need_packages=i4l-isdnlog|supported=full|
+|vendor=AVM Computersysteme Vertriebs GmbH|device=FRITZ!Card PCMCIA|device_class=ISDN Single Basic Rate|bus_type=PCMCIA|vario=CAPI 2.0 driver|SMP=No|drv_id=0x51f42|drv_subtyp=5|drv_typ=8002|feature=Fax|info=This card has multiple drivers, some functions are only available on the binonly driver|interface=CAPI20|interface=CAPI20 Fax|line_cnt=1|line_protocol=DSS1|module=fcpcmcia|need_packages=capi4linux|need_packages=i4l-base|need_packages=i4l-isdnlog|short_description=binary only CAPI with FAX G3|supported=full|vario=HiSax driver|SMP=Yes|drv_id=0x1a|drv_subtyp=0|drv_typ=26|feature=Fax|info=This card has multiple drivers, some functions are only available on the binonly driver|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=capi4linux|need_packages=i4l-base|need_packages=i4l-isdnlog|short_description=OpenSource without Fax G3|supported=full|
+|vendor=Winbond|device=W6692 card|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x1050|device_id=0x6692|subvendor_id=0xffff|subdevice_id=0xffff|vario=HiSax driver|SMP=Yes|drv_id=0x60024|drv_subtyp=6|drv_typ=36|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|need_packages=i4l-isdnlog|supported=full|
+|vendor=Eicon Networks|device=Diehl ISDN-SX|device_class=ISDN Single Basic Rate|bus_type=ISA|vario=I4L driver|IRQ=10|IRQ=11|IRQ=12|IRQ=3|IRQ=4|IRQ=9|MEMBASE=0xd0000|SMP=Yes|drv_id=0x11f4a|drv_subtyp=1|drv_typ=8010|feature=Fax|firmware=%{PROTO}|interface=FCLASS2|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=eicon|need_packages=i4l-base|need_packages=i4l-isdnlog|need_packages=i4lfirm|supported=full|
+|vendor=ASUSCOM|device=ISA IPAC|device_class=ISDN Single Basic Rate|bus_type=ISA|vendor_id=0x7506|device_id=0x9016|vario=HiSax driver|SMP=Yes|drv_id=0x2000c|drv_subtyp=2|drv_typ=12|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|need_packages=i4l-isdnlog|supported=full|
+|vendor=AVM Computersysteme Vertriebs GmbH|device=A1 PCMCIA|device_class=ISDN Single Basic Rate|bus_type=PCMCIA|vario=CAPI 2.0 driver|SMP=No|drv_id=0x61f42|drv_subtyp=6|drv_typ=8002|feature=Fax|info=This card has multiple drivers, some functions are only available on the binonly driver|interface=CAPI20|interface=CAPI20 Fax|line_cnt=1|line_protocol=DSS1|module=fcpcmcia|need_packages=capi4linux|need_packages=i4l-base|need_packages=i4l-isdnlog|short_description=binary only CAPI with FAX G3|supported=full|vario=HiSax driver|SMP=Yes|drv_id=0x1001a|drv_subtyp=1|drv_typ=26|feature=Fax|info=This card has multiple drivers, some functions are only available on the binonly driver|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=capi4linux|need_packages=i4l-base|need_packages=i4l-isdnlog|short_description=OpenSource without Fax G3|supported=full|
+|vendor=AsKey|device=PCI + Voice (W6692)|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x1050|device_id=0x6692|subvendor_id=0x144f|subdevice_id=0x1703|vario=HiSax driver|SMP=Yes|drv_id=0x30024|drv_subtyp=3|drv_typ=36|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|need_packages=i4l-isdnlog|supported=full|
+|vendor=Eicon Networks|device=Diva 2.0 PCI|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x1133|device_id=0xe002|subvendor_id=0xffff|subdevice_id=0xffff|vario=HiSax driver|SMP=Yes|drv_id=0x2000b|drv_subtyp=2|drv_typ=11|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|need_packages=i4l-isdnlog|supported=full|
+|vendor=Sedlbauer AG|device=Speed PCI|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0xe159|device_id=0x0002|subvendor_id=0x0053|subdevice_id=0x0001|vario=HiSax driver|SMP=Yes|drv_id=0x6000f|drv_subtyp=6|drv_typ=15|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|need_packages=i4l-isdnlog|supported=full|
+|vendor=ITK|device=ISDN PnP|device_class=ISDN Single Basic Rate|bus_type=ISA|vendor_id=0x8b26|device_id=0x2900|vario=HiSax driver|SMP=Yes|drv_id=0x20009|drv_subtyp=2|drv_typ=9|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|need_packages=i4l-isdnlog|supported=full|
+|vendor=AVM Computersysteme Vertriebs GmbH|device=FRITZ!X ISDN|device_class=ISDN Single Basic Rate|bus_type=USB|vendor_id=0x057c|device_id=0x2000|vario=CAPI 2.0 driver|SMP=No|drv_id=0x71f43|drv_subtyp=7|drv_typ=8003|feature=Fax|info=This card is supported with binonly drivers from the manufacturer|interface=CAPI20|interface=CAPI20 Fax|line_cnt=1|line_protocol=DSS1|module=fxusb|need_packages=capi4linux|need_packages=i4l-base|need_packages=i4l-isdnlog|revision=0x0301|short_description=binary only CAPI with FAX G3|supported=full|
+|vendor=Dynalink|device=PCI (W6692)|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x1043|device_id=0x0675|subvendor_id=0x0675|subdevice_id=0x1702|vario=HiSax driver|SMP=Yes|drv_id=0x40024|drv_subtyp=4|drv_typ=36|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|need_packages=i4l-isdnlog|supported=full|
+|vendor=Elsa AG|device=ML PC|device_class=ISDN Single Basic Rate|bus_type=ISA|vario=HiSax driver|IO=0x160|IO=0x170|IO=0x260|IO=0x360|IRQ=3|IRQ=5|IRQ=7|IRQ=9|SMP=Yes|drv_id=0x10006|drv_subtyp=1|drv_typ=6|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|need_packages=i4l-isdnlog|supported=full|
+|vendor=AVM Computersysteme Vertriebs GmbH|device=M2 PCMCIA|device_class=ISDN Single Basic Rate|bus_type=PCMCIA|vario=CAPI 2.0 driver|SMP=Yes|drv_id=0x51f41|drv_subtyp=5|drv_typ=8001|feature=Fax|firmware=b1-%{PROTO}.t4|interface=CAPI20|interface=CAPI20 Fax|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|module=b1pcmcia|need_packages=capi4linux|need_packages=i4l-base|need_packages=i4l-isdnlog|need_packages=i4lfirm|supported=full|
+|vendor=Eicon Networks|device=Diva 2.01 PCI|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x1133|device_id=0xe005|subvendor_id=0xffff|subdevice_id=0xffff|vario=HiSax driver|SMP=Yes|drv_id=0x4000b|drv_subtyp=4|drv_typ=11|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|need_packages=i4l-isdnlog|supported=full|
+|vendor=U.S.Robotics|device=ISDN PCI Card TA|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x1050|device_id=0x6692|subvendor_id=0x16ec|subdevice_id=0x3409|vario=HiSax driver|SMP=Yes|drv_id=0x70024|drv_subtyp=7|drv_typ=36|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|need_packages=i4l-isdnlog|supported=full|
+|vendor=Sagem|device=Niccy ISA|device_class=ISDN Single Basic Rate|bus_type=ISA|vendor_id=0x814c|device_id=0x5001|vario=HiSax driver|SMP=Yes|drv_id=0x10018|drv_subtyp=1|drv_typ=24|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|need_packages=i4l-isdnlog|supported=full|
+|vendor=Elsa AG|device=ML PCF|device_class=ISDN Single Basic Rate|bus_type=ISA|vario=HiSax driver|IO=0x160|IO=0x170|IO=0x260|IO=0x360|IRQ=10|IRQ=11|IRQ=15|IRQ=3|IRQ=5|IRQ=9|SMP=Yes|drv_id=0x40006|drv_subtyp=4|drv_typ=6|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|need_packages=i4l-isdnlog|supported=full|
+|vendor=Teles AG|device=16.3 AB|device_class=ISDN Single Basic Rate|bus_type=ISA|vario=HiSax driver|IO=0x180|IO=0x280|IO=0x380|IRQ=10|IRQ=11|IRQ=12|IRQ=15|IRQ=3|IRQ=5|IRQ=9|SMP=Yes|drv_id=0x10003|drv_subtyp=1|drv_typ=3|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|need_packages=i4l-isdnlog|supported=full|
+|vendor=Dynalink|device=6692 PCI|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x0675|device_id=0x1702|subvendor_id=0xffff|subdevice_id=0xffff|vario=HiSax driver|SMP=Yes|drv_id=0x50024|drv_subtyp=5|drv_typ=36|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|need_packages=i4l-isdnlog|supported=full|
+|vendor=ITK|device=ISDN 3.0|device_class=ISDN Single Basic Rate|bus_type=ISA|vendor_id=0x8b26|device_id=0x2500|vario=HiSax driver|SMP=Yes|drv_id=0x10009|drv_subtyp=1|drv_typ=9|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|need_packages=i4l-isdnlog|supported=full|
+|vendor=Teles AG|device=PCI|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x11de|device_id=0x6120|subvendor_id=0x0000|subdevice_id=0x0000|vario=HiSax driver|SMP=Yes|drv_id=0x15|drv_subtyp=0|drv_typ=21|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|need_packages=i4l-isdnlog|supported=full|
+|vendor=Sedlbauer AG|device=Speed Win2 PC104|device_class=ISDN Single Basic Rate|bus_type=PC104|vendor_id=0x0000|device_id=0x0000|subvendor_id=0x0000|subdevice_id=0x0000|vario=HiSax driver|SMP=Yes|drv_id=0x4000f|drv_subtyp=4|drv_typ=15|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|need_packages=i4l-isdnlog|supported=full|
+|vendor=AVM Computersysteme Vertriebs GmbH|device=B1 PCI|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x1244|device_id=0x0700|vario=CAPI 2.0 driver|SMP=Yes|drv_id=0x11f41|drv_subtyp=1|drv_typ=8001|feature=Fax|firmware=b1-%{PROTO}.t4|interface=CAPI20|interface=CAPI20 Fax|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=b1pci|need_packages=capi4linux|need_packages=i4l-base|need_packages=i4l-isdnlog|need_packages=i4lfirm|supported=full|
+|vendor=Sedlbauer AG|device=Speed Star2|device_class=ISDN Single Basic Rate|bus_type=PCMCIA|vario=HiSax driver|SMP=Yes|drv_id=0x50016|drv_subtyp=5|drv_typ=22|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|need_packages=i4l-isdnlog|supported=full|
+|vendor=AsKey|device=PCI (W6692)|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x1050|device_id=0x6692|subvendor_id=0x144f|subdevice_id=0x1702|vario=HiSax driver|SMP=Yes|drv_id=0x10024|drv_subtyp=1|drv_typ=36|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|need_packages=i4l-isdnlog|supported=full|
+|vendor=High Soft Tech|device=saphir III|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0xe159|device_id=0x0002|subvendor_id=0x0052|subdevice_id=0x0001|vario=HiSax driver|SMP=Yes|drv_id=0x9000f|drv_subtyp=9|drv_typ=15|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|need_packages=i4l-isdnlog|supported=full|
+|vendor=Digi|device=DataFire Micro V IOM2 (North America)|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x114f|device_id=0x0072|subvendor_id=0xffff|subdevice_id=0xffff|vario=HiSax driver|SMP=Yes|drv_id=0x140023|drv_subtyp=20|drv_typ=35|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|need_packages=i4l-isdnlog|supported=full|
+|vendor=Dynalink|device=PCI (CCD HFC)|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x1397|device_id=0x2bd0|subvendor_id=0x1043|subdevice_id=0x1704|vario=HiSax driver|SMP=Yes|drv_id=0xb0023|drv_subtyp=11|drv_typ=35|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|need_packages=i4l-isdnlog|supported=full|
+|vendor=Elsa AG|device=Quickstep 1000|device_class=ISDN Single Basic Rate|bus_type=ISA|vendor_id=0x9315|device_id=0x3301|vario=HiSax driver|SMP=Yes|drv_id=0x70007|drv_subtyp=7|drv_typ=7|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|need_packages=i4l-isdnlog|supported=full|
+|vendor=ITK|device=ix1-micro Rev.2|device_class=ISDN Single Basic Rate|bus_type=ISA|vario=HiSax driver|IO=0x390|IO=0x398|IO=0x3a0|IO=0x3a8|IRQ=10|IRQ=11|IRQ=5|IRQ=9|SMP=Yes|drv_id=0x9|drv_subtyp=0|drv_typ=9|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|need_packages=i4l-isdnlog|supported=full|
+|vendor=Teles AG|device=16.3c|device_class=ISDN Single Basic Rate|bus_type=ISA|vendor_id=0x2750|device_id=0x1026|vario=HiSax driver|SMP=Yes|drv_id=0xe|drv_subtyp=0|drv_typ=14|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|need_packages=i4l-isdnlog|supported=full|
+|vendor=SGS Thomson Microelectronics|device=ST5481 USB Adapter|device_class=ISDN Single Basic Rate|bus_type=USB|vendor_id=0x0483|device_id=0x4810|vario=HiSax driver|SMP=Yes|drv_id=0x103e9|drv_subtyp=1|drv_typ=1001|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax_st5481|need_packages=i4l-base|need_packages=i4l-isdnlog|supported=full|
+|vendor=AVM Computersysteme Vertriebs GmbH|device=FRITZ!Card PCI|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x1244|device_id=0x0a00|subvendor_id=0xffff|subdevice_id=0xffff|vario=CAPI 2.0 driver|SMP=No|alternative_name=Telekom AG,Teledat 150|drv_id=0x11f42|drv_subtyp=1|drv_typ=8002|feature=Fax|info=This card has multiple drivers, some functions are only available on the binonly driver|interface=CAPI20|interface=CAPI20 Fax|line_cnt=1|line_protocol=DSS1|module=fcpci|need_packages=capi4linux|need_packages=i4l-base|need_packages=i4l-isdnlog|short_description=binary only CAPI with FAX G3|supported=full|vario=HiSax driver|SMP=Yes|alternative_name=Telekom AG,Teledat 150|drv_id=0x1001b|drv_subtyp=1|drv_typ=27|feature=Fax|info=This card has multiple drivers, some functions are only available on the binonly driver|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=capi4linux|need_packages=i4l-base|need_packages=i4l-isdnlog|short_description=OpenSource without Fax G3|supported=full|
+|vendor=AVM Computersysteme Vertriebs GmbH|device=A1|device_class=ISDN Single Basic Rate|bus_type=ISA|vario=CAPI 2.0 driver|IO=0x200|IO=0x240|IO=0x300|IO=0x340|IRQ=10|IRQ=11|IRQ=12|IRQ=15|IRQ=3|IRQ=4|IRQ=5|IRQ=7|IRQ=9|SMP=No|drv_id=0x41f42|drv_subtyp=4|drv_typ=8002|feature=Fax|info=This card has multiple drivers, some functions are only available on the binonly driver|interface=CAPI20|interface=CAPI20 Fax|line_cnt=1|line_protocol=DSS1|module=fcclassic|need_packages=capi4linux|need_packages=i4l-base|need_packages=i4l-isdnlog|short_description=binary only CAPI with FAX G3|supported=full|vario=HiSax driver|IO=0x200|IO=0x240|IO=0x300|IO=0x340|IRQ=10|IRQ=11|IRQ=12|IRQ=15|IRQ=3|IRQ=4|IRQ=5|IRQ=7|IRQ=9|SMP=Yes|drv_id=0x10005|drv_subtyp=1|drv_typ=5|feature=Fax|info=This card has multiple drivers, some functions are only available on the binonly driver|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=capi4linux|need_packages=i4l-base|need_packages=i4l-isdnlog|short_description=OpenSource without Fax G3|supported=full|
+|vendor=Elsa AG|device=PCMCIA|device_class=ISDN Single Basic Rate|bus_type=PCMCIA|vario=HiSax driver|SMP=Yes|drv_id=0x6000a|drv_subtyp=6|drv_typ=10|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|need_packages=i4l-isdnlog|supported=full|
+|vendor=Iscas|device=TE320|device_class=ISDN Single Basic Rate|bus_type=ISA|vendor_id=0x8615|device_id=0x0000|vario=HiSax driver|SMP=Yes|drv_id=0x4000c|drv_subtyp=4|drv_typ=12|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|need_packages=i4l-isdnlog|supported=full|
+|vendor=Eicon Networks|device=Diva 2.02 PCI|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x1133|device_id=0xe00b|subvendor_id=0xffff|subdevice_id=0xffff|vario=HiSax driver|SMP=Yes|drv_id=0xd000b|drv_subtyp=13|drv_typ=11|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|need_packages=i4l-isdnlog|supported=full|
+|vendor=ASUSCOM|device=ISA ISAC|device_class=ISDN Single Basic Rate|bus_type=ISA|vendor_id=0x7506|device_id=0x8816|vario=HiSax driver|SMP=Yes|drv_id=0x1000c|drv_subtyp=1|drv_typ=12|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|need_packages=i4l-isdnlog|supported=full|
+|vendor=AVM Computersysteme Vertriebs GmbH|device=FRITZ!Card USB v2.1|device_class=ISDN Single Basic Rate|bus_type=USB|vendor_id=0x057c|device_id=0x1900|vario=CAPI 2.0 driver|SMP=No|drv_id=0x31f43|drv_subtyp=3|drv_typ=8003|feature=Fax|info=This card is supported with binonly drivers from the manufacturer|interface=CAPI20|interface=CAPI20 Fax|line_cnt=1|line_protocol=DSS1|module=fcusb2|need_packages=capi4linux|need_packages=i4l-base|need_packages=i4l-isdnlog|short_description=binary only CAPI with FAX G3|supported=full|
+|vendor=Eicon Networks|device=Diehl ISDN-S|device_class=ISDN Single Basic Rate|bus_type=ISA|vario=I4L driver|IRQ=10|IRQ=11|IRQ=12|IRQ=3|IRQ=4|IRQ=9|MEMBASE=0xd0000|SMP=Yes|drv_id=0x1f4a|drv_subtyp=0|drv_typ=8010|feature=Fax|firmware=%{PROTO}|interface=FCLASS2|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=eicon|need_packages=i4l-base|need_packages=i4l-isdnlog|need_packages=i4lfirm|supported=full|
+|vendor=Sedlbauer AG|device=Speed Fax+|device_class=ISDN Single Basic Rate|bus_type=ISA|vendor_id=0x274c|device_id=0x0200|vario=HiSax driver|SMP=Yes|drv_id=0x3001c|drv_subtyp=3|drv_typ=28|feature=Fax|firmware=ISAR.BIN|interface=FCLASS1|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|need_packages=i4l-isdnlog|supported=full|
+|vendor=Billion|device=B008|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x1397|device_id=0xb008|subvendor_id=0xffff|subdevice_id=0xffff|vario=HiSax driver|SMP=Yes|drv_id=0x40023|drv_subtyp=4|drv_typ=35|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|need_packages=i4l-isdnlog|supported=full|
+|vendor=Billion|device=B00B|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x1397|device_id=0xb00b|subvendor_id=0xffff|subdevice_id=0xffff|vario=HiSax driver|SMP=Yes|drv_id=0x70023|drv_subtyp=7|drv_typ=35|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|need_packages=i4l-isdnlog|supported=full|
+|vendor=TigerJet|device=300 PCI|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0xe159|device_id=0x0001|subvendor_id=0xffff|subdevice_id=0xffff|vario=HiSax driver|SMP=Yes|drv_id=0x14|drv_subtyp=0|drv_typ=20|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|need_packages=i4l-isdnlog|supported=full|
+|vendor=Seyon|device=B100|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x1397|device_id=0xb100|subvendor_id=0xffff|subdevice_id=0xffff|vario=HiSax driver|SMP=Yes|drv_id=0x90023|drv_subtyp=9|drv_typ=35|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|need_packages=i4l-isdnlog|supported=full|
+|vendor=TigerJet|device=NetSpider-U PCI|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0xe159|device_id=0x0001|subvendor_id=0xffff|subdevice_id=0xffff|vario=HiSax driver|SMP=Yes|drv_id=0x26|drv_subtyp=0|drv_typ=38|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|need_packages=i4l-isdnlog|supported=full|
+|vendor=Sedlbauer AG|device=Speed Fax+ PCI|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0xe159|device_id=0x0002|subvendor_id=0x0054|subdevice_id=0x0001|vario=HiSax driver|SMP=Yes|drv_id=0x8001c|drv_subtyp=8|drv_typ=28|feature=Fax|firmware=ISAR.BIN|interface=FCLASS1|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|need_packages=i4l-isdnlog|supported=full|
+|vendor=AVM Computersysteme Vertriebs GmbH|device=FRITZ!X USB v1.0 / v2.0|device_class=ISDN Single Basic Rate|bus_type=USB|vendor_id=0x057c|device_id=0x2000|vario=CAPI 2.0 driver|SMP=No|drv_id=0x51f43|drv_subtyp=5|drv_typ=8003|feature=Fax|info=This card is supported with binonly drivers from the manufacturer|interface=CAPI20|interface=CAPI20 Fax|line_cnt=1|line_protocol=DSS1|module=fxusb|need_packages=capi4linux|need_packages=i4l-base|need_packages=i4l-isdnlog|revision=0x0100|short_description=binary only CAPI with FAX G3|supported=full|
+|vendor=Acer|device=P10|device_class=ISDN Single Basic Rate|bus_type=ISA|vendor_id=0xd805|device_id=0x1411|vario=HiSax driver|SMP=Yes|drv_id=0x1e|drv_subtyp=0|drv_typ=30|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|need_packages=i4l-isdnlog|supported=full|
+|vendor=Elsa AG|device=Quickstep 3000 PCI|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x1048|device_id=0x3000|subvendor_id=0xffff|subdevice_id=0xffff|vario=HiSax driver|SMP=Yes|drv_id=0xa0012|drv_subtyp=10|drv_typ=18|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|need_packages=i4l-isdnlog|supported=full|
+|vendor=TeleInt|device=SA1|device_class=ISDN Single Basic Rate|bus_type=ISA|vario=HiSax driver|IO=0x300|IRQ=10|IRQ=11|IRQ=3|IRQ=4|IRQ=5|IRQ=7|SMP=Yes|drv_id=0xd|drv_subtyp=0|drv_typ=13|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|need_packages=i4l-isdnlog|supported=full|
+|vendor=Billion|device=B000|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x1397|device_id=0xb000|subvendor_id=0xffff|subdevice_id=0xffff|vario=HiSax driver|SMP=Yes|drv_id=0x10023|drv_subtyp=1|drv_typ=35|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|need_packages=i4l-isdnlog|supported=full|
+|vendor=Teles AG|device=8.0|device_class=ISDN Single Basic Rate|bus_type=ISA|vario=HiSax driver|IRQ=3|IRQ=4|IRQ=5|IRQ=6|IRQ=7|IRQ=9|MEMBASE=0xc0000|MEMBASE=0xc2000|MEMBASE=0xc4000|MEMBASE=0xc6000|MEMBASE=0xc8000|MEMBASE=0xca000|MEMBASE=0xcc000|MEMBASE=0xce000|MEMBASE=0xd0000|MEMBASE=0xd2000|MEMBASE=0xd4000|MEMBASE=0xd6000|MEMBASE=0xd8000|MEMBASE=0xda000|MEMBASE=0xdc000|MEMBASE=0xde000|SMP=Yes|drv_id=0x2|drv_subtyp=0|drv_typ=2|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|need_packages=i4l-isdnlog|supported=full|
+|vendor=Elsa AG|device=Microlink ISDN USB|device_class=ISDN Single Basic Rate|bus_type=USB|vario=HiSax driver|line_cnt=1|supported=not|
+|vendor=Teles AG|device=16.0|device_class=ISDN Single Basic Rate|bus_type=ISA|vario=HiSax driver|IO=0xd80|IO=0xe80|IO=0xf80|IRQ=10|IRQ=11|IRQ=12|IRQ=15|IRQ=3|IRQ=4|IRQ=5|IRQ=9|MEMBASE=0xc0000|MEMBASE=0xc2000|MEMBASE=0xc4000|MEMBASE=0xc6000|MEMBASE=0xc8000|MEMBASE=0xca000|MEMBASE=0xcc000|MEMBASE=0xce000|MEMBASE=0xd0000|MEMBASE=0xd2000|MEMBASE=0xd4000|MEMBASE=0xd6000|MEMBASE=0xd8000|MEMBASE=0xda000|MEMBASE=0xdc000|MEMBASE=0xde000|SMP=Yes|drv_id=0x1|drv_subtyp=0|drv_typ=1|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|need_packages=i4l-isdnlog|supported=full|
+|vendor=Auerswald|device=Comfort 2000 System Telephone|device_class=ISDN Single Basic Rate|bus_type=USB|vendor_id=0x09bf|device_id=0x00f1|vario=HiSax driver|SMP=Yes|drv_id=0x4002a|drv_subtyp=4|drv_typ=42|interface=I4L|line_cnt=1|line_protocol=DSS1|module=auerswald|need_packages=i4l-base|need_packages=i4l-isdnlog|supported=full|
+|vendor=Eicon Networks|device=Diva Server BRI PCI|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x1133|device_id=0xe010|subvendor_id=0xffff|subdevice_id=0xffff|vario=I4L driver|SMP=Yes|drv_id=0x51f4a|drv_subtyp=5|drv_typ=8010|feature=Fax|firmware=%{PROTO}|interface=FCLASS2|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=eicon|need_packages=i4l-base|need_packages=i4l-isdnlog|need_packages=i4lfirm|supported=full|
+|vendor=Sedlbauer AG|device=Speed Card|device_class=ISDN Single Basic Rate|bus_type=ISA|vario=HiSax driver|IO=0x270|IRQ=10|IRQ=11|IRQ=12|IRQ=15|IRQ=3|IRQ=4|IRQ=5|IRQ=7|SMP=Yes|alternative_name=Telekom AG,Teledat 100 ISA|drv_id=0xf|drv_subtyp=0|drv_typ=15|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|need_packages=i4l-isdnlog|supported=full|
+|vendor=Billion|device=B007|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x1397|device_id=0xb007|subvendor_id=0xffff|subdevice_id=0xffff|vario=HiSax driver|SMP=Yes|drv_id=0x30023|drv_subtyp=3|drv_typ=35|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|need_packages=i4l-isdnlog|supported=full|
+|vendor=Elsa AG|device=Quickstep 1000 PCI|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x1048|device_id=0x1000|subvendor_id=0xffff|subdevice_id=0xffff|vario=HiSax driver|SMP=Yes|drv_id=0x90012|drv_subtyp=9|drv_typ=18|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|need_packages=i4l-isdnlog|supported=full|
+|vendor=Teles AG|device=16.3|device_class=ISDN Single Basic Rate|bus_type=ISA|vario=HiSax driver|IO=0x180|IO=0x280|IO=0x380|IRQ=10|IRQ=12|IRQ=15|IRQ=5|IRQ=9|SMP=Yes|drv_id=0x3|drv_subtyp=0|drv_typ=3|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|need_packages=i4l-isdnlog|supported=full|
+|vendor=Elsa AG|device=Microlink PCI|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x1048|device_id=0x1000|subvendor_id=0xffff|subdevice_id=0xffff|vario=HiSax driver|SMP=Yes|drv_id=0xc0012|drv_subtyp=12|drv_typ=18|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|need_packages=i4l-isdnlog|supported=full|
+|vendor=Gazel|device=Djinn Itoo|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x10b5|device_id=0x1151|subvendor_id=0xffff|subdevice_id=0xffff|vario=HiSax driver|SMP=Yes|drv_id=0x20022|drv_subtyp=2|drv_typ=34|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|need_packages=i4l-isdnlog|supported=full|
+|vendor=Pyramid|device=Speed Fax+ PCI|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0xe159|device_id=0x0002|subvendor_id=0x0051|subdevice_id=0x0001|vario=HiSax driver|SMP=Yes|drv_id=0x7001c|drv_subtyp=7|drv_typ=28|feature=Fax|firmware=ISAR.BIN|interface=FCLASS1|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|need_packages=i4l-isdnlog|supported=full|
+|vendor=AVM Computersysteme Vertriebs GmbH|device=FRITZ!Card PCI v2.0|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x1244|device_id=0x0e00|subvendor_id=0x1244|subdevice_id=0x0e00|vario=CAPI 2.0 driver|SMP=No|alternative_name=Telekom AG,Teledat 150 v2.0|drv_id=0x21f42|drv_subtyp=2|drv_typ=8002|feature=Fax|info=This card has multiple drivers, some functions are only available on the binonly driver|interface=CAPI20|interface=CAPI20 Fax|line_cnt=1|line_protocol=DSS1|module=fcpci|need_packages=capi4linux|need_packages=i4l-base|need_packages=i4l-isdnlog|short_description=binary only CAPI with FAX G3|supported=full|vario=HiSax driver|SMP=Yes|alternative_name=Telekom AG,Teledat 150 v2.0|drv_id=0x3e8|drv_subtyp=0|drv_typ=1000|feature=Fax|info=This card has multiple drivers, some functions are only available on the binonly driver|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax_fcpcipnp|need_packages=capi4linux|need_packages=i4l-base|need_packages=i4l-isdnlog|short_description=OpenSource without Fax G3|supported=full|
+|vendor=Compaq Computer Corporation|device=ISDN S0 ISA|device_class=ISDN Single Basic Rate|bus_type=ISA|vendor_id=0x110e|device_id=0x0210|vario=HiSax driver|SMP=Yes|drv_id=0x13|drv_subtyp=0|drv_typ=19|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|need_packages=i4l-isdnlog|supported=full|
+|vendor=Billion|device=BIPAC-D|device_class=ISDN Single Basic Rate|bus_type=ISA|vendor_id=0x2c09|device_id=0x0200|vario=HiSax driver|SMP=Yes|drv_id=0x1001e|drv_subtyp=1|drv_typ=30|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|need_packages=i4l-isdnlog|supported=full|
+|vendor=Auerswald|device=COMpact 2206 USB|device_class=ISDN Single Basic Rate|bus_type=USB|vendor_id=0x09bf|device_id=0x00db|vario=HiSax driver|SMP=Yes|alternative_name=COMpact 4410 USB|drv_id=0x1002a|drv_subtyp=1|drv_typ=42|interface=I4L|line_cnt=1|line_protocol=DSS1|module=auerswald|need_packages=i4l-base|need_packages=i4l-isdnlog|supported=full|
+|vendor=ASUSCOM|device=PCI + Voice (W6692)|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x1050|device_id=0x6692|subvendor_id=0x1043|subdevice_id=0x1703|vario=HiSax driver|SMP=Yes|drv_id=0x20024|drv_subtyp=2|drv_typ=36|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|need_packages=i4l-isdnlog|supported=full|
+|vendor=Eicon Networks|device=Diehl ISDN-SCOM|device_class=ISDN Single Basic Rate|bus_type=ISA|vario=I4L driver|IRQ=10|IRQ=11|IRQ=12|IRQ=3|IRQ=4|IRQ=5|IRQ=7|IRQ=9|MEMBASE=0xd0000|SMP=Yes|drv_id=0x21f4a|drv_subtyp=2|drv_typ=8010|feature=Fax|firmware=%{PROTO}|interface=FCLASS2|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=eicon|need_packages=i4l-base|need_packages=i4l-isdnlog|need_packages=i4lfirm|supported=full|
+|vendor=Teles AG|device=PCMCIA|device_class=ISDN Single Basic Rate|bus_type=PCMCIA|vario=HiSax driver|SMP=Yes|drv_id=0x8|drv_subtyp=0|drv_typ=8|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|need_packages=i4l-isdnlog|supported=full|
+|vendor=Gazel|device=R753|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x10b5|device_id=0x1152|subvendor_id=0xffff|subdevice_id=0xffff|vario=HiSax driver|SMP=Yes|drv_id=0x10022|drv_subtyp=1|drv_typ=34|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|need_packages=i4l-isdnlog|supported=full|
+|vendor=AVM Computersysteme Vertriebs GmbH|device=FRITZ!Card USB|device_class=ISDN Single Basic Rate|bus_type=USB|vendor_id=0x057c|device_id=0x0c00|vario=CAPI 2.0 driver|SMP=No|drv_id=0x11f43|drv_subtyp=1|drv_typ=8003|feature=Fax|info=This card is supported with binonly drivers from the manufacturer|interface=CAPI20|interface=CAPI20 Fax|line_cnt=1|line_protocol=DSS1|module=fcusb|need_packages=capi4linux|need_packages=i4l-base|need_packages=i4l-isdnlog|short_description=binary only CAPI with FAX G3|supported=full|
+|vendor=Elsa AG|device=ML PCC-8|device_class=ISDN Single Basic Rate|bus_type=ISA|vario=HiSax driver|IO=0x160|IO=0x170|IO=0x260|IO=0x360|IRQ=3|IRQ=5|IRQ=7|IRQ=9|SMP=Yes|drv_id=0x20006|drv_subtyp=2|drv_typ=6|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|need_packages=i4l-isdnlog|supported=full|
+|vendor=Billion|device=Tornado Tipac|device_class=ISDN Single Basic Rate|bus_type=ISA|vendor_id=0xcd4c|device_id=0x0100|vario=HiSax driver|SMP=Yes|drv_id=0x4001e|drv_subtyp=4|drv_typ=30|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|need_packages=i4l-isdnlog|supported=full|
+|vendor=Abocom/Magitek|device=2BD1|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x13d1|device_id=0x2bd1|subvendor_id=0xffff|subdevice_id=0xffff|vario=HiSax driver|SMP=Yes|drv_id=0x160023|drv_subtyp=22|drv_typ=35|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|need_packages=i4l-isdnlog|supported=full|
+|vendor=Billion|device=B00A|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x1397|device_id=0xb00a|subvendor_id=0xffff|subdevice_id=0xffff|vario=HiSax driver|SMP=Yes|drv_id=0x60023|drv_subtyp=6|drv_typ=35|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|need_packages=i4l-isdnlog|supported=full|
+|vendor=Eicon Networks|device=Diva 2.01 ISA|device_class=ISDN Single Basic Rate|bus_type=ISA|vendor_id=0x891c|device_id=0xa100|vario=HiSax driver|SMP=Yes|drv_id=0x3000b|drv_subtyp=3|drv_typ=11|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|need_packages=i4l-isdnlog|supported=full|
+|vendor=Teles AG|device=PCI v2|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0xe159|device_id=0x0001|subvendor_id=0x00a7|subdevice_id=0x0001|vario=HiSax driver|SMP=Yes|drv_id=0x20014|drv_subtyp=2|drv_typ=20|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|need_packages=i4l-isdnlog|supported=full|
+|vendor=AVM Computersysteme Vertriebs GmbH|device=FRITZ!X USB v3.0|device_class=ISDN Single Basic Rate|bus_type=USB|vendor_id=0x057c|device_id=0x2000|vario=CAPI 2.0 driver|SMP=No|drv_id=0x81f43|drv_subtyp=8|drv_typ=8003|feature=Fax|info=This card is supported with binonly drivers from the manufacturer|interface=CAPI20|interface=CAPI20 Fax|line_cnt=1|line_protocol=DSS1|module=fxusb|need_packages=capi4linux|need_packages=i4l-base|need_packages=i4l-isdnlog|revision=0x0302|short_description=binary only CAPI with FAX G3|supported=full|
+|vendor=Telekom AG|device=Concept|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x0871|device_id=0xffa2|subvendor_id=0xffff|subdevice_id=0xffff|vario=HiSax driver|SMP=Yes|drv_id=0xe0023|drv_subtyp=14|drv_typ=35|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|need_packages=i4l-isdnlog|supported=full|
+|vendor=AVM Computersysteme Vertriebs GmbH|device=FRITZ!Card Classic|device_class=ISDN Single Basic Rate|bus_type=ISA|vario=CAPI 2.0 driver|IO=0x200|IO=0x240|IO=0x300|IO=0x340|IRQ=10|IRQ=11|IRQ=12|IRQ=15|IRQ=3|IRQ=4|IRQ=5|IRQ=7|IRQ=9|SMP=No|drv_id=0x31f42|drv_subtyp=3|drv_typ=8002|feature=Fax|info=This card has multiple drivers, some functions are only available on the binonly driver|interface=CAPI20|interface=CAPI20 Fax|line_cnt=1|line_protocol=DSS1|module=fcclassic|need_packages=capi4linux|need_packages=i4l-base|need_packages=i4l-isdnlog|short_description=binary only CAPI with FAX G3|supported=full|vario=HiSax driver|IO=0x200|IO=0x240|IO=0x300|IO=0x340|IRQ=10|IRQ=11|IRQ=12|IRQ=15|IRQ=3|IRQ=4|IRQ=5|IRQ=7|IRQ=9|SMP=Yes|drv_id=0x5|drv_subtyp=0|drv_typ=5|feature=Fax|info=This card has multiple drivers, some functions are only available on the binonly driver|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=capi4linux|need_packages=i4l-base|need_packages=i4l-isdnlog|short_description=OpenSource without Fax G3|supported=full|
+|vendor=Eicon Networks|device=Diva 2.0 ISA|device_class=ISDN Single Basic Rate|bus_type=ISA|vendor_id=0x891c|device_id=0x7100|vario=HiSax driver|SMP=Yes|drv_id=0x1000b|drv_subtyp=1|drv_typ=11|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|need_packages=i4l-isdnlog|supported=full|
+|vendor=Eicon Networks|device=Diva Server 4BRI/PCI|device_class=ISDN Multiple Basic Rate|bus_type=PCI|vendor_id=0x1133|device_id=0xe012|subvendor_id=0xffff|subdevice_id=0xffff|vario=I4L driver|SMP=Yes|drv_id=0x61f4a|drv_subtyp=6|drv_typ=8010|feature=Fax|firmware=%{PROTO}|interface=FCLASS2|interface=I4L|line_cnt=4|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=eicon|need_packages=i4l-base|need_packages=i4l-isdnlog|need_packages=i4lfirm|supported=full|
+|vendor=ICN|device=4B|device_class=ISDN Multiple Basic Rate|bus_type=ISA|vario=I4L driver|IO=0x300|IO=0x308|IO=0x310|IO=0x318|IO=0x320|IO=0x328|IO=0x330|IO=0x338|IO=0x340|IO=0x348|IO=0x350|IO=0x358|IO=0x360|IO=0x368|MEMBASE=0xc0000|MEMBASE=0xc2000|MEMBASE=0xc4000|MEMBASE=0xc6000|MEMBASE=0xc8000|MEMBASE=0xca000|MEMBASE=0xcc000|MEMBASE=0xce000|MEMBASE=0xd0000|MEMBASE=0xd2000|MEMBASE=0xd4000|MEMBASE=0xd6000|MEMBASE=0xd8000|MEMBASE=0xda000|MEMBASE=0xdc000|MEMBASE=0xde000|SMP=Yes|drv_id=0x11f5e|drv_subtyp=1|drv_typ=8030|firmware=pc-%{PROTO}.bin|interface=I4L|line_cnt=2|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=icn|need_packages=i4l-base|need_packages=i4l-isdnlog|need_packages=i4lfirm|supported=full|
+|vendor=AVM Computersysteme Vertriebs GmbH|device=C4|device_class=ISDN Multiple Basic Rate|bus_type=PCI|vendor_id=0x1011|device_id=0x1065|subvendor_id=0x1244|subdevice_id=0x0800|vario=CAPI 2.0 driver|SMP=Yes|drv_id=0x31f41|drv_subtyp=3|drv_typ=8001|feature=Fax|firmware=c4.bin|interface=CAPI20|interface=CAPI20 Fax|line_cnt=4|line_protocol=DSS1|line_protocol=LEASED|module=c4|need_packages=capi4linux|need_packages=i4l-base|need_packages=i4l-isdnlog|need_packages=i4lfirm|supported=full|
+|vendor=Eicon Networks|device=Diehl ISDN-QUADRO|device_class=ISDN Multiple Basic Rate|bus_type=ISA|vario=I4L driver|IRQ=10|IRQ=11|IRQ=12|IRQ=3|IRQ=4|IRQ=5|IRQ=6|IRQ=9|MEMBASE=0xd0000|SMP=Yes|drv_id=0x31f4a|drv_subtyp=3|drv_typ=8010|feature=Fax|firmware=%{PROTO}|interface=FCLASS2|interface=I4L|line_cnt=4|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=eicon|need_packages=i4l-base|need_packages=i4l-isdnlog|need_packages=i4lfirm|supported=full|
+|vendor=Eicon Networks|device=Diva Server 4BRI/PCI U|device_class=ISDN Multiple Basic Rate|bus_type=PCI|vendor_id=0x1133|device_id=0xe013|subvendor_id=0xffff|subdevice_id=0xffff|vario=I4L driver|SMP=Yes|drv_id=0x71f4a|drv_subtyp=7|drv_typ=8010|feature=Fax|firmware=%{PROTO}|interface=FCLASS2|interface=I4L|line_cnt=4|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=eicon|need_packages=i4l-base|need_packages=i4l-isdnlog|need_packages=i4lfirm|supported=full|
+|vendor=AVM Computersysteme Vertriebs GmbH|device=C2|device_class=ISDN Multiple Basic Rate|bus_type=PCI|vendor_id=0x1011|device_id=0x1065|subvendor_id=0x1244|subdevice_id=0x1100|vario=CAPI 2.0 driver|SMP=Yes|drv_id=0x61f41|drv_subtyp=6|drv_typ=8001|feature=Fax|firmware=c2.bin|interface=CAPI20|interface=CAPI20 Fax|line_cnt=2|line_protocol=DSS1|line_protocol=LEASED|module=c4|need_packages=capi4linux|need_packages=i4l-base|need_packages=i4l-isdnlog|need_packages=i4lfirm|supported=full|
+|vendor=AVM Computersysteme Vertriebs GmbH|device=T1 PCI|device_class=ISDN Primary Rate|bus_type=PCI|vendor_id=0x1244|device_id=0x1200|vario=CAPI 2.0 driver|SMP=Yes|drv_id=0x21f45|drv_subtyp=2|drv_typ=8005|feature=Fax|interface=CAPI20|interface=CAPI20 Fax|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|module=t1pci|need_packages=capi4linux|need_packages=i4l-base|need_packages=i4l-isdnlog|need_packages=i4lfirm|special=B version|supported=full|
+|vendor=AVM Computersysteme Vertriebs GmbH|device=T1 ISA|device_class=ISDN Primary Rate|bus_type=ISA|vario=CAPI 2.0 driver|IO=0x340|IRQ=10|IRQ=11|IRQ=12|IRQ=15|IRQ=3|IRQ=5|IRQ=7|IRQ=9|SMP=Yes|drv_id=0x1f45|drv_subtyp=0|drv_typ=8005|feature=Fax|interface=CAPI20|interface=CAPI20 Fax|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|module=t1isa|need_packages=capi4linux|need_packages=i4l-base|need_packages=i4l-isdnlog|need_packages=i4lfirm|special=B version|supported=full|
+|vendor=Eicon Networks|device=Diehl ISDN-S2M|device_class=ISDN Primary Rate|bus_type=ISA|vario=I4L driver|IRQ=10|IRQ=11|IRQ=12|IRQ=3|IRQ=4|IRQ=5|IRQ=7|IRQ=9|MEMBASE=0xd0000|SMP=Yes|drv_id=0x41f4a|drv_subtyp=4|drv_typ=8010|feature=Fax|firmware=%{PROTO}|interface=FCLASS2|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=eicon|need_packages=i4l-base|need_packages=i4l-isdnlog|need_packages=i4lfirm|supported=full|
+|vendor=Eicon Networks|device=Diva Server PRI/PCI|device_class=ISDN Primary Rate|bus_type=PCI|vendor_id=0x1133|device_id=0xe014|subvendor_id=0xffff|subdevice_id=0xffff|vario=I4L driver|SMP=Yes|drv_id=0x81f4a|drv_subtyp=8|drv_typ=8010|feature=Fax|firmware=%{PROTO}|interface=FCLASS2|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=eicon|need_packages=i4l-base|need_packages=i4l-isdnlog|need_packages=i4lfirm|supported=full|
+|vendor=AVM Computersysteme Vertriebs GmbH|device=FRITZ!Card DSL|device_class=ISDN Basic Rate and DSL|bus_type=PCI|vendor_id=0x1131|device_id=0x5402|subvendor_id=0x1244|subdevice_id=0x0f00|vario=CAPI 2.0 driver|SMP=No|drv_id=0x11f44|drv_subtyp=1|drv_typ=8004|feature=DSL|feature=Fax|firmware=fdslbase.bin|info=This card is supported with binonly drivers from the manufacturer|interface=CAPI20|interface=CAPI20 Fax|line_cnt=1|line_protocol=DSS1|module=fcdsl|need_packages=avm_fcdsl|need_packages=capi4linux|need_packages=i4l-base|need_packages=i4l-isdnlog|short_description=binary only CAPI with FAX G3 and DSL|supported=full|
+|vendor=AVM Computersysteme Vertriebs GmbH|device=FRITZ!Card DSL v2.0|device_class=ISDN Basic Rate and DSL|bus_type=PCI|vendor_id=0x1244|device_id=0x2900|vario=CAPI 2.0 driver|SMP=Yes|drv_id=0x31f44|drv_subtyp=3|drv_typ=8004|feature=DSL|feature=Fax|firmware=fds2base.bin|info=card is supported with binary only drivers from the manufacturer|interface=CAPI20|interface=CAPI20 Fax|line_cnt=1|line_protocol=DSS1|module=fcdsl2|need_packages=avm_fcdsl|need_packages=capi4linux|need_packages=i4l-base|need_packages=i4l-isdnlog|short_description=binary only CAPI with FAX G3 and DSL|supported=full|
+|vendor=AVM Computersysteme Vertriebs GmbH|device=FRITZ!Card DSL USB|device_class=ISDN Basic Rate and DSL|bus_type=USB|vendor_id=0x057c|device_id=0x2300|vario=CAPI 2.0 driver|SMP=Yes|drv_id=0x21f44|drv_subtyp=2|drv_typ=8004|feature=DSL|feature=Fax|firmware=fdsubase.frm|info=This card is supported with binonly drivers from the manufacturer|interface=CAPI20|interface=CAPI20 Fax|line_cnt=1|line_protocol=DSS1|module=fcdslusb|need_packages=avm_fcdsl|need_packages=capi4linux|need_packages=i4l-base|need_packages=i4l-isdnlog|short_description=binary only CAPI with FAX G3|supported=full|
+|vendor=AVM Computersysteme Vertriebs GmbH|device=FRITZ!Card DSL SL USB|device_class=DSL|bus_type=USB|vendor_id=0x057c|device_id=0x3500|vario=CAPI 2.0 driver|SMP=Yes|drv_id=0x51f44|drv_subtyp=5|drv_typ=8004|feature=DSLONLY|firmware=fdlubase.frm|info=DSL only card with binonly drivers from the manufacturer|interface=CAPI20|line_protocol=???|module=fcdslslusb|need_packages=avm_fcdsl|need_packages=capi4linux|need_packages=i4l-base|short_description=binary only CAPI|supported=full|
+|vendor=AVM Computersysteme Vertriebs GmbH|device=FRITZ!Card DSL SL|device_class=DSL|bus_type=PCI|vendor_id=0x1244|device_id=0x2700|vario=CAPI 2.0 driver|SMP=Yes|drv_id=0x41f44|drv_subtyp=4|drv_typ=8004|feature=DSLONLY|firmware=fdssbase.bin|info=DSL only card with binonly driver from the manufacturer|interface=CAPI20|line_protocol=???|module=fcdslsl|need_packages=avm_fcdsl|need_packages=capi4linux|need_packages=i4l-base|short_description=DSL only card with CAPI2.0|supported=full|
+|vendor=AVM Computersysteme Vertriebs GmbH|device=FRITZ!Card DSL USB v2.0|device_class=ISDN Basic Rate and DSL|bus_type=USB|vendor_id=0x057c|device_id=0x3600|vario=CAPI 2.0 driver|SMP=Yes|drv_id=0x61f44|drv_subtyp=6|drv_typ=8004|feature=DSL|feature=Fax|firmware=fdsubase2.frm|info=This card is supported with binonly drivers from the manufacturer|interface=CAPI20|interface=CAPI20 Fax|line_cnt=1|line_protocol=DSS1|module=fcdslusb2|need_packages=avm_fcdsl|need_packages=capi4linux|need_packages=i4l-base|need_packages=i4l-isdnlog|short_description=binary only CAPI with FAX G3|supported=full|
+|vendor=Telekom AG|device=Eumex 2220PC|device_class=ISDN Single Basic Rate|bus_type=USB|vendor_id=0x057c|device_id=0x2805|vario=CAPI 2.0 driver|SMP=Yes|drv_id=0xa1f43|drv_subtyp=10|drv_typ=8003|feature=Fax|info=This card is supported with binonly drivers from the manufacturer|interface=CAPI20|interface=CAPI20 Fax|line_cnt=1|line_protocol=DSS1|module=e2220pc|need_packages=capi4linux|need_packages=i4l-base|need_packages=i4l-isdnlog|short_description=binary only CAPI with FAX G3|supported=full|
+|vendor=Telekom AG|device=Eumex 2220pc|device_class=ISDN Single Basic Rate|bus_type=USB|vendor_id=0x057c|device_id=0x4401|vario=CAPI 2.0 driver|SMP=Yes|drv_id=0xb1f43|drv_subtyp=11|drv_typ=8003|feature=Fax|info=This card is supported with binonly drivers from the manufacturer|interface=CAPI20|interface=CAPI20 Fax|line_cnt=1|line_protocol=DSS1|module=e2220pc|need_packages=capi4linux|need_packages=i4l-base|need_packages=i4l-isdnlog|short_description=binary only CAPI with FAX G3|supported=full|
+|vendor=Telekom AG|device=Eumex 5520PC|device_class=ISDN Single Basic Rate|bus_type=USB|vendor_id=0x057c|device_id=0x2806|vario=CAPI 2.0 driver|SMP=Yes|drv_id=0xc1f43|drv_subtyp=12|drv_typ=8003|feature=Fax|info=This card is supported with binonly drivers from the manufacturer|interface=CAPI20|interface=CAPI20 Fax|line_cnt=1|line_protocol=DSS1|module=e5520pc|need_packages=capi4linux|need_packages=i4l-base|need_packages=i4l-isdnlog|short_description=binary only CAPI with FAX G3|supported=full|
+|vendor=Telekom AG|device=Eumex 5520pc|device_class=ISDN Single Basic Rate|bus_type=USB|vendor_id=0x057c|device_id=0x4601|vario=CAPI 2.0 driver|SMP=Yes|drv_id=0xd1f43|drv_subtyp=13|drv_typ=8003|feature=Fax|info=This card is supported with binonly drivers from the manufacturer|interface=CAPI20|interface=CAPI20 Fax|line_cnt=1|line_protocol=DSS1|module=e5520pc|need_packages=capi4linux|need_packages=i4l-base|need_packages=i4l-isdnlog|short_description=binary only CAPI with FAX G3|supported=full|
+|vendor=AVM Computersysteme Vertriebs GmbH|device=BlueFRITZ!USB|device_class=Others|bus_type=USB|vendor_id=0x057c|device_id=0x2200|vario=CAPI 2.0 driver|SMP=Yes|drv_id=0x11f46|drv_subtyp=1|drv_typ=8006|feature=BLUETOOTH|feature=Basic Rate|firmware=bfubase.frm|interface=CAPI20|line_cnt=1|line_protocol=DSS1|module=bfusb|need_packages=bluez-firmware|need_packages=bluez-libs|need_packages=bluez-utils|need_packages=capi4linux|need_packages=i4l-base|need_packages=i4l-isdnlog|short_description=Bluetooth Dongle,need ISDN Accesspoint|supported=full|
+|vendor=AVM Computersysteme Vertriebs GmbH|device=FRITZ!Box SL|device_class=DSL|bus_type=USB|vendor_id=0x057c|device_id=0x3701|vario=other|SMP=yes|drv_id=0xffff0001|drv_subtyp=1|drv_typ=9999|feature=DSLONLY|feature=PPPOE|interface=pppoe|line_cnt=0|line_protocol=none|need_packages=ppp|need_packages=smpppd|module=usbnet|supported=full|
+|vendor=AVM Computersysteme Vertriebs GmbH|device=FRITZ!Box|device_class=DSL|bus_type=USB|vendor_id=0x057c|device_id=0x3702|vario=other|SMP=yes|drv_id=0xffff0002|drv_subtyp=2|drv_typ=9999|feature=DSLONLY|feature=PPPOE|interface=pppoe|line_cnt=0|line_protocol=none|need_packages=ppp|need_packages=smpppd|module=usbnet|supported=full|
+|vendor=AVM Computersysteme Vertriebs GmbH|device=FRITZ!Box SL WLAN|device_class=DSL|bus_type=USB|vendor_id=0x057c|device_id=0x3c00|vario=other|SMP=yes|drv_id=0xffff0003|drv_subtyp=3|drv_typ=9999|feature=DSLONLY|feature=PPPOE|interface=pppoe|line_cnt=0|line_protocol=none|need_packages=ppp|need_packages=smpppd|module=usbnet|supported=full|
+|vendor=AVM Computersysteme Vertriebs GmbH|device=FRITZ!Box Fon WLAN|device_class=DSL|bus_type=USB|vendor_id=0x057c|device_id=0x4001|vario=other|SMP=yes|drv_id=0xffff0004|drv_subtyp=4|drv_typ=9999|feature=DSLONLY|feature=PPPOE|interface=pppoe|line_cnt=0|line_protocol=none|need_packages=ppp|need_packages=smpppd|module=usbnet|supported=full|
+|vendor=AVM Computersysteme Vertriebs GmbH|device=FRITZ!Box Fon (Annex A)|device_class=DSL|bus_type=USB|vendor_id=0x057c|device_id=0x3c00|vario=other|SMP=yes|drv_id=0xffff0005|drv_subtyp=5|drv_typ=9999|feature=DSLONLY|feature=PPPOE|interface=pppoe|line_cnt=0|line_protocol=none|need_packages=ppp|need_packages=smpppd|module=usbnet|supported=full|
+|vendor=AVM Computersysteme Vertriebs GmbH|device=FRITZ!Box (Annex A)|device_class=DSL|bus_type=USB|vendor_id=0x057c|device_id=0x3e01|vario=other|SMP=yes|drv_id=0xffff0006|drv_subtyp=6|drv_typ=9999|feature=DSLONLY|feature=PPPOE|interface=pppoe|line_cnt=0|line_protocol=none|need_packages=ppp|need_packages=smpppd|module=usbnet|supported=full|
+|vendor=AVM Computersysteme Vertriebs GmbH|device=FRITZ!Box Fon|device_class=DSL|bus_type=USB|vendor_id=0x057c|device_id=0x3a00|vario=other|SMP=yes|drv_id=0xffff0007|drv_subtyp=7|drv_typ=9999|feature=DSLONLY|feature=PPPOE|interface=pppoe|line_cnt=0|line_protocol=none|need_packages=ppp|need_packages=smpppd|module=usbnet|supported=full|
+|vendor=Sitecom|device=DC-104 USB ISDN Modem Rev 1|device_class=ISDN Single Basic Rate|bus_type=USB|vendor_id=0x0483|device_id=0x4810|subvendor_id=|subdevice_id=|vario=HiSax driver|SMP=Yes|drv_id=0x03e9|drv_subtyp=0|drv_typ=1001|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax_st5481|need_packages=i4l-base|need_packages=i4l-isdnlog|supported=full|
+|vendor=Sitecom|device=DC 104 USB ISDN Modem Rev 2|device_class=ISDN Single Basic Rate|bus_type=USB|vendor_id=0x0959|device_id=0x2bd0|subvendor_id=|subdevice_id=|vario=HiSax driver|SMP=Yes|drv_id=0x103ea|drv_subtyp=1|drv_typ=1002|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hfc_usb|supported=full|
+|vendor=Sitecom|device=DC 105 ISDN TA|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x182d|device_id=0x3069|subvendor_id=0x182d|subdevice_id=0x3069|vario=HiSax driver|SMP=Yes|drv_id=0x170023|drv_subtyp=23|drv_typ=35|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|supported=full|
--- /dev/null
+#
+# CDB data export for subclass: ISDN Single Basic Rate
+# Generated at : Tue Aug 26 16:15:17 2003
+#
+# Exported combinations:
+# arch=ppc dist=Stable lang=de_DE vario=HiSax driver
+#
+# Author: dhess@suse.de (13.02.2003)
+# Author: didge@suse.de (04.08.2003)
+#
+#
+# Export format: |Vendorname|Productname|Subclass|Bus|Variation|topic=value|topic=value|...|Variation|topic=value|topic=value|...|
+#
+
+
+|vendor=Sagem|device=Niccy PCI|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x1267|device_id=0x1016|subvendor_id=0xffff|subdevice_id=0xffff|vario=HiSax driver|SMP=Yes|drv_id=0x20018|drv_subtyp=2|drv_typ=24|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=AVM Computersysteme Vertriebs GmbH|device=FRITZ!X seriell|device_class=ISDN Single Basic Rate|bus_type=Serial|vario=HiSax driver|line_cnt=1|supported=not|
+|vendor=Eicon Networks|device=Diva 2.0 PCI|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x1133|device_id=0xe002|subvendor_id=0xffff|subdevice_id=0xffff|vario=HiSax driver|SMP=Yes|drv_id=0x2000b|drv_subtyp=2|drv_typ=11|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Sedlbauer AG|device=Speed PCI|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0xe159|device_id=0x0002|subvendor_id=0x0053|subdevice_id=0x0001|vario=HiSax driver|SMP=Yes|drv_id=0x6000f|drv_subtyp=6|drv_typ=15|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Eicon Networks|device=Diva 2.01 PCI|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x1133|device_id=0xe005|subvendor_id=0xffff|subdevice_id=0xffff|vario=HiSax driver|SMP=Yes|drv_id=0x4000b|drv_subtyp=4|drv_typ=11|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Telekom AG|device=Teledat USB 2a/b|device_class=ISDN Single Basic Rate|bus_type=USB|vario=HiSax driver|line_cnt=1|supported=not|
+|vendor=High Soft Tech|device=saphir III|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0xe159|device_id=0x0002|subvendor_id=0x0052|subdevice_id=0x0001|vario=HiSax driver|SMP=Yes|drv_id=0x9000f|drv_subtyp=9|drv_typ=15|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=AVM Computersysteme Vertriebs GmbH|device=FRITZ!Card PCI|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x1244|device_id=0x0a00|subvendor_id=0xffff|subdevice_id=0xffff|vario=HiSax driver|SMP=Yes|alternative_name=Telekom AG,Teledat 150|drv_id=0x1001b|drv_subtyp=1|drv_typ=27|feature=Fax|info=This card has multiple drivers, some functions are only available on the binonly driver|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|short_description=OpenSource without Fax G3|supported=full|
+|vendor=Eicon Networks|device=Diva 2.02 PCI|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x1133|device_id=0xe00b|subvendor_id=0xffff|subdevice_id=0xffff|vario=HiSax driver|SMP=Yes|drv_id=0xd000b|drv_subtyp=13|drv_typ=11|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Sedlbauer AG|device=Speed Fax+ PCI|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0xe159|device_id=0x0002|subvendor_id=0x0054|subdevice_id=0x0001|vario=HiSax driver|SMP=Yes|drv_id=0x8001c|drv_subtyp=8|drv_typ=28|feature=Fax|firmware=ISAR.BIN|interface=FCLASS1|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Elsa AG|device=Quickstep 3000 PCI|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x1048|device_id=0x3000|subvendor_id=0xffff|subdevice_id=0xffff|vario=HiSax driver|SMP=Yes|drv_id=0xa0012|drv_subtyp=10|drv_typ=18|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Elsa AG|device=Microlink ISDN USB|device_class=ISDN Single Basic Rate|bus_type=USB|vario=HiSax driver|line_cnt=1|supported=not|
+|vendor=Elsa AG|device=Quickstep 1000 PCI|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x1048|device_id=0x1000|subvendor_id=0xffff|subdevice_id=0xffff|vario=HiSax driver|SMP=Yes|drv_id=0x90012|drv_subtyp=9|drv_typ=18|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Elsa AG|device=Microlink PCI|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x1048|device_id=0x1000|subvendor_id=0xffff|subdevice_id=0xffff|vario=HiSax driver|SMP=Yes|drv_id=0xc0012|drv_subtyp=12|drv_typ=18|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Pyramid|device=Speed Fax+ PCI|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0xe159|device_id=0x0002|subvendor_id=0x0051|subdevice_id=0x0001|vario=HiSax driver|SMP=Yes|drv_id=0x7001c|drv_subtyp=7|drv_typ=28|feature=Fax|firmware=ISAR.BIN|interface=FCLASS1|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=AVM Computersysteme Vertriebs GmbH|device=FRITZ!Box SL|device_class=DSL|bus_type=USB|vendor_id=0x057c|device_id=0x3701|vario=other|SMP=yes|drv_id=0xffff0001|drv_subtyp=1|drv_typ=9999|feature=DSLONLY|feature=PPPOE|interface=pppoe|line_cnt=0|line_protocol=none|need_packages=ppp|need_packages=smpppd|module=usbnet|supported=full|
+|vendor=AVM Computersysteme Vertriebs GmbH|device=FRITZ!Box|device_class=DSL|bus_type=USB|vendor_id=0x057c|device_id=0x3702|vario=other|SMP=yes|drv_id=0xffff0002|drv_subtyp=2|drv_typ=9999|feature=DSLONLY|feature=PPPOE|interface=pppoe|line_cnt=0|line_protocol=none|need_packages=ppp|need_packages=smpppd|module=usbnet|supported=full|
+|vendor=AVM Computersysteme Vertriebs GmbH|device=FRITZ!Box SL WLAN|device_class=DSL|bus_type=USB|vendor_id=0x057c|device_id=0x3c00|vario=other|SMP=yes|drv_id=0xffff0003|drv_subtyp=3|drv_typ=9999|feature=DSLONLY|feature=PPPOE|interface=pppoe|line_cnt=0|line_protocol=none|need_packages=ppp|need_packages=smpppd|module=usbnet|supported=full|
+|vendor=AVM Computersysteme Vertriebs GmbH|device=FRITZ!Box Fon WLAN|device_class=DSL|bus_type=USB|vendor_id=0x057c|device_id=0x4001|vario=other|SMP=yes|drv_id=0xffff0004|drv_subtyp=4|drv_typ=9999|feature=DSLONLY|feature=PPPOE|interface=pppoe|line_cnt=0|line_protocol=none|need_packages=ppp|need_packages=smpppd|module=usbnet|supported=full|
+|vendor=AVM Computersysteme Vertriebs GmbH|device=FRITZ!Box Fon (Annex A)|device_class=DSL|bus_type=USB|vendor_id=0x057c|device_id=0x3c00|vario=other|SMP=yes|drv_id=0xffff0005|drv_subtyp=5|drv_typ=9999|feature=DSLONLY|feature=PPPOE|interface=pppoe|line_cnt=0|line_protocol=none|need_packages=ppp|need_packages=smpppd|module=usbnet|supported=full|
+|vendor=AVM Computersysteme Vertriebs GmbH|device=FRITZ!Box (Annex A)|device_class=DSL|bus_type=USB|vendor_id=0x057c|device_id=0x3e01|vario=other|SMP=yes|drv_id=0xffff0006|drv_subtyp=6|drv_typ=9999|feature=DSLONLY|feature=PPPOE|interface=pppoe|line_cnt=0|line_protocol=none|need_packages=ppp|need_packages=smpppd|module=usbnet|supported=full|
+|vendor=AVM Computersysteme Vertriebs GmbH|device=AVM FRITZ!Box Fon|device_class=DSL|bus_type=USB|vendor_id=0x057c|device_id=0x3a00|vario=other|SMP=yes|drv_id=0xffff0007|drv_subtyp=7|drv_typ=9999|feature=DSLONLY|feature=PPPOE|interface=pppoe|line_cnt=0|line_protocol=none|need_packages=ppp|need_packages=smpppd|module=usbnet|supported=full|
--- /dev/null
+#
+# CDB data export for subclass: ISDN Single Basic Rate
+# Generated at : Sat Aug 30 17:23:03 2003
+#
+# Exported combinations:
+# arch=x86_64 dist=Stable lang=de_DE vario=HiSax driver
+# arch=x86_64 dist=Stable lang=de_DE vario=I4L driver
+# arch=x86_64 dist=Stable lang=de_DE vario=CAPI 2.0 driver
+#
+# Author: dhess@suse.de (13.02.2003)
+# Author: didge@suse.de (04.08.2003)
+#
+#
+# Export format: |Vendorname|Productname|Subclass|Bus|Variation|topic=value|topic=value|...|Variation|topic=value|topic=value|...|
+#
+
+
+|vendor=Billion|device=B009|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x1397|device_id=0xb009|subvendor_id=0xffff|subdevice_id=0xffff|vario=HiSax driver|SMP=Yes|drv_id=0x50023|drv_subtyp=5|drv_typ=35|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=AVM Computersysteme Vertriebs GmbH|device=B1|device_class=ISDN Single Basic Rate|bus_type=ISA|vario=CAPI 2.0 driver|supported=unknown|
+|vendor=Billion|device=B00C|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x1397|device_id=0xb00c|subvendor_id=0xffff|subdevice_id=0xffff|vario=HiSax driver|SMP=Yes|drv_id=0x80023|drv_subtyp=8|drv_typ=35|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Telekom AG|device=A1T|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x0871|device_id=0xffa1|subvendor_id=0xffff|subdevice_id=0xffff|vario=HiSax driver|SMP=Yes|drv_id=0xd0023|drv_subtyp=13|drv_typ=35|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Sagem|device=Niccy PCI|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x1267|device_id=0x1016|subvendor_id=0xffff|subdevice_id=0xffff|vario=HiSax driver|SMP=Yes|drv_id=0x20018|drv_subtyp=2|drv_typ=24|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Cologne Chip AG|device=HFC 2BDS0|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x1397|device_id=0x2bd0|subvendor_id=0xffff|subdevice_id=0xffff|vario=HiSax driver|SMP=Yes|drv_id=0x110023|drv_subtyp=17|drv_typ=35|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Formula-n|device=enter:now|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0xe159|device_id=0x0001|subvendor_id=0x0055|subdevice_id=0x0002|vario=HiSax driver|SMP=Yes|drv_id=0x10029|drv_subtyp=1|drv_typ=41|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|short_description=under development|supported=full|
+|vendor=TigerJet|device=NetJet PCI|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0xe159|device_id=0x0001|subvendor_id=0x00ff|subdevice_id=0x000f|vario=HiSax driver|SMP=Yes|drv_id=0x10014|drv_subtyp=1|drv_typ=20|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Scitel|device=Quadro|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x10b5|device_id=0x9050|subvendor_id=0x0871|subdevice_id=0xffa8|vario=HiSax driver|SMP=Yes|drv_id=0x21|drv_subtyp=0|drv_typ=33|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Teles AG|device=S0Box|device_class=ISDN Single Basic Rate|bus_type=Parallel|vario=HiSax driver|IO=0x278|IO=0x378|IO=0x3bc|IRQ=5|IRQ=7|SMP=Yes|drv_id=0x19|drv_subtyp=0|drv_typ=25|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Eicon Networks|device=Diva 2.0U PCI|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x1133|device_id=0xe004|subvendor_id=0xffff|subdevice_id=0xffff|vario=HiSax driver|SMP=Yes|drv_id=0xc000b|drv_subtyp=12|drv_typ=11|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Auerswald|device=Comfort 1200 System Telephone|device_class=ISDN Single Basic Rate|bus_type=USB|vendor_id=0x09bf|device_id=0x00f2|vario=HiSax driver|SMP=Yes|drv_id=0x3002a|drv_subtyp=3|drv_typ=42|interface=I4L|line_cnt=1|line_protocol=DSS1|module=auerswald|need_packages=i4l-base|need_packages=i4l-isdnlog|supported=full|
+|vendor=AsKey|device=PCI (CCD HFC)|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x1397|device_id=0x2bd0|subvendor_id=0x144f|subdevice_id=0x1704|vario=HiSax driver|SMP=Yes|drv_id=0xc0023|drv_subtyp=12|drv_typ=35|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=AVM Computersysteme Vertriebs GmbH|device=B1 PCMCIA|device_class=ISDN Single Basic Rate|bus_type=PCMCIA|vario=CAPI 2.0 driver|SMP=Yes|drv_id=0x21f41|drv_subtyp=2|drv_typ=8001|feature=Fax|firmware=b1-%{PROTO}.t4|interface=CAPI20|interface=CAPI20 Fax|interface=I4L|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=b1pcmcia|need_packages=capi4linux|need_packages=i4l-base|need_packages=i4l-isdnlog|need_packages=i4lfirm|supported=full|
+|vendor=Auerswald|device=COMpact 2104 USB|device_class=ISDN Single Basic Rate|bus_type=USB|vendor_id=0x09bf|device_id=0x00c0|vario=HiSax driver|SMP=Yes|drv_id=0x2002a|drv_subtyp=2|drv_typ=42|interface=I4L|line_cnt=1|line_protocol=DSS1|module=auerswald|need_packages=i4l-base|need_packages=i4l-isdnlog|supported=full|
+|vendor=Gazel|device=R685|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x10b5|device_id=0x1030|subvendor_id=0xffff|subdevice_id=0xffff|vario=HiSax driver|SMP=Yes|drv_id=0x22|drv_subtyp=0|drv_typ=34|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=ASUSCOM|device=PCI (CCD HFC)|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x1043|device_id=0x0675|subvendor_id=0x0675|subdevice_id=0x1704|vario=HiSax driver|SMP=Yes|drv_id=0xa0023|drv_subtyp=10|drv_typ=35|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=ASUSCOM|device=PCI (W6692)|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x1050|device_id=0x6692|subvendor_id=0x1043|subdevice_id=0x1702|vario=HiSax driver|SMP=Yes|drv_id=0x24|drv_subtyp=0|drv_typ=36|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Sedlbauer AG|device=Speed Star|device_class=ISDN Single Basic Rate|bus_type=PCMCIA|vario=HiSax driver|SMP=Yes|drv_id=0x20016|drv_subtyp=2|drv_typ=22|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=AVM Computersysteme Vertriebs GmbH|device=FRITZ!X seriell|device_class=ISDN Single Basic Rate|bus_type=Serial|vario=HiSax driver|line_cnt=1|supported=not|
+|vendor=Digi|device=DataFire Micro V IOM2 (Europe)|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x114f|device_id=0x0070|subvendor_id=0xffff|subdevice_id=0xffff|vario=HiSax driver|SMP=Yes|drv_id=0x120023|drv_subtyp=18|drv_typ=35|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Digi|device=DataFire Micro V (North America)|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x114f|device_id=0x0073|subvendor_id=0xffff|subdevice_id=0xffff|vario=HiSax driver|SMP=Yes|drv_id=0x150023|drv_subtyp=21|drv_typ=35|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Berkom|device=A4T|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x11de|device_id=0x6120|subvendor_id=0x0871|subdevice_id=0xffa4|vario=HiSax driver|SMP=Yes|drv_id=0x20|drv_subtyp=0|drv_typ=32|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Digi|device=DataFire Micro V (Europe)|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x114f|device_id=0x0071|subvendor_id=0xffff|subdevice_id=0xffff|vario=HiSax driver|SMP=Yes|drv_id=0x130023|drv_subtyp=19|drv_typ=35|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Zolltrix|device=2BDS0|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x15b0|device_id=0x2bd0|subvendor_id=0xffff|subdevice_id=0xffff|vario=HiSax driver|SMP=Yes|drv_id=0x100023|drv_subtyp=16|drv_typ=35|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Motorola|device=MC145575|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x1051|device_id=0x0100|subvendor_id=0xffff|subdevice_id=0xffff|vario=HiSax driver|SMP=Yes|drv_id=0xf0023|drv_subtyp=15|drv_typ=35|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Elsa AG|device=PCMCIA IPAC|device_class=ISDN Single Basic Rate|bus_type=PCMCIA|vario=HiSax driver|SMP=Yes|drv_id=0xb000a|drv_subtyp=11|drv_typ=10|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Billion|device=B006|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x1397|device_id=0xb006|subvendor_id=0xffff|subdevice_id=0xffff|vario=HiSax driver|SMP=Yes|drv_id=0x20023|drv_subtyp=2|drv_typ=35|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=AVM Computersysteme Vertriebs GmbH|device=FRITZ!Card PCMCIA|device_class=ISDN Single Basic Rate|bus_type=PCMCIA|vario=HiSax driver|SMP=Yes|drv_id=0x1a|drv_subtyp=0|drv_typ=26|feature=Fax|info=This card has multiple drivers, some functions are only available on the binonly driver|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|short_description=OpenSource without Fax G3|supported=full|
+|vendor=Winbond|device=W6692 card|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x1050|device_id=0x6692|subvendor_id=0xffff|subdevice_id=0xffff|vario=HiSax driver|SMP=Yes|drv_id=0x60024|drv_subtyp=6|drv_typ=36|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=AVM Computersysteme Vertriebs GmbH|device=A1 PCMCIA|device_class=ISDN Single Basic Rate|bus_type=PCMCIA|vario=HiSax driver|SMP=Yes|drv_id=0x1001a|drv_subtyp=1|drv_typ=26|feature=Fax|info=This card has multiple drivers, some functions are only available on the binonly driver|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|short_description=OpenSource without Fax G3|supported=full|
+|vendor=AsKey|device=PCI + Voice (W6692)|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x1050|device_id=0x6692|subvendor_id=0x144f|subdevice_id=0x1703|vario=HiSax driver|SMP=Yes|drv_id=0x30024|drv_subtyp=3|drv_typ=36|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Eicon Networks|device=Diva 2.0 PCI|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x1133|device_id=0xe002|subvendor_id=0xffff|subdevice_id=0xffff|vario=HiSax driver|SMP=Yes|drv_id=0x2000b|drv_subtyp=2|drv_typ=11|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Sedlbauer AG|device=Speed PCI|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0xe159|device_id=0x0002|subvendor_id=0x0053|subdevice_id=0x0001|vario=HiSax driver|SMP=Yes|drv_id=0x6000f|drv_subtyp=6|drv_typ=15|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Dynalink|device=PCI (W6692)|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x1043|device_id=0x0675|subvendor_id=0x0675|subdevice_id=0x1702|vario=HiSax driver|SMP=Yes|drv_id=0x40024|drv_subtyp=4|drv_typ=36|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Eicon Networks|device=Diva 2.01 PCI|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x1133|device_id=0xe005|subvendor_id=0xffff|subdevice_id=0xffff|vario=HiSax driver|SMP=Yes|drv_id=0x4000b|drv_subtyp=4|drv_typ=11|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=U.S.Robotics|device=ISDN PCI Card TA|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x1050|device_id=0x6692|subvendor_id=0x16ec|subdevice_id=0x3409|vario=HiSax driver|SMP=Yes|drv_id=0x70024|drv_subtyp=7|drv_typ=36|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Dynalink|device=6692 PCI|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x0675|device_id=0x1702|subvendor_id=0xffff|subdevice_id=0xffff|vario=HiSax driver|SMP=Yes|drv_id=0x50024|drv_subtyp=5|drv_typ=36|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Teles AG|device=PCI|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x11de|device_id=0x6120|subvendor_id=0x0000|subdevice_id=0x0000|vario=HiSax driver|SMP=Yes|drv_id=0x15|drv_subtyp=0|drv_typ=21|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Sedlbauer AG|device=Speed Win2 PC104|device_class=ISDN Single Basic Rate|bus_type=PC104|vendor_id=0x0000|device_id=0x0000|subvendor_id=0x0000|subdevice_id=0x0000|vario=HiSax driver|SMP=Yes|drv_id=0x4000f|drv_subtyp=4|drv_typ=15|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=AVM Computersysteme Vertriebs GmbH|device=B1 PCI|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x1244|device_id=0x0700|vario=CAPI 2.0 driver|SMP=Yes|drv_id=0x11f41|drv_subtyp=1|drv_typ=8001|feature=Fax|firmware=b1-%{PROTO}.t4|interface=CAPI20|interface=CAPI20 Fax|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=b1pci|need_packages=capi4linux|need_packages=i4l-base|need_packages=i4l-isdnlog|need_packages=i4lfirm|supported=full|
+|vendor=Sedlbauer AG|device=Speed Star2|device_class=ISDN Single Basic Rate|bus_type=PCMCIA|vario=HiSax driver|SMP=Yes|drv_id=0x50016|drv_subtyp=5|drv_typ=22|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Telekom AG|device=Teledat USB 2a/b|device_class=ISDN Single Basic Rate|bus_type=USB|vario=HiSax driver|line_cnt=1|supported=not|
+|vendor=AsKey|device=PCI (W6692)|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x1050|device_id=0x6692|subvendor_id=0x144f|subdevice_id=0x1702|vario=HiSax driver|SMP=Yes|drv_id=0x10024|drv_subtyp=1|drv_typ=36|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=High Soft Tech|device=saphir III|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0xe159|device_id=0x0002|subvendor_id=0x0052|subdevice_id=0x0001|vario=HiSax driver|SMP=Yes|drv_id=0x9000f|drv_subtyp=9|drv_typ=15|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Digi|device=DataFire Micro V IOM2 (North America)|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x114f|device_id=0x0072|subvendor_id=0xffff|subdevice_id=0xffff|vario=HiSax driver|SMP=Yes|drv_id=0x140023|drv_subtyp=20|drv_typ=35|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Dynalink|device=PCI (CCD HFC)|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x1397|device_id=0x2bd0|subvendor_id=0x1043|subdevice_id=0x1704|vario=HiSax driver|SMP=Yes|drv_id=0xb0023|drv_subtyp=11|drv_typ=35|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=SGS Thomson Microelectronics|device=ST5481 USB Adapter|device_class=ISDN Single Basic Rate|bus_type=USB|vendor_id=0x0483|device_id=0x4810|vario=HiSax driver|SMP=Yes|drv_id=0x103e9|drv_subtyp=1|drv_typ=1001|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax_st5481|need_packages=i4l-base|supported=full|
+|vendor=AVM Computersysteme Vertriebs GmbH|device=FRITZ!Card PCI|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x1244|device_id=0x0a00|subvendor_id=0xffff|subdevice_id=0xffff|vario=HiSax driver|SMP=Yes|alternative_name=Telekom AG,Teledat 150|drv_id=0x1001b|drv_subtyp=1|drv_typ=27|feature=Fax|info=This card has multiple drivers, some functions are only available on the binonly driver|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|short_description=OpenSource without Fax G3|supported=full|
+|vendor=Elsa AG|device=PCMCIA|device_class=ISDN Single Basic Rate|bus_type=PCMCIA|vario=HiSax driver|SMP=Yes|drv_id=0x6000a|drv_subtyp=6|drv_typ=10|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Eicon Networks|device=Diva 2.02 PCI|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x1133|device_id=0xe00b|subvendor_id=0xffff|subdevice_id=0xffff|vario=HiSax driver|SMP=Yes|drv_id=0xd000b|drv_subtyp=13|drv_typ=11|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Billion|device=B008|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x1397|device_id=0xb008|subvendor_id=0xffff|subdevice_id=0xffff|vario=HiSax driver|SMP=Yes|drv_id=0x40023|drv_subtyp=4|drv_typ=35|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Billion|device=B00B|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x1397|device_id=0xb00b|subvendor_id=0xffff|subdevice_id=0xffff|vario=HiSax driver|SMP=Yes|drv_id=0x70023|drv_subtyp=7|drv_typ=35|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=TigerJet|device=300 PCI|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0xe159|device_id=0x0001|subvendor_id=0xffff|subdevice_id=0xffff|vario=HiSax driver|SMP=Yes|drv_id=0x14|drv_subtyp=0|drv_typ=20|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Seyon|device=B100|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x1397|device_id=0xb100|subvendor_id=0xffff|subdevice_id=0xffff|vario=HiSax driver|SMP=Yes|drv_id=0x90023|drv_subtyp=9|drv_typ=35|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=TigerJet|device=NetSpider-U PCI|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0xe159|device_id=0x0001|subvendor_id=0xffff|subdevice_id=0xffff|vario=HiSax driver|SMP=Yes|drv_id=0x26|drv_subtyp=0|drv_typ=38|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Sedlbauer AG|device=Speed Fax+ PCI|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0xe159|device_id=0x0002|subvendor_id=0x0054|subdevice_id=0x0001|vario=HiSax driver|SMP=Yes|drv_id=0x8001c|drv_subtyp=8|drv_typ=28|feature=Fax|firmware=ISAR.BIN|interface=FCLASS1|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Elsa AG|device=Quickstep 3000 PCI|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x1048|device_id=0x3000|subvendor_id=0xffff|subdevice_id=0xffff|vario=HiSax driver|SMP=Yes|drv_id=0xa0012|drv_subtyp=10|drv_typ=18|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Billion|device=B000|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x1397|device_id=0xb000|subvendor_id=0xffff|subdevice_id=0xffff|vario=HiSax driver|SMP=Yes|drv_id=0x10023|drv_subtyp=1|drv_typ=35|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Elsa AG|device=Microlink ISDN USB|device_class=ISDN Single Basic Rate|bus_type=USB|vario=HiSax driver|line_cnt=1|supported=not|
+|vendor=Auerswald|device=Comfort 2000 System Telephone|device_class=ISDN Single Basic Rate|bus_type=USB|vendor_id=0x09bf|device_id=0x00f1|vario=HiSax driver|SMP=Yes|drv_id=0x4002a|drv_subtyp=4|drv_typ=42|interface=I4L|line_cnt=1|module=auerswald|need_packages=i4l-base|need_packages=i4l-isdnlog|supported=full|
+|vendor=Billion|device=B007|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x1397|device_id=0xb007|subvendor_id=0xffff|subdevice_id=0xffff|vario=HiSax driver|SMP=Yes|drv_id=0x30023|drv_subtyp=3|drv_typ=35|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Elsa AG|device=Quickstep 1000 PCI|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x1048|device_id=0x1000|subvendor_id=0xffff|subdevice_id=0xffff|vario=HiSax driver|SMP=Yes|drv_id=0x90012|drv_subtyp=9|drv_typ=18|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Elsa AG|device=Microlink PCI|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x1048|device_id=0x1000|subvendor_id=0xffff|subdevice_id=0xffff|vario=HiSax driver|SMP=Yes|drv_id=0xc0012|drv_subtyp=12|drv_typ=18|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Gazel|device=Djinn Itoo|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x10b5|device_id=0x1151|subvendor_id=0xffff|subdevice_id=0xffff|vario=HiSax driver|SMP=Yes|drv_id=0x20022|drv_subtyp=2|drv_typ=34|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Pyramid|device=Speed Fax+ PCI|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0xe159|device_id=0x0002|subvendor_id=0x0051|subdevice_id=0x0001|vario=HiSax driver|SMP=Yes|drv_id=0x7001c|drv_subtyp=7|drv_typ=28|feature=Fax|firmware=ISAR.BIN|interface=FCLASS1|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=AVM Computersysteme Vertriebs GmbH|device=FRITZ!Card PCI v2.0|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x1244|device_id=0x0e00|subvendor_id=0x1244|subdevice_id=0x0e00|vario=HiSax driver|SMP=Yes|alternative_name=Telekom AG,Teledat 150 v2.0|drv_id=0x3e8|drv_subtyp=0|drv_typ=1000|feature=Fax|info=This card has multiple drivers, some functions are only available on the binonly driver|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax_fcpcipnp|need_packages=i4l-base|short_description=OpenSource without Fax G3|supported=full|
+|vendor=Auerswald|device=COMpact 2206 USB|device_class=ISDN Single Basic Rate|bus_type=USB|vendor_id=0x09bf|device_id=0x00db|vario=HiSax driver|SMP=Yes|drv_id=0x1002a|drv_subtyp=1|drv_typ=42|interface=I4L|line_cnt=1|line_protocol=DSS1|module=auerswald|need_packages=i4l-base|need_packages=i4l-isdnlog|supported=full|
+|vendor=ASUSCOM|device=PCI + Voice (W6692)|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x1050|device_id=0x6692|subvendor_id=0x1043|subdevice_id=0x1703|vario=HiSax driver|SMP=Yes|drv_id=0x20024|drv_subtyp=2|drv_typ=36|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Teles AG|device=PCMCIA|device_class=ISDN Single Basic Rate|bus_type=PCMCIA|vario=HiSax driver|SMP=Yes|drv_id=0x8|drv_subtyp=0|drv_typ=8|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Gazel|device=R753|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x10b5|device_id=0x1152|subvendor_id=0xffff|subdevice_id=0xffff|vario=HiSax driver|SMP=Yes|drv_id=0x10022|drv_subtyp=1|drv_typ=34|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Abocom/Magitek|device=2BD1|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x13d1|device_id=0x2bd1|subvendor_id=0xffff|subdevice_id=0xffff|vario=HiSax driver|SMP=Yes|drv_id=0x160023|drv_subtyp=22|drv_typ=35|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Billion|device=B00A|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x1397|device_id=0xb00a|subvendor_id=0xffff|subdevice_id=0xffff|vario=HiSax driver|SMP=Yes|drv_id=0x60023|drv_subtyp=6|drv_typ=35|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Teles AG|device=PCI v2|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0xe159|device_id=0x0001|subvendor_id=0x00a7|subdevice_id=0x0001|vario=HiSax driver|SMP=Yes|drv_id=0x20014|drv_subtyp=2|drv_typ=20|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=Telekom AG|device=Concept|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x0871|device_id=0xffa2|subvendor_id=0xffff|subdevice_id=0xffff|vario=HiSax driver|SMP=Yes|drv_id=0xe0023|drv_subtyp=14|drv_typ=35|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|need_packages=i4l-base|supported=full|
+|vendor=AVM Computersysteme Vertriebs GmbH|device=C4|device_class=ISDN Multiple Basic Rate|bus_type=PCI|vendor_id=0x1011|device_id=0x1065|subvendor_id=0x1244|subdevice_id=0x0800|vario=CAPI 2.0 driver|SMP=Yes|drv_id=0x31f41|drv_subtyp=3|drv_typ=8001|feature=Fax|firmware=c4.bin|interface=CAPI20|interface=CAPI20 Fax|interface=I4L|line_cnt=4|line_protocol=DSS1|line_protocol=LEASED|module=c4|need_packages=capi4linux|need_packages=i4l-base|need_packages=i4l-isdnlog|need_packages=i4lfirm|supported=full|
+|vendor=AVM Computersysteme Vertriebs GmbH|device=C2|device_class=ISDN Multiple Basic Rate|bus_type=PCI|vendor_id=0x1011|device_id=0x1065|subvendor_id=0x1244|subdevice_id=0x1100|vario=CAPI 2.0 driver|SMP=Yes|drv_id=0x61f41|drv_subtyp=6|drv_typ=8001|feature=Fax|firmware=c2.bin|interface=CAPI20|interface=CAPI20 Fax|interface=I4L|line_cnt=2|line_protocol=DSS1|line_protocol=LEASED|module=c4|need_packages=capi4linux|need_packages=i4l-base|need_packages=i4l-isdnlog|need_packages=i4lfirm|supported=full|
+|vendor=AVM Computersysteme Vertriebs GmbH|device=T1 PCI|device_class=ISDN Primary Rate|bus_type=PCI|vendor_id=0x1244|device_id=0x1200|vario=CAPI 2.0 driver|SMP=Yes|drv_id=0x21f45|drv_subtyp=2|drv_typ=8005|feature=Fax|firmware=t1-{PROF}.t4|interface=CAPI20|interface=CAPI20 Fax|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|module=t1pci|need_packages=capi4linux|need_packages=i4l-base|need_packages=i4l-isdnlog|need_packages=i4lfirm|special=B version|supported=full|
+|vendor=AVM Computersysteme Vertriebs GmbH|device=BlueFRITZ!USB|device_class=Others|bus_type=USB|vendor_id=0x057c|device_id=0x2200|vario=CAPI 2.0 driver|Interface=CAPI20|SMP=Yes|drv_id=0x11f46|drv_subtyp=1|drv_typ=8006|feature=BLUETOOTH|feature=Basic Rate|firmware=bfubase.frm|line_cnt=1|line_protocol=DSS1|module=bfusb|need_packages=bluez-firmware|need_packages=bluez-libs|need_packages=bluez-utils|need_packages=capi4linux|need_packages=i4l-base|need_packages=i4l-isdnlog|supported=full|
+|vendor=AVM Computersysteme Vertriebs GmbH|device=FRITZ!Box SL|device_class=DSL|bus_type=USB|vendor_id=0x057c|device_id=0x3701|vario=other|SMP=yes|drv_id=0xffff0001|drv_subtyp=1|drv_typ=9999|feature=DSLONLY|feature=PPPOE|interface=pppoe|line_cnt=0|line_protocol=none|need_packages=ppp|need_packages=smpppd|module=usbnet|supported=full|
+|vendor=AVM Computersysteme Vertriebs GmbH|device=FRITZ!Box|device_class=DSL|bus_type=USB|vendor_id=0x057c|device_id=0x3702|vario=other|SMP=yes|drv_id=0xffff0002|drv_subtyp=2|drv_typ=9999|feature=DSLONLY|feature=PPPOE|interface=pppoe|line_cnt=0|line_protocol=none|need_packages=ppp|need_packages=smpppd|module=usbnet|supported=full|
+|vendor=AVM Computersysteme Vertriebs GmbH|device=FRITZ!Box SL WLAN|device_class=DSL|bus_type=USB|vendor_id=0x057c|device_id=0x3c00|vario=other|SMP=yes|drv_id=0xffff0003|drv_subtyp=3|drv_typ=9999|feature=DSLONLY|feature=PPPOE|interface=pppoe|line_cnt=0|line_protocol=none|need_packages=ppp|need_packages=smpppd|module=usbnet|supported=full|
+|vendor=AVM Computersysteme Vertriebs GmbH|device=FRITZ!Box Fon WLAN|device_class=DSL|bus_type=USB|vendor_id=0x057c|device_id=0x4001|vario=other|SMP=yes|drv_id=0xffff0004|drv_subtyp=4|drv_typ=9999|feature=DSLONLY|feature=PPPOE|interface=pppoe|line_cnt=0|line_protocol=none|need_packages=ppp|need_packages=smpppd|module=usbnet|supported=full|
+|vendor=AVM Computersysteme Vertriebs GmbH|device=FRITZ!Box Fon (Annex A)|device_class=DSL|bus_type=USB|vendor_id=0x057c|device_id=0x3c00|vario=other|SMP=yes|drv_id=0xffff0005|drv_subtyp=5|drv_typ=9999|feature=DSLONLY|feature=PPPOE|interface=pppoe|line_cnt=0|line_protocol=none|need_packages=ppp|need_packages=smpppd|module=usbnet|supported=full|
+|vendor=AVM Computersysteme Vertriebs GmbH|device=FRITZ!Box (Annex A)|device_class=DSL|bus_type=USB|vendor_id=0x057c|device_id=0x3e01|vario=other|SMP=yes|drv_id=0xffff0006|drv_subtyp=6|drv_typ=9999|feature=DSLONLY|feature=PPPOE|interface=pppoe|line_cnt=0|line_protocol=none|need_packages=ppp|need_packages=smpppd|module=usbnet|supported=full|
+|vendor=AVM Computersysteme Vertriebs GmbH|device=AVM FRITZ!Box Fon|device_class=DSL|bus_type=USB|vendor_id=0x057c|device_id=0x3a00|vario=other|SMP=yes|drv_id=0xffff0007|drv_subtyp=7|drv_typ=9999|feature=DSLONLY|feature=PPPOE|interface=pppoe|line_cnt=0|line_protocol=none|need_packages=ppp|need_packages=smpppd|module=usbnet|supported=full|
+|vendor=Sitecom|device=DC-104 USB ISDN Modem Rev 1|device_class=ISDN Single Basic Rate|bus_type=USB|vendor_id=0x0483|device_id=0x4810|subvendor_id=|subdevice_id=|vario=HiSax driver|SMP=Yes|drv_id=0x03e9|drv_subtyp=0|drv_typ=1001|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax_st5481|need_packages=i4l-base|need_packages=i4l-isdnlog|supported=full|
+|vendor=Sitecom|device=DC 104 USB ISDN Modem Rev 2|device_class=ISDN Single Basic Rate|bus_type=USB|vendor_id=0x0959|device_id=0x2bd0|subvendor_id=|subdevice_id=|vario=HiSax driver|SMP=Yes|drv_id=0x103ea|drv_subtyp=1|drv_typ=1002|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hfc_usb|supported=full|
+|vendor=Sitecom|device=DC 105 ISDN TA|device_class=ISDN Single Basic Rate|bus_type=PCI|vendor_id=0x182d|device_id=0x3069|subvendor_id=0x182d|subdevice_id=0x3069|vario=HiSax driver|SMP=Yes|drv_id=0x170023|drv_subtyp=23|drv_typ=35|interface=I4L|line_cnt=1|line_protocol=1TR6|line_protocol=DSS1|line_protocol=LEASED|line_protocol=NI1|module=hisax|supported=full|
--- /dev/null
+TOPDIR = ../../..
+TARGETS = mk_isdnhwdb isdn_cdb.h ISDN.CDB.hwdb
+CLEANFILES = isdn_cdb isdn_cdb.h lex.yy.c ISDN.CDB.txt mk_isdnhwdb ISDN.CDB.hwdb
+
+include $(TOPDIR)/Makefile.common
+
+ISDN.CDB.txt:
+ if [ -f ISDN.$(ARCH).txt ]; then \
+ ln -s ISDN.$(ARCH).txt ISDN.CDB.txt; \
+ else \
+ ln -s ISDN.ppc.txt ISDN.CDB.txt; \
+ fi
+
+isdn_cdb.h: isdn_cdb ISDN.CDB.txt
+ rm -f isdn_cdb.h
+ ./isdn_cdb ISDN.CDB.txt isdn_cdb.h
+
+lex.yy.c: isdn_cdb.lex
+ lex isdn_cdb.lex
+
+isdn_cdb: isdn_cdb.o cdb_read.o
+
+mk_isdnhwdb: mk_isdnhwdb.o cdb_read.o
+
+cdb_read.o: cdb_read.c cdb_read.h
+
+isdn_cdb.o: isdn_cdb.c cdb_read.h lex.yy.c
+
+mk_isdnhwdb.o: mk_isdnhwdb.c cdb_read.h lex.yy.c
+
+ISDN.CDB.hwdb: mk_isdnhwdb ISDN.CDB.txt
+ rm -f ISDN.CDB.hwdb
+ ./mk_isdnhwdb ISDN.CDB.txt ISDN.CDB.hwdb
--- /dev/null
+#define CDBISDN_CDB_FILE "/usr/share/hwinfo/ISDN.CDB.txt"
+#define CDBISDN_HWDB_FILE "/usr/share/hwinfo/ISDN.CDB.hwdb"
+
+#define IWHREC_TYPE_VERSION 1
+#define IWHREC_TYPE_DATE 2
+#define IWHREC_TYPE_NAME_SIZE 3
+#define IWHREC_TYPE_NAME_COUNT 4
+#define IWHREC_TYPE_NAME_DATA 5
+#define IWHREC_TYPE_VENDOR_COUNT 11
+#define IWHREC_TYPE_VENDOR_RECORD 12
+#define IWHREC_TYPE_CARD_COUNT 21
+#define IWHREC_TYPE_CARD_RECORD 22
+#define IWHREC_TYPE_CARD_IDSORTED 23
+#define IWHREC_TYPE_VARIO_COUNT 31
+#define IWHREC_TYPE_VARIO_RECORD 32
+
--- /dev/null
+#include "cdb_read.h"
+
+int max_ce = MAXCARDS;
+int ce_idx = 0;
+int max_vario = MAXVARIO;
+int vario_idx;
+int name_str_cnt = 0;
+int max_name_str_cnt = MAXNAMECNT;
+int max_ivendor = MAXCARDS;
+int ivendor_idx = 0;
+
+char *name_str;
+cdb_isdn_card *cards;
+cdb_isdn_vario *varios;
+cdb_isdn_vendor *vendors;
+
+int *isdncard_id;
+
+int drvid_cnt;
+int drv_subtyp_cnt;
+int drv_typ_cnt;
+int supported_cnt;
+
+int not_supported = 0;
+
+static struct _vendorshortnames_t _vendorshortnames[] = {
+ {"AVM Computersysteme Vertriebs GmbH","AVM"},
+ {"High Soft Tech","HST"},
+ {"Cologne Chip AG","CC"},
+ {"Telekom AG","DTAG"},
+ {"TigerJet","TJET"},
+ {"ASUSCOM","Asus"},
+ {"U.S.Robotics","USR"},
+ {"SGS Thomson Microelectronics","SGST"},
+ {"Abocom/Magitek","Abocom"},
+ {NULL,NULL},
+};
+
+static int compare_vendor(cdb_isdn_vendor *v1, cdb_isdn_vendor *v2) {
+ return(strcasecmp(v1->name, v2->name));
+}
+
+static int compare_card(cdb_isdn_card *c1, cdb_isdn_card *c2) {
+ return(strcasecmp(c1->name, c2->name));
+}
+
+int compare_name(const int *c1, const int *c2) {
+ return(strcasecmp(cards[*c1].name,
+ cards[*c2].name));
+}
+
+static int compare_type(cdb_isdn_vario *v1, cdb_isdn_vario *v2) {
+ int x= v1->typ - v2->typ;
+
+ if (!x)
+ x=v1->subtyp - v2->subtyp;
+ return(x);
+}
+
+static int compare_id(const int *c1, const int *c2) {
+ int x = cards[*c1].vendor - cards[*c2].vendor;
+
+ if (!x)
+ x = cards[*c1].device -
+ cards[*c2].device;
+ if (!x)
+ x = cards[*c1].subvendor -
+ cards[*c2].subvendor;
+ if (!x)
+ x = cards[*c1].subdevice -
+ cards[*c2].subdevice;
+ return(x);
+}
+
+static char *add_name(const char *str, int merge) {
+ char *p;
+ int l;
+
+ if (!str)
+ return(NULL);
+ if (merge) {
+ p = name_str;
+ while (*p) {
+ if (!strcmp(p, str))
+ break;
+ p += strlen(p) +1;
+ if (p >= (name_str + max_name_str_cnt))
+ return(NULL);
+ }
+ if (*p)
+ return(p);
+ } else {
+ p = name_str + name_str_cnt;
+ }
+ l = strlen(str) +1;
+ if ((p + l) >= (name_str + max_name_str_cnt))
+ return(NULL);
+ strcpy(p, str);
+ name_str_cnt += l;
+ return(p);
+}
+
+static char stmp[4096],sstmp[4096];
+
+static char *add_lname(int v, const char *str) {
+ sprintf(stmp, "%s %s", vendors[v].shortname, str);
+ return(add_name(stmp, 1));
+}
+
+static char *add_name_list(const char *str, const char *list) {
+ if (!list || !list[0])
+ return(add_name(str, 1));
+ sprintf(stmp, "%s,%s", list, str);
+ return(add_name(stmp, 1));
+}
+
+static char *add_sortedname_list(const char *str, const char *list, const char *fmt) {
+ u_int v,i,flg=0;
+ char *t,*p;
+ if (!list || !list[0])
+ return(add_name(str, 1));
+ strncpy(stmp, list, 4096);
+ sscanf(str, fmt, &v);
+ p = sstmp;
+ t = strtok(stmp, ",");
+ while (t) {
+ sscanf(t, fmt, &i);
+ if (!flg && i>v) {
+ flg++;
+ p += sprintf(p, fmt, v);
+ *p++ = ',';
+ }
+ p += sprintf(p, fmt, i);
+ *p++ = ',';
+ t = strtok(NULL, ",");
+ }
+ if (!flg)
+ p += sprintf(p, fmt, v);
+ else
+ p--;
+ *p = 0;
+ return(add_name(sstmp, 1));
+}
+
+static int add_vendor(char *v, int card) {
+ int i,found = 0;
+
+ for(i=0;i < ivendor_idx; i++) {
+ if (!strcmp(v, vendors[i].name)) {
+ vendors[i].refcnt++;
+ return(i);
+ }
+ }
+ if (ivendor_idx < max_ivendor) {
+ i=0;
+ while (_vendorshortnames[i].lname) {
+ if (!strcmp(v, _vendorshortnames[i].lname)) {
+ found++;
+ break;
+ } else if (!strcmp(v, _vendorshortnames[i].sname)) {
+ found++;
+ break;
+ }
+ i++;
+ }
+ if (found) {
+ if (!(vendors[ivendor_idx].name = add_name(_vendorshortnames[i].lname, 1)))
+ return(-1);
+ if (!(vendors[ivendor_idx].shortname = add_name(_vendorshortnames[i].sname, 1)))
+ return(-1);
+ } else {
+ char *p;
+ if (!(vendors[ivendor_idx].name = add_name(v, 1)))
+ return(-1);
+ p = strtok(v, " ");
+ if (p) {
+ if (!(vendors[ivendor_idx].shortname = add_name(p, 1)))
+ return(-1);
+ } else
+ vendors[ivendor_idx].shortname = vendors[ivendor_idx].name;
+ }
+ vendors[ivendor_idx].vnr = ivendor_idx;
+ vendors[ivendor_idx].refcnt++;
+ ivendor_idx++;
+ return(ivendor_idx-1);
+ } else
+ return(-1);
+}
+
+static int new_vario(char *v, int c) {
+
+ vario_idx++;
+ if (vario_idx>=max_vario)
+ return(-1);
+ drvid_cnt = 0;
+ drv_subtyp_cnt = 0;
+ drv_typ_cnt = 0;
+ not_supported = 0;
+ supported_cnt = 0;
+ if (!(varios[vario_idx].name = add_name(v, 1)))
+ return(-1);
+ if (cards[c].vario>0) {
+ varios[vario_idx-1].next_vario = vario_idx;
+ } else
+ cards[c].vario = vario_idx;
+ varios[vario_idx].handle = vario_idx;
+ varios[vario_idx].card_ref = c;
+ cards[c].vario_cnt++;
+ return(0);
+}
+
+void del_vario(void) {
+ fprintf(stderr, "del_vario: %d %s\n", vario_idx, cards[varios[vario_idx].card_ref].name);
+ cards[varios[vario_idx].card_ref].vario_cnt--;
+ if (vario_idx>0) {
+ if (varios[vario_idx-1].next_vario == vario_idx) {
+ if (cards[varios[vario_idx].card_ref].vario_cnt == 1)
+ cards[varios[vario_idx].card_ref].vario = vario_idx-1;
+ varios[vario_idx-1].next_vario = 0;
+ } else if (cards[varios[vario_idx].card_ref].vario == vario_idx) {
+ cards[varios[vario_idx].card_ref].vario = 0;
+ } else {
+ fprintf(stderr, "del_vario:internal error\n");
+ exit(98);
+ }
+ }
+ memset(&varios[vario_idx], 0, sizeof(cdb_isdn_vario));
+ vario_idx--;
+}
+
+int new_entry(void) {
+ if (not_supported) {
+ not_supported = 0;
+ fprintf(stderr, "new_entry:not_supported %s\n", cards[ce_idx].name);
+ if (cards[ce_idx].vario_cnt < 1) {
+ vendors[cards[ce_idx].vhandle].refcnt--;
+ memset(&cards[ce_idx], 0, sizeof(cdb_isdn_card));
+ ce_idx--;
+ }
+ }
+ ce_idx++;
+ if (ce_idx >= max_ce)
+ return(1);
+ cards[ce_idx].handle = ce_idx;
+ cards[ce_idx].vendor = PCI_ANY_ID;
+ cards[ce_idx].device = PCI_ANY_ID;
+ cards[ce_idx].subvendor = PCI_ANY_ID;
+ cards[ce_idx].subdevice = PCI_ANY_ID;
+ return(0);
+}
+
+void add_current_item(int item, char *val) {
+ int i;
+ char *old;
+
+ if ((item != vario) && not_supported)
+ return;
+ switch (item) {
+ case vendor:
+ i = add_vendor(val, ce_idx);
+ if (i<0) {
+ fprintf(stderr, "error in add_vendor %s\n", val);
+ exit(100);
+ }
+ cards[ce_idx].vhandle = i;
+ break;
+ case device:
+ cards[ce_idx].name = add_name(val, 1);
+ if (!cards[ce_idx].name) {
+ fprintf(stderr, "error in add_name %s\n", val);
+ exit(101);
+ }
+ cards[ce_idx].lname = add_lname(cards[ce_idx].vhandle, val);
+ if (!cards[ce_idx].lname) {
+ fprintf(stderr, "error in add_lname %s\n", val);
+ exit(101);
+ }
+ break;
+ case vendor_id:
+ i = sscanf(val,"%x", &cards[ce_idx].vendor);
+ if (i!=1) {
+ fprintf(stderr, "error to hex %s\n", val);
+ exit(102);
+ }
+ break;
+ case device_id:
+ i = sscanf(val,"%x", &cards[ce_idx].device);
+ if (i!=1) {
+ fprintf(stderr, "error to hex %s\n", val);
+ exit(102);
+ }
+ break;
+ case subvendor_id:
+ i = sscanf(val,"%x", &cards[ce_idx].subvendor);
+ if (i!=1) {
+ fprintf(stderr, "error to hex %s\n", val);
+ exit(102);
+ }
+ break;
+ case subdevice_id:
+ i = sscanf(val,"%x", &cards[ce_idx].subdevice);
+ if (i!=1) {
+ fprintf(stderr, "error to hex %s\n", val);
+ exit(102);
+ }
+ break;
+ case device_class:
+ cards[ce_idx].Class = add_name(val, 1);
+ if (!cards[ce_idx].name) {
+ fprintf(stderr, "error in add_name %s\n", val);
+ exit(101);
+ }
+ break;
+ case bus_type:
+ cards[ce_idx].bus = add_name(val, 1);
+ if (!cards[ce_idx].name) {
+ fprintf(stderr, "error in add_name %s\n", val);
+ exit(101);
+ }
+ break;
+ case vario:
+ if (new_vario(val, ce_idx)) {
+ fprintf(stderr, "error in new_vario(%s, %d)\n", val, ce_idx);
+ exit(103);
+ }
+ break;
+ case SMP:
+ if (!strcasecmp(val, "no"))
+ varios[vario_idx].smp = 0;
+ else if (!strcasecmp(val, "yes"))
+ varios[vario_idx].smp = 1;
+ break;
+ case drv_id:
+ if (drvid_cnt) {
+ fprintf(stderr, "more as one drvid_cnt (%s) card (%s)\n", val, cards[ce_idx].name);
+ } else {
+ i = sscanf(val,"%x", &varios[vario_idx].drvid);
+ if (i!=1) {
+ fprintf(stderr, "error to hex %s\n", val);
+ exit(102);
+ }
+ }
+ drvid_cnt++;
+ break;
+ case drv_subtyp:
+ if (drv_subtyp_cnt) {
+ fprintf(stderr, "more as one drv_subtyp (%s) card (%s)\n", val, cards[ce_idx].name);
+ } else {
+ i = sscanf(val,"%d", &varios[vario_idx].subtyp);
+ if (i!=1) {
+ fprintf(stderr, "error to decimal %s\n", val);
+ exit(104);
+ }
+ }
+ drv_subtyp_cnt++;
+ break;
+ case drv_typ:
+ if (drv_typ_cnt) {
+ fprintf(stderr, "more as one drv_typ (%s) card (%s)\n", val, cards[ce_idx].name);
+ } else {
+ i = sscanf(val,"%d", &varios[vario_idx].typ);
+ if (i!=1) {
+ fprintf(stderr, "error to decimal %s\n", val);
+ exit(104);
+ }
+ }
+ drv_typ_cnt++;
+ break;
+ case interface:
+ varios[vario_idx].interface = add_name_list(val, varios[vario_idx].interface);
+ break;
+ case line_cnt:
+ i = sscanf(val,"%d", &cards[ce_idx].line_cnt);
+ if (i!=1) {
+ fprintf(stderr, "error to hex %s\n", val);
+ exit(102);
+ }
+ break;
+ case line_protocol:
+ varios[vario_idx].protocol = add_name_list(val, varios[vario_idx].protocol);
+ break;
+ case module:
+ varios[vario_idx].mod_name = add_name(val, 1);
+ break;
+ case need_packages:
+ varios[vario_idx].need_pkg = add_name_list(val, varios[vario_idx].need_pkg);
+ break;
+ case supported:
+ if (supported_cnt)
+ fprintf(stderr, "more as one supported entry (%s) vendor(%s) card(%s)\n", val,
+ vendors[cards[ce_idx].vhandle].name, cards[ce_idx].name);
+ if (!strcasecmp(val, "not")) {
+ not_supported = 1;
+ del_vario();
+ }
+ supported_cnt++;
+ break;
+ case feature:
+ varios[vario_idx].features = add_name_list(val, varios[vario_idx].features);
+ break;
+ case info:
+ old = name_str + name_str_cnt;
+ varios[vario_idx].info = add_name(val, 1);
+ if (old == varios[vario_idx].info)
+ fprintf(stderr, "info(%s): %s\n", cards[ce_idx].name, varios[vario_idx].info);
+ break;
+ case special:
+ break;
+ case firmware:
+ varios[vario_idx].firmware = add_name(val, 1);
+ break;
+ case short_description:
+ old = name_str + name_str_cnt;
+ varios[vario_idx].description = add_name(val, 1);
+ if (old == varios[vario_idx].description)
+ fprintf(stderr, "description(%s): %s\n", cards[ce_idx].name, varios[vario_idx].description);
+ break;
+ case IRQ:
+ varios[vario_idx].irq = add_sortedname_list(val, varios[vario_idx].irq, "%d");
+ break;
+ case IO:
+ varios[vario_idx].io = add_sortedname_list(val, varios[vario_idx].io, "0x%x");
+ break;
+ case MEMBASE:
+ varios[vario_idx].membase = add_sortedname_list(val, varios[vario_idx].membase, "0x%x");
+ break;
+ case alternative_name:
+ break;
+ case revision:
+ i = sscanf(val,"%x", &cards[ce_idx].revision);
+ if (i!=1) {
+ fprintf(stderr, "error to hex %s\n", val);
+ exit(102);
+ }
+ if ((cards[ce_idx].subvendor == PCI_ANY_ID) &&
+ (cards[ce_idx].subdevice == PCI_ANY_ID))
+ cards[ce_idx].subvendor = cards[ce_idx].revision;
+ break;
+ }
+}
+
+void SortVendors(void) {
+ int v,c;
+
+ qsort(vendors, ivendor_idx, sizeof(cdb_isdn_vendor), (fcmp)compare_vendor);
+ /* readjust card data */
+ for (c = 1; c <= ce_idx; c++) {
+ for (v = 0; v < ivendor_idx; v++) {
+ if (cards[c].vhandle == vendors[v].vnr) {
+ cards[c].vhandle = v;
+ break;
+ }
+ }
+ }
+ /* now adjust own handle */
+ for (v = 0; v < ivendor_idx; v++) {
+ vendors[v].vnr = v;
+ }
+}
+
+void SortCards(void) {
+ int v,c;
+
+ qsort(&cards[1], ce_idx, sizeof(cdb_isdn_card), (fcmp)compare_card);
+ /* readjust vario data */
+ for (v = 1; v <= vario_idx; v++) {
+ for (c = 1; c <= ce_idx; c++) {
+ if (cards[c].handle == varios[v].card_ref) {
+ varios[v].card_ref = c;
+ break;
+ }
+ }
+ }
+ /* now adjust own handle */
+ for (c = 0; c <= ce_idx; c++) {
+ cards[c].handle = c;
+ }
+ isdncard_id = malloc(ce_idx*sizeof(int));
+ if (!isdncard_id) {
+ fprintf(stderr, "no mem for isdncard_id (%d entries)\n", ce_idx);
+ exit(97);
+ }
+ for (c = 0; c < ce_idx; c++)
+ isdncard_id[c] = c + 1;
+ qsort(isdncard_id, ce_idx, sizeof(int), (fcmp)compare_id);
+}
+
+void SortVarios(void) {
+ int v,c,i;
+
+ qsort(&varios[1], vario_idx, sizeof(cdb_isdn_vario), (fcmp)compare_type);
+ /* readjust vario data */
+ for (v = 1; v <= vario_idx; v++) {
+ if (varios[v].next_vario) {
+ for (i = 1; i <= vario_idx; i++) {
+ if (varios[i].handle == varios[v].next_vario) {
+ varios[v].next_vario = i;
+ break;
+ }
+ }
+ }
+ }
+ /* readjust card data */
+ for (c = 1; c <= ce_idx; c++) {
+ for (v = 1; v <= vario_idx; v++) {
+ if (varios[v].handle == cards[c].vario) {
+ cards[c].vario = v;
+ break;
+ }
+ }
+ }
+ /* now adjust own handle */
+ for (v = 1; v <= vario_idx; v++) {
+ varios[v].handle = v;
+ }
+}
+
--- /dev/null
+#include <stdio.h>
+#include <stdlib.h>
+#include <malloc.h>
+#include <string.h>
+#include <time.h>
+#include "isdn_cdb_def.h"
+#include "hd.h"
+
+#define CDB_DATAVERSION 0x101
+#define MAXCARDS 300
+#define MAXVARIO (MAXCARDS*4)
+#define MAXNAMECNT (MAXCARDS*256)
+
+extern int max_ce;
+extern int ce_idx;
+extern int max_vario;
+extern int vario_idx;
+extern int name_str_cnt;
+extern int max_name_str_cnt;
+extern int max_ivendor;
+extern int ivendor_idx;
+
+extern char *name_str;
+extern cdb_isdn_card *cards;
+extern cdb_isdn_vario *varios;
+extern cdb_isdn_vendor *vendors;
+
+extern int *isdncard_id;
+
+extern int drvid_cnt;
+extern int drv_subtyp_cnt;
+extern int drv_typ_cnt;
+extern int supported_cnt;
+
+extern int not_supported;
+
+struct _vendorshortnames_t {
+ char *lname;
+ char *sname;
+};
+
+typedef int (*fcmp) (const void *, const void *);
+
+
+extern void del_vario(void);
+extern int new_entry(void);
+extern void add_current_item(int item, char *val);
+extern void SortVendors(void);
+extern void SortCards(void);
+extern void SortVarios(void);
--- /dev/null
+#include <stdio.h>
+#include <stdlib.h>
+#include <malloc.h>
+#include <string.h>
+#include <time.h>
+#include "lex.yy.c"
+#include "hd.h"
+#include "cdb_read.h"
+
+int yywrap(void) {
+ return(1);
+}
+
+static int WriteVendors(FILE *f) {
+ int i;
+
+ fprintf(f, "/* vendor database */\n");
+ fprintf(f,"static cdb_isdn_vendor cdb_isdnvendor_info_init[] = {\n");
+ for (i=0; i < ivendor_idx; i++) {
+ fprintf(f," {");
+ if (vendors[i].name)
+ fprintf(f,"\"%s\",", vendors[i].name);
+ else
+ fprintf(f,"\"\",");
+ if (vendors[i].shortname)
+ fprintf(f,"\"%s\",", vendors[i].shortname);
+ else
+ fprintf(f,"\"\",");
+ fprintf(f,"%d,",vendors[i].vnr);
+ fprintf(f,"%d",vendors[i].refcnt);
+ fprintf(f,"},\n");
+ }
+ fprintf(f,"};\n");
+ return(0);
+}
+
+static int WriteCards(FILE *f) {
+ int i;
+
+ fprintf(f, "/* card database */\n");
+ fprintf(f,"static cdb_isdn_card cdb_isdncard_info_init[] = {\n");
+ for (i=0; i <= ce_idx; i++) {
+ fprintf(f," {");
+ fprintf(f,"%d,",cards[i].handle);
+ fprintf(f,"%d,",cards[i].vhandle);
+ if (cards[i].name)
+ fprintf(f,"\"%s\",", cards[i].name);
+ else
+ fprintf(f,"\"\",");
+ if (cards[i].lname)
+ fprintf(f,"\"%s\",", cards[i].lname);
+ else
+ fprintf(f,"\"\",");
+ if (cards[i].Class)
+ fprintf(f,"\"%s\",",cards[i].Class);
+ else
+ fprintf(f,"NULL,");
+ if (cards[i].bus)
+ fprintf(f,"\"%s\",",cards[i].bus);
+ else
+ fprintf(f,"NULL,");
+ fprintf(f,"%d,",cards[i].revision);
+ fprintf(f,"%d,",cards[i].vendor);
+ fprintf(f,"%d,",cards[i].device);
+ fprintf(f,"%d,",cards[i].subvendor);
+ fprintf(f,"%d,",cards[i].subdevice);
+ fprintf(f,"%d,",cards[i].features);
+ fprintf(f,"%d,",cards[i].line_cnt);
+ fprintf(f,"%d,",cards[i].vario_cnt);
+ fprintf(f,"%d",cards[i].vario);
+ fprintf(f,"},\n");
+ }
+ fprintf(f,"};\n");
+ fprintf(f,"static int cdb_isdncard_idsorted_init[] = {");
+ for (i=0; i < ce_idx; i++) {
+ if (!(i%8))
+ fprintf(f,"\n ");
+ fprintf(f,"%d,",isdncard_id[i]);
+ }
+ fprintf(f,"\n};\n");
+ return(0);
+}
+
+static int WriteVarios(FILE *f) {
+ int i;
+
+ fprintf(f, "/* driver database */\n");
+ fprintf(f,"static cdb_isdn_vario cdb_isdnvario_info_init[] = {\n");
+ for (i=0; i <= vario_idx; i++) {
+ fprintf(f," {");
+ fprintf(f,"%d,",varios[i].handle);
+ fprintf(f,"%d,",varios[i].next_vario);
+ fprintf(f,"%d,",varios[i].drvid);
+ fprintf(f,"%d,",varios[i].typ);
+ fprintf(f,"%d,",varios[i].subtyp);
+ fprintf(f,"%d,",varios[i].smp);
+ if (varios[i].mod_name)
+ fprintf(f,"\"%s\",", varios[i].mod_name);
+ else
+ fprintf(f,"\"\",");
+ if (varios[i].para_str)
+ fprintf(f,"\"%s\",", varios[i].para_str);
+ else
+ fprintf(f,"\"\",");
+ if (varios[i].mod_preload)
+ fprintf(f,"\"%s\",", varios[i].mod_preload);
+ else
+ fprintf(f,"\"\",");
+ if (varios[i].cfg_prog)
+ fprintf(f,"\"%s\",", varios[i].cfg_prog);
+ else
+ fprintf(f,"\"\",");
+ if (varios[i].firmware)
+ fprintf(f,"\"%s\",", varios[i].firmware);
+ else
+ fprintf(f,"\"\",");
+ if (varios[i].description)
+ fprintf(f,"\"%s\",", varios[i].description);
+ else
+ fprintf(f,"\"\",");
+ if (varios[i].need_pkg)
+ fprintf(f,"\"%s\",", varios[i].need_pkg);
+ else
+ fprintf(f,"\"\",");
+ if (varios[i].info)
+ fprintf(f,"\"%s\",", varios[i].info);
+ else
+ fprintf(f,"\"\",");
+ if (varios[i].protocol)
+ fprintf(f,"\"%s\",", varios[i].protocol);
+ else
+ fprintf(f,"\"\",");
+ if (varios[i].interface)
+ fprintf(f,"\"%s\",", varios[i].interface);
+ else
+ fprintf(f,"\"\",");
+ if (varios[i].io)
+ fprintf(f,"\"%s\",", varios[i].io);
+ else
+ fprintf(f,"\"\",");
+ if (varios[i].irq)
+ fprintf(f,"\"%s\",", varios[i].irq);
+ else
+ fprintf(f,"\"\",");
+ if (varios[i].membase)
+ fprintf(f,"\"%s\",", varios[i].membase);
+ else
+ fprintf(f,"\"\",");
+ if (varios[i].features)
+ fprintf(f,"\"%s\",", varios[i].features);
+ else
+ fprintf(f,"\"\",");
+ fprintf(f,"%d,",varios[i].card_ref);
+ if (varios[i].name)
+ fprintf(f,"\"%s\"", varios[i].name);
+ else
+ fprintf(f,"\"\"");
+ fprintf(f,"},\n");
+ }
+ fprintf(f,"};\n");
+ return(0);
+}
+
+int main(argc,argv)
+int argc;
+char **argv;
+{
+ char line[256];
+ int l;
+ time_t tim;
+ if (argc<2) {
+ fprintf(stderr, "Error no filename\n");
+ exit(1);
+ }
+ if (!(stdin=freopen(argv[1],"rb", stdin))) {
+ fprintf(stderr, "Cannot open %s as stdin\n", argv[1]);
+ exit(2);
+ }
+ if (argc >2) {
+ if (!(stdout=freopen(argv[2],"w", stdout))) {
+ fprintf(stderr, "Cannot open %s as stdout\n", argv[2]);
+ exit(3);
+ }
+ }
+ cards = calloc(max_ce, sizeof(cdb_isdn_card));
+ if (!cards) {
+ fprintf(stderr, "cannot alloc card\n");
+ fclose(stdin);
+ exit(4);
+ }
+ varios = calloc(max_vario, sizeof(cdb_isdn_vario));
+ if (!varios) {
+ fprintf(stderr, "cannot alloc vario\n");
+ fclose(stdin);
+ free(cards);
+ exit(5);
+ }
+ name_str = calloc(max_name_str_cnt, 1);
+ if (!name_str) {
+ fprintf(stderr, "cannot alloc name_str\n");
+ fclose(stdin);
+ free(cards);
+ free(varios);
+ exit(6);
+ }
+ vendors = calloc(max_ivendor, sizeof(cdb_isdn_vendor));
+ if (!vendors) {
+ fprintf(stderr, "cannot alloc vendors\n");
+ fclose(stdin);
+ free(cards);
+ free(varios);
+ free(name_str);
+ exit(7);
+ }
+ BEGIN Main;
+ yylex();
+
+ SortVendors();
+ SortCards();
+ SortVarios();
+
+ fprintf(stdout, "/* CDBISDN database */\n");
+ fprintf(stdout,"const int CDBISDN_DBVERSION = 0x%x;\n", CDB_DATAVERSION);
+ time(&tim);
+ strcpy(line,ctime(&tim));
+ l = strlen(line);
+ if (l)
+ line[l-1] = 0;
+ fprintf(stdout,"const char CDBISDN_DATE[] = \"%s\";\n", line);
+ WriteVendors(stdout);
+ WriteCards(stdout);
+ WriteVarios(stdout);
+
+ fclose(stdin);
+ free(cards);
+ free(name_str);
+ free(vendors);
+ free(varios);
+ fprintf(stderr, "used cards(%d/%d)\n", ce_idx, max_ce);
+ fprintf(stderr, "used varios(%d/%d)\n", vario_idx, max_vario);
+ fprintf(stderr, "used vendors(%d/%d)\n", ivendor_idx, max_ivendor);
+ fprintf(stderr, "used name_str(%d/%d)\n",name_str_cnt, max_name_str_cnt);
+ return(0);
+}
--- /dev/null
+WSP [ \t]
+VALCHAR [^\|]
+
+%START Main NextLine NewEntry Value
+
+%{
+#include "isdn_cdb_def.h"
+%}
+%%
+ int item = 0;
+
+<Main>{
+# BEGIN NextLine;
+^\| {
+ if (new_entry())
+ exit(99);
+ BEGIN NewEntry;
+ }
+^{WSP}+ ;
+\n ;
+}
+
+<NextLine>{
+.* ;
+\n BEGIN Main;
+}
+
+<NewEntry>{
+vendor= {item=vendor; BEGIN Value;}
+device= {item=device; BEGIN Value;}
+vendor_id= {item=vendor_id; BEGIN Value;}
+device_id= {item=device_id; BEGIN Value;}
+subvendor_id= {item=subvendor_id; BEGIN Value;}
+subdevice_id= {item=subdevice_id; BEGIN Value;}
+device_class= {item=device_class; BEGIN Value;}
+bus_type= {item=bus_type; BEGIN Value;}
+vario= {item=vario; BEGIN Value;}
+SMP= {item=SMP; BEGIN Value;}
+drv_id= {item=drv_id; BEGIN Value;}
+drv_subtyp= {item=drv_subtyp; BEGIN Value;}
+drv_typ= {item=drv_typ; BEGIN Value;}
+[iI]nterface= {item=interface; BEGIN Value;}
+line_cnt= {item=line_cnt; BEGIN Value;}
+line_protocol= {item=line_protocol; BEGIN Value;}
+module= {item=module; BEGIN Value;}
+need_packages= {item=need_packages; BEGIN Value;}
+supported= {item=supported; BEGIN Value;}
+feature= {item=feature; BEGIN Value;}
+info= {item=info; BEGIN Value;}
+special= {item=special; BEGIN Value;}
+firmware= {item=firmware; BEGIN Value;}
+short_description= {item=short_description; BEGIN Value;}
+IRQ= {item=IRQ; BEGIN Value;}
+IO= {item=IO; BEGIN Value;}
+MEMBASE= {item=MEMBASE; BEGIN Value;}
+alternative_name= {item=alternative_name; BEGIN Value;}
+revision= {item=revision; BEGIN Value;}
+\n BEGIN Main;
+}
+
+<Value>{
+\| BEGIN NewEntry;
+{VALCHAR}*/\| add_current_item(item, yytext);
+}
--- /dev/null
+#ifndef ISDN_CDB_DEF
+#define ISDN_CDB_DEF
+
+enum {
+ vendor,
+ device,
+ vendor_id,
+ device_id,
+ subvendor_id,
+ subdevice_id,
+ revision,
+ device_class,
+ bus_type,
+ vario,
+ SMP,
+ drv_id,
+ drv_subtyp,
+ drv_typ,
+ interface,
+ line_cnt,
+ line_protocol,
+ module,
+ need_packages,
+ supported,
+ feature,
+ info,
+ special,
+ firmware,
+ short_description,
+ IRQ,
+ IO,
+ MEMBASE,
+ alternative_name,
+};
+
+extern void add_current_item(int, char *);
+extern int new_entry(void);
+
+#endif /* ISDN_CDB_DEF */
--- /dev/null
+#include <stdio.h>
+#include <stdlib.h>
+#include <malloc.h>
+#include <string.h>
+#include <time.h>
+#include "lex.yy.c"
+#include "hd.h"
+#include "cdb_read.h"
+#include "cdb_hwdb.h"
+
+
+int yywrap(void) {
+ return(1);
+}
+
+static int WriteNames(FILE *f) {
+ char *p, *e;
+ int l, nc=0;
+
+ fprintf(f, "! name data\n");
+ fprintf(f, "$%02d %d\n", IWHREC_TYPE_NAME_SIZE, name_str_cnt);
+ p = e = name_str;
+ e += name_str_cnt;
+ while (p < e) {
+ l = strlen(p);
+ fprintf(f, "$%02d %s\n", IWHREC_TYPE_NAME_DATA, p);
+ p += l + 1;
+ nc++;
+ }
+ fprintf(f, "$%02d %d\n", IWHREC_TYPE_NAME_COUNT, nc);
+ return(0);
+}
+
+static int WriteVendors(FILE *f) {
+ int i, nullidx, idx;
+
+ fprintf(f, "! vendor database\n");
+ fprintf(f, "$%02d %d\n", IWHREC_TYPE_VENDOR_COUNT, ivendor_idx);
+ nullidx = strlen(name_str); /* first 0 in string array */
+ for (i=0; i < ivendor_idx; i++) {
+ fprintf(f,"$%02d ", IWHREC_TYPE_VENDOR_RECORD);
+ if (vendors[i].name && vendors[i].name[0])
+ idx = vendors[i].name - name_str;
+ else
+ idx = nullidx;
+ fprintf(f,"%x ", idx);
+ if (vendors[i].shortname && vendors[i].shortname[0])
+ idx = vendors[i].shortname - name_str;
+ else
+ idx = nullidx;
+ fprintf(f,"%x ", idx);
+ fprintf(f,"%d ", vendors[i].vnr);
+ fprintf(f,"%d\n",vendors[i].refcnt);
+ }
+ return(0);
+}
+
+static int WriteCards(FILE *f) {
+ int i, nullidx, idx;
+
+ fprintf(f, "! card database\n");
+ fprintf(f, "$%02d %d\n", IWHREC_TYPE_CARD_COUNT, ce_idx);
+ nullidx = strlen(name_str); /* first 0 in string array */
+
+ for (i=0; i <= ce_idx; i++) {
+ fprintf(f,"$%02d ", IWHREC_TYPE_CARD_RECORD);
+ fprintf(f,"%d ",cards[i].handle);
+ fprintf(f,"%d ",cards[i].vhandle);
+ if (cards[i].name && cards[i].name[0])
+ idx = cards[i].name - name_str;
+ else
+ idx = nullidx;
+ fprintf(f,"%x ", idx);
+ if (cards[i].lname && cards[i].lname[0])
+ idx = cards[i].lname - name_str;
+ else
+ idx = nullidx;
+ fprintf(f,"%x ", idx);
+ if (cards[i].Class && cards[i].Class[0])
+ idx = cards[i].Class - name_str;
+ else
+ idx = nullidx;
+ fprintf(f,"%x ", idx);
+ if (cards[i].bus && cards[i].bus[0])
+ idx = cards[i].bus - name_str;
+ else
+ idx = nullidx;
+ fprintf(f,"%x ", idx);
+ fprintf(f,"%d ",cards[i].revision);
+ fprintf(f,"%d ",cards[i].vendor);
+ fprintf(f,"%d ",cards[i].device);
+ fprintf(f,"%d ",cards[i].subvendor);
+ fprintf(f,"%d ",cards[i].subdevice);
+ fprintf(f,"%d ",cards[i].features);
+ fprintf(f,"%d ",cards[i].line_cnt);
+ fprintf(f,"%d ",cards[i].vario_cnt);
+ fprintf(f,"%d\n",cards[i].vario);
+ }
+ for (i=0; i < ce_idx; i++) {
+ fprintf(f,"$%02d %d\n", IWHREC_TYPE_CARD_IDSORTED, isdncard_id[i]);
+ }
+ return(0);
+}
+
+static int WriteVarios(FILE *f) {
+ int i, nullidx, idx;
+
+ fprintf(f, "! driver database\n");
+ fprintf(f, "$%02d %d\n", IWHREC_TYPE_VARIO_COUNT, vario_idx);
+ nullidx = strlen(name_str); /* first 0 in string array */
+
+ for (i=0; i <= vario_idx; i++) {
+ fprintf(f,"$%02d ", IWHREC_TYPE_VARIO_RECORD);
+ fprintf(f,"%d ",varios[i].handle);
+ fprintf(f,"%d ",varios[i].next_vario);
+ fprintf(f,"%d ",varios[i].drvid);
+ fprintf(f,"%d ",varios[i].typ);
+ fprintf(f,"%d ",varios[i].subtyp);
+ fprintf(f,"%d ",varios[i].smp);
+ if (varios[i].mod_name && varios[i].mod_name[0])
+ idx = varios[i].mod_name - name_str;
+ else
+ idx = nullidx;
+ fprintf(f,"%x ", idx);
+ if (varios[i].para_str && varios[i].para_str[0])
+ idx = varios[i].para_str - name_str;
+ else
+ idx = nullidx;
+ fprintf(f,"%x ", idx);
+ if (varios[i].mod_preload && varios[i].mod_preload[0])
+ idx = varios[i].mod_preload - name_str;
+ else
+ idx = nullidx;
+ fprintf(f,"%x ", idx);
+ if (varios[i].cfg_prog && varios[i].cfg_prog[0])
+ idx = varios[i].cfg_prog - name_str;
+ else
+ idx = nullidx;
+ fprintf(f,"%x ", idx);
+ if (varios[i].firmware && varios[i].firmware[0])
+ idx = varios[i].firmware - name_str;
+ else
+ idx = nullidx;
+ fprintf(f,"%x ", idx);
+ if (varios[i].description && varios[i].description[0])
+ idx = varios[i].description - name_str;
+ else
+ idx = nullidx;
+ fprintf(f,"%x ", idx);
+ if (varios[i].need_pkg && varios[i].need_pkg[0])
+ idx = varios[i].need_pkg - name_str;
+ else
+ idx = nullidx;
+ fprintf(f,"%x ", idx);
+ if (varios[i].info && varios[i].info[0])
+ idx = varios[i].info - name_str;
+ else
+ idx = nullidx;
+ fprintf(f,"%x ", idx);
+ if (varios[i].protocol && varios[i].protocol[0])
+ idx = varios[i].protocol - name_str;
+ else
+ idx = nullidx;
+ fprintf(f,"%x ", idx);
+ if (varios[i].interface && varios[i].interface[0])
+ idx = varios[i].interface - name_str;
+ else
+ idx = nullidx;
+ fprintf(f,"%x ", idx);
+ if (varios[i].io && varios[i].io[0])
+ idx = varios[i].io - name_str;
+ else
+ idx = nullidx;
+ fprintf(f,"%x ", idx);
+ if (varios[i].irq && varios[i].irq[0])
+ idx = varios[i].irq - name_str;
+ else
+ idx = nullidx;
+ fprintf(f,"%x ", idx);
+ if (varios[i].membase && varios[i].membase[0])
+ idx = varios[i].membase - name_str;
+ else
+ idx = nullidx;
+ fprintf(f,"%x ", idx);
+ if (varios[i].features && varios[i].features[0])
+ idx = varios[i].features - name_str;
+ else
+ idx = nullidx;
+ fprintf(f,"%x ", idx);
+ fprintf(f,"%d ",varios[i].card_ref);
+ if (varios[i].name && varios[i].name[0])
+ idx = varios[i].name - name_str;
+ else
+ idx = nullidx;
+ fprintf(f,"%x\n", idx);
+ }
+ return(0);
+}
+
+int main(argc,argv)
+int argc;
+char **argv;
+{
+ char line[256];
+ int l;
+ time_t tim;
+ if (argc<2) {
+ if (!(stdin=freopen(CDBISDN_CDB_FILE,"rb", stdin))) {
+ fprintf(stderr, "Cannot open %s as stdin\n", CDBISDN_CDB_FILE);
+ exit(2);
+ }
+ } else {
+ if (!(stdin=freopen(argv[1],"rb", stdin))) {
+ fprintf(stderr, "Cannot open %s as stdin\n", argv[1]);
+ exit(2);
+ }
+ }
+ if (argc >2) {
+ if (strcmp(argv[2], "-")) { /* - := stdout */
+ if (!(stdout=freopen(argv[2],"w", stdout))) {
+ fprintf(stderr, "Cannot open %s as stdout\n", argv[2]);
+ exit(3);
+ }
+ }
+ } else { /* default: CDBISDN_HWDB_FILE */
+ if (!(stdout=freopen(CDBISDN_HWDB_FILE,"w", stdout))) {
+ fprintf(stderr, "Cannot open %s as stdout\n", CDBISDN_HWDB_FILE);
+ exit(3);
+ }
+ }
+ cards = calloc(max_ce, sizeof(cdb_isdn_card));
+ if (!cards) {
+ fprintf(stderr, "cannot alloc card\n");
+ fclose(stdin);
+ exit(4);
+ }
+ varios = calloc(max_vario, sizeof(cdb_isdn_vario));
+ if (!varios) {
+ fprintf(stderr, "cannot alloc vario\n");
+ fclose(stdin);
+ free(cards);
+ exit(5);
+ }
+ name_str = calloc(max_name_str_cnt, 1);
+ if (!name_str) {
+ fprintf(stderr, "cannot alloc name_str\n");
+ fclose(stdin);
+ free(cards);
+ free(varios);
+ exit(6);
+ }
+ vendors = calloc(max_ivendor, sizeof(cdb_isdn_vendor));
+ if (!vendors) {
+ fprintf(stderr, "cannot alloc vendors\n");
+ fclose(stdin);
+ free(cards);
+ free(varios);
+ free(name_str);
+ exit(7);
+ }
+ BEGIN Main;
+ yylex();
+
+ SortVendors();
+ SortCards();
+ SortVarios();
+
+ fprintf(stdout, "! CDBISDN database version %x\n", CDB_DATAVERSION + 1);
+ fprintf(stdout, "! file is build with mk_isdnhwdb\n");
+ fprintf(stdout, "! Do not change this file !!!\n");
+ fprintf(stdout,"$%02d %d\n", IWHREC_TYPE_VERSION, CDB_DATAVERSION + 1);
+ time(&tim);
+ strcpy(line,ctime(&tim));
+ l = strlen(line);
+ if (l)
+ line[l-1] = 0;
+ fprintf(stdout,"$%02d %s\n", IWHREC_TYPE_DATE, line);
+ WriteNames(stdout);
+ WriteVendors(stdout);
+ WriteCards(stdout);
+ WriteVarios(stdout);
+
+ fclose(stdin);
+ free(cards);
+ free(name_str);
+ free(vendors);
+ free(varios);
+ fprintf(stderr, "used cards(%d/%d)\n", ce_idx, max_ce);
+ fprintf(stderr, "used varios(%d/%d)\n", vario_idx, max_vario);
+ fprintf(stderr, "used vendors(%d/%d)\n", ivendor_idx, max_ivendor);
+ fprintf(stderr, "used name_str(%d/%d)\n",name_str_cnt, max_name_str_cnt);
+ return(0);
+}
--- /dev/null
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include "hd.h"
+#include "hd_int.h"
+
+#define debprintf(a...)
+// #define debprintf(a...) fprintf(stderr, ## a)
+
+/* private data */
+
+#include "cdb/isdn_cdb.h"
+#include "cdb/cdb_hwdb.h"
+
+static int CDBISDN_vendor_cnt;
+static int CDBISDN_card_cnt;
+static int CDBISDN_vario_cnt;
+static int CDBISDN_name_size;
+static char *CDBISDN_names;
+
+static cdb_isdn_vendor *cdb_isdnvendor_info;
+static cdb_isdn_card *cdb_isdncard_info;
+static int *cdb_isdncard_idsorted;
+static cdb_isdn_vario *cdb_isdnvario_info;
+static int cdb_dbversion;
+static char cdb_date[32];
+
+static char line[1024];
+
+static int CDBISDN_readhwdb;
+
+static int
+init_cdbisdn(void)
+{
+ FILE *cdb;
+ char *s, *p = NULL;
+ int rectyp, l, cnt = 0, icnt = 0;
+
+ cdb = fopen(CDBISDN_HWDB_FILE, "rb");
+ if (!cdb) {
+ debprintf("open failure %s\n", CDBISDN_HWDB_FILE);
+ goto fallback;
+ }
+ while (!feof(cdb)) {
+ s = fgets(line, 1024, cdb);
+ if (!s)
+ break;
+ if (!s[0] || s[0] == '!' || s[0] == '#' || s[0] == '\n')
+ continue;
+ if (s[0] != '$') {
+ debprintf("got wrong line %s\n", s);
+ continue;
+ }
+ sscanf(s, "$%d", &rectyp);
+ switch(rectyp) {
+ case IWHREC_TYPE_VERSION:
+ sscanf(s + 4, "%d", &cdb_dbversion);
+ break;
+ case IWHREC_TYPE_DATE:
+ l = strlen(s + 4);
+ if (!l)
+ continue;
+ l--;
+ if (l > 31)
+ l = 31;
+ strncpy(cdb_date, s + 4, l);
+ cdb_date[l] = 0;
+ break;
+ case IWHREC_TYPE_NAME_SIZE:
+ sscanf(s + 4, "%d", &CDBISDN_name_size);
+ CDBISDN_names = calloc(CDBISDN_name_size + 1, 1);
+ if (!CDBISDN_names) {
+ debprintf("fail to allocate %d bytes for CDBISDN_names\n", CDBISDN_name_size);
+ goto fallback_close;
+ }
+ p = CDBISDN_names;
+ cnt = 0;
+ icnt = 0;
+ break;
+ case IWHREC_TYPE_NAME_DATA:
+ if (!p)
+ goto fallback_close;
+ l = strlen(s + 4);
+ icnt += l;
+ if (icnt > CDBISDN_name_size) {
+ debprintf("name_size overflow %d/%d\n", icnt, CDBISDN_name_size);
+ goto fallback_close;
+ }
+ strcpy(p, s + 4);
+ p[l-1] = 0;
+ p += l;
+ cnt++;
+ break;
+ case IWHREC_TYPE_NAME_COUNT:
+ sscanf(s + 4, "%d", &l);
+ if (cnt != l)
+ goto fallback_close;
+ break;
+ case IWHREC_TYPE_VENDOR_COUNT:
+ sscanf(s + 4, "%d", &CDBISDN_vendor_cnt);
+ cdb_isdnvendor_info = calloc(CDBISDN_vendor_cnt, sizeof(cdb_isdn_vendor));
+ if (!cdb_isdnvendor_info) {
+ debprintf("fail to allocate %d vendor structs\n", CDBISDN_vendor_cnt);
+ goto fallback_close;
+ }
+ cnt = 0;
+ break;
+ case IWHREC_TYPE_VENDOR_RECORD:
+ if (cnt >= CDBISDN_vendor_cnt) {
+ debprintf("vendor overflow %d/%d\n", cnt, CDBISDN_vendor_cnt);
+ goto fallback_close;
+ }
+ l = sscanf(s + 4, "%p %p %d %d",
+ &cdb_isdnvendor_info[cnt].name,
+ &cdb_isdnvendor_info[cnt].shortname,
+ &cdb_isdnvendor_info[cnt].vnr,
+ &cdb_isdnvendor_info[cnt].refcnt);
+ if (l != 4) {
+ debprintf("error reading vendor record %s\n", s);
+ goto fallback_close;
+ }
+ cdb_isdnvendor_info[cnt].name = CDBISDN_names + (u_long)cdb_isdnvendor_info[cnt].name;
+ cdb_isdnvendor_info[cnt].shortname = CDBISDN_names + (u_long)cdb_isdnvendor_info[cnt].shortname;
+ cnt++;
+ break;
+ case IWHREC_TYPE_CARD_COUNT:
+ sscanf(s + 4, "%d", &CDBISDN_card_cnt);
+ cdb_isdncard_info = calloc(CDBISDN_card_cnt + 1, sizeof(cdb_isdn_card));
+ cdb_isdncard_idsorted = calloc(CDBISDN_card_cnt, sizeof(int));
+ if (!cdb_isdncard_info || !cdb_isdncard_idsorted) {
+ debprintf("fail to allocate %d vendor structs\n", CDBISDN_card_cnt);
+ goto fallback_close;
+ }
+ cnt = 0;
+ icnt = 0;
+ break;
+ case IWHREC_TYPE_CARD_RECORD:
+ if (cnt > CDBISDN_card_cnt) {
+ debprintf("card overflow %d/%d\n", cnt, CDBISDN_card_cnt);
+ goto fallback_close;
+ }
+ l = sscanf(s + 4, "%d %d %p %p %p %p %d %d %d %d %d %d %d %d %d",
+ &cdb_isdncard_info[cnt].handle, /* internal identifier idx in database */
+ &cdb_isdncard_info[cnt].vhandle, /* internal identifier to vendor database */
+ &cdb_isdncard_info[cnt].name, /* cardname */
+ &cdb_isdncard_info[cnt].lname, /* vendor short name + cardname */
+ &cdb_isdncard_info[cnt].Class, /* CLASS of the card */
+ &cdb_isdncard_info[cnt].bus, /* bus type */
+ &cdb_isdncard_info[cnt].revision, /* revision used with USB */
+ &cdb_isdncard_info[cnt].vendor, /* Vendor ID for ISAPNP and PCI cards */
+ &cdb_isdncard_info[cnt].device, /* Device ID for ISAPNP and PCI cards */
+ &cdb_isdncard_info[cnt].subvendor, /* Subvendor ID for PCI cards */
+ &cdb_isdncard_info[cnt].subdevice, /* Subdevice ID for PCI cards */
+ &cdb_isdncard_info[cnt].features, /* feature flags */
+ &cdb_isdncard_info[cnt].line_cnt, /* count of ISDN ports */
+ &cdb_isdncard_info[cnt].vario_cnt, /* count of driver varios */
+ &cdb_isdncard_info[cnt].vario); /* referenz to driver vario record */
+ if (l != 15) {
+ debprintf("error reading card record %s\n", s);
+ goto fallback_close;
+ }
+ cdb_isdncard_info[cnt].name = CDBISDN_names + (u_long)cdb_isdncard_info[cnt].name;
+ cdb_isdncard_info[cnt].lname = CDBISDN_names + (u_long)cdb_isdncard_info[cnt].lname;
+ cdb_isdncard_info[cnt].Class = CDBISDN_names + (u_long)cdb_isdncard_info[cnt].Class;
+ cdb_isdncard_info[cnt].bus = CDBISDN_names + (u_long)cdb_isdncard_info[cnt].bus;
+ cnt++;
+ break;
+ case IWHREC_TYPE_CARD_IDSORTED:
+ if (icnt >= CDBISDN_card_cnt) {
+ debprintf("card overflow %d/%d\n", icnt, CDBISDN_card_cnt);
+ goto fallback_close;
+ }
+ sscanf(s + 4, "%d", &cdb_isdncard_idsorted[icnt]);
+ icnt++;
+ break;
+ case IWHREC_TYPE_VARIO_COUNT:
+ sscanf(s + 4, "%d", &CDBISDN_vario_cnt);
+ cdb_isdnvario_info = calloc(CDBISDN_vario_cnt+1, sizeof(cdb_isdn_vario));
+ if (!cdb_isdnvario_info) {
+ debprintf("fail to allocate %d vario structs\n", CDBISDN_vario_cnt);
+ goto fallback_close;
+ }
+ cnt = 0;
+ break;
+ case IWHREC_TYPE_VARIO_RECORD:
+ if (cnt > CDBISDN_vario_cnt) {
+ debprintf("vario overflow %d/%d\n", cnt, CDBISDN_vario_cnt);
+ goto fallback_close;
+ }
+ l = sscanf(s + 4, "%d %d %d %d %d %d %p %p %p %p %p %p %p %p %p %p %p %p %p %p %d %p",
+ &cdb_isdnvario_info[cnt].handle, /* idx in database */
+ &cdb_isdnvario_info[cnt].next_vario, /* link to alternate vario */
+ &cdb_isdnvario_info[cnt].drvid, /* unique id of the driver vario */
+ &cdb_isdnvario_info[cnt].typ, /* Type to identify the driver */
+ &cdb_isdnvario_info[cnt].subtyp, /* Subtype of the driver type */
+ &cdb_isdnvario_info[cnt].smp, /* SMP supported ? */
+ &cdb_isdnvario_info[cnt].mod_name, /* name of the driver module */
+ &cdb_isdnvario_info[cnt].para_str, /* optional parameter string */
+ &cdb_isdnvario_info[cnt].mod_preload, /* optional modules to preload */
+ &cdb_isdnvario_info[cnt].cfg_prog, /* optional cfg prog */
+ &cdb_isdnvario_info[cnt].firmware, /* optional firmware to load */
+ &cdb_isdnvario_info[cnt].description, /* optional description */
+ &cdb_isdnvario_info[cnt].need_pkg, /* list of packages needed for function */
+ &cdb_isdnvario_info[cnt].info, /* optional additional info */
+ &cdb_isdnvario_info[cnt].protocol, /* supported D-channel protocols */
+ &cdb_isdnvario_info[cnt].interface, /* supported API interfaces */
+ &cdb_isdnvario_info[cnt].io, /* possible IO ports with legacy ISA cards */
+ &cdb_isdnvario_info[cnt].irq, /* possible interrupts with legacy ISA cards */
+ &cdb_isdnvario_info[cnt].membase, /* possible membase with legacy ISA cards */
+ &cdb_isdnvario_info[cnt].features, /* optional features*/
+ &cdb_isdnvario_info[cnt].card_ref, /* reference to a card */
+ &cdb_isdnvario_info[cnt].name); /* driver name */
+ if (l != 22) {
+ debprintf("error reading vario record %s\n", s);
+ goto fallback_close;
+ }
+ cdb_isdnvario_info[cnt].mod_name = CDBISDN_names + (u_long)cdb_isdnvario_info[cnt].mod_name;
+ cdb_isdnvario_info[cnt].para_str = CDBISDN_names + (u_long)cdb_isdnvario_info[cnt].para_str;
+ cdb_isdnvario_info[cnt].mod_preload = CDBISDN_names + (u_long)cdb_isdnvario_info[cnt].mod_preload;
+ cdb_isdnvario_info[cnt].cfg_prog = CDBISDN_names + (u_long)cdb_isdnvario_info[cnt].cfg_prog;
+ cdb_isdnvario_info[cnt].firmware = CDBISDN_names + (u_long)cdb_isdnvario_info[cnt].firmware;
+ cdb_isdnvario_info[cnt].description = CDBISDN_names + (u_long)cdb_isdnvario_info[cnt].description;
+ cdb_isdnvario_info[cnt].need_pkg = CDBISDN_names + (u_long)cdb_isdnvario_info[cnt].need_pkg;
+ cdb_isdnvario_info[cnt].info = CDBISDN_names + (u_long)cdb_isdnvario_info[cnt].info;
+ cdb_isdnvario_info[cnt].protocol = CDBISDN_names + (u_long)cdb_isdnvario_info[cnt].protocol;
+ cdb_isdnvario_info[cnt].interface = CDBISDN_names + (u_long)cdb_isdnvario_info[cnt].interface;
+ cdb_isdnvario_info[cnt].io = CDBISDN_names + (u_long)cdb_isdnvario_info[cnt].io;
+ cdb_isdnvario_info[cnt].irq = CDBISDN_names + (u_long)cdb_isdnvario_info[cnt].irq;
+ cdb_isdnvario_info[cnt].membase = CDBISDN_names + (u_long)cdb_isdnvario_info[cnt].membase;
+ cdb_isdnvario_info[cnt].features = CDBISDN_names + (u_long)cdb_isdnvario_info[cnt].features;
+ cdb_isdnvario_info[cnt].name = CDBISDN_names + (u_long)cdb_isdnvario_info[cnt].name;
+ cnt++;
+ break;
+ default:
+ debprintf("got wrong RecType %d\n", rectyp);
+ break;
+ }
+ }
+ fclose(cdb);
+ if (CDBISDN_name_size == 0 ||
+ CDBISDN_vendor_cnt == 0 ||
+ CDBISDN_card_cnt == 0 ||
+ CDBISDN_vario_cnt == 0)
+ goto fallback;
+ debprintf("successfull reading %s\n", CDBISDN_HWDB_FILE);
+ CDBISDN_readhwdb = 1;
+ return(0);
+fallback_close:
+ fclose(cdb);
+fallback:
+ debprintf("error reading %s\n", CDBISDN_HWDB_FILE);
+ CDBISDN_vendor_cnt = (sizeof(cdb_isdnvendor_info_init) / sizeof(cdb_isdn_vendor));
+ CDBISDN_card_cnt = ((sizeof(cdb_isdncard_info_init) / sizeof(cdb_isdn_card)) -1);
+ CDBISDN_vario_cnt = ((sizeof(cdb_isdnvario_info_init) / sizeof(cdb_isdn_vario))-1);
+ cdb_isdnvendor_info = cdb_isdnvendor_info_init;
+ cdb_isdncard_info = cdb_isdncard_info_init;
+ cdb_isdncard_idsorted = cdb_isdncard_idsorted_init;
+ cdb_isdnvario_info = cdb_isdnvario_info_init;
+ cdb_dbversion = CDBISDN_DBVERSION;
+ strncpy(cdb_date, CDBISDN_DATE, 31);
+ CDBISDN_readhwdb = 1;
+ return(1);
+}
+
+typedef int (*fcmp) (const void *, const void *);
+
+static int compare_type(cdb_isdn_vario *v1, cdb_isdn_vario *v2) {
+ int x= v1->typ - v2->typ;
+
+ if (!x)
+ x=v1->subtyp - v2->subtyp;
+ return(x);
+}
+
+static int compare_id(const int *c1, const int *c2) {
+ int x= cdb_isdncard_info[*c1].vendor - cdb_isdncard_info[*c2].vendor;
+
+ if (!x)
+ x=cdb_isdncard_info[*c1].device - cdb_isdncard_info[*c2].device;
+ if (!x)
+ x=cdb_isdncard_info[*c1].subvendor - cdb_isdncard_info[*c2].subvendor;
+ if (!x)
+ x=cdb_isdncard_info[*c1].subdevice - cdb_isdncard_info[*c2].subdevice;
+ return(x);
+}
+
+/* interface */
+
+cdb_isdn_vendor *hd_cdbisdn_get_vendor(int handle)
+{
+ if (!CDBISDN_readhwdb)
+ init_cdbisdn();
+ if (handle<0)
+ return(NULL);
+ if ((unsigned)handle >= CDBISDN_vendor_cnt)
+ return(NULL);
+ return(&cdb_isdnvendor_info[handle]);
+}
+
+cdb_isdn_card *hd_cdbisdn_get_card(int handle)
+{
+ if (!CDBISDN_readhwdb)
+ init_cdbisdn();
+ if (handle<=0)
+ return(NULL);
+ if ((unsigned) handle>CDBISDN_card_cnt)
+ return(NULL);
+ return(&cdb_isdncard_info[handle]);
+}
+
+cdb_isdn_vario *hd_cdbisdn_get_vario_from_type(int typ, int subtyp)
+{
+ cdb_isdn_vario key, *ret;
+
+ if (!CDBISDN_readhwdb)
+ CDBISDN_readhwdb = init_cdbisdn();
+ key.typ = typ;
+ key.subtyp = subtyp;
+ if (!(ret=bsearch(&key, &cdb_isdnvario_info[1], CDBISDN_vario_cnt, sizeof(cdb_isdn_vario), (fcmp)compare_type))) {
+ debprintf("ret NULL\n");
+ return(NULL);
+ }
+ return(ret);
+}
+
+cdb_isdn_card *hd_cdbisdn_get_card_from_type(int typ, int subtyp)
+{
+ cdb_isdn_vario *civ;
+
+ if (!CDBISDN_readhwdb)
+ init_cdbisdn();
+ civ = hd_cdbisdn_get_vario_from_type(typ, subtyp);
+ if (civ) {
+ if (civ->card_ref > 0)
+ return(&cdb_isdncard_info[civ->card_ref]);
+ }
+ return(NULL);
+}
+
+cdb_isdn_card *hd_cdbisdn_get_card_from_id(int vendor, int device, int subvendor, int subdevice)
+{
+ int key, *ret;
+
+ if (!CDBISDN_readhwdb)
+ init_cdbisdn();
+ key = 0;
+ cdb_isdncard_info[key].vendor = vendor;
+ cdb_isdncard_info[key].device = device;
+ cdb_isdncard_info[key].subvendor = subvendor;
+ cdb_isdncard_info[key].subdevice = subdevice;
+ if (!(ret=bsearch(&key, cdb_isdncard_idsorted, CDBISDN_card_cnt, sizeof(int), (fcmp)compare_id))) {
+ debprintf("bs1 ret NULL\n");
+ key = 0;
+ cdb_isdncard_info[key].subvendor = PCI_ANY_ID;
+ cdb_isdncard_info[key].subdevice = PCI_ANY_ID;
+ if (!(ret=bsearch(&key, cdb_isdncard_idsorted, CDBISDN_card_cnt, sizeof(int), (fcmp)compare_id))) {
+ debprintf("bs2 ret NULL\n");
+ return(NULL);
+ }
+ }
+ debprintf("ret idx %d\n", *ret);
+ if (*ret <= 0)
+ return(NULL);
+ if ((unsigned) *ret > CDBISDN_card_cnt)
+ return(NULL);
+ return(&cdb_isdncard_info[*ret]);
+}
+
+cdb_isdn_vario *hd_cdbisdn_get_vario(int handle)
+{
+ if (!CDBISDN_readhwdb)
+ init_cdbisdn();
+ if (handle<=0)
+ return(NULL);
+ if ((unsigned) handle > CDBISDN_vario_cnt)
+ return(NULL);
+ return(&cdb_isdnvario_info[handle]);
+}
+
+int hd_cdbisdn_get_version(void)
+{
+ if (!CDBISDN_readhwdb)
+ init_cdbisdn();
+ return(CDBISDN_VERSION);
+}
+
+int hd_cdbisdn_get_db_version(void)
+{
+ if (!CDBISDN_readhwdb)
+ init_cdbisdn();
+ return(cdb_dbversion);
+}
+
+char *hd_cdbisdn_get_db_date(void)
+{
+ if (!CDBISDN_readhwdb)
+ init_cdbisdn();
+ return(cdb_date);
+}
--- /dev/null
+#if defined(__i386__)
+
+#include <stdio.h>
+#include <sys/io.h>
+
+#include "hd.h"
+#include "hd_int.h"
+#include "isa.h"
+
+#define AVM_CONFIG_OFF 0x1800 /* offset for config register */
+#define AVM_TEST_MASK 0x28 /* allways zero */
+#define AVM_HSCX_A_VSTR 0x40e /* HSCX A version reg */
+#define AVM_HSCX_B_VSTR 0xc0e /* HSCX B version reg */
+
+int avm_a1_detect(isa_isdn_t **ii) {
+ int adr,i;
+ unsigned char val,v1,v2;
+ int found=0;
+ unsigned short AVM_ADR[4]={0x200,0x240,0x300,0x340};
+ isa_isdn_t *card;
+
+ for (i=0;i<4;i++) {
+ adr=AVM_ADR[i] + AVM_CONFIG_OFF;
+ val = inb(adr);
+ if (val & AVM_TEST_MASK)
+ continue;
+ /* May be we found an AVM A1 or AVM Fritz!Classic */
+ /* Checking HSCX VERSIONS */
+ v1 = 0xf & inb(AVM_ADR[i] + AVM_HSCX_A_VSTR);
+ if ((v1 != 5) && (v1 != 4))
+ continue;
+ v2 = 0xf & inb(AVM_ADR[i] + AVM_HSCX_B_VSTR);
+ if (v1 != v2)
+ continue;
+ /* 99% we found an AVM A1 or AVM Fritz!Classic */
+ /* printf("# AVM A1 or Fritz!Classic found\n");
+ printf("TYPE=5 SUBTYPE=0 IO=0x%3x\n", AVM_ADR[i]); */
+ card = new_isa_isdn(ii);
+ card->type = 5; card->has_io = 1; card->io = AVM_ADR[i];
+ found++;
+ }
+ return(found);
+}
+
+#define ELSA_CONFIG 5
+#define ELSA_PC 1
+#define ELSA_PCC8 2
+#define ELSA_PCC16 3
+#define ELSA_PCF 4
+#define ELSA_PCFPRO 5
+
+#define ELSA_IRQ_IDX 0x38 /* Bit 3,4,5 des Config-Reg */
+#define ELSA_IRQ_IDX_PCC8 0x30 /* Bit 4,5 des Config-Reg */
+#define ELSA_IRQ_IDX_PC 0x0c /* Bit 2,3 des Config-Reg */
+
+
+int
+probe_elsa_adr(unsigned int adr)
+{
+ int i, in1, in2, p16_1 = 0, p16_2 = 0, p8_1 = 0, p8_2 = 0, pc_1 = 0,
+ pc_2 = 0, pfp_1 = 0, pfp_2 = 0;
+
+ for (i = 0; i < 16; i++) {
+ in1 = inb(adr + ELSA_CONFIG); /* 'toggelt' bei */
+ in2 = inb(adr + ELSA_CONFIG); /* jedem Zugriff */
+ p16_1 += 0x04 & in1;
+ p16_2 += 0x04 & in2;
+ p8_1 += 0x02 & in1;
+ p8_2 += 0x02 & in2;
+ pc_1 += 0x01 & in1;
+ pc_2 += 0x01 & in2;
+ pfp_1 += 0x40 & in1;
+ pfp_2 += 0x40 & in2;
+ }
+ if (65 == ++p16_1 * ++p16_2) {
+ return (ELSA_PCC16);
+ } else if (1025 == ++pfp_1 * ++pfp_2) {
+ return (ELSA_PCFPRO);
+ } else if (33 == ++p8_1 * ++p8_2) {
+ return (ELSA_PCC8);
+ } else if (17 == ++pc_1 * ++pc_2) {
+ return (ELSA_PC);
+ }
+ return (0);
+}
+
+int
+probe_elsa(isa_isdn_t **ii)
+{
+ int i, subtyp, val, irq, found=0;
+ isa_isdn_t *card;
+
+ unsigned int CARD_portlist[] =
+ {0x160, 0x170, 0x260, 0x360, 0};
+
+ for (i = 0; CARD_portlist[i]; i++) {
+ if ((subtyp = probe_elsa_adr(CARD_portlist[i]))) {
+ found++;
+ val = inb(CARD_portlist[i] + ELSA_CONFIG);
+ if (subtyp == ELSA_PC) {
+ int CARD_IrqTab[8] =
+ {7, 3, 5, 9, 0, 0, 0, 0};
+ irq = CARD_IrqTab[(val & ELSA_IRQ_IDX_PC) >> 2];
+ } else if (subtyp == ELSA_PCC8) {
+ int CARD_IrqTab[8] =
+ {7, 3, 5, 9, 0, 0, 0, 0};
+ irq = CARD_IrqTab[(val & ELSA_IRQ_IDX_PCC8) >> 4];
+ } else {
+ int CARD_IrqTab[8] =
+ {15, 10, 15, 3, 11, 5, 11, 9};
+ irq = CARD_IrqTab[(val & ELSA_IRQ_IDX) >> 3];
+ }
+ switch(subtyp) {
+ case ELSA_PC:
+ /* printf("# Elsa ML PC found\n");
+ printf("TYPE=6 SUBTYPE=%d IO=0x%03x IRQ=%d\n",
+ subtyp, CARD_portlist[i], irq); */
+ case ELSA_PCC8:
+ /* printf("# Elsa ML PCC-8 found\n");
+ printf("TYPE=6 SUBTYPE=%d IO=0x%03x IRQ=%d\n",
+ subtyp, CARD_portlist[i], irq); */
+ case ELSA_PCC16:
+ /* printf("# Elsa ML PCC-16 found\n");
+ printf("TYPE=6 SUBTYPE=%d IO=0x%03x IRQ=%d\n",
+ subtyp, CARD_portlist[i], irq); */
+ case ELSA_PCF:
+ /* printf("# Elsa ML PCF found\n");
+ printf("TYPE=6 SUBTYPE=%d IO=0x%03x IRQ=%d\n",
+ subtyp, CARD_portlist[i], irq); */
+ case ELSA_PCFPRO:
+ /* printf("# Elsa ML PCFPro found\n");
+ printf("TYPE=6 SUBTYPE=%d IO=0x%03x IRQ=%d\n",
+ subtyp, CARD_portlist[i], irq); */
+
+ card = new_isa_isdn(ii);
+ card->type = 6; card->subtype = subtyp;
+ card->has_io = 1; card->io = CARD_portlist[i];
+ card->has_irq = 1; card->irq = irq;
+ break;
+ }
+ }
+ }
+ return (found);
+}
+
+
+#define TELES_CONFIG_OFF 0xc00
+#define TELES_ID1 0x51
+#define TELES_ID2 0x93
+#define TELES_16_0 0x1e
+#define TELES_16_0_AB 0x1f
+#define TELES_16_3_0 0x1c
+#define TELES_16_3_1 0x39
+#define TELES_16_3_3 0x38
+#define TELES_16_3_AB 0x46
+
+
+int telesdetect(isa_isdn_t **ii) {
+ int adr,val,i;
+ int found=0;
+ unsigned short TELES_ADR[3]={0x380,0x280,0x180};
+ isa_isdn_t *card;
+
+ for (i=0;i<3;i++) {
+ adr=TELES_ADR[i] + TELES_CONFIG_OFF;
+
+ val = inb(adr);
+ if (val != TELES_ID1)
+ continue;
+ adr++;
+ val = inb(adr);
+ if (val != TELES_ID2)
+ continue;
+ adr++;
+ val = inb(adr);
+ switch(val) {
+ case TELES_16_0:
+ /* printf("# Teles 16.0 found\n");
+ printf("TYPE=1 SUBTYPE=0 IO=0x%3x\n",
+ TELES_ADR[i] + TELES_CONFIG_OFF); */
+ case TELES_16_0_AB:
+ /* printf("# Teles 16.0 AB found\n");
+ printf("TYPE=1 SUBTYPE=1 IO=0x%3x\n",
+ TELES_ADR[i] + TELES_CONFIG_OFF); */
+ card = new_isa_isdn(ii);
+ card->type = 1;
+ if(val == TELES_16_0_AB) card->subtype = 1;
+ card->has_io = 1; card->io = TELES_ADR[i] + TELES_CONFIG_OFF;
+ found++;
+ break;
+ case TELES_16_3_0:
+ /* printf("# Teles 16.3 v1.0 found\n");
+ printf("TYPE=3 SUBTYPE=0 IO=0x%3x\n",
+ TELES_ADR[i]); */
+ case TELES_16_3_1:
+ /* printf("# Teles 16.3 v1.1 found\n");
+ printf("TYPE=3 SUBTYPE=0 IO=0x%3x\n",
+ TELES_ADR[i]); */
+ case TELES_16_3_3:
+ /* printf("# Teles 16.3 v1.3 found\n");
+ printf("TYPE=3 SUBTYPE=0 IO=0x%3x\n",
+ TELES_ADR[i]); */
+ case TELES_16_3_AB:
+ /* printf("# Teles 16.3 AB Video found\n");
+ printf("TYPE=3 SUBTYPE=1 IO=0x%3x\n",
+ TELES_ADR[i]); */
+ card = new_isa_isdn(ii);
+ card->type = 3;
+ if(val == TELES_16_3_AB) card->subtype = 1;
+ card->has_io = 1; card->io = TELES_ADR[i];
+ found++;
+ break;
+ default:
+ if (0 /* guess */)
+ printf("# may be a Teles 16.0/16.3 detected at IO=0x%3x byte 3 is 0x%02x\n",
+ TELES_ADR[i] + TELES_CONFIG_OFF, val);
+ break;
+ }
+ }
+ return(found);
+}
+
+isa_isdn_t *isdn_detect()
+{
+ isa_isdn_t *ii = NULL;
+
+ if(iopl(3) < 0) return ii;
+
+ avm_a1_detect(&ii);
+ probe_elsa(&ii);
+ telesdetect(&ii);
+
+ iopl(0);
+
+ return ii;
+}
+
+#endif /* i386 */
--- /dev/null
+1.
+ihw_card_info *ihw_get_card(int handle);
+
+"ihw_card_info" is a struct, which hold all info about the card (see ihw.h)
+The parameter is a internal used index for the database (range 0 ... max)
+To get all records use the following code as example:
+
+ ihw_card_info *icp;
+ handle = 0;
+ while ((icp =ihw_get_card(handle++))) {
+ ...
+ }
+
+If here are no entries left, you get NULL as return value.
+
+2.
+ihw_card_info *ihw_get_device_from_type(int typ, int subtyp);
+
+Get card informations for the card with TYPE and SUBTYPE .
+Returns NULL if no card match.
+This function is useful to get the card informations, if you have type and
+subtype from a rc.config, or from hardware probe.
+
+3.
+extern ihw_card_info *ihw_get_card_from_id(int vendor, int device,
+ int subvendor, int subdevice);
+
+Get card informations for the card with VENDOR,DEVICE,SUBVENDOR and
+SUBDEVICE for PCI and ISAPNP cards (set SUBVENDOR and SUBDEVICE
+to 0xffff for ISAPNP cards). Returns NULL if no card found.
+
+This function will be useful for hardware probe.
+
+
+4.
+ihw_para_info *ihw_get_parameter(int card_handle, int pnr);
+
+This function provides parameter info for a card (which was given by one of
+the first 3 functions). "card_handle" is the "ihw_card_info->handle" of
+the given card, pnr is the number of the requested parameter (1,2, ...).
+For the first parameter, set pnr to 1, for next increment pnr, until
+NULL is returned.
+
+For examples see at demo/demo.c
+
+Specials:
+
+To make it easy to decide, if an parameter has to be set in a rc.config
+a flag P_DEFINE is set in ihw_para_info->flags, which is set for all
+parameter which have to go into rc.config (for yast1 this parameter has to be
+setable).
+
+Other flags (may be useful for autodetection):
+
+P_HARDSET - parameter depends on a jumper or switch.
+P_SOFTSET - parameter is written into a config register (not for PnP/PCI)
+P_READABLE - parameter can be read from a config register (not for PnP/PCI)
+P_ISAPNP - parameter is set via ISA PnP setup
+P_PCI - parameter is a PCI one
+
+Karsten
--- /dev/null
+TOPDIR = ../..
+TARGETS = $(LIBHD_D)
+
+include $(TOPDIR)/Makefile.common
+
+$(LIBHD_D): $(OBJS)
+ ar r $(LIBHD) $?
--- /dev/null
+usage: smp
+
+exit codes:
+ 0 -> ok, is smp
+ != 0 -> no, is single processor
+
+Note1: just checks the smp capability of the board, not if >1 processor is
+actually installed.
+
+Note2: must be run as 'root'.
+
+Original is:
+
+/mirror/distributions/redhat/ftp.redhat.com/redhat/redhat-6.1/i386/misc/src/anaconda/isys/smp.c
--- /dev/null
+/*
+[_Anarchy_(alan@lightning.swansea.uk.linux.org)] you should do one check
+ though - if the board seems to be SMP and the CPU in /proc/cpuinfo is non
+ intel dont install an SMP kernel - thats a dual pentium board with a cyrix
+ or similar single cpu in it
+*/
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <sys/mman.h>
+#include <string.h>
+#include <errno.h>
+
+#ifdef __i386__
+#define SMP_MAGIC_IDENT (('_'<<24)|('P'<<16)|('M'<<8)|'_')
+
+struct intel_mp_floating
+{
+ char mpf_signature[4]; /* "_MP_" */
+ unsigned long mpf_physptr; /* Configuration table address */
+ unsigned char mpf_length; /* Our length (paragraphs) */
+ unsigned char mpf_specification;/* Specification version */
+ unsigned char mpf_checksum; /* Checksum (makes sum 0) */
+ unsigned char mpf_feature1; /* Standard or configuration ? */
+ unsigned char mpf_feature2; /* Bit7 set for IMCR|PIC */
+ unsigned char mpf_feature3; /* Unused (0) */
+ unsigned char mpf_feature4; /* Unused (0) */
+ unsigned char mpf_feature5; /* Unused (0) */
+};
+
+struct mp_config_table
+{
+ char mpc_signature[4];
+#define MPC_SIGNATURE "PCMP"
+ unsigned short mpc_length; /* Size of table */
+ char mpc_spec; /* 0x01 */
+ char mpc_checksum;
+ char mpc_oem[8];
+ char mpc_productid[12];
+ unsigned long mpc_oemptr; /* 0 if not present */
+ unsigned short mpc_oemsize; /* 0 if not present */
+ unsigned short mpc_oemcount;
+ unsigned long mpc_lapic; /* APIC address */
+ unsigned long reserved;
+};
+
+/* Followed by entries */
+
+#define MP_PROCESSOR 0
+#define MP_BUS 1
+#define MP_IOAPIC 2
+#define MP_INTSRC 3
+#define MP_LINTSRC 4
+
+struct mpc_config_processor
+{
+ unsigned char mpc_type;
+ unsigned char mpc_apicid; /* Local APIC number */
+ unsigned char mpc_apicver; /* Its versions */
+ unsigned char mpc_cpuflag;
+#define CPU_ENABLED 1 /* Processor is available */
+#define CPU_BOOTPROCESSOR 2 /* Processor is the BP */
+ unsigned long mpc_cpufeature;
+#define CPU_STEPPING_MASK 0x0F
+#define CPU_MODEL_MASK 0xF0
+#define CPU_FAMILY_MASK 0xF00
+ unsigned long mpc_featureflag; /* CPUID feature value */
+ unsigned long mpc_reserved[2];
+};
+
+struct mpc_config_bus
+{
+ unsigned char mpc_type;
+ unsigned char mpc_busid;
+ unsigned char mpc_bustype[6] __attribute((packed));
+};
+
+#define BUSTYPE_EISA "EISA"
+#define BUSTYPE_ISA "ISA"
+#define BUSTYPE_INTERN "INTERN" /* Internal BUS */
+#define BUSTYPE_MCA "MCA"
+#define BUSTYPE_VL "VL" /* Local bus */
+#define BUSTYPE_PCI "PCI"
+#define BUSTYPE_PCMCIA "PCMCIA"
+
+/* We don't understand the others */
+
+struct mpc_config_ioapic
+{
+ unsigned char mpc_type;
+ unsigned char mpc_apicid;
+ unsigned char mpc_apicver;
+ unsigned char mpc_flags;
+#define MPC_APIC_USABLE 0x01
+ unsigned long mpc_apicaddr;
+};
+
+struct mpc_config_intsrc
+{
+ unsigned char mpc_type;
+ unsigned char mpc_irqtype;
+ unsigned short mpc_irqflag;
+ unsigned char mpc_srcbus;
+ unsigned char mpc_srcbusirq;
+ unsigned char mpc_dstapic;
+ unsigned char mpc_dstirq;
+};
+
+#define MP_INT_VECTORED 0
+#define MP_INT_NMI 1
+#define MP_INT_SMI 2
+#define MP_INT_EXTINT 3
+
+#define MP_IRQDIR_DEFAULT 0
+#define MP_IRQDIR_HIGH 1
+#define MP_IRQDIR_LOW 3
+
+
+struct mpc_config_intlocal
+{
+ unsigned char mpc_type;
+ unsigned char mpc_irqtype;
+ unsigned short mpc_irqflag;
+ unsigned char mpc_srcbusid;
+ unsigned char mpc_srcbusirq;
+ unsigned char mpc_destapic;
+#define MP_APIC_ALL 0xFF
+ unsigned char mpc_destapiclint;
+};
+
+
+/*
+ * Default configurations
+ *
+ * 1 2 CPU ISA 82489DX
+ * 2 2 CPU EISA 82489DX no IRQ 8 or timer chaining
+ * 3 2 CPU EISA 82489DX
+ * 4 2 CPU MCA 82489DX
+ * 5 2 CPU ISA+PCI
+ * 6 2 CPU EISA+PCI
+ * 7 2 CPU MCA+PCI
+ */
+
+
+static int smp_found_config=0;
+
+/*
+ * Checksum an MP configuration block.
+ */
+
+static int mpf_checksum(unsigned char *mp, int len)
+{
+ int sum=0;
+ while(len--)
+ sum+=*mp++;
+ return sum&0xFF;
+}
+
+static int do_smp_scan_config(unsigned long *bp, unsigned long length)
+{
+ struct intel_mp_floating *mpf;
+
+/*
+ if (sizeof(*mpf)!=16)
+ logMessage("Error: MPF size\n");
+*/
+
+ while (length>0)
+ {
+ if (*bp==SMP_MAGIC_IDENT)
+ {
+ mpf=(struct intel_mp_floating *)bp;
+ if (mpf->mpf_length==1 &&
+ !mpf_checksum((unsigned char *)bp,16) &&
+ (mpf->mpf_specification == 1
+ || mpf->mpf_specification == 4) )
+ {
+ /*logMessage("Intel MultiProcessor Specification v1.%d\n", mpf->mpf_specification);
+ if (mpf->mpf_feature2&(1<<7))
+ logMessage(" IMCR and PIC compatibility mode.\n");
+ else
+ logMessage(" Virtual Wire compatibility mode.\n");
+*/
+ smp_found_config=1;
+ return 1;
+ }
+ }
+ bp+=4;
+ length-=16;
+ }
+
+ return 0;
+}
+
+static int smp_scan_config(int mem_fd, unsigned long base,
+ unsigned long length)
+{
+ void *p;
+ int o;
+
+ o=base&0xFFF;
+ base-=o;
+ length+=o;
+
+ p=mmap(0, (length+4095)&0xFFFFF000, PROT_READ, MAP_SHARED,
+ mem_fd, (base&0xFFFF0000));
+ if(p==MAP_FAILED)
+ {
+ /*logMessage("SMP Probe error: mmap: %s", strerror(errno));*/
+ return 1;
+ }
+ do_smp_scan_config(p+o, length-o);
+ munmap(p, (length+4095)&0xFFFFF000);
+ return 0;
+}
+
+static int intelDetectSMP(void)
+{
+ int mem_fd;
+
+ mem_fd=open("/dev/mem", O_RDONLY);
+
+ if(mem_fd==-1)
+ {
+ /*logMessage("Error detecting SMP: /dev/mem: %s", strerror(errno));*/
+ }
+
+ /*
+ * FIXME: Linux assumes you have 640K of base ram..
+ * this continues the error...
+ *
+ * 1) Scan the bottom 1K for a signature
+ * 2) Scan the top 1K of base RAM
+ * 3) Scan the 64K of bios
+ */
+ if (!smp_scan_config(mem_fd, 0x0, 0x400) &&
+ !smp_scan_config(mem_fd, 639*0x400,0x400) &&
+ !smp_scan_config(mem_fd, 0xF0000,0x10000)) {
+#if 0
+
+ /*
+ * If it is an SMP machine we should know now, unless the
+ * configuration is in an EISA/MCA bus machine with an
+ * extended bios data area.
+ *
+ * there is a real-mode segmented pointer pointing to the
+ * 4K EBDA area at 0x40E, calculate and scan it here.
+ *
+ * NOTE! There are Linux loaders that will corrupt the EBDA
+ * area, and as such this kind of SMP config may be less
+ * trustworthy, simply because the SMP table may have been
+ * stomped on during early boot. These loaders are buggy and
+ * should be fixed.
+ */
+ unsigned int address;
+
+ address = *(unsigned short *)phys_to_virt(0x40E);
+ address<<=4;
+ smp_scan_config(mem_fd, address, 0x1000);
+ if (smp_found_config)
+ /*logMessage("WARNING: MP table in the EBDA can be UNSAFE, contact linux-smp@vger.rutgers.edu if you experience SMP problems!\n");*/
+#endif
+ }
+/*
+ if(smp_found_config)
+ logMessage("Detected SMP capable motherboard\n");
+ else
+ logMessage("Detected non SMP capable motherboard\n");
+*/
+ return smp_found_config;
+}
+
+int detectSMP(void)
+{
+ static int isSMP = -1;
+
+ if (isSMP != -1)
+ return isSMP;
+
+ return isSMP = intelDetectSMP();
+}
+
+#endif /* __i386__ */
--- /dev/null
+ License information
+ -------------------
+
+The x86emu library is under a BSD style license, comaptible
+with the XFree86 and X licenses used by XFree86. The
+original x86emu libraries were under the GNU General Public
+License. Due to license incompatibilities between the GPL
+and the XFree86 license, the original authors of the code
+decided to allow a license change. If you have submitted
+code to the original x86emu project, and you don't agree
+with the license change, please contact us and let you
+know. Your code will be removed to comply with your wishes.
+
+If you have any questions about this, please send email to
+x86emu@linuxlabs.com or KendallB@scitechsoft.com for
+clarification.
+
--- /dev/null
+#############################################################################
+#
+# Realmode X86 Emulator Library
+#
+# Copyright (C) 1996-1999 SciTech Software, Inc.
+#
+# ========================================================================
+#
+# Permission to use, copy, modify, distribute, and sell this software and
+# its documentation for any purpose is hereby granted without fee,
+# provided that the above copyright notice appear in all copies and that
+# both that copyright notice and this permission notice appear in
+# supporting documentation, and that the name of the authors not be used
+# in advertising or publicity pertaining to distribution of the software
+# without specific, written prior permission. The authors makes no
+# representations about the suitability of this software for any purpose.
+# It is provided "as is" without express or implied warranty.
+#
+# THE AUTHORS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+# EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
+# USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
+# OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+# PERFORMANCE OF THIS SOFTWARE.
+#
+# ========================================================================
+#
+# Descripton: Linux specific makefile for the x86emu library.
+#
+#############################################################################
+
+TARGETLIB = ../libhd.a
+TARGETDEBUGLIB = ../libx86emud.a
+
+OBJS=\
+debug.o \
+decode.o \
+fpu.o \
+ops.o \
+ops2.o \
+prim_ops.o \
+sys.o
+
+DEBUGOBJS=debug.d \
+ decode.d \
+ fpu.d \
+ ops.d \
+ ops2.d \
+ prim_ops.d \
+ sys.d
+
+.SUFFIXES: .d
+
+all: $(TARGETLIB)
+
+$(TARGETLIB): $(OBJS)
+# prefix objects with x86emu_
+ @for i in $? ; do cp -p $$i x86emu_$$i ; ar rv $@ x86emu_$$i || exit ; rm -f x86emu_$$i ; done
+
+$(TARGETDEBUGLIB): $(DEBUGOBJS)
+ ar rv $(TARGETDEBUGLIB) $(DEBUGOBJS)
+
+INCS = -I. -Ix86emu -Iinclude
+CFLAGS += -D__DRIVER__ -DFORCE_POST -D_CEXPORT= -DNO_LONG_LONG
+CDEBUGFLAGS = -DDEBUG
+
+.c.o:
+ gcc -c $(CFLAGS) $(INCS) $*.c
+
+.c.d:
+ gcc -c -o$*.d $(CFLAGS) $(CDEBUGFLAGS) $(INCS) $*.c
+
+.cpp.o:
+ gcc -c $(CFLAGS) $(INCS) $*.cpp
+
+install: all
+
+distclean: clean
+ @rm -f *~
+
+clean:
+ @rm -f *.o *.d
+
+validate: validate.o ../libx86emu.a
+ gcc -o validate validate.o -lx86emu -L..
--- /dev/null
+/****************************************************************************
+*
+* Realmode X86 Emulator Library
+*
+* Copyright (C) 1996-1999 SciTech Software, Inc.
+* Copyright (C) David Mosberger-Tang
+* Copyright (C) 1999 Egbert Eich
+*
+* ========================================================================
+*
+* Permission to use, copy, modify, distribute, and sell this software and
+* its documentation for any purpose is hereby granted without fee,
+* provided that the above copyright notice appear in all copies and that
+* both that copyright notice and this permission notice appear in
+* supporting documentation, and that the name of the authors not be used
+* in advertising or publicity pertaining to distribution of the software
+* without specific, written prior permission. The authors makes no
+* representations about the suitability of this software for any purpose.
+* It is provided "as is" without express or implied warranty.
+*
+* THE AUTHORS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+* EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
+* USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
+* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+* PERFORMANCE OF THIS SOFTWARE.
+*
+* ========================================================================
+*
+* Language: ANSI C
+* Environment: Any
+* Developer: Kendall Bennett
+*
+* Description: This file contains the code to handle debugging of the
+* emulator.
+*
+****************************************************************************/
+/* $XFree86: xc/extras/x86emu/src/x86emu/debug.c,v 1.2 2000/04/05 18:13:14 dawes Exp $ */
+
+#include "x86emu/x86emui.h"
+#ifdef IN_MODULE
+#include "xf86_ansic.h"
+#else
+#include <stdarg.h>
+#include <stdlib.h>
+#endif
+
+/*----------------------------- Implementation ----------------------------*/
+
+#ifdef DEBUG
+
+static void print_encoded_bytes (u16 s, u16 o);
+static void print_decoded_instruction (void);
+static int parse_line (char *s, int *ps, int *n);
+
+/* should look something like debug's output. */
+void X86EMU_trace_regs (void)
+{
+ if (DEBUG_TRACE()) {
+ x86emu_dump_regs();
+ }
+ if (DEBUG_DECODE() && ! DEBUG_DECODE_NOPRINT()) {
+ printk("%04x:%04x ",M.x86.saved_cs, M.x86.saved_ip);
+ print_encoded_bytes( M.x86.saved_cs, M.x86.saved_ip);
+ print_decoded_instruction();
+ }
+}
+
+void X86EMU_trace_xregs (void)
+{
+ if (DEBUG_TRACE()) {
+ x86emu_dump_xregs();
+ }
+}
+
+void x86emu_just_disassemble (void)
+{
+ /*
+ * This routine called if the flag DEBUG_DISASSEMBLE is set kind
+ * of a hack!
+ */
+ printk("%04x:%04x ",M.x86.saved_cs, M.x86.saved_ip);
+ print_encoded_bytes( M.x86.saved_cs, M.x86.saved_ip);
+ print_decoded_instruction();
+}
+
+static void disassemble_forward (u16 seg, u16 off, int n)
+{
+ X86EMU_sysEnv tregs;
+ int i;
+ u8 op1;
+ /*
+ * hack, hack, hack. What we do is use the exact machinery set up
+ * for execution, except that now there is an additional state
+ * flag associated with the "execution", and we are using a copy
+ * of the register struct. All the major opcodes, once fully
+ * decoded, have the following two steps: TRACE_REGS(r,m);
+ * SINGLE_STEP(r,m); which disappear if DEBUG is not defined to
+ * the preprocessor. The TRACE_REGS macro expands to:
+ *
+ * if (debug&DEBUG_DISASSEMBLE)
+ * {just_disassemble(); goto EndOfInstruction;}
+ * if (debug&DEBUG_TRACE) trace_regs(r,m);
+ *
+ * ...... and at the last line of the routine.
+ *
+ * EndOfInstruction: end_instr();
+ *
+ * Up to the point where TRACE_REG is expanded, NO modifications
+ * are done to any register EXCEPT the IP register, for fetch and
+ * decoding purposes.
+ *
+ * This was done for an entirely different reason, but makes a
+ * nice way to get the system to help debug codes.
+ */
+ tregs = M;
+ tregs.x86.R_IP = off;
+ tregs.x86.R_CS = seg;
+
+ /* reset the decoding buffers */
+ tregs.x86.enc_str_pos = 0;
+ tregs.x86.enc_pos = 0;
+
+ /* turn on the "disassemble only, no execute" flag */
+ tregs.x86.debug |= DEBUG_DISASSEMBLE_F;
+
+ /* DUMP NEXT n instructions to screen in straight_line fashion */
+ /*
+ * This looks like the regular instruction fetch stream, except
+ * that when this occurs, each fetched opcode, upon seeing the
+ * DEBUG_DISASSEMBLE flag set, exits immediately after decoding
+ * the instruction. XXX --- CHECK THAT MEM IS NOT AFFECTED!!!
+ * Note the use of a copy of the register structure...
+ */
+ for (i=0; i<n; i++) {
+ op1 = (*sys_rdb)(((u32)M.x86.R_CS<<4) + (M.x86.R_IP++));
+ (x86emu_optab[op1])(op1);
+ }
+ /* end major hack mode. */
+}
+
+void x86emu_check_ip_access (void)
+{
+ /* NULL as of now */
+}
+
+void x86emu_check_sp_access (void)
+{
+}
+
+void x86emu_check_mem_access (u32 dummy)
+{
+ /* check bounds, etc */
+}
+
+void x86emu_check_data_access (uint dummy1, uint dummy2)
+{
+ /* check bounds, etc */
+}
+
+void x86emu_inc_decoded_inst_len (int x)
+{
+ M.x86.enc_pos += x;
+}
+
+void x86emu_decode_printf (char *x)
+{
+ sprintf(M.x86.decoded_buf+M.x86.enc_str_pos,"%s",x);
+ M.x86.enc_str_pos += strlen(x);
+}
+
+void x86emu_decode_printf2 (char *x, int y)
+{
+ char temp[100];
+ sprintf(temp,x,y);
+ sprintf(M.x86.decoded_buf+M.x86.enc_str_pos,"%s",temp);
+ M.x86.enc_str_pos += strlen(temp);
+}
+
+void x86emu_end_instr (void)
+{
+ M.x86.enc_str_pos = 0;
+ M.x86.enc_pos = 0;
+}
+
+static void print_encoded_bytes (u16 s, u16 o)
+{
+ int i;
+ char buf1[64];
+ for (i=0; i< M.x86.enc_pos; i++) {
+ sprintf(buf1+2*i,"%02x", fetch_data_byte_abs(s,o+i));
+ }
+ printk("%-20s",buf1);
+}
+
+static void print_decoded_instruction (void)
+{
+ printk("%s", M.x86.decoded_buf);
+}
+
+void x86emu_print_int_vect (u16 iv)
+{
+ u16 seg,off;
+
+ if (iv > 256) return;
+ seg = fetch_data_word_abs(0,iv*4);
+ off = fetch_data_word_abs(0,iv*4+2);
+ printk("%04x:%04x ", seg, off);
+}
+
+void X86EMU_dump_memory (u16 seg, u16 off, u32 amt)
+{
+ u32 start = off & 0xfffffff0;
+ u32 end = (off+16) & 0xfffffff0;
+ u32 i;
+ u32 current;
+
+ current = start;
+ while (end <= off + amt) {
+ printk("%04x:%04x ", seg, start);
+ for (i=start; i< off; i++)
+ printk(" ");
+ for ( ; i< end; i++)
+ printk("%02x ", fetch_data_byte_abs(seg,i));
+ printk("\n");
+ start = end;
+ end = start + 16;
+ }
+}
+
+void x86emu_single_step (void)
+{
+ char s[1024];
+ int ps[10];
+ int ntok;
+ int cmd;
+ int done;
+ int segment;
+ int offset;
+ static int breakpoint;
+ static int noDecode = 1;
+
+ char *p;
+
+ if (DEBUG_BREAK()) {
+ if (M.x86.saved_ip != breakpoint) {
+ return;
+ } else {
+ M.x86.debug &= ~DEBUG_DECODE_NOPRINT_F;
+ M.x86.debug |= DEBUG_TRACE_F;
+ M.x86.debug &= ~DEBUG_BREAK_F;
+ print_decoded_instruction ();
+ X86EMU_trace_regs();
+ }
+ }
+ done=0;
+ offset = M.x86.saved_ip;
+ while (!done) {
+ printk("-");
+ p = fgets(s, 1023, stdin);
+ cmd = parse_line(s, ps, &ntok);
+ switch(cmd) {
+ case 'u':
+ disassemble_forward(M.x86.saved_cs,(u16)offset,10);
+ break;
+ case 'd':
+ if (ntok == 2) {
+ segment = M.x86.saved_cs;
+ offset = ps[1];
+ X86EMU_dump_memory(segment,(u16)offset,16);
+ offset += 16;
+ } else if (ntok == 3) {
+ segment = ps[1];
+ offset = ps[2];
+ X86EMU_dump_memory(segment,(u16)offset,16);
+ offset += 16;
+ } else {
+ segment = M.x86.saved_cs;
+ X86EMU_dump_memory(segment,(u16)offset,16);
+ offset += 16;
+ }
+ break;
+ case 'c':
+ M.x86.debug ^= DEBUG_TRACECALL_F;
+ break;
+ case 's':
+ M.x86.debug ^= DEBUG_SVC_F | DEBUG_SYS_F | DEBUG_SYSINT_F;
+ break;
+ case 'r':
+ X86EMU_trace_regs();
+ break;
+ case 'x':
+ X86EMU_trace_xregs();
+ break;
+ case 'g':
+ if (ntok == 2) {
+ breakpoint = ps[1];
+ if (noDecode) {
+ M.x86.debug |= DEBUG_DECODE_NOPRINT_F;
+ } else {
+ M.x86.debug &= ~DEBUG_DECODE_NOPRINT_F;
+ }
+ M.x86.debug &= ~DEBUG_TRACE_F;
+ M.x86.debug |= DEBUG_BREAK_F;
+ done = 1;
+ }
+ break;
+ case 'q':
+ M.x86.debug |= DEBUG_EXIT;
+ return;
+ case 'P':
+ noDecode = (noDecode)?0:1;
+ printk("Toggled decoding to %s\n",(noDecode)?"FALSE":"TRUE");
+ break;
+ case 't':
+ case 0:
+ done = 1;
+ break;
+ }
+ }
+}
+
+int X86EMU_trace_on(void)
+{
+ return M.x86.debug |= DEBUG_STEP_F | DEBUG_DECODE_F | DEBUG_TRACE_F;
+}
+
+int X86EMU_trace_off(void)
+{
+ return M.x86.debug &= ~(DEBUG_STEP_F | DEBUG_DECODE_F | DEBUG_TRACE_F);
+}
+
+static int parse_line (char *s, int *ps, int *n)
+{
+ int cmd;
+
+ *n = 0;
+ while(*s == ' ' || *s == '\t') s++;
+ ps[*n] = *s;
+ switch (*s) {
+ case '\n':
+ *n += 1;
+ return 0;
+ default:
+ cmd = *s;
+ *n += 1;
+ }
+
+ while (1) {
+ while (*s != ' ' && *s != '\t' && *s != '\n') s++;
+
+ if (*s == '\n')
+ return cmd;
+
+ while(*s == ' ' || *s == '\t') s++;
+
+ sscanf(s,"%x",&ps[*n]);
+ *n += 1;
+ }
+}
+
+#endif /* DEBUG */
+
+void x86emu_dump_regs (void)
+{
+ printk("\tAX=%04x ", M.x86.R_AX );
+ printk("BX=%04x ", M.x86.R_BX );
+ printk("CX=%04x ", M.x86.R_CX );
+ printk("DX=%04x ", M.x86.R_DX );
+ printk("SP=%04x ", M.x86.R_SP );
+ printk("BP=%04x ", M.x86.R_BP );
+ printk("SI=%04x ", M.x86.R_SI );
+ printk("DI=%04x\n", M.x86.R_DI );
+ printk("\tDS=%04x ", M.x86.R_DS );
+ printk("ES=%04x ", M.x86.R_ES );
+ printk("SS=%04x ", M.x86.R_SS );
+ printk("CS=%04x ", M.x86.R_CS );
+ printk("IP=%04x ", M.x86.R_IP );
+ if (ACCESS_FLAG(F_OF)) printk("OV "); /* CHECKED... */
+ else printk("NV ");
+ if (ACCESS_FLAG(F_DF)) printk("DN ");
+ else printk("UP ");
+ if (ACCESS_FLAG(F_IF)) printk("EI ");
+ else printk("DI ");
+ if (ACCESS_FLAG(F_SF)) printk("NG ");
+ else printk("PL ");
+ if (ACCESS_FLAG(F_ZF)) printk("ZR ");
+ else printk("NZ ");
+ if (ACCESS_FLAG(F_AF)) printk("AC ");
+ else printk("NA ");
+ if (ACCESS_FLAG(F_PF)) printk("PE ");
+ else printk("PO ");
+ if (ACCESS_FLAG(F_CF)) printk("CY ");
+ else printk("NC ");
+ printk("\n");
+}
+
+void x86emu_dump_xregs (void)
+{
+ printk("\tEAX=%08x ", M.x86.R_EAX );
+ printk("EBX=%08x ", M.x86.R_EBX );
+ printk("ECX=%08x ", M.x86.R_ECX );
+ printk("EDX=%08x \n", M.x86.R_EDX );
+ printk("\tESP=%08x ", M.x86.R_ESP );
+ printk("EBP=%08x ", M.x86.R_EBP );
+ printk("ESI=%08x ", M.x86.R_ESI );
+ printk("EDI=%08x\n", M.x86.R_EDI );
+ printk("\tDS=%04x ", M.x86.R_DS );
+ printk("ES=%04x ", M.x86.R_ES );
+ printk("SS=%04x ", M.x86.R_SS );
+ printk("CS=%04x ", M.x86.R_CS );
+ printk("EIP=%08x\n\t", M.x86.R_EIP );
+ if (ACCESS_FLAG(F_OF)) printk("OV "); /* CHECKED... */
+ else printk("NV ");
+ if (ACCESS_FLAG(F_DF)) printk("DN ");
+ else printk("UP ");
+ if (ACCESS_FLAG(F_IF)) printk("EI ");
+ else printk("DI ");
+ if (ACCESS_FLAG(F_SF)) printk("NG ");
+ else printk("PL ");
+ if (ACCESS_FLAG(F_ZF)) printk("ZR ");
+ else printk("NZ ");
+ if (ACCESS_FLAG(F_AF)) printk("AC ");
+ else printk("NA ");
+ if (ACCESS_FLAG(F_PF)) printk("PE ");
+ else printk("PO ");
+ if (ACCESS_FLAG(F_CF)) printk("CY ");
+ else printk("NC ");
+ printk("\n");
+}
--- /dev/null
+/****************************************************************************
+*
+* Realmode X86 Emulator Library
+*
+* Copyright (C) 1996-1999 SciTech Software, Inc.
+* Copyright (C) David Mosberger-Tang
+* Copyright (C) 1999 Egbert Eich
+*
+* ========================================================================
+*
+* Permission to use, copy, modify, distribute, and sell this software and
+* its documentation for any purpose is hereby granted without fee,
+* provided that the above copyright notice appear in all copies and that
+* both that copyright notice and this permission notice appear in
+* supporting documentation, and that the name of the authors not be used
+* in advertising or publicity pertaining to distribution of the software
+* without specific, written prior permission. The authors makes no
+* representations about the suitability of this software for any purpose.
+* It is provided "as is" without express or implied warranty.
+*
+* THE AUTHORS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+* EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
+* USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
+* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+* PERFORMANCE OF THIS SOFTWARE.
+*
+* ========================================================================
+*
+* Language: ANSI C
+* Environment: Any
+* Developer: Kendall Bennett
+*
+* Description: This file includes subroutines which are related to
+* instruction decoding and accessess of immediate data via IP. etc.
+*
+****************************************************************************/
+
+/* $XFree86: xc/extras/x86emu/src/x86emu/decode.c,v 1.11 2002/07/23 20:20:43 tsi Exp $ */
+
+#include "x86emu/x86emui.h"
+
+/*----------------------------- Implementation ----------------------------*/
+
+/****************************************************************************
+REMARKS:
+Handles any pending asychronous interrupts.
+****************************************************************************/
+static void x86emu_intr_handle(void)
+{
+ u8 intno;
+
+ if (M.x86.intr & INTR_SYNCH) {
+ intno = M.x86.intno;
+ if (_X86EMU_intrTab[intno]) {
+ (*_X86EMU_intrTab[intno])(intno);
+ } else {
+ push_word((u16)M.x86.R_FLG);
+ CLEAR_FLAG(F_IF);
+ CLEAR_FLAG(F_TF);
+ push_word(M.x86.R_CS);
+ M.x86.R_CS = mem_access_word(intno * 4 + 2);
+ push_word(M.x86.R_IP);
+ M.x86.R_IP = mem_access_word(intno * 4);
+ M.x86.intr = 0;
+ }
+ }
+}
+
+/****************************************************************************
+PARAMETERS:
+intrnum - Interrupt number to raise
+
+REMARKS:
+Raise the specified interrupt to be handled before the execution of the
+next instruction.
+****************************************************************************/
+void x86emu_intr_raise(
+ u8 intrnum)
+{
+ M.x86.intno = intrnum;
+ M.x86.intr |= INTR_SYNCH;
+}
+
+/****************************************************************************
+REMARKS:
+Main execution loop for the emulator. We return from here when the system
+halts, which is normally caused by a stack fault when we return from the
+original real mode call.
+****************************************************************************/
+#include <time.h>
+void X86EMU_exec(unsigned timeout)
+{
+ u8 op1;
+ unsigned instr_cnt = 0;
+ unsigned debug = timeout & (1 << 31);
+ time_t t0 = time(NULL);
+
+ timeout &= ~(1 << 31);
+
+ M.x86.intr = 0;
+ DB(x86emu_end_instr();)
+
+ for (;;) {
+DB( if (CHECK_IP_FETCH())
+ x86emu_check_ip_access();)
+ /* If debugging, save the IP and CS values. */
+ SAVE_IP_CS(M.x86.R_CS, M.x86.R_IP);
+ INC_DECODED_INST_LEN(1);
+ if (M.x86.intr) {
+ if (M.x86.intr & INTR_HALTED) {
+DB( if (M.x86.R_SP != 0) {
+ printk("halted\n");
+ X86EMU_trace_regs();
+ }
+ else {
+ if (M.x86.debug)
+ printk("Service completed successfully\n");
+ })
+ return;
+ }
+ if (((M.x86.intr & INTR_SYNCH) && (M.x86.intno == 0 || M.x86.intno == 2)) ||
+ !ACCESS_FLAG(F_IF)) {
+ x86emu_intr_handle();
+ }
+ }
+ op1 = (*sys_rdb)(((u32)M.x86.R_CS << 4) + (M.x86.R_IP++));
+ if (debug) {
+ fprintf(stderr, "%6u: %04x:%04x %02x\n", instr_cnt++, M.x86.R_CS, M.x86.R_IP - 1, op1);
+ }
+ if(!(instr_cnt & 0xffff) && timeout && time(NULL) - t0 > timeout) {
+ if (debug) {
+ fprintf(stderr, "*** %us timeout ***\n", timeout);
+ }
+ return;
+ }
+ (*x86emu_optab[op1])(op1);
+ if (M.x86.debug & DEBUG_EXIT) {
+ M.x86.debug &= ~DEBUG_EXIT;
+ return;
+ }
+ }
+}
+
+/****************************************************************************
+REMARKS:
+Halts the system by setting the halted system flag.
+****************************************************************************/
+void X86EMU_halt_sys(void)
+{
+ M.x86.intr |= INTR_HALTED;
+}
+
+/****************************************************************************
+PARAMETERS:
+mod - Mod value from decoded byte
+regh - Reg h value from decoded byte
+regl - Reg l value from decoded byte
+
+REMARKS:
+Raise the specified interrupt to be handled before the execution of the
+next instruction.
+
+NOTE: Do not inline this function, as (*sys_rdb) is already inline!
+****************************************************************************/
+void fetch_decode_modrm(
+ int *mod,
+ int *regh,
+ int *regl)
+{
+ int fetched;
+
+DB( if (CHECK_IP_FETCH())
+ x86emu_check_ip_access();)
+ fetched = (*sys_rdb)(((u32)M.x86.R_CS << 4) + (M.x86.R_IP++));
+ INC_DECODED_INST_LEN(1);
+ *mod = (fetched >> 6) & 0x03;
+ *regh = (fetched >> 3) & 0x07;
+ *regl = (fetched >> 0) & 0x07;
+}
+
+/****************************************************************************
+RETURNS:
+Immediate byte value read from instruction queue
+
+REMARKS:
+This function returns the immediate byte from the instruction queue, and
+moves the instruction pointer to the next value.
+
+NOTE: Do not inline this function, as (*sys_rdb) is already inline!
+****************************************************************************/
+u8 fetch_byte_imm(void)
+{
+ u8 fetched;
+
+DB( if (CHECK_IP_FETCH())
+ x86emu_check_ip_access();)
+ fetched = (*sys_rdb)(((u32)M.x86.R_CS << 4) + (M.x86.R_IP++));
+ INC_DECODED_INST_LEN(1);
+ return fetched;
+}
+
+/****************************************************************************
+RETURNS:
+Immediate word value read from instruction queue
+
+REMARKS:
+This function returns the immediate byte from the instruction queue, and
+moves the instruction pointer to the next value.
+
+NOTE: Do not inline this function, as (*sys_rdw) is already inline!
+****************************************************************************/
+u16 fetch_word_imm(void)
+{
+ u16 fetched;
+
+DB( if (CHECK_IP_FETCH())
+ x86emu_check_ip_access();)
+ fetched = (*sys_rdw)(((u32)M.x86.R_CS << 4) + (M.x86.R_IP));
+ M.x86.R_IP += 2;
+ INC_DECODED_INST_LEN(2);
+ return fetched;
+}
+
+/****************************************************************************
+RETURNS:
+Immediate lone value read from instruction queue
+
+REMARKS:
+This function returns the immediate byte from the instruction queue, and
+moves the instruction pointer to the next value.
+
+NOTE: Do not inline this function, as (*sys_rdw) is already inline!
+****************************************************************************/
+u32 fetch_long_imm(void)
+{
+ u32 fetched;
+
+DB( if (CHECK_IP_FETCH())
+ x86emu_check_ip_access();)
+ fetched = (*sys_rdl)(((u32)M.x86.R_CS << 4) + (M.x86.R_IP));
+ M.x86.R_IP += 4;
+ INC_DECODED_INST_LEN(4);
+ return fetched;
+}
+
+/****************************************************************************
+RETURNS:
+Value of the default data segment
+
+REMARKS:
+Inline function that returns the default data segment for the current
+instruction.
+
+On the x86 processor, the default segment is not always DS if there is
+no segment override. Address modes such as -3[BP] or 10[BP+SI] all refer to
+addresses relative to SS (ie: on the stack). So, at the minimum, all
+decodings of addressing modes would have to set/clear a bit describing
+whether the access is relative to DS or SS. That is the function of the
+cpu-state-varible M.x86.mode. There are several potential states:
+
+ repe prefix seen (handled elsewhere)
+ repne prefix seen (ditto)
+
+ cs segment override
+ ds segment override
+ es segment override
+ fs segment override
+ gs segment override
+ ss segment override
+
+ ds/ss select (in absense of override)
+
+Each of the above 7 items are handled with a bit in the mode field.
+****************************************************************************/
+_INLINE u32 get_data_segment(void)
+{
+#define GET_SEGMENT(segment)
+ switch (M.x86.mode & SYSMODE_SEGMASK) {
+ case 0: /* default case: use ds register */
+ case SYSMODE_SEGOVR_DS:
+ case SYSMODE_SEGOVR_DS | SYSMODE_SEG_DS_SS:
+ return M.x86.R_DS;
+ case SYSMODE_SEG_DS_SS: /* non-overridden, use ss register */
+ return M.x86.R_SS;
+ case SYSMODE_SEGOVR_CS:
+ case SYSMODE_SEGOVR_CS | SYSMODE_SEG_DS_SS:
+ return M.x86.R_CS;
+ case SYSMODE_SEGOVR_ES:
+ case SYSMODE_SEGOVR_ES | SYSMODE_SEG_DS_SS:
+ return M.x86.R_ES;
+ case SYSMODE_SEGOVR_FS:
+ case SYSMODE_SEGOVR_FS | SYSMODE_SEG_DS_SS:
+ return M.x86.R_FS;
+ case SYSMODE_SEGOVR_GS:
+ case SYSMODE_SEGOVR_GS | SYSMODE_SEG_DS_SS:
+ return M.x86.R_GS;
+ case SYSMODE_SEGOVR_SS:
+ case SYSMODE_SEGOVR_SS | SYSMODE_SEG_DS_SS:
+ return M.x86.R_SS;
+ default:
+#ifdef DEBUG
+ printk("error: should not happen: multiple overrides.\n");
+#endif
+ HALT_SYS();
+ return 0;
+ }
+}
+
+/****************************************************************************
+PARAMETERS:
+offset - Offset to load data from
+
+RETURNS:
+Byte value read from the absolute memory location.
+
+NOTE: Do not inline this function as (*sys_rdX) is already inline!
+****************************************************************************/
+u8 fetch_data_byte(
+ uint offset)
+{
+#ifdef DEBUG
+ if (CHECK_DATA_ACCESS())
+ x86emu_check_data_access((u16)get_data_segment(), offset);
+#endif
+ return (*sys_rdb)((get_data_segment() << 4) + offset);
+}
+
+/****************************************************************************
+PARAMETERS:
+offset - Offset to load data from
+
+RETURNS:
+Word value read from the absolute memory location.
+
+NOTE: Do not inline this function as (*sys_rdX) is already inline!
+****************************************************************************/
+u16 fetch_data_word(
+ uint offset)
+{
+#ifdef DEBUG
+ if (CHECK_DATA_ACCESS())
+ x86emu_check_data_access((u16)get_data_segment(), offset);
+#endif
+ return (*sys_rdw)((get_data_segment() << 4) + offset);
+}
+
+/****************************************************************************
+PARAMETERS:
+offset - Offset to load data from
+
+RETURNS:
+Long value read from the absolute memory location.
+
+NOTE: Do not inline this function as (*sys_rdX) is already inline!
+****************************************************************************/
+u32 fetch_data_long(
+ uint offset)
+{
+#ifdef DEBUG
+ if (CHECK_DATA_ACCESS())
+ x86emu_check_data_access((u16)get_data_segment(), offset);
+#endif
+ return (*sys_rdl)((get_data_segment() << 4) + offset);
+}
+
+/****************************************************************************
+PARAMETERS:
+segment - Segment to load data from
+offset - Offset to load data from
+
+RETURNS:
+Byte value read from the absolute memory location.
+
+NOTE: Do not inline this function as (*sys_rdX) is already inline!
+****************************************************************************/
+u8 fetch_data_byte_abs(
+ uint segment,
+ uint offset)
+{
+#ifdef DEBUG
+ if (CHECK_DATA_ACCESS())
+ x86emu_check_data_access(segment, offset);
+#endif
+ return (*sys_rdb)(((u32)segment << 4) + offset);
+}
+
+/****************************************************************************
+PARAMETERS:
+segment - Segment to load data from
+offset - Offset to load data from
+
+RETURNS:
+Word value read from the absolute memory location.
+
+NOTE: Do not inline this function as (*sys_rdX) is already inline!
+****************************************************************************/
+u16 fetch_data_word_abs(
+ uint segment,
+ uint offset)
+{
+#ifdef DEBUG
+ if (CHECK_DATA_ACCESS())
+ x86emu_check_data_access(segment, offset);
+#endif
+ return (*sys_rdw)(((u32)segment << 4) + offset);
+}
+
+/****************************************************************************
+PARAMETERS:
+segment - Segment to load data from
+offset - Offset to load data from
+
+RETURNS:
+Long value read from the absolute memory location.
+
+NOTE: Do not inline this function as (*sys_rdX) is already inline!
+****************************************************************************/
+u32 fetch_data_long_abs(
+ uint segment,
+ uint offset)
+{
+#ifdef DEBUG
+ if (CHECK_DATA_ACCESS())
+ x86emu_check_data_access(segment, offset);
+#endif
+ return (*sys_rdl)(((u32)segment << 4) + offset);
+}
+
+/****************************************************************************
+PARAMETERS:
+offset - Offset to store data at
+val - Value to store
+
+REMARKS:
+Writes a word value to an segmented memory location. The segment used is
+the current 'default' segment, which may have been overridden.
+
+NOTE: Do not inline this function as (*sys_wrX) is already inline!
+****************************************************************************/
+void store_data_byte(
+ uint offset,
+ u8 val)
+{
+#ifdef DEBUG
+ if (CHECK_DATA_ACCESS())
+ x86emu_check_data_access((u16)get_data_segment(), offset);
+#endif
+ (*sys_wrb)((get_data_segment() << 4) + offset, val);
+}
+
+/****************************************************************************
+PARAMETERS:
+offset - Offset to store data at
+val - Value to store
+
+REMARKS:
+Writes a word value to an segmented memory location. The segment used is
+the current 'default' segment, which may have been overridden.
+
+NOTE: Do not inline this function as (*sys_wrX) is already inline!
+****************************************************************************/
+void store_data_word(
+ uint offset,
+ u16 val)
+{
+#ifdef DEBUG
+ if (CHECK_DATA_ACCESS())
+ x86emu_check_data_access((u16)get_data_segment(), offset);
+#endif
+ (*sys_wrw)((get_data_segment() << 4) + offset, val);
+}
+
+/****************************************************************************
+PARAMETERS:
+offset - Offset to store data at
+val - Value to store
+
+REMARKS:
+Writes a long value to an segmented memory location. The segment used is
+the current 'default' segment, which may have been overridden.
+
+NOTE: Do not inline this function as (*sys_wrX) is already inline!
+****************************************************************************/
+void store_data_long(
+ uint offset,
+ u32 val)
+{
+#ifdef DEBUG
+ if (CHECK_DATA_ACCESS())
+ x86emu_check_data_access((u16)get_data_segment(), offset);
+#endif
+ (*sys_wrl)((get_data_segment() << 4) + offset, val);
+}
+
+/****************************************************************************
+PARAMETERS:
+segment - Segment to store data at
+offset - Offset to store data at
+val - Value to store
+
+REMARKS:
+Writes a byte value to an absolute memory location.
+
+NOTE: Do not inline this function as (*sys_wrX) is already inline!
+****************************************************************************/
+void store_data_byte_abs(
+ uint segment,
+ uint offset,
+ u8 val)
+{
+#ifdef DEBUG
+ if (CHECK_DATA_ACCESS())
+ x86emu_check_data_access(segment, offset);
+#endif
+ (*sys_wrb)(((u32)segment << 4) + offset, val);
+}
+
+/****************************************************************************
+PARAMETERS:
+segment - Segment to store data at
+offset - Offset to store data at
+val - Value to store
+
+REMARKS:
+Writes a word value to an absolute memory location.
+
+NOTE: Do not inline this function as (*sys_wrX) is already inline!
+****************************************************************************/
+void store_data_word_abs(
+ uint segment,
+ uint offset,
+ u16 val)
+{
+#ifdef DEBUG
+ if (CHECK_DATA_ACCESS())
+ x86emu_check_data_access(segment, offset);
+#endif
+ (*sys_wrw)(((u32)segment << 4) + offset, val);
+}
+
+/****************************************************************************
+PARAMETERS:
+segment - Segment to store data at
+offset - Offset to store data at
+val - Value to store
+
+REMARKS:
+Writes a long value to an absolute memory location.
+
+NOTE: Do not inline this function as (*sys_wrX) is already inline!
+****************************************************************************/
+void store_data_long_abs(
+ uint segment,
+ uint offset,
+ u32 val)
+{
+#ifdef DEBUG
+ if (CHECK_DATA_ACCESS())
+ x86emu_check_data_access(segment, offset);
+#endif
+ (*sys_wrl)(((u32)segment << 4) + offset, val);
+}
+
+/****************************************************************************
+PARAMETERS:
+reg - Register to decode
+
+RETURNS:
+Pointer to the appropriate register
+
+REMARKS:
+Return a pointer to the register given by the R/RM field of the
+modrm byte, for byte operands. Also enables the decoding of instructions.
+****************************************************************************/
+u8* decode_rm_byte_register(
+ int reg)
+{
+ switch (reg) {
+ case 0:
+ DECODE_PRINTF("AL");
+ return &M.x86.R_AL;
+ case 1:
+ DECODE_PRINTF("CL");
+ return &M.x86.R_CL;
+ case 2:
+ DECODE_PRINTF("DL");
+ return &M.x86.R_DL;
+ case 3:
+ DECODE_PRINTF("BL");
+ return &M.x86.R_BL;
+ case 4:
+ DECODE_PRINTF("AH");
+ return &M.x86.R_AH;
+ case 5:
+ DECODE_PRINTF("CH");
+ return &M.x86.R_CH;
+ case 6:
+ DECODE_PRINTF("DH");
+ return &M.x86.R_DH;
+ case 7:
+ DECODE_PRINTF("BH");
+ return &M.x86.R_BH;
+ }
+ HALT_SYS();
+ return NULL; /* NOT REACHED OR REACHED ON ERROR */
+}
+
+/****************************************************************************
+PARAMETERS:
+reg - Register to decode
+
+RETURNS:
+Pointer to the appropriate register
+
+REMARKS:
+Return a pointer to the register given by the R/RM field of the
+modrm byte, for word operands. Also enables the decoding of instructions.
+****************************************************************************/
+u16* decode_rm_word_register(
+ int reg)
+{
+ switch (reg) {
+ case 0:
+ DECODE_PRINTF("AX");
+ return &M.x86.R_AX;
+ case 1:
+ DECODE_PRINTF("CX");
+ return &M.x86.R_CX;
+ case 2:
+ DECODE_PRINTF("DX");
+ return &M.x86.R_DX;
+ case 3:
+ DECODE_PRINTF("BX");
+ return &M.x86.R_BX;
+ case 4:
+ DECODE_PRINTF("SP");
+ return &M.x86.R_SP;
+ case 5:
+ DECODE_PRINTF("BP");
+ return &M.x86.R_BP;
+ case 6:
+ DECODE_PRINTF("SI");
+ return &M.x86.R_SI;
+ case 7:
+ DECODE_PRINTF("DI");
+ return &M.x86.R_DI;
+ }
+ HALT_SYS();
+ return NULL; /* NOTREACHED OR REACHED ON ERROR */
+}
+
+/****************************************************************************
+PARAMETERS:
+reg - Register to decode
+
+RETURNS:
+Pointer to the appropriate register
+
+REMARKS:
+Return a pointer to the register given by the R/RM field of the
+modrm byte, for dword operands. Also enables the decoding of instructions.
+****************************************************************************/
+u32* decode_rm_long_register(
+ int reg)
+{
+ switch (reg) {
+ case 0:
+ DECODE_PRINTF("EAX");
+ return &M.x86.R_EAX;
+ case 1:
+ DECODE_PRINTF("ECX");
+ return &M.x86.R_ECX;
+ case 2:
+ DECODE_PRINTF("EDX");
+ return &M.x86.R_EDX;
+ case 3:
+ DECODE_PRINTF("EBX");
+ return &M.x86.R_EBX;
+ case 4:
+ DECODE_PRINTF("ESP");
+ return &M.x86.R_ESP;
+ case 5:
+ DECODE_PRINTF("EBP");
+ return &M.x86.R_EBP;
+ case 6:
+ DECODE_PRINTF("ESI");
+ return &M.x86.R_ESI;
+ case 7:
+ DECODE_PRINTF("EDI");
+ return &M.x86.R_EDI;
+ }
+ HALT_SYS();
+ return NULL; /* NOTREACHED OR REACHED ON ERROR */
+}
+
+/****************************************************************************
+PARAMETERS:
+reg - Register to decode
+
+RETURNS:
+Pointer to the appropriate register
+
+REMARKS:
+Return a pointer to the register given by the R/RM field of the
+modrm byte, for word operands, modified from above for the weirdo
+special case of segreg operands. Also enables the decoding of instructions.
+****************************************************************************/
+u16* decode_rm_seg_register(
+ int reg)
+{
+ switch (reg) {
+ case 0:
+ DECODE_PRINTF("ES");
+ return &M.x86.R_ES;
+ case 1:
+ DECODE_PRINTF("CS");
+ return &M.x86.R_CS;
+ case 2:
+ DECODE_PRINTF("SS");
+ return &M.x86.R_SS;
+ case 3:
+ DECODE_PRINTF("DS");
+ return &M.x86.R_DS;
+ case 4:
+ DECODE_PRINTF("FS");
+ return &M.x86.R_FS;
+ case 5:
+ DECODE_PRINTF("GS");
+ return &M.x86.R_GS;
+ case 6:
+ case 7:
+ DECODE_PRINTF("ILLEGAL SEGREG");
+ break;
+ }
+ HALT_SYS();
+ return NULL; /* NOT REACHED OR REACHED ON ERROR */
+}
+
+/*
+ *
+ * return offset from the SIB Byte
+ */
+u32 decode_sib_address(int sib, int mod)
+{
+ u32 base = 0, i = 0, scale = 1;
+
+ switch(sib & 0x07) {
+ case 0:
+ DECODE_PRINTF("[EAX]");
+ base = M.x86.R_EAX;
+ break;
+ case 1:
+ DECODE_PRINTF("[ECX]");
+ base = M.x86.R_ECX;
+ break;
+ case 2:
+ DECODE_PRINTF("[EDX]");
+ base = M.x86.R_EDX;
+ break;
+ case 3:
+ DECODE_PRINTF("[EBX]");
+ base = M.x86.R_EBX;
+ break;
+ case 4:
+ DECODE_PRINTF("[ESP]");
+ base = M.x86.R_ESP;
+ M.x86.mode |= SYSMODE_SEG_DS_SS;
+ break;
+ case 5:
+ if (mod == 0) {
+ base = fetch_long_imm();
+ DECODE_PRINTF2("%08x", base);
+ } else {
+ DECODE_PRINTF("[EBP]");
+ base = M.x86.R_ESP;
+ M.x86.mode |= SYSMODE_SEG_DS_SS;
+ }
+ break;
+ case 6:
+ DECODE_PRINTF("[ESI]");
+ base = M.x86.R_ESI;
+ break;
+ case 7:
+ DECODE_PRINTF("[EDI]");
+ base = M.x86.R_EDI;
+ break;
+ }
+ switch ((sib >> 3) & 0x07) {
+ case 0:
+ DECODE_PRINTF("[EAX");
+ i = M.x86.R_EAX;
+ break;
+ case 1:
+ DECODE_PRINTF("[ECX");
+ i = M.x86.R_ECX;
+ break;
+ case 2:
+ DECODE_PRINTF("[EDX");
+ i = M.x86.R_EDX;
+ break;
+ case 3:
+ DECODE_PRINTF("[EBX");
+ i = M.x86.R_EBX;
+ break;
+ case 4:
+ i = 0;
+ break;
+ case 5:
+ DECODE_PRINTF("[EBP");
+ i = M.x86.R_EBP;
+ break;
+ case 6:
+ DECODE_PRINTF("[ESI");
+ i = M.x86.R_ESI;
+ break;
+ case 7:
+ DECODE_PRINTF("[EDI");
+ i = M.x86.R_EDI;
+ break;
+ }
+ scale = 1 << ((sib >> 6) & 0x03);
+ if (((sib >> 3) & 0x07) != 4) {
+ if (scale == 1) {
+ DECODE_PRINTF("]");
+ } else {
+ DECODE_PRINTF2("*%d]", scale);
+ }
+ }
+ return base + (i * scale);
+}
+
+/****************************************************************************
+PARAMETERS:
+rm - RM value to decode
+
+RETURNS:
+Offset in memory for the address decoding
+
+REMARKS:
+Return the offset given by mod=00 addressing. Also enables the
+decoding of instructions.
+
+NOTE: The code which specifies the corresponding segment (ds vs ss)
+ below in the case of [BP+..]. The assumption here is that at the
+ point that this subroutine is called, the bit corresponding to
+ SYSMODE_SEG_DS_SS will be zero. After every instruction
+ except the segment override instructions, this bit (as well
+ as any bits indicating segment overrides) will be clear. So
+ if a SS access is needed, set this bit. Otherwise, DS access
+ occurs (unless any of the segment override bits are set).
+****************************************************************************/
+u32 decode_rm00_address(
+ int rm)
+{
+ u32 offset;
+ int sib;
+
+ if (M.x86.mode & SYSMODE_PREFIX_ADDR) {
+ /* 32-bit addressing */
+ switch (rm) {
+ case 0:
+ DECODE_PRINTF("[EAX]");
+ return M.x86.R_EAX;
+ case 1:
+ DECODE_PRINTF("[ECX]");
+ return M.x86.R_ECX;
+ case 2:
+ DECODE_PRINTF("[EDX]");
+ return M.x86.R_EDX;
+ case 3:
+ DECODE_PRINTF("[EBX]");
+ return M.x86.R_EBX;
+ case 4:
+ sib = fetch_byte_imm();
+ return decode_sib_address(sib, 0);
+ case 5:
+ offset = fetch_long_imm();
+ DECODE_PRINTF2("[%08x]", offset);
+ return offset;
+ case 6:
+ DECODE_PRINTF("[ESI]");
+ return M.x86.R_ESI;
+ case 7:
+ DECODE_PRINTF("[EDI]");
+ return M.x86.R_EDI;
+ }
+ HALT_SYS();
+ } else {
+ /* 16-bit addressing */
+ switch (rm) {
+ case 0:
+ DECODE_PRINTF("[BX+SI]");
+ return (M.x86.R_BX + M.x86.R_SI) & 0xffff;
+ case 1:
+ DECODE_PRINTF("[BX+DI]");
+ return (M.x86.R_BX + M.x86.R_DI) & 0xffff;
+ case 2:
+ DECODE_PRINTF("[BP+SI]");
+ M.x86.mode |= SYSMODE_SEG_DS_SS;
+ return (M.x86.R_BP + M.x86.R_SI) & 0xffff;
+ case 3:
+ DECODE_PRINTF("[BP+DI]");
+ M.x86.mode |= SYSMODE_SEG_DS_SS;
+ return (M.x86.R_BP + M.x86.R_DI) & 0xffff;
+ case 4:
+ DECODE_PRINTF("[SI]");
+ return M.x86.R_SI;
+ case 5:
+ DECODE_PRINTF("[DI]");
+ return M.x86.R_DI;
+ case 6:
+ offset = fetch_word_imm();
+ DECODE_PRINTF2("[%04x]", offset);
+ return offset;
+ case 7:
+ DECODE_PRINTF("[BX]");
+ return M.x86.R_BX;
+ }
+ HALT_SYS();
+ }
+ return 0;
+}
+
+/****************************************************************************
+PARAMETERS:
+rm - RM value to decode
+
+RETURNS:
+Offset in memory for the address decoding
+
+REMARKS:
+Return the offset given by mod=01 addressing. Also enables the
+decoding of instructions.
+****************************************************************************/
+u32 decode_rm01_address(
+ int rm)
+{
+ int displacement = 0;
+ int sib;
+
+ /* Fetch disp8 if no SIB byte */
+ if (!((M.x86.mode & SYSMODE_PREFIX_ADDR) && (rm == 4)))
+ displacement = (s8)fetch_byte_imm();
+
+ if (M.x86.mode & SYSMODE_PREFIX_ADDR) {
+ /* 32-bit addressing */
+ switch (rm) {
+ case 0:
+ DECODE_PRINTF2("%d[EAX]", displacement);
+ return M.x86.R_EAX + displacement;
+ case 1:
+ DECODE_PRINTF2("%d[ECX]", displacement);
+ return M.x86.R_ECX + displacement;
+ case 2:
+ DECODE_PRINTF2("%d[EDX]", displacement);
+ return M.x86.R_EDX + displacement;
+ case 3:
+ DECODE_PRINTF2("%d[EBX]", displacement);
+ return M.x86.R_EBX + displacement;
+ case 4:
+ sib = fetch_byte_imm();
+ displacement = (s8)fetch_byte_imm();
+ DECODE_PRINTF2("%d", displacement);
+ return decode_sib_address(sib, 1) + displacement;
+ case 5:
+ DECODE_PRINTF2("%d[EBP]", displacement);
+ return M.x86.R_EBP + displacement;
+ case 6:
+ DECODE_PRINTF2("%d[ESI]", displacement);
+ return M.x86.R_ESI + displacement;
+ case 7:
+ DECODE_PRINTF2("%d[EDI]", displacement);
+ return M.x86.R_EDI + displacement;
+ }
+ HALT_SYS();
+ } else {
+ /* 16-bit addressing */
+ switch (rm) {
+ case 0:
+ DECODE_PRINTF2("%d[BX+SI]", displacement);
+ return (M.x86.R_BX + M.x86.R_SI + displacement) & 0xffff;
+ case 1:
+ DECODE_PRINTF2("%d[BX+DI]", displacement);
+ return (M.x86.R_BX + M.x86.R_DI + displacement) & 0xffff;
+ case 2:
+ DECODE_PRINTF2("%d[BP+SI]", displacement);
+ M.x86.mode |= SYSMODE_SEG_DS_SS;
+ return (M.x86.R_BP + M.x86.R_SI + displacement) & 0xffff;
+ case 3:
+ DECODE_PRINTF2("%d[BP+DI]", displacement);
+ M.x86.mode |= SYSMODE_SEG_DS_SS;
+ return (M.x86.R_BP + M.x86.R_DI + displacement) & 0xffff;
+ case 4:
+ DECODE_PRINTF2("%d[SI]", displacement);
+ return (M.x86.R_SI + displacement) & 0xffff;
+ case 5:
+ DECODE_PRINTF2("%d[DI]", displacement);
+ return (M.x86.R_DI + displacement) & 0xffff;
+ case 6:
+ DECODE_PRINTF2("%d[BP]", displacement);
+ M.x86.mode |= SYSMODE_SEG_DS_SS;
+ return (M.x86.R_BP + displacement) & 0xffff;
+ case 7:
+ DECODE_PRINTF2("%d[BX]", displacement);
+ return (M.x86.R_BX + displacement) & 0xffff;
+ }
+ HALT_SYS();
+ }
+ return 0; /* SHOULD NOT HAPPEN */
+}
+
+/****************************************************************************
+PARAMETERS:
+rm - RM value to decode
+
+RETURNS:
+Offset in memory for the address decoding
+
+REMARKS:
+Return the offset given by mod=10 addressing. Also enables the
+decoding of instructions.
+****************************************************************************/
+u32 decode_rm10_address(
+ int rm)
+{
+ u32 displacement = 0;
+ int sib;
+
+ /* Fetch disp16 if 16-bit addr mode */
+ if (!(M.x86.mode & SYSMODE_PREFIX_ADDR))
+ displacement = (u16)fetch_word_imm();
+ else {
+ /* Fetch disp32 if no SIB byte */
+ if (rm != 4)
+ displacement = (u32)fetch_long_imm();
+ }
+
+ if (M.x86.mode & SYSMODE_PREFIX_ADDR) {
+ /* 32-bit addressing */
+ switch (rm) {
+ case 0:
+ DECODE_PRINTF2("%08x[EAX]", displacement);
+ return M.x86.R_EAX + displacement;
+ case 1:
+ DECODE_PRINTF2("%08x[ECX]", displacement);
+ return M.x86.R_ECX + displacement;
+ case 2:
+ DECODE_PRINTF2("%08x[EDX]", displacement);
+ M.x86.mode |= SYSMODE_SEG_DS_SS;
+ return M.x86.R_EDX + displacement;
+ case 3:
+ DECODE_PRINTF2("%08x[EBX]", displacement);
+ return M.x86.R_EBX + displacement;
+ case 4:
+ sib = fetch_byte_imm();
+ displacement = (u32)fetch_long_imm();
+ DECODE_PRINTF2("%08x", displacement);
+ return decode_sib_address(sib, 2) + displacement;
+ break;
+ case 5:
+ DECODE_PRINTF2("%08x[EBP]", displacement);
+ return M.x86.R_EBP + displacement;
+ case 6:
+ DECODE_PRINTF2("%08x[ESI]", displacement);
+ return M.x86.R_ESI + displacement;
+ case 7:
+ DECODE_PRINTF2("%08x[EDI]", displacement);
+ return M.x86.R_EDI + displacement;
+ }
+ HALT_SYS();
+ } else {
+ /* 16-bit addressing */
+ switch (rm) {
+ case 0:
+ DECODE_PRINTF2("%04x[BX+SI]", displacement);
+ return (M.x86.R_BX + M.x86.R_SI + displacement) & 0xffff;
+ case 1:
+ DECODE_PRINTF2("%04x[BX+DI]", displacement);
+ return (M.x86.R_BX + M.x86.R_DI + displacement) & 0xffff;
+ case 2:
+ DECODE_PRINTF2("%04x[BP+SI]", displacement);
+ M.x86.mode |= SYSMODE_SEG_DS_SS;
+ return (M.x86.R_BP + M.x86.R_SI + displacement) & 0xffff;
+ case 3:
+ DECODE_PRINTF2("%04x[BP+DI]", displacement);
+ M.x86.mode |= SYSMODE_SEG_DS_SS;
+ return (M.x86.R_BP + M.x86.R_DI + displacement) & 0xffff;
+ case 4:
+ DECODE_PRINTF2("%04x[SI]", displacement);
+ return (M.x86.R_SI + displacement) & 0xffff;
+ case 5:
+ DECODE_PRINTF2("%04x[DI]", displacement);
+ return (M.x86.R_DI + displacement) & 0xffff;
+ case 6:
+ DECODE_PRINTF2("%04x[BP]", displacement);
+ M.x86.mode |= SYSMODE_SEG_DS_SS;
+ return (M.x86.R_BP + displacement) & 0xffff;
+ case 7:
+ DECODE_PRINTF2("%04x[BX]", displacement);
+ return (M.x86.R_BX + displacement) & 0xffff;
+ }
+ HALT_SYS();
+ }
+ return 0;
+ /*NOTREACHED */
+}
--- /dev/null
+/****************************************************************************
+*
+* Realmode X86 Emulator Library
+*
+* Copyright (C) 1996-1999 SciTech Software, Inc.
+* Copyright (C) David Mosberger-Tang
+* Copyright (C) 1999 Egbert Eich
+*
+* ========================================================================
+*
+* Permission to use, copy, modify, distribute, and sell this software and
+* its documentation for any purpose is hereby granted without fee,
+* provided that the above copyright notice appear in all copies and that
+* both that copyright notice and this permission notice appear in
+* supporting documentation, and that the name of the authors not be used
+* in advertising or publicity pertaining to distribution of the software
+* without specific, written prior permission. The authors makes no
+* representations about the suitability of this software for any purpose.
+* It is provided "as is" without express or implied warranty.
+*
+* THE AUTHORS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+* EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
+* USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
+* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+* PERFORMANCE OF THIS SOFTWARE.
+*
+* ========================================================================
+*
+* Language: ANSI C
+* Environment: Any
+* Developer: Kendall Bennett
+*
+* Description: This file contains the code to implement the decoding and
+* emulation of the FPU instructions.
+*
+****************************************************************************/
+/* $XFree86$ */
+
+#include "x86emu/x86emui.h"
+
+/*----------------------------- Implementation ----------------------------*/
+
+/* opcode=0xd8 */
+void x86emuOp_esc_coprocess_d8(u8 X86EMU_UNUSED(op1))
+{
+ START_OF_INSTR();
+ DECODE_PRINTF("ESC D8\n");
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR_NO_TRACE();
+}
+
+#ifdef DEBUG
+
+static char *x86emu_fpu_op_d9_tab[] = {
+ "FLD\tDWORD PTR ", "ESC_D9\t", "FST\tDWORD PTR ", "FSTP\tDWORD PTR ",
+ "FLDENV\t", "FLDCW\t", "FSTENV\t", "FSTCW\t",
+
+ "FLD\tDWORD PTR ", "ESC_D9\t", "FST\tDWORD PTR ", "FSTP\tDWORD PTR ",
+ "FLDENV\t", "FLDCW\t", "FSTENV\t", "FSTCW\t",
+
+ "FLD\tDWORD PTR ", "ESC_D9\t", "FST\tDWORD PTR ", "FSTP\tDWORD PTR ",
+ "FLDENV\t", "FLDCW\t", "FSTENV\t", "FSTCW\t",
+};
+
+static char *x86emu_fpu_op_d9_tab1[] = {
+ "FLD\t", "FLD\t", "FLD\t", "FLD\t",
+ "FLD\t", "FLD\t", "FLD\t", "FLD\t",
+
+ "FXCH\t", "FXCH\t", "FXCH\t", "FXCH\t",
+ "FXCH\t", "FXCH\t", "FXCH\t", "FXCH\t",
+
+ "FNOP", "ESC_D9", "ESC_D9", "ESC_D9",
+ "ESC_D9", "ESC_D9", "ESC_D9", "ESC_D9",
+
+ "FSTP\t", "FSTP\t", "FSTP\t", "FSTP\t",
+ "FSTP\t", "FSTP\t", "FSTP\t", "FSTP\t",
+
+ "FCHS", "FABS", "ESC_D9", "ESC_D9",
+ "FTST", "FXAM", "ESC_D9", "ESC_D9",
+
+ "FLD1", "FLDL2T", "FLDL2E", "FLDPI",
+ "FLDLG2", "FLDLN2", "FLDZ", "ESC_D9",
+
+ "F2XM1", "FYL2X", "FPTAN", "FPATAN",
+ "FXTRACT", "ESC_D9", "FDECSTP", "FINCSTP",
+
+ "FPREM", "FYL2XP1", "FSQRT", "ESC_D9",
+ "FRNDINT", "FSCALE", "ESC_D9", "ESC_D9",
+};
+
+#endif /* DEBUG */
+
+/* opcode=0xd9 */
+void x86emuOp_esc_coprocess_d9(u8 X86EMU_UNUSED(op1))
+{
+ int mod, rl, rh;
+ uint destoffset = 0;
+ u8 stkelem = 0;
+
+ START_OF_INSTR();
+ FETCH_DECODE_MODRM(mod, rh, rl);
+#ifdef DEBUG
+ if (mod != 3) {
+ DECODE_PRINTINSTR32(x86emu_fpu_op_d9_tab, mod, rh, rl);
+ } else {
+ DECODE_PRINTF(x86emu_fpu_op_d9_tab1[(rh << 3) + rl]);
+ }
+#endif
+ switch (mod) {
+ case 0:
+ destoffset = decode_rm00_address(rl);
+ DECODE_PRINTF("\n");
+ break;
+ case 1:
+ destoffset = decode_rm01_address(rl);
+ DECODE_PRINTF("\n");
+ break;
+ case 2:
+ destoffset = decode_rm10_address(rl);
+ DECODE_PRINTF("\n");
+ break;
+ case 3: /* register to register */
+ stkelem = (u8)rl;
+ if (rh < 4) {
+ DECODE_PRINTF2("ST(%d)\n", stkelem);
+ } else {
+ DECODE_PRINTF("\n");
+ }
+ break;
+ }
+#ifdef X86EMU_FPU_PRESENT
+ /* execute */
+ switch (mod) {
+ case 3:
+ switch (rh) {
+ case 0:
+ x86emu_fpu_R_fld(X86EMU_FPU_STKTOP, stkelem);
+ break;
+ case 1:
+ x86emu_fpu_R_fxch(X86EMU_FPU_STKTOP, stkelem);
+ break;
+ case 2:
+ switch (rl) {
+ case 0:
+ x86emu_fpu_R_nop();
+ break;
+ default:
+ x86emu_fpu_illegal();
+ break;
+ }
+ case 3:
+ x86emu_fpu_R_fstp(X86EMU_FPU_STKTOP, stkelem);
+ break;
+ case 4:
+ switch (rl) {
+ case 0:
+ x86emu_fpu_R_fchs(X86EMU_FPU_STKTOP);
+ break;
+ case 1:
+ x86emu_fpu_R_fabs(X86EMU_FPU_STKTOP);
+ break;
+ case 4:
+ x86emu_fpu_R_ftst(X86EMU_FPU_STKTOP);
+ break;
+ case 5:
+ x86emu_fpu_R_fxam(X86EMU_FPU_STKTOP);
+ break;
+ default:
+ /* 2,3,6,7 */
+ x86emu_fpu_illegal();
+ break;
+ }
+ break;
+
+ case 5:
+ switch (rl) {
+ case 0:
+ x86emu_fpu_R_fld1(X86EMU_FPU_STKTOP);
+ break;
+ case 1:
+ x86emu_fpu_R_fldl2t(X86EMU_FPU_STKTOP);
+ break;
+ case 2:
+ x86emu_fpu_R_fldl2e(X86EMU_FPU_STKTOP);
+ break;
+ case 3:
+ x86emu_fpu_R_fldpi(X86EMU_FPU_STKTOP);
+ break;
+ case 4:
+ x86emu_fpu_R_fldlg2(X86EMU_FPU_STKTOP);
+ break;
+ case 5:
+ x86emu_fpu_R_fldln2(X86EMU_FPU_STKTOP);
+ break;
+ case 6:
+ x86emu_fpu_R_fldz(X86EMU_FPU_STKTOP);
+ break;
+ default:
+ /* 7 */
+ x86emu_fpu_illegal();
+ break;
+ }
+ break;
+
+ case 6:
+ switch (rl) {
+ case 0:
+ x86emu_fpu_R_f2xm1(X86EMU_FPU_STKTOP);
+ break;
+ case 1:
+ x86emu_fpu_R_fyl2x(X86EMU_FPU_STKTOP);
+ break;
+ case 2:
+ x86emu_fpu_R_fptan(X86EMU_FPU_STKTOP);
+ break;
+ case 3:
+ x86emu_fpu_R_fpatan(X86EMU_FPU_STKTOP);
+ break;
+ case 4:
+ x86emu_fpu_R_fxtract(X86EMU_FPU_STKTOP);
+ break;
+ case 5:
+ x86emu_fpu_illegal();
+ break;
+ case 6:
+ x86emu_fpu_R_decstp();
+ break;
+ case 7:
+ x86emu_fpu_R_incstp();
+ break;
+ }
+ break;
+
+ case 7:
+ switch (rl) {
+ case 0:
+ x86emu_fpu_R_fprem(X86EMU_FPU_STKTOP);
+ break;
+ case 1:
+ x86emu_fpu_R_fyl2xp1(X86EMU_FPU_STKTOP);
+ break;
+ case 2:
+ x86emu_fpu_R_fsqrt(X86EMU_FPU_STKTOP);
+ break;
+ case 3:
+ x86emu_fpu_illegal();
+ break;
+ case 4:
+ x86emu_fpu_R_frndint(X86EMU_FPU_STKTOP);
+ break;
+ case 5:
+ x86emu_fpu_R_fscale(X86EMU_FPU_STKTOP);
+ break;
+ case 6:
+ case 7:
+ default:
+ x86emu_fpu_illegal();
+ break;
+ }
+ break;
+
+ default:
+ switch (rh) {
+ case 0:
+ x86emu_fpu_M_fld(X86EMU_FPU_FLOAT, destoffset);
+ break;
+ case 1:
+ x86emu_fpu_illegal();
+ break;
+ case 2:
+ x86emu_fpu_M_fst(X86EMU_FPU_FLOAT, destoffset);
+ break;
+ case 3:
+ x86emu_fpu_M_fstp(X86EMU_FPU_FLOAT, destoffset);
+ break;
+ case 4:
+ x86emu_fpu_M_fldenv(X86EMU_FPU_WORD, destoffset);
+ break;
+ case 5:
+ x86emu_fpu_M_fldcw(X86EMU_FPU_WORD, destoffset);
+ break;
+ case 6:
+ x86emu_fpu_M_fstenv(X86EMU_FPU_WORD, destoffset);
+ break;
+ case 7:
+ x86emu_fpu_M_fstcw(X86EMU_FPU_WORD, destoffset);
+ break;
+ }
+ }
+ }
+#else
+ (void)destoffset;
+ (void)stkelem;
+#endif /* X86EMU_FPU_PRESENT */
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR_NO_TRACE();
+}
+
+#ifdef DEBUG
+
+char *x86emu_fpu_op_da_tab[] = {
+ "FIADD\tDWORD PTR ", "FIMUL\tDWORD PTR ", "FICOM\tDWORD PTR ",
+ "FICOMP\tDWORD PTR ",
+ "FISUB\tDWORD PTR ", "FISUBR\tDWORD PTR ", "FIDIV\tDWORD PTR ",
+ "FIDIVR\tDWORD PTR ",
+
+ "FIADD\tDWORD PTR ", "FIMUL\tDWORD PTR ", "FICOM\tDWORD PTR ",
+ "FICOMP\tDWORD PTR ",
+ "FISUB\tDWORD PTR ", "FISUBR\tDWORD PTR ", "FIDIV\tDWORD PTR ",
+ "FIDIVR\tDWORD PTR ",
+
+ "FIADD\tDWORD PTR ", "FIMUL\tDWORD PTR ", "FICOM\tDWORD PTR ",
+ "FICOMP\tDWORD PTR ",
+ "FISUB\tDWORD PTR ", "FISUBR\tDWORD PTR ", "FIDIV\tDWORD PTR ",
+ "FIDIVR\tDWORD PTR ",
+
+ "ESC_DA ", "ESC_DA ", "ESC_DA ", "ESC_DA ",
+ "ESC_DA ", "ESC_DA ", "ESC_DA ", "ESC_DA ",
+};
+
+#endif /* DEBUG */
+
+/* opcode=0xda */
+void x86emuOp_esc_coprocess_da(u8 X86EMU_UNUSED(op1))
+{
+ int mod, rl, rh;
+ uint destoffset = 0;
+ u8 stkelem = 0;
+
+ START_OF_INSTR();
+ FETCH_DECODE_MODRM(mod, rh, rl);
+ DECODE_PRINTINSTR32(x86emu_fpu_op_da_tab, mod, rh, rl);
+ switch (mod) {
+ case 0:
+ destoffset = decode_rm00_address(rl);
+ DECODE_PRINTF("\n");
+ break;
+ case 1:
+ destoffset = decode_rm01_address(rl);
+ DECODE_PRINTF("\n");
+ break;
+ case 2:
+ destoffset = decode_rm10_address(rl);
+ DECODE_PRINTF("\n");
+ break;
+ case 3: /* register to register */
+ stkelem = (u8)rl;
+ DECODE_PRINTF2("\tST(%d),ST\n", stkelem);
+ break;
+ }
+#ifdef X86EMU_FPU_PRESENT
+ switch (mod) {
+ case 3:
+ x86emu_fpu_illegal();
+ break;
+ default:
+ switch (rh) {
+ case 0:
+ x86emu_fpu_M_iadd(X86EMU_FPU_SHORT, destoffset);
+ break;
+ case 1:
+ x86emu_fpu_M_imul(X86EMU_FPU_SHORT, destoffset);
+ break;
+ case 2:
+ x86emu_fpu_M_icom(X86EMU_FPU_SHORT, destoffset);
+ break;
+ case 3:
+ x86emu_fpu_M_icomp(X86EMU_FPU_SHORT, destoffset);
+ break;
+ case 4:
+ x86emu_fpu_M_isub(X86EMU_FPU_SHORT, destoffset);
+ break;
+ case 5:
+ x86emu_fpu_M_isubr(X86EMU_FPU_SHORT, destoffset);
+ break;
+ case 6:
+ x86emu_fpu_M_idiv(X86EMU_FPU_SHORT, destoffset);
+ break;
+ case 7:
+ x86emu_fpu_M_idivr(X86EMU_FPU_SHORT, destoffset);
+ break;
+ }
+ }
+#else
+ (void)destoffset;
+ (void)stkelem;
+#endif
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR_NO_TRACE();
+}
+
+#ifdef DEBUG
+
+char *x86emu_fpu_op_db_tab[] = {
+ "FILD\tDWORD PTR ", "ESC_DB\t19", "FIST\tDWORD PTR ", "FISTP\tDWORD PTR ",
+ "ESC_DB\t1C", "FLD\tTBYTE PTR ", "ESC_DB\t1E", "FSTP\tTBYTE PTR ",
+
+ "FILD\tDWORD PTR ", "ESC_DB\t19", "FIST\tDWORD PTR ", "FISTP\tDWORD PTR ",
+ "ESC_DB\t1C", "FLD\tTBYTE PTR ", "ESC_DB\t1E", "FSTP\tTBYTE PTR ",
+
+ "FILD\tDWORD PTR ", "ESC_DB\t19", "FIST\tDWORD PTR ", "FISTP\tDWORD PTR ",
+ "ESC_DB\t1C", "FLD\tTBYTE PTR ", "ESC_DB\t1E", "FSTP\tTBYTE PTR ",
+};
+
+#endif /* DEBUG */
+
+/* opcode=0xdb */
+void x86emuOp_esc_coprocess_db(u8 X86EMU_UNUSED(op1))
+{
+ int mod, rl, rh;
+ uint destoffset = 0;
+
+ START_OF_INSTR();
+ FETCH_DECODE_MODRM(mod, rh, rl);
+#ifdef DEBUG
+ if (mod != 3) {
+ DECODE_PRINTINSTR32(x86emu_fpu_op_db_tab, mod, rh, rl);
+ } else if (rh == 4) { /* === 11 10 0 nnn */
+ switch (rl) {
+ case 0:
+ DECODE_PRINTF("FENI\n");
+ break;
+ case 1:
+ DECODE_PRINTF("FDISI\n");
+ break;
+ case 2:
+ DECODE_PRINTF("FCLEX\n");
+ break;
+ case 3:
+ DECODE_PRINTF("FINIT\n");
+ break;
+ }
+ } else {
+ DECODE_PRINTF2("ESC_DB %0x\n", (mod << 6) + (rh << 3) + (rl));
+ }
+#endif /* DEBUG */
+ switch (mod) {
+ case 0:
+ destoffset = decode_rm00_address(rl);
+ break;
+ case 1:
+ destoffset = decode_rm01_address(rl);
+ break;
+ case 2:
+ destoffset = decode_rm10_address(rl);
+ break;
+ case 3: /* register to register */
+ break;
+ }
+#ifdef X86EMU_FPU_PRESENT
+ /* execute */
+ switch (mod) {
+ case 3:
+ switch (rh) {
+ case 4:
+ switch (rl) {
+ case 0:
+ x86emu_fpu_R_feni();
+ break;
+ case 1:
+ x86emu_fpu_R_fdisi();
+ break;
+ case 2:
+ x86emu_fpu_R_fclex();
+ break;
+ case 3:
+ x86emu_fpu_R_finit();
+ break;
+ default:
+ x86emu_fpu_illegal();
+ break;
+ }
+ break;
+ default:
+ x86emu_fpu_illegal();
+ break;
+ }
+ break;
+ default:
+ switch (rh) {
+ case 0:
+ x86emu_fpu_M_fild(X86EMU_FPU_SHORT, destoffset);
+ break;
+ case 1:
+ x86emu_fpu_illegal();
+ break;
+ case 2:
+ x86emu_fpu_M_fist(X86EMU_FPU_SHORT, destoffset);
+ break;
+ case 3:
+ x86emu_fpu_M_fistp(X86EMU_FPU_SHORT, destoffset);
+ break;
+ case 4:
+ x86emu_fpu_illegal();
+ break;
+ case 5:
+ x86emu_fpu_M_fld(X86EMU_FPU_LDBL, destoffset);
+ break;
+ case 6:
+ x86emu_fpu_illegal();
+ break;
+ case 7:
+ x86emu_fpu_M_fstp(X86EMU_FPU_LDBL, destoffset);
+ break;
+ }
+ }
+#else
+ (void)destoffset;
+#endif
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR_NO_TRACE();
+}
+
+#ifdef DEBUG
+char *x86emu_fpu_op_dc_tab[] = {
+ "FADD\tQWORD PTR ", "FMUL\tQWORD PTR ", "FCOM\tQWORD PTR ",
+ "FCOMP\tQWORD PTR ",
+ "FSUB\tQWORD PTR ", "FSUBR\tQWORD PTR ", "FDIV\tQWORD PTR ",
+ "FDIVR\tQWORD PTR ",
+
+ "FADD\tQWORD PTR ", "FMUL\tQWORD PTR ", "FCOM\tQWORD PTR ",
+ "FCOMP\tQWORD PTR ",
+ "FSUB\tQWORD PTR ", "FSUBR\tQWORD PTR ", "FDIV\tQWORD PTR ",
+ "FDIVR\tQWORD PTR ",
+
+ "FADD\tQWORD PTR ", "FMUL\tQWORD PTR ", "FCOM\tQWORD PTR ",
+ "FCOMP\tQWORD PTR ",
+ "FSUB\tQWORD PTR ", "FSUBR\tQWORD PTR ", "FDIV\tQWORD PTR ",
+ "FDIVR\tQWORD PTR ",
+
+ "FADD\t", "FMUL\t", "FCOM\t", "FCOMP\t",
+ "FSUBR\t", "FSUB\t", "FDIVR\t", "FDIV\t",
+};
+#endif /* DEBUG */
+
+/* opcode=0xdc */
+void x86emuOp_esc_coprocess_dc(u8 X86EMU_UNUSED(op1))
+{
+ int mod, rl, rh;
+ uint destoffset = 0;
+ u8 stkelem = 0;
+
+ START_OF_INSTR();
+ FETCH_DECODE_MODRM(mod, rh, rl);
+ DECODE_PRINTINSTR32(x86emu_fpu_op_dc_tab, mod, rh, rl);
+ switch (mod) {
+ case 0:
+ destoffset = decode_rm00_address(rl);
+ DECODE_PRINTF("\n");
+ break;
+ case 1:
+ destoffset = decode_rm01_address(rl);
+ DECODE_PRINTF("\n");
+ break;
+ case 2:
+ destoffset = decode_rm10_address(rl);
+ DECODE_PRINTF("\n");
+ break;
+ case 3: /* register to register */
+ stkelem = (u8)rl;
+ DECODE_PRINTF2("\tST(%d),ST\n", stkelem);
+ break;
+ }
+#ifdef X86EMU_FPU_PRESENT
+ /* execute */
+ switch (mod) {
+ case 3:
+ switch (rh) {
+ case 0:
+ x86emu_fpu_R_fadd(stkelem, X86EMU_FPU_STKTOP);
+ break;
+ case 1:
+ x86emu_fpu_R_fmul(stkelem, X86EMU_FPU_STKTOP);
+ break;
+ case 2:
+ x86emu_fpu_R_fcom(stkelem, X86EMU_FPU_STKTOP);
+ break;
+ case 3:
+ x86emu_fpu_R_fcomp(stkelem, X86EMU_FPU_STKTOP);
+ break;
+ case 4:
+ x86emu_fpu_R_fsubr(stkelem, X86EMU_FPU_STKTOP);
+ break;
+ case 5:
+ x86emu_fpu_R_fsub(stkelem, X86EMU_FPU_STKTOP);
+ break;
+ case 6:
+ x86emu_fpu_R_fdivr(stkelem, X86EMU_FPU_STKTOP);
+ break;
+ case 7:
+ x86emu_fpu_R_fdiv(stkelem, X86EMU_FPU_STKTOP);
+ break;
+ }
+ break;
+ default:
+ switch (rh) {
+ case 0:
+ x86emu_fpu_M_fadd(X86EMU_FPU_DOUBLE, destoffset);
+ break;
+ case 1:
+ x86emu_fpu_M_fmul(X86EMU_FPU_DOUBLE, destoffset);
+ break;
+ case 2:
+ x86emu_fpu_M_fcom(X86EMU_FPU_DOUBLE, destoffset);
+ break;
+ case 3:
+ x86emu_fpu_M_fcomp(X86EMU_FPU_DOUBLE, destoffset);
+ break;
+ case 4:
+ x86emu_fpu_M_fsub(X86EMU_FPU_DOUBLE, destoffset);
+ break;
+ case 5:
+ x86emu_fpu_M_fsubr(X86EMU_FPU_DOUBLE, destoffset);
+ break;
+ case 6:
+ x86emu_fpu_M_fdiv(X86EMU_FPU_DOUBLE, destoffset);
+ break;
+ case 7:
+ x86emu_fpu_M_fdivr(X86EMU_FPU_DOUBLE, destoffset);
+ break;
+ }
+ }
+#else
+ (void)destoffset;
+ (void)stkelem;
+#endif
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR_NO_TRACE();
+}
+
+#ifdef DEBUG
+
+static char *x86emu_fpu_op_dd_tab[] = {
+ "FLD\tQWORD PTR ", "ESC_DD\t29,", "FST\tQWORD PTR ", "FSTP\tQWORD PTR ",
+ "FRSTOR\t", "ESC_DD\t2D,", "FSAVE\t", "FSTSW\t",
+
+ "FLD\tQWORD PTR ", "ESC_DD\t29,", "FST\tQWORD PTR ", "FSTP\tQWORD PTR ",
+ "FRSTOR\t", "ESC_DD\t2D,", "FSAVE\t", "FSTSW\t",
+
+ "FLD\tQWORD PTR ", "ESC_DD\t29,", "FST\tQWORD PTR ", "FSTP\tQWORD PTR ",
+ "FRSTOR\t", "ESC_DD\t2D,", "FSAVE\t", "FSTSW\t",
+
+ "FFREE\t", "FXCH\t", "FST\t", "FSTP\t",
+ "ESC_DD\t2C,", "ESC_DD\t2D,", "ESC_DD\t2E,", "ESC_DD\t2F,",
+};
+
+#endif /* DEBUG */
+
+/* opcode=0xdd */
+void x86emuOp_esc_coprocess_dd(u8 X86EMU_UNUSED(op1))
+{
+ int mod, rl, rh;
+ uint destoffset = 0;
+ u8 stkelem = 0;
+
+ START_OF_INSTR();
+ FETCH_DECODE_MODRM(mod, rh, rl);
+ DECODE_PRINTINSTR32(x86emu_fpu_op_dd_tab, mod, rh, rl);
+ switch (mod) {
+ case 0:
+ destoffset = decode_rm00_address(rl);
+ DECODE_PRINTF("\n");
+ break;
+ case 1:
+ destoffset = decode_rm01_address(rl);
+ DECODE_PRINTF("\n");
+ break;
+ case 2:
+ destoffset = decode_rm10_address(rl);
+ DECODE_PRINTF("\n");
+ break;
+ case 3: /* register to register */
+ stkelem = (u8)rl;
+ DECODE_PRINTF2("\tST(%d),ST\n", stkelem);
+ break;
+ }
+#ifdef X86EMU_FPU_PRESENT
+ switch (mod) {
+ case 3:
+ switch (rh) {
+ case 0:
+ x86emu_fpu_R_ffree(stkelem);
+ break;
+ case 1:
+ x86emu_fpu_R_fxch(stkelem);
+ break;
+ case 2:
+ x86emu_fpu_R_fst(stkelem); /* register version */
+ break;
+ case 3:
+ x86emu_fpu_R_fstp(stkelem); /* register version */
+ break;
+ default:
+ x86emu_fpu_illegal();
+ break;
+ }
+ break;
+ default:
+ switch (rh) {
+ case 0:
+ x86emu_fpu_M_fld(X86EMU_FPU_DOUBLE, destoffset);
+ break;
+ case 1:
+ x86emu_fpu_illegal();
+ break;
+ case 2:
+ x86emu_fpu_M_fst(X86EMU_FPU_DOUBLE, destoffset);
+ break;
+ case 3:
+ x86emu_fpu_M_fstp(X86EMU_FPU_DOUBLE, destoffset);
+ break;
+ case 4:
+ x86emu_fpu_M_frstor(X86EMU_FPU_WORD, destoffset);
+ break;
+ case 5:
+ x86emu_fpu_illegal();
+ break;
+ case 6:
+ x86emu_fpu_M_fsave(X86EMU_FPU_WORD, destoffset);
+ break;
+ case 7:
+ x86emu_fpu_M_fstsw(X86EMU_FPU_WORD, destoffset);
+ break;
+ }
+ }
+#else
+ (void)destoffset;
+ (void)stkelem;
+#endif
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR_NO_TRACE();
+}
+
+#ifdef DEBUG
+
+static char *x86emu_fpu_op_de_tab[] =
+{
+ "FIADD\tWORD PTR ", "FIMUL\tWORD PTR ", "FICOM\tWORD PTR ",
+ "FICOMP\tWORD PTR ",
+ "FISUB\tWORD PTR ", "FISUBR\tWORD PTR ", "FIDIV\tWORD PTR ",
+ "FIDIVR\tWORD PTR ",
+
+ "FIADD\tWORD PTR ", "FIMUL\tWORD PTR ", "FICOM\tWORD PTR ",
+ "FICOMP\tWORD PTR ",
+ "FISUB\tWORD PTR ", "FISUBR\tWORD PTR ", "FIDIV\tWORD PTR ",
+ "FIDIVR\tWORD PTR ",
+
+ "FIADD\tWORD PTR ", "FIMUL\tWORD PTR ", "FICOM\tWORD PTR ",
+ "FICOMP\tWORD PTR ",
+ "FISUB\tWORD PTR ", "FISUBR\tWORD PTR ", "FIDIV\tWORD PTR ",
+ "FIDIVR\tWORD PTR ",
+
+ "FADDP\t", "FMULP\t", "FCOMP\t", "FCOMPP\t",
+ "FSUBRP\t", "FSUBP\t", "FDIVRP\t", "FDIVP\t",
+};
+
+#endif /* DEBUG */
+
+/* opcode=0xde */
+void x86emuOp_esc_coprocess_de(u8 X86EMU_UNUSED(op1))
+{
+ int mod, rl, rh;
+ uint destoffset = 0;
+ u8 stkelem = 0;
+
+ START_OF_INSTR();
+ FETCH_DECODE_MODRM(mod, rh, rl);
+ DECODE_PRINTINSTR32(x86emu_fpu_op_de_tab, mod, rh, rl);
+ switch (mod) {
+ case 0:
+ destoffset = decode_rm00_address(rl);
+ DECODE_PRINTF("\n");
+ break;
+ case 1:
+ destoffset = decode_rm01_address(rl);
+ DECODE_PRINTF("\n");
+ break;
+ case 2:
+ destoffset = decode_rm10_address(rl);
+ DECODE_PRINTF("\n");
+ break;
+ case 3: /* register to register */
+ stkelem = (u8)rl;
+ DECODE_PRINTF2("\tST(%d),ST\n", stkelem);
+ break;
+ }
+#ifdef X86EMU_FPU_PRESENT
+ switch (mod) {
+ case 3:
+ switch (rh) {
+ case 0:
+ x86emu_fpu_R_faddp(stkelem, X86EMU_FPU_STKTOP);
+ break;
+ case 1:
+ x86emu_fpu_R_fmulp(stkelem, X86EMU_FPU_STKTOP);
+ break;
+ case 2:
+ x86emu_fpu_R_fcomp(stkelem, X86EMU_FPU_STKTOP);
+ break;
+ case 3:
+ if (stkelem == 1)
+ x86emu_fpu_R_fcompp(stkelem, X86EMU_FPU_STKTOP);
+ else
+ x86emu_fpu_illegal();
+ break;
+ case 4:
+ x86emu_fpu_R_fsubrp(stkelem, X86EMU_FPU_STKTOP);
+ break;
+ case 5:
+ x86emu_fpu_R_fsubp(stkelem, X86EMU_FPU_STKTOP);
+ break;
+ case 6:
+ x86emu_fpu_R_fdivrp(stkelem, X86EMU_FPU_STKTOP);
+ break;
+ case 7:
+ x86emu_fpu_R_fdivp(stkelem, X86EMU_FPU_STKTOP);
+ break;
+ }
+ break;
+ default:
+ switch (rh) {
+ case 0:
+ x86emu_fpu_M_fiadd(X86EMU_FPU_WORD, destoffset);
+ break;
+ case 1:
+ x86emu_fpu_M_fimul(X86EMU_FPU_WORD, destoffset);
+ break;
+ case 2:
+ x86emu_fpu_M_ficom(X86EMU_FPU_WORD, destoffset);
+ break;
+ case 3:
+ x86emu_fpu_M_ficomp(X86EMU_FPU_WORD, destoffset);
+ break;
+ case 4:
+ x86emu_fpu_M_fisub(X86EMU_FPU_WORD, destoffset);
+ break;
+ case 5:
+ x86emu_fpu_M_fisubr(X86EMU_FPU_WORD, destoffset);
+ break;
+ case 6:
+ x86emu_fpu_M_fidiv(X86EMU_FPU_WORD, destoffset);
+ break;
+ case 7:
+ x86emu_fpu_M_fidivr(X86EMU_FPU_WORD, destoffset);
+ break;
+ }
+ }
+#else
+ (void)destoffset;
+ (void)stkelem;
+#endif
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR_NO_TRACE();
+}
+
+#ifdef DEBUG
+
+static char *x86emu_fpu_op_df_tab[] = {
+ /* mod == 00 */
+ "FILD\tWORD PTR ", "ESC_DF\t39\n", "FIST\tWORD PTR ", "FISTP\tWORD PTR ",
+ "FBLD\tTBYTE PTR ", "FILD\tQWORD PTR ", "FBSTP\tTBYTE PTR ",
+ "FISTP\tQWORD PTR ",
+
+ /* mod == 01 */
+ "FILD\tWORD PTR ", "ESC_DF\t39 ", "FIST\tWORD PTR ", "FISTP\tWORD PTR ",
+ "FBLD\tTBYTE PTR ", "FILD\tQWORD PTR ", "FBSTP\tTBYTE PTR ",
+ "FISTP\tQWORD PTR ",
+
+ /* mod == 10 */
+ "FILD\tWORD PTR ", "ESC_DF\t39 ", "FIST\tWORD PTR ", "FISTP\tWORD PTR ",
+ "FBLD\tTBYTE PTR ", "FILD\tQWORD PTR ", "FBSTP\tTBYTE PTR ",
+ "FISTP\tQWORD PTR ",
+
+ /* mod == 11 */
+ "FFREE\t", "FXCH\t", "FST\t", "FSTP\t",
+ "ESC_DF\t3C,", "ESC_DF\t3D,", "ESC_DF\t3E,", "ESC_DF\t3F,"
+};
+
+#endif /* DEBUG */
+
+/* opcode=0xdf */
+void x86emuOp_esc_coprocess_df(u8 X86EMU_UNUSED(op1))
+{
+ int mod, rl, rh;
+ uint destoffset = 0;
+ u8 stkelem = 0;
+
+ START_OF_INSTR();
+ FETCH_DECODE_MODRM(mod, rh, rl);
+ DECODE_PRINTINSTR32(x86emu_fpu_op_df_tab, mod, rh, rl);
+ switch (mod) {
+ case 0:
+ destoffset = decode_rm00_address(rl);
+ DECODE_PRINTF("\n");
+ break;
+ case 1:
+ destoffset = decode_rm01_address(rl);
+ DECODE_PRINTF("\n");
+ break;
+ case 2:
+ destoffset = decode_rm10_address(rl);
+ DECODE_PRINTF("\n");
+ break;
+ case 3: /* register to register */
+ stkelem = (u8)rl;
+ DECODE_PRINTF2("\tST(%d)\n", stkelem);
+ break;
+ }
+#ifdef X86EMU_FPU_PRESENT
+ switch (mod) {
+ case 3:
+ switch (rh) {
+ case 0:
+ x86emu_fpu_R_ffree(stkelem);
+ break;
+ case 1:
+ x86emu_fpu_R_fxch(stkelem);
+ break;
+ case 2:
+ x86emu_fpu_R_fst(stkelem); /* register version */
+ break;
+ case 3:
+ x86emu_fpu_R_fstp(stkelem); /* register version */
+ break;
+ default:
+ x86emu_fpu_illegal();
+ break;
+ }
+ break;
+ default:
+ switch (rh) {
+ case 0:
+ x86emu_fpu_M_fild(X86EMU_FPU_WORD, destoffset);
+ break;
+ case 1:
+ x86emu_fpu_illegal();
+ break;
+ case 2:
+ x86emu_fpu_M_fist(X86EMU_FPU_WORD, destoffset);
+ break;
+ case 3:
+ x86emu_fpu_M_fistp(X86EMU_FPU_WORD, destoffset);
+ break;
+ case 4:
+ x86emu_fpu_M_fbld(X86EMU_FPU_BSD, destoffset);
+ break;
+ case 5:
+ x86emu_fpu_M_fild(X86EMU_FPU_LONG, destoffset);
+ break;
+ case 6:
+ x86emu_fpu_M_fbstp(X86EMU_FPU_BSD, destoffset);
+ break;
+ case 7:
+ x86emu_fpu_M_fistp(X86EMU_FPU_LONG, destoffset);
+ break;
+ }
+ }
+#else
+ (void)destoffset;
+ (void)stkelem;
+#endif
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR_NO_TRACE();
+}
--- /dev/null
+/****************************************************************************
+*
+* Realmode X86 Emulator Library
+*
+* Copyright (C) 1996-1999 SciTech Software, Inc.
+* Copyright (C) David Mosberger-Tang
+* Copyright (C) 1999 Egbert Eich
+*
+* ========================================================================
+*
+* Permission to use, copy, modify, distribute, and sell this software and
+* its documentation for any purpose is hereby granted without fee,
+* provided that the above copyright notice appear in all copies and that
+* both that copyright notice and this permission notice appear in
+* supporting documentation, and that the name of the authors not be used
+* in advertising or publicity pertaining to distribution of the software
+* without specific, written prior permission. The authors makes no
+* representations about the suitability of this software for any purpose.
+* It is provided "as is" without express or implied warranty.
+*
+* THE AUTHORS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+* EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
+* USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
+* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+* PERFORMANCE OF THIS SOFTWARE.
+*
+* ========================================================================
+*
+* Language: ANSI C
+* Environment: Any
+* Developer: Kendall Bennett
+*
+* Description: Header file for public specific functions.
+* Any application linking against us should only
+* include this header
+*
+****************************************************************************/
+/* $XFree86$ */
+
+#ifndef __X86EMU_X86EMU_H
+#define __X86EMU_X86EMU_H
+
+#ifdef SCITECH
+#include "scitech.h"
+#define X86API _ASMAPI
+#define X86APIP _ASMAPIP
+typedef int X86EMU_pioAddr;
+#else
+#include "x86emu/types.h"
+#define X86API
+#define X86APIP *
+#endif
+#include "x86emu/regs.h"
+
+/*---------------------- Macros and type definitions ----------------------*/
+
+#ifdef PACK
+# pragma PACK /* Don't pack structs with function pointers! */
+#endif
+
+/****************************************************************************
+REMARKS:
+Data structure containing ponters to programmed I/O functions used by the
+emulator. This is used so that the user program can hook all programmed
+I/O for the emulator to handled as necessary by the user program. By
+default the emulator contains simple functions that do not do access the
+hardware in any way. To allow the emualtor access the hardware, you will
+need to override the programmed I/O functions using the X86EMU_setupPioFuncs
+function.
+
+HEADER:
+x86emu.h
+
+MEMBERS:
+inb - Function to read a byte from an I/O port
+inw - Function to read a word from an I/O port
+inl - Function to read a dword from an I/O port
+outb - Function to write a byte to an I/O port
+outw - Function to write a word to an I/O port
+outl - Function to write a dword to an I/O port
+****************************************************************************/
+typedef struct {
+ u8 (X86APIP inb)(X86EMU_pioAddr addr);
+ u16 (X86APIP inw)(X86EMU_pioAddr addr);
+ u32 (X86APIP inl)(X86EMU_pioAddr addr);
+ void (X86APIP outb)(X86EMU_pioAddr addr, u8 val);
+ void (X86APIP outw)(X86EMU_pioAddr addr, u16 val);
+ void (X86APIP outl)(X86EMU_pioAddr addr, u32 val);
+ } X86EMU_pioFuncs;
+
+/****************************************************************************
+REMARKS:
+Data structure containing ponters to memory access functions used by the
+emulator. This is used so that the user program can hook all memory
+access functions as necessary for the emulator. By default the emulator
+contains simple functions that only access the internal memory of the
+emulator. If you need specialised functions to handle access to different
+types of memory (ie: hardware framebuffer accesses and BIOS memory access
+etc), you will need to override this using the X86EMU_setupMemFuncs
+function.
+
+HEADER:
+x86emu.h
+
+MEMBERS:
+rdb - Function to read a byte from an address
+rdw - Function to read a word from an address
+rdl - Function to read a dword from an address
+wrb - Function to write a byte to an address
+wrw - Function to write a word to an address
+wrl - Function to write a dword to an address
+****************************************************************************/
+typedef struct {
+ u8 (X86APIP rdb)(u32 addr);
+ u16 (X86APIP rdw)(u32 addr);
+ u32 (X86APIP rdl)(u32 addr);
+ void (X86APIP wrb)(u32 addr, u8 val);
+ void (X86APIP wrw)(u32 addr, u16 val);
+ void (X86APIP wrl)(u32 addr, u32 val);
+ } X86EMU_memFuncs;
+
+/****************************************************************************
+ Here are the default memory read and write
+ function in case they are needed as fallbacks.
+***************************************************************************/
+extern u8 X86API rdb(u32 addr);
+extern u16 X86API rdw(u32 addr);
+extern u32 X86API rdl(u32 addr);
+extern void X86API wrb(u32 addr, u8 val);
+extern void X86API wrw(u32 addr, u16 val);
+extern void X86API wrl(u32 addr, u32 val);
+
+#ifdef END_PACK
+# pragma END_PACK
+#endif
+
+/*--------------------- type definitions -----------------------------------*/
+
+typedef void (X86APIP X86EMU_intrFuncs)(int num);
+extern X86EMU_intrFuncs _X86EMU_intrTab[256];
+
+/*-------------------------- Function Prototypes --------------------------*/
+
+#ifdef __cplusplus
+extern "C" { /* Use "C" linkage when in C++ mode */
+#endif
+
+void X86EMU_setupMemFuncs(X86EMU_memFuncs *funcs);
+void X86EMU_setupPioFuncs(X86EMU_pioFuncs *funcs);
+void X86EMU_setupIntrFuncs(X86EMU_intrFuncs funcs[]);
+void X86EMU_prepareForInt(int num);
+
+/* decode.c */
+
+void X86EMU_exec(unsigned timeout);
+void X86EMU_halt_sys(void);
+
+#ifdef DEBUG
+#define HALT_SYS() \
+ printk("halt_sys: file %s, line %d\n", __FILE__, __LINE__), \
+ X86EMU_halt_sys()
+#else
+#define HALT_SYS() X86EMU_halt_sys()
+#endif
+
+/* Debug options */
+
+#define DEBUG_DECODE_F 0x000001 /* print decoded instruction */
+#define DEBUG_TRACE_F 0x000002 /* dump regs before/after execution */
+#define DEBUG_STEP_F 0x000004
+#define DEBUG_DISASSEMBLE_F 0x000008
+#define DEBUG_BREAK_F 0x000010
+#define DEBUG_SVC_F 0x000020
+#define DEBUG_SAVE_IP_CS_F 0x000040
+#define DEBUG_FS_F 0x000080
+#define DEBUG_PROC_F 0x000100
+#define DEBUG_SYSINT_F 0x000200 /* bios system interrupts. */
+#define DEBUG_TRACECALL_F 0x000400
+#define DEBUG_INSTRUMENT_F 0x000800
+#define DEBUG_MEM_TRACE_F 0x001000
+#define DEBUG_IO_TRACE_F 0x002000
+#define DEBUG_TRACECALL_REGS_F 0x004000
+#define DEBUG_DECODE_NOPRINT_F 0x008000
+#define DEBUG_EXIT 0x010000
+#define DEBUG_SYS_F (DEBUG_SVC_F|DEBUG_FS_F|DEBUG_PROC_F)
+
+void X86EMU_trace_regs(void);
+void X86EMU_trace_xregs(void);
+void X86EMU_dump_memory(u16 seg, u16 off, u32 amt);
+int X86EMU_trace_on(void);
+int X86EMU_trace_off(void);
+
+#ifdef __cplusplus
+} /* End of "C" linkage for C++ */
+#endif
+
+#endif /* __X86EMU_X86EMU_H */
--- /dev/null
+/****************************************************************************
+*
+* Realmode X86 Emulator Library
+*
+* Copyright (C) 1996-1999 SciTech Software, Inc.
+* Copyright (C) David Mosberger-Tang
+* Copyright (C) 1999 Egbert Eich
+*
+* ========================================================================
+*
+* Permission to use, copy, modify, distribute, and sell this software and
+* its documentation for any purpose is hereby granted without fee,
+* provided that the above copyright notice appear in all copies and that
+* both that copyright notice and this permission notice appear in
+* supporting documentation, and that the name of the authors not be used
+* in advertising or publicity pertaining to distribution of the software
+* without specific, written prior permission. The authors makes no
+* representations about the suitability of this software for any purpose.
+* It is provided "as is" without express or implied warranty.
+*
+* THE AUTHORS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+* EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
+* USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
+* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+* PERFORMANCE OF THIS SOFTWARE.
+*
+* ========================================================================
+*
+* Language: ANSI C
+* Environment: Any
+* Developer: Kendall Bennett
+*
+* Description: Header file for FPU register definitions.
+*
+****************************************************************************/
+/* $XFree86: xc/extras/x86emu/include/x86emu/fpu_regs.h,v 1.2 2003/10/22 20:03:05 tsi Exp $ */
+
+#ifndef __X86EMU_FPU_REGS_H
+#define __X86EMU_FPU_REGS_H
+
+#ifdef X86_FPU_SUPPORT
+
+#ifdef PACK
+# pragma PACK
+#endif
+
+/* Basic 8087 register can hold any of the following values: */
+
+union x86_fpu_reg_u {
+ s8 tenbytes[10];
+ double dval;
+ float fval;
+ s16 sval;
+ s32 lval;
+ };
+
+struct x86_fpu_reg {
+ union x86_fpu_reg_u reg;
+ char tag;
+ };
+
+/*
+ * Since we are not going to worry about the problems of aliasing
+ * registers, every time a register is modified, its result type is
+ * set in the tag fields for that register. If some operation
+ * attempts to access the type in a way inconsistent with its current
+ * storage format, then we flag the operation. If common, we'll
+ * attempt the conversion.
+ */
+
+#define X86_FPU_VALID 0x80
+#define X86_FPU_REGTYP(r) ((r) & 0x7F)
+
+#define X86_FPU_WORD 0x0
+#define X86_FPU_SHORT 0x1
+#define X86_FPU_LONG 0x2
+#define X86_FPU_FLOAT 0x3
+#define X86_FPU_DOUBLE 0x4
+#define X86_FPU_LDBL 0x5
+#define X86_FPU_BSD 0x6
+
+#define X86_FPU_STKTOP 0
+
+struct x86_fpu_registers {
+ struct x86_fpu_reg x86_fpu_stack[8];
+ int x86_fpu_flags;
+ int x86_fpu_config; /* rounding modes, etc. */
+ short x86_fpu_tos, x86_fpu_bos;
+ };
+
+#ifdef END_PACK
+# pragma END_PACK
+#endif
+
+/*
+ * There are two versions of the following macro.
+ *
+ * One version is for opcode D9, for which there are more than 32
+ * instructions encoded in the second byte of the opcode.
+ *
+ * The other version, deals with all the other 7 i87 opcodes, for
+ * which there are only 32 strings needed to describe the
+ * instructions.
+ */
+
+#endif /* X86_FPU_SUPPORT */
+
+#ifdef DEBUG
+# define DECODE_PRINTINSTR32(t,mod,rh,rl) \
+ DECODE_PRINTF(t[(mod<<3)+(rh)]);
+# define DECODE_PRINTINSTR256(t,mod,rh,rl) \
+ DECODE_PRINTF(t[(mod<<6)+(rh<<3)+(rl)]);
+#else
+# define DECODE_PRINTINSTR32(t,mod,rh,rl)
+# define DECODE_PRINTINSTR256(t,mod,rh,rl)
+#endif
+
+#endif /* __X86EMU_FPU_REGS_H */
--- /dev/null
+/****************************************************************************
+*
+* Realmode X86 Emulator Library
+*
+* Copyright (C) 1996-1999 SciTech Software, Inc.
+* Copyright (C) David Mosberger-Tang
+* Copyright (C) 1999 Egbert Eich
+*
+* ========================================================================
+*
+* Permission to use, copy, modify, distribute, and sell this software and
+* its documentation for any purpose is hereby granted without fee,
+* provided that the above copyright notice appear in all copies and that
+* both that copyright notice and this permission notice appear in
+* supporting documentation, and that the name of the authors not be used
+* in advertising or publicity pertaining to distribution of the software
+* without specific, written prior permission. The authors makes no
+* representations about the suitability of this software for any purpose.
+* It is provided "as is" without express or implied warranty.
+*
+* THE AUTHORS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+* EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
+* USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
+* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+* PERFORMANCE OF THIS SOFTWARE.
+*
+* ========================================================================
+*
+* Language: ANSI C
+* Environment: Any
+* Developer: Kendall Bennett
+*
+* Description: Header file for x86 register definitions.
+*
+****************************************************************************/
+/* $XFree86: xc/extras/x86emu/include/x86emu/regs.h,v 1.5 2003/10/22 20:03:05 tsi Exp $ */
+
+#ifndef __X86EMU_REGS_H
+#define __X86EMU_REGS_H
+
+/*---------------------- Macros and type definitions ----------------------*/
+
+#ifdef PACK
+# pragma PACK
+#endif
+
+/*
+ * General EAX, EBX, ECX, EDX type registers. Note that for
+ * portability, and speed, the issue of byte swapping is not addressed
+ * in the registers. All registers are stored in the default format
+ * available on the host machine. The only critical issue is that the
+ * registers should line up EXACTLY in the same manner as they do in
+ * the 386. That is:
+ *
+ * EAX & 0xff === AL
+ * EAX & 0xffff == AX
+ *
+ * etc. The result is that alot of the calculations can then be
+ * done using the native instruction set fully.
+ */
+
+#ifdef __BIG_ENDIAN__
+
+typedef struct {
+ u32 e_reg;
+ } I32_reg_t;
+
+typedef struct {
+ u16 filler0, x_reg;
+ } I16_reg_t;
+
+typedef struct {
+ u8 filler0, filler1, h_reg, l_reg;
+ } I8_reg_t;
+
+#else /* !__BIG_ENDIAN__ */
+
+typedef struct {
+ u32 e_reg;
+ } I32_reg_t;
+
+typedef struct {
+ u16 x_reg;
+ } I16_reg_t;
+
+typedef struct {
+ u8 l_reg, h_reg;
+ } I8_reg_t;
+
+#endif /* BIG_ENDIAN */
+
+typedef union {
+ I32_reg_t I32_reg;
+ I16_reg_t I16_reg;
+ I8_reg_t I8_reg;
+ } i386_general_register;
+
+struct i386_general_regs {
+ i386_general_register A, B, C, D;
+ };
+
+typedef struct i386_general_regs Gen_reg_t;
+
+struct i386_special_regs {
+ i386_general_register SP, BP, SI, DI, IP;
+ u32 FLAGS;
+ };
+
+/*
+ * Segment registers here represent the 16 bit quantities
+ * CS, DS, ES, SS.
+ */
+
+struct i386_segment_regs {
+ u16 CS, DS, SS, ES, FS, GS;
+ };
+
+/* 8 bit registers */
+#define R_AH gen.A.I8_reg.h_reg
+#define R_AL gen.A.I8_reg.l_reg
+#define R_BH gen.B.I8_reg.h_reg
+#define R_BL gen.B.I8_reg.l_reg
+#define R_CH gen.C.I8_reg.h_reg
+#define R_CL gen.C.I8_reg.l_reg
+#define R_DH gen.D.I8_reg.h_reg
+#define R_DL gen.D.I8_reg.l_reg
+
+/* 16 bit registers */
+#define R_AX gen.A.I16_reg.x_reg
+#define R_BX gen.B.I16_reg.x_reg
+#define R_CX gen.C.I16_reg.x_reg
+#define R_DX gen.D.I16_reg.x_reg
+
+/* 32 bit extended registers */
+#define R_EAX gen.A.I32_reg.e_reg
+#define R_EBX gen.B.I32_reg.e_reg
+#define R_ECX gen.C.I32_reg.e_reg
+#define R_EDX gen.D.I32_reg.e_reg
+
+/* special registers */
+#define R_SP spc.SP.I16_reg.x_reg
+#define R_BP spc.BP.I16_reg.x_reg
+#define R_SI spc.SI.I16_reg.x_reg
+#define R_DI spc.DI.I16_reg.x_reg
+#define R_IP spc.IP.I16_reg.x_reg
+#define R_FLG spc.FLAGS
+
+/* special registers */
+#define R_SP spc.SP.I16_reg.x_reg
+#define R_BP spc.BP.I16_reg.x_reg
+#define R_SI spc.SI.I16_reg.x_reg
+#define R_DI spc.DI.I16_reg.x_reg
+#define R_IP spc.IP.I16_reg.x_reg
+#define R_FLG spc.FLAGS
+
+/* special registers */
+#define R_ESP spc.SP.I32_reg.e_reg
+#define R_EBP spc.BP.I32_reg.e_reg
+#define R_ESI spc.SI.I32_reg.e_reg
+#define R_EDI spc.DI.I32_reg.e_reg
+#define R_EIP spc.IP.I32_reg.e_reg
+#define R_EFLG spc.FLAGS
+
+/* segment registers */
+#define R_CS seg.CS
+#define R_DS seg.DS
+#define R_SS seg.SS
+#define R_ES seg.ES
+#define R_FS seg.FS
+#define R_GS seg.GS
+
+/* flag conditions */
+#define FB_CF 0x0001 /* CARRY flag */
+#define FB_PF 0x0004 /* PARITY flag */
+#define FB_AF 0x0010 /* AUX flag */
+#define FB_ZF 0x0040 /* ZERO flag */
+#define FB_SF 0x0080 /* SIGN flag */
+#define FB_TF 0x0100 /* TRAP flag */
+#define FB_IF 0x0200 /* INTERRUPT ENABLE flag */
+#define FB_DF 0x0400 /* DIR flag */
+#define FB_OF 0x0800 /* OVERFLOW flag */
+
+/* 80286 and above always have bit#1 set */
+#define F_ALWAYS_ON (0x0002) /* flag bits always on */
+
+/*
+ * Define a mask for only those flag bits we will ever pass back
+ * (via PUSHF)
+ */
+#define F_MSK (FB_CF|FB_PF|FB_AF|FB_ZF|FB_SF|FB_TF|FB_IF|FB_DF|FB_OF)
+
+/* following bits masked in to a 16bit quantity */
+
+#define F_CF 0x0001 /* CARRY flag */
+#define F_PF 0x0004 /* PARITY flag */
+#define F_AF 0x0010 /* AUX flag */
+#define F_ZF 0x0040 /* ZERO flag */
+#define F_SF 0x0080 /* SIGN flag */
+#define F_TF 0x0100 /* TRAP flag */
+#define F_IF 0x0200 /* INTERRUPT ENABLE flag */
+#define F_DF 0x0400 /* DIR flag */
+#define F_OF 0x0800 /* OVERFLOW flag */
+
+#define TOGGLE_FLAG(flag) (M.x86.R_FLG ^= (flag))
+#define SET_FLAG(flag) (M.x86.R_FLG |= (flag))
+#define CLEAR_FLAG(flag) (M.x86.R_FLG &= ~(flag))
+#define ACCESS_FLAG(flag) (M.x86.R_FLG & (flag))
+#define CLEARALL_FLAG(m) (M.x86.R_FLG = 0)
+
+#define CONDITIONAL_SET_FLAG(COND,FLAG) \
+ if (COND) SET_FLAG(FLAG); else CLEAR_FLAG(FLAG)
+
+#define F_PF_CALC 0x010000 /* PARITY flag has been calced */
+#define F_ZF_CALC 0x020000 /* ZERO flag has been calced */
+#define F_SF_CALC 0x040000 /* SIGN flag has been calced */
+
+#define F_ALL_CALC 0xff0000 /* All have been calced */
+
+/*
+ * Emulator machine state.
+ * Segment usage control.
+ */
+#define SYSMODE_SEG_DS_SS 0x00000001
+#define SYSMODE_SEGOVR_CS 0x00000002
+#define SYSMODE_SEGOVR_DS 0x00000004
+#define SYSMODE_SEGOVR_ES 0x00000008
+#define SYSMODE_SEGOVR_FS 0x00000010
+#define SYSMODE_SEGOVR_GS 0x00000020
+#define SYSMODE_SEGOVR_SS 0x00000040
+#define SYSMODE_PREFIX_REPE 0x00000080
+#define SYSMODE_PREFIX_REPNE 0x00000100
+#define SYSMODE_PREFIX_DATA 0x00000200
+#define SYSMODE_PREFIX_ADDR 0x00000400
+#define SYSMODE_INTR_PENDING 0x10000000
+#define SYSMODE_EXTRN_INTR 0x20000000
+#define SYSMODE_HALTED 0x40000000
+
+#define SYSMODE_SEGMASK (SYSMODE_SEG_DS_SS | \
+ SYSMODE_SEGOVR_CS | \
+ SYSMODE_SEGOVR_DS | \
+ SYSMODE_SEGOVR_ES | \
+ SYSMODE_SEGOVR_FS | \
+ SYSMODE_SEGOVR_GS | \
+ SYSMODE_SEGOVR_SS)
+#define SYSMODE_CLRMASK (SYSMODE_SEG_DS_SS | \
+ SYSMODE_SEGOVR_CS | \
+ SYSMODE_SEGOVR_DS | \
+ SYSMODE_SEGOVR_ES | \
+ SYSMODE_SEGOVR_FS | \
+ SYSMODE_SEGOVR_GS | \
+ SYSMODE_SEGOVR_SS | \
+ SYSMODE_PREFIX_DATA | \
+ SYSMODE_PREFIX_ADDR)
+
+#define INTR_SYNCH 0x1
+#define INTR_ASYNCH 0x2
+#define INTR_HALTED 0x4
+
+typedef struct {
+ struct i386_general_regs gen;
+ struct i386_special_regs spc;
+ struct i386_segment_regs seg;
+ /*
+ * MODE contains information on:
+ * REPE prefix 2 bits repe,repne
+ * SEGMENT overrides 5 bits normal,DS,SS,CS,ES
+ * Delayed flag set 3 bits (zero, signed, parity)
+ * reserved 6 bits
+ * interrupt # 8 bits instruction raised interrupt
+ * BIOS video segregs 4 bits
+ * Interrupt Pending 1 bits
+ * Extern interrupt 1 bits
+ * Halted 1 bits
+ */
+ u32 mode;
+ volatile int intr; /* mask of pending interrupts */
+ int debug;
+#ifdef DEBUG
+ int check;
+ u16 saved_ip;
+ u16 saved_cs;
+ int enc_pos;
+ int enc_str_pos;
+ char decode_buf[32]; /* encoded byte stream */
+ char decoded_buf[256]; /* disassembled strings */
+#endif
+ u8 intno;
+ u8 __pad[3];
+ } X86EMU_regs;
+
+/****************************************************************************
+REMARKS:
+Structure maintaining the emulator machine state.
+
+MEMBERS:
+mem_base - Base real mode memory for the emulator
+mem_size - Size of the real mode memory block for the emulator
+private - private data pointer
+x86 - X86 registers
+****************************************************************************/
+typedef struct {
+ unsigned long mem_base;
+ unsigned long mem_size;
+ void* private;
+ X86EMU_regs x86;
+ } X86EMU_sysEnv;
+
+#ifdef END_PACK
+# pragma END_PACK
+#endif
+
+/*----------------------------- Global Variables --------------------------*/
+
+#ifdef __cplusplus
+extern "C" { /* Use "C" linkage when in C++ mode */
+#endif
+
+/* Global emulator machine state.
+ *
+ * We keep it global to avoid pointer dereferences in the code for speed.
+ */
+
+extern X86EMU_sysEnv _X86EMU_env;
+#define M _X86EMU_env
+
+/*-------------------------- Function Prototypes --------------------------*/
+
+/* Function to log information at runtime */
+
+void printk(const char *fmt, ...);
+
+#ifdef __cplusplus
+} /* End of "C" linkage for C++ */
+#endif
+
+#endif /* __X86EMU_REGS_H */
--- /dev/null
+/****************************************************************************
+*
+* Realmode X86 Emulator Library
+*
+* Copyright (C) 1996-1999 SciTech Software, Inc.
+* Copyright (C) David Mosberger-Tang
+* Copyright (C) 1999 Egbert Eich
+*
+* ========================================================================
+*
+* Permission to use, copy, modify, distribute, and sell this software and
+* its documentation for any purpose is hereby granted without fee,
+* provided that the above copyright notice appear in all copies and that
+* both that copyright notice and this permission notice appear in
+* supporting documentation, and that the name of the authors not be used
+* in advertising or publicity pertaining to distribution of the software
+* without specific, written prior permission. The authors makes no
+* representations about the suitability of this software for any purpose.
+* It is provided "as is" without express or implied warranty.
+*
+* THE AUTHORS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+* EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
+* USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
+* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+* PERFORMANCE OF THIS SOFTWARE.
+*
+* ========================================================================
+*
+* Language: ANSI C
+* Environment: Any
+* Developer: Kendall Bennett
+*
+* Description: Header file for x86 emulator type definitions.
+*
+****************************************************************************/
+
+/* $XFree86: xc/extras/x86emu/include/x86emu/types.h,v 1.6 2003/06/12 14:12:26 eich Exp $ */
+
+#ifndef __X86EMU_TYPES_H
+#define __X86EMU_TYPES_H
+
+#ifndef IN_MODULE
+#include <sys/types.h>
+#endif
+
+/*
+ * The following kludge is an attempt to work around typedef conflicts with
+ * <sys/types.h>.
+ */
+#define u8 x86emuu8
+#define u16 x86emuu16
+#define u32 x86emuu32
+#define u64 x86emuu64
+#define s8 x86emus8
+#define s16 x86emus16
+#define s32 x86emus32
+#define s64 x86emus64
+#define uint x86emuuint
+#define sint x86emusint
+
+/*---------------------- Macros and type definitions ----------------------*/
+
+/* Currently only for Linux/32bit */
+#undef __HAS_LONG_LONG__
+#if defined(__GNUC__) && !defined(NO_LONG_LONG)
+#define __HAS_LONG_LONG__
+#endif
+
+/* Taken from Xmd.h */
+#undef NUM32
+#if defined (_LP64) || \
+ defined(__alpha) || defined(__alpha__) || \
+ defined(__ia64__) || defined(ia64) || \
+ defined(__sparc64__) || \
+ defined(__s390x__) || \
+ (defined(__hppa__) && defined(__LP64)) || \
+ defined(__AMD64__) || defined(AMD64) || \
+ (defined(__sgi) && (_MIPS_SZLONG == 64))
+#define NUM32 int
+#else
+#define NUM32 long
+#endif
+
+typedef unsigned char u8;
+typedef unsigned short u16;
+typedef unsigned NUM32 u32;
+#ifdef __HAS_LONG_LONG__
+typedef unsigned long long u64;
+#endif
+
+typedef char s8;
+typedef short s16;
+typedef NUM32 s32;
+#ifdef __HAS_LONG_LONG__
+typedef long long s64;
+#endif
+
+typedef unsigned int uint;
+typedef int sint;
+
+typedef u16 X86EMU_pioAddr;
+
+#undef NUM32
+
+#endif /* __X86EMU_TYPES_H */
--- /dev/null
+/****************************************************************************
+*
+* Realmode X86 Emulator Library
+*
+* Copyright (C) 1996-1999 SciTech Software, Inc.
+* Copyright (C) David Mosberger-Tang
+* Copyright (C) 1999 Egbert Eich
+*
+* ========================================================================
+*
+* Permission to use, copy, modify, distribute, and sell this software and
+* its documentation for any purpose is hereby granted without fee,
+* provided that the above copyright notice appear in all copies and that
+* both that copyright notice and this permission notice appear in
+* supporting documentation, and that the name of the authors not be used
+* in advertising or publicity pertaining to distribution of the software
+* without specific, written prior permission. The authors makes no
+* representations about the suitability of this software for any purpose.
+* It is provided "as is" without express or implied warranty.
+*
+* THE AUTHORS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+* EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
+* USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
+* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+* PERFORMANCE OF THIS SOFTWARE.
+*
+* ========================================================================
+*
+* Language: ANSI C
+* Environment: Any
+* Developer: Kendall Bennett
+*
+* Description: This file includes subroutines to implement the decoding
+* and emulation of all the x86 processor instructions.
+*
+* There are approximately 250 subroutines in here, which correspond
+* to the 256 byte-"opcodes" found on the 8086. The table which
+* dispatches this is found in the files optab.[ch].
+*
+* Each opcode proc has a comment preceeding it which gives it's table
+* address. Several opcodes are missing (undefined) in the table.
+*
+* Each proc includes information for decoding (DECODE_PRINTF and
+* DECODE_PRINTF2), debugging (TRACE_REGS, SINGLE_STEP), and misc
+* functions (START_OF_INSTR, END_OF_INSTR).
+*
+* Many of the procedures are *VERY* similar in coding. This has
+* allowed for a very large amount of code to be generated in a fairly
+* short amount of time (i.e. cut, paste, and modify). The result is
+* that much of the code below could have been folded into subroutines
+* for a large reduction in size of this file. The downside would be
+* that there would be a penalty in execution speed. The file could
+* also have been *MUCH* larger by inlining certain functions which
+* were called. This could have resulted even faster execution. The
+* prime directive I used to decide whether to inline the code or to
+* modularize it, was basically: 1) no unnecessary subroutine calls,
+* 2) no routines more than about 200 lines in size, and 3) modularize
+* any code that I might not get right the first time. The fetch_*
+* subroutines fall into the latter category. The The decode_* fall
+* into the second category. The coding of the "switch(mod){ .... }"
+* in many of the subroutines below falls into the first category.
+* Especially, the coding of {add,and,or,sub,...}_{byte,word}
+* subroutines are an especially glaring case of the third guideline.
+* Since so much of the code is cloned from other modules (compare
+* opcode #00 to opcode #01), making the basic operations subroutine
+* calls is especially important; otherwise mistakes in coding an
+* "add" would represent a nightmare in maintenance.
+*
+****************************************************************************/
+
+/* $XFree86: xc/extras/x86emu/src/x86emu/ops.c,v 1.8tsi Exp $ */
+
+#include "x86emu/x86emui.h"
+
+/*----------------------------- Implementation ----------------------------*/
+
+/****************************************************************************
+PARAMETERS:
+op1 - Instruction op code
+
+REMARKS:
+Handles illegal opcodes.
+****************************************************************************/
+static void x86emuOp_illegal_op(
+ u8 op1)
+{
+ START_OF_INSTR();
+ if (M.x86.R_SP != 0) {
+ DECODE_PRINTF("ILLEGAL X86 OPCODE\n");
+ TRACE_REGS();
+ printk("%04x:%04x: %02X ILLEGAL X86 OPCODE!\n",
+ M.x86.R_CS, M.x86.R_IP-1,op1);
+ HALT_SYS();
+ }
+ else {
+ /* If we get here, it means the stack pointer is back to zero
+ * so we are just returning from an emulator service call
+ * so therte is no need to display an error message. We trap
+ * the emulator with an 0xF1 opcode to finish the service
+ * call.
+ */
+ X86EMU_halt_sys();
+ }
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x00
+****************************************************************************/
+static void x86emuOp_add_byte_RM_R(u8 X86EMU_UNUSED(op1))
+{
+ int mod, rl, rh;
+ uint destoffset;
+ u8 *destreg, *srcreg;
+ u8 destval;
+
+ START_OF_INSTR();
+ DECODE_PRINTF("ADD\t");
+ FETCH_DECODE_MODRM(mod, rh, rl);
+ switch (mod) {
+ case 0:
+ destoffset = decode_rm00_address(rl);
+ DECODE_PRINTF(",");
+ destval = fetch_data_byte(destoffset);
+ srcreg = DECODE_RM_BYTE_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ destval = add_byte(destval, *srcreg);
+ store_data_byte(destoffset, destval);
+ break;
+ case 1:
+ destoffset = decode_rm01_address(rl);
+ DECODE_PRINTF(",");
+ destval = fetch_data_byte(destoffset);
+ srcreg = DECODE_RM_BYTE_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ destval = add_byte(destval, *srcreg);
+ store_data_byte(destoffset, destval);
+ break;
+ case 2:
+ destoffset = decode_rm10_address(rl);
+ DECODE_PRINTF(",");
+ destval = fetch_data_byte(destoffset);
+ srcreg = DECODE_RM_BYTE_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ destval = add_byte(destval, *srcreg);
+ store_data_byte(destoffset, destval);
+ break;
+ case 3: /* register to register */
+ destreg = DECODE_RM_BYTE_REGISTER(rl);
+ DECODE_PRINTF(",");
+ srcreg = DECODE_RM_BYTE_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = add_byte(*destreg, *srcreg);
+ break;
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x01
+****************************************************************************/
+static void x86emuOp_add_word_RM_R(u8 X86EMU_UNUSED(op1))
+{
+ int mod, rl, rh;
+ uint destoffset;
+
+ START_OF_INSTR();
+ DECODE_PRINTF("ADD\t");
+ FETCH_DECODE_MODRM(mod, rh, rl);
+ switch (mod) {
+ case 0:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 destval;
+ u32 *srcreg;
+
+ destoffset = decode_rm00_address(rl);
+ DECODE_PRINTF(",");
+ destval = fetch_data_long(destoffset);
+ srcreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ destval = add_long(destval, *srcreg);
+ store_data_long(destoffset, destval);
+ } else {
+ u16 destval;
+ u16 *srcreg;
+
+ destoffset = decode_rm00_address(rl);
+ DECODE_PRINTF(",");
+ destval = fetch_data_word(destoffset);
+ srcreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ destval = add_word(destval, *srcreg);
+ store_data_word(destoffset, destval);
+ }
+ break;
+ case 1:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 destval;
+ u32 *srcreg;
+
+ destoffset = decode_rm01_address(rl);
+ DECODE_PRINTF(",");
+ destval = fetch_data_long(destoffset);
+ srcreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ destval = add_long(destval, *srcreg);
+ store_data_long(destoffset, destval);
+ } else {
+ u16 destval;
+ u16 *srcreg;
+
+ destoffset = decode_rm01_address(rl);
+ DECODE_PRINTF(",");
+ destval = fetch_data_word(destoffset);
+ srcreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ destval = add_word(destval, *srcreg);
+ store_data_word(destoffset, destval);
+ }
+ break;
+ case 2:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 destval;
+ u32 *srcreg;
+
+ destoffset = decode_rm10_address(rl);
+ DECODE_PRINTF(",");
+ destval = fetch_data_long(destoffset);
+ srcreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ destval = add_long(destval, *srcreg);
+ store_data_long(destoffset, destval);
+ } else {
+ u16 destval;
+ u16 *srcreg;
+
+ destoffset = decode_rm10_address(rl);
+ DECODE_PRINTF(",");
+ destval = fetch_data_word(destoffset);
+ srcreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ destval = add_word(destval, *srcreg);
+ store_data_word(destoffset, destval);
+ }
+ break;
+ case 3: /* register to register */
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 *destreg,*srcreg;
+
+ destreg = DECODE_RM_LONG_REGISTER(rl);
+ DECODE_PRINTF(",");
+ srcreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = add_long(*destreg, *srcreg);
+ } else {
+ u16 *destreg,*srcreg;
+
+ destreg = DECODE_RM_WORD_REGISTER(rl);
+ DECODE_PRINTF(",");
+ srcreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = add_word(*destreg, *srcreg);
+ }
+ break;
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x02
+****************************************************************************/
+static void x86emuOp_add_byte_R_RM(u8 X86EMU_UNUSED(op1))
+{
+ int mod, rl, rh;
+ u8 *destreg, *srcreg;
+ uint srcoffset;
+ u8 srcval;
+
+ START_OF_INSTR();
+ DECODE_PRINTF("ADD\t");
+ FETCH_DECODE_MODRM(mod, rh, rl);
+ switch (mod) {
+ case 0:
+ destreg = DECODE_RM_BYTE_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm00_address(rl);
+ srcval = fetch_data_byte(srcoffset);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = add_byte(*destreg, srcval);
+ break;
+ case 1:
+ destreg = DECODE_RM_BYTE_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm01_address(rl);
+ srcval = fetch_data_byte(srcoffset);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = add_byte(*destreg, srcval);
+ break;
+ case 2:
+ destreg = DECODE_RM_BYTE_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm10_address(rl);
+ srcval = fetch_data_byte(srcoffset);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = add_byte(*destreg, srcval);
+ break;
+ case 3: /* register to register */
+ destreg = DECODE_RM_BYTE_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcreg = DECODE_RM_BYTE_REGISTER(rl);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = add_byte(*destreg, *srcreg);
+ break;
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x03
+****************************************************************************/
+static void x86emuOp_add_word_R_RM(u8 X86EMU_UNUSED(op1))
+{
+ int mod, rl, rh;
+ uint srcoffset;
+
+ START_OF_INSTR();
+ DECODE_PRINTF("ADD\t");
+ FETCH_DECODE_MODRM(mod, rh, rl);
+ switch (mod) {
+ case 0:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 *destreg;
+ u32 srcval;
+
+ destreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm00_address(rl);
+ srcval = fetch_data_long(srcoffset);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = add_long(*destreg, srcval);
+ } else {
+ u16 *destreg;
+ u16 srcval;
+
+ destreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm00_address(rl);
+ srcval = fetch_data_word(srcoffset);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = add_word(*destreg, srcval);
+ }
+ break;
+ case 1:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 *destreg;
+ u32 srcval;
+
+ destreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm01_address(rl);
+ srcval = fetch_data_long(srcoffset);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = add_long(*destreg, srcval);
+ } else {
+ u16 *destreg;
+ u16 srcval;
+
+ destreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm01_address(rl);
+ srcval = fetch_data_word(srcoffset);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = add_word(*destreg, srcval);
+ }
+ break;
+ case 2:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 *destreg;
+ u32 srcval;
+
+ destreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm10_address(rl);
+ srcval = fetch_data_long(srcoffset);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = add_long(*destreg, srcval);
+ } else {
+ u16 *destreg;
+ u16 srcval;
+
+ destreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm10_address(rl);
+ srcval = fetch_data_word(srcoffset);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = add_word(*destreg, srcval);
+ }
+ break;
+ case 3: /* register to register */
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 *destreg,*srcreg;
+
+ destreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcreg = DECODE_RM_LONG_REGISTER(rl);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = add_long(*destreg, *srcreg);
+ } else {
+ u16 *destreg,*srcreg;
+
+ destreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcreg = DECODE_RM_WORD_REGISTER(rl);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = add_word(*destreg, *srcreg);
+ }
+ break;
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x04
+****************************************************************************/
+static void x86emuOp_add_byte_AL_IMM(u8 X86EMU_UNUSED(op1))
+{
+ u8 srcval;
+
+ START_OF_INSTR();
+ DECODE_PRINTF("ADD\tAL,");
+ srcval = fetch_byte_imm();
+ DECODE_PRINTF2("%x\n", srcval);
+ TRACE_AND_STEP();
+ M.x86.R_AL = add_byte(M.x86.R_AL, srcval);
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x05
+****************************************************************************/
+static void x86emuOp_add_word_AX_IMM(u8 X86EMU_UNUSED(op1))
+{
+ u32 srcval;
+
+ START_OF_INSTR();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ DECODE_PRINTF("ADD\tEAX,");
+ srcval = fetch_long_imm();
+ } else {
+ DECODE_PRINTF("ADD\tAX,");
+ srcval = fetch_word_imm();
+ }
+ DECODE_PRINTF2("%x\n", srcval);
+ TRACE_AND_STEP();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ M.x86.R_EAX = add_long(M.x86.R_EAX, srcval);
+ } else {
+ M.x86.R_AX = add_word(M.x86.R_AX, (u16)srcval);
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x06
+****************************************************************************/
+static void x86emuOp_push_ES(u8 X86EMU_UNUSED(op1))
+{
+ START_OF_INSTR();
+ DECODE_PRINTF("PUSH\tES\n");
+ TRACE_AND_STEP();
+ push_word(M.x86.R_ES);
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x07
+****************************************************************************/
+static void x86emuOp_pop_ES(u8 X86EMU_UNUSED(op1))
+{
+ START_OF_INSTR();
+ DECODE_PRINTF("POP\tES\n");
+ TRACE_AND_STEP();
+ M.x86.R_ES = pop_word();
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x08
+****************************************************************************/
+static void x86emuOp_or_byte_RM_R(u8 X86EMU_UNUSED(op1))
+{
+ int mod, rl, rh;
+ u8 *destreg, *srcreg;
+ uint destoffset;
+ u8 destval;
+
+ START_OF_INSTR();
+ DECODE_PRINTF("OR\t");
+ FETCH_DECODE_MODRM(mod, rh, rl);
+ switch (mod) {
+ case 0:
+ destoffset = decode_rm00_address(rl);
+ DECODE_PRINTF(",");
+ destval = fetch_data_byte(destoffset);
+ srcreg = DECODE_RM_BYTE_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ destval = or_byte(destval, *srcreg);
+ store_data_byte(destoffset, destval);
+ break;
+ case 1:
+ destoffset = decode_rm01_address(rl);
+ DECODE_PRINTF(",");
+ destval = fetch_data_byte(destoffset);
+ srcreg = DECODE_RM_BYTE_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ destval = or_byte(destval, *srcreg);
+ store_data_byte(destoffset, destval);
+ break;
+ case 2:
+ destoffset = decode_rm10_address(rl);
+ DECODE_PRINTF(",");
+ destval = fetch_data_byte(destoffset);
+ srcreg = DECODE_RM_BYTE_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ destval = or_byte(destval, *srcreg);
+ store_data_byte(destoffset, destval);
+ break;
+ case 3: /* register to register */
+ destreg = DECODE_RM_BYTE_REGISTER(rl);
+ DECODE_PRINTF(",");
+ srcreg = DECODE_RM_BYTE_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = or_byte(*destreg, *srcreg);
+ break;
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x09
+****************************************************************************/
+static void x86emuOp_or_word_RM_R(u8 X86EMU_UNUSED(op1))
+{
+ int mod, rl, rh;
+ uint destoffset;
+
+ START_OF_INSTR();
+ DECODE_PRINTF("OR\t");
+ FETCH_DECODE_MODRM(mod, rh, rl);
+ switch (mod) {
+ case 0:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 destval;
+ u32 *srcreg;
+
+ destoffset = decode_rm00_address(rl);
+ DECODE_PRINTF(",");
+ destval = fetch_data_long(destoffset);
+ srcreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ destval = or_long(destval, *srcreg);
+ store_data_long(destoffset, destval);
+ } else {
+ u16 destval;
+ u16 *srcreg;
+
+ destoffset = decode_rm00_address(rl);
+ DECODE_PRINTF(",");
+ destval = fetch_data_word(destoffset);
+ srcreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ destval = or_word(destval, *srcreg);
+ store_data_word(destoffset, destval);
+ }
+ break;
+ case 1:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 destval;
+ u32 *srcreg;
+
+ destoffset = decode_rm01_address(rl);
+ DECODE_PRINTF(",");
+ destval = fetch_data_long(destoffset);
+ srcreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ destval = or_long(destval, *srcreg);
+ store_data_long(destoffset, destval);
+ } else {
+ u16 destval;
+ u16 *srcreg;
+
+ destoffset = decode_rm01_address(rl);
+ DECODE_PRINTF(",");
+ destval = fetch_data_word(destoffset);
+ srcreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ destval = or_word(destval, *srcreg);
+ store_data_word(destoffset, destval);
+ }
+ break;
+ case 2:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 destval;
+ u32 *srcreg;
+
+ destoffset = decode_rm10_address(rl);
+ DECODE_PRINTF(",");
+ destval = fetch_data_long(destoffset);
+ srcreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ destval = or_long(destval, *srcreg);
+ store_data_long(destoffset, destval);
+ } else {
+ u16 destval;
+ u16 *srcreg;
+
+ destoffset = decode_rm10_address(rl);
+ DECODE_PRINTF(",");
+ destval = fetch_data_word(destoffset);
+ srcreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ destval = or_word(destval, *srcreg);
+ store_data_word(destoffset, destval);
+ }
+ break;
+ case 3: /* register to register */
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 *destreg,*srcreg;
+
+ destreg = DECODE_RM_LONG_REGISTER(rl);
+ DECODE_PRINTF(",");
+ srcreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = or_long(*destreg, *srcreg);
+ } else {
+ u16 *destreg,*srcreg;
+
+ destreg = DECODE_RM_WORD_REGISTER(rl);
+ DECODE_PRINTF(",");
+ srcreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = or_word(*destreg, *srcreg);
+ }
+ break;
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x0a
+****************************************************************************/
+static void x86emuOp_or_byte_R_RM(u8 X86EMU_UNUSED(op1))
+{
+ int mod, rl, rh;
+ u8 *destreg, *srcreg;
+ uint srcoffset;
+ u8 srcval;
+
+ START_OF_INSTR();
+ DECODE_PRINTF("OR\t");
+ FETCH_DECODE_MODRM(mod, rh, rl);
+ switch (mod) {
+ case 0:
+ destreg = DECODE_RM_BYTE_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm00_address(rl);
+ srcval = fetch_data_byte(srcoffset);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = or_byte(*destreg, srcval);
+ break;
+ case 1:
+ destreg = DECODE_RM_BYTE_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm01_address(rl);
+ srcval = fetch_data_byte(srcoffset);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = or_byte(*destreg, srcval);
+ break;
+ case 2:
+ destreg = DECODE_RM_BYTE_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm10_address(rl);
+ srcval = fetch_data_byte(srcoffset);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = or_byte(*destreg, srcval);
+ break;
+ case 3: /* register to register */
+ destreg = DECODE_RM_BYTE_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcreg = DECODE_RM_BYTE_REGISTER(rl);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = or_byte(*destreg, *srcreg);
+ break;
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x0b
+****************************************************************************/
+static void x86emuOp_or_word_R_RM(u8 X86EMU_UNUSED(op1))
+{
+ int mod, rl, rh;
+ uint srcoffset;
+
+ START_OF_INSTR();
+ DECODE_PRINTF("OR\t");
+ FETCH_DECODE_MODRM(mod, rh, rl);
+ switch (mod) {
+ case 0:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 *destreg;
+ u32 srcval;
+
+ destreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm00_address(rl);
+ srcval = fetch_data_long(srcoffset);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = or_long(*destreg, srcval);
+ } else {
+ u16 *destreg;
+ u16 srcval;
+
+ destreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm00_address(rl);
+ srcval = fetch_data_word(srcoffset);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = or_word(*destreg, srcval);
+ }
+ break;
+ case 1:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 *destreg;
+ u32 srcval;
+
+ destreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm01_address(rl);
+ srcval = fetch_data_long(srcoffset);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = or_long(*destreg, srcval);
+ } else {
+ u16 *destreg;
+ u16 srcval;
+
+ destreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm01_address(rl);
+ srcval = fetch_data_word(srcoffset);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = or_word(*destreg, srcval);
+ }
+ break;
+ case 2:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 *destreg;
+ u32 srcval;
+
+ destreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm10_address(rl);
+ srcval = fetch_data_long(srcoffset);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = or_long(*destreg, srcval);
+ } else {
+ u16 *destreg;
+ u16 srcval;
+
+ destreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm10_address(rl);
+ srcval = fetch_data_word(srcoffset);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = or_word(*destreg, srcval);
+ }
+ break;
+ case 3: /* register to register */
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 *destreg,*srcreg;
+
+ destreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcreg = DECODE_RM_LONG_REGISTER(rl);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = or_long(*destreg, *srcreg);
+ } else {
+ u16 *destreg,*srcreg;
+
+ destreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcreg = DECODE_RM_WORD_REGISTER(rl);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = or_word(*destreg, *srcreg);
+ }
+ break;
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x0c
+****************************************************************************/
+static void x86emuOp_or_byte_AL_IMM(u8 X86EMU_UNUSED(op1))
+{
+ u8 srcval;
+
+ START_OF_INSTR();
+ DECODE_PRINTF("OR\tAL,");
+ srcval = fetch_byte_imm();
+ DECODE_PRINTF2("%x\n", srcval);
+ TRACE_AND_STEP();
+ M.x86.R_AL = or_byte(M.x86.R_AL, srcval);
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x0d
+****************************************************************************/
+static void x86emuOp_or_word_AX_IMM(u8 X86EMU_UNUSED(op1))
+{
+ u32 srcval;
+
+ START_OF_INSTR();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ DECODE_PRINTF("OR\tEAX,");
+ srcval = fetch_long_imm();
+ } else {
+ DECODE_PRINTF("OR\tAX,");
+ srcval = fetch_word_imm();
+ }
+ DECODE_PRINTF2("%x\n", srcval);
+ TRACE_AND_STEP();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ M.x86.R_EAX = or_long(M.x86.R_EAX, srcval);
+ } else {
+ M.x86.R_AX = or_word(M.x86.R_AX, (u16)srcval);
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x0e
+****************************************************************************/
+static void x86emuOp_push_CS(u8 X86EMU_UNUSED(op1))
+{
+ START_OF_INSTR();
+ DECODE_PRINTF("PUSH\tCS\n");
+ TRACE_AND_STEP();
+ push_word(M.x86.R_CS);
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x0f. Escape for two-byte opcode (286 or better)
+****************************************************************************/
+static void x86emuOp_two_byte(u8 X86EMU_UNUSED(op1))
+{
+ u8 op2 = (*sys_rdb)(((u32)M.x86.R_CS << 4) + (M.x86.R_IP++));
+ INC_DECODED_INST_LEN(1);
+ (*x86emu_optab2[op2])(op2);
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x10
+****************************************************************************/
+static void x86emuOp_adc_byte_RM_R(u8 X86EMU_UNUSED(op1))
+{
+ int mod, rl, rh;
+ u8 *destreg, *srcreg;
+ uint destoffset;
+ u8 destval;
+
+ START_OF_INSTR();
+ DECODE_PRINTF("ADC\t");
+ FETCH_DECODE_MODRM(mod, rh, rl);
+ switch (mod) {
+ case 0:
+ destoffset = decode_rm00_address(rl);
+ DECODE_PRINTF(",");
+ destval = fetch_data_byte(destoffset);
+ srcreg = DECODE_RM_BYTE_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ destval = adc_byte(destval, *srcreg);
+ store_data_byte(destoffset, destval);
+ break;
+ case 1:
+ destoffset = decode_rm01_address(rl);
+ DECODE_PRINTF(",");
+ destval = fetch_data_byte(destoffset);
+ srcreg = DECODE_RM_BYTE_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ destval = adc_byte(destval, *srcreg);
+ store_data_byte(destoffset, destval);
+ break;
+ case 2:
+ destoffset = decode_rm10_address(rl);
+ DECODE_PRINTF(",");
+ destval = fetch_data_byte(destoffset);
+ srcreg = DECODE_RM_BYTE_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ destval = adc_byte(destval, *srcreg);
+ store_data_byte(destoffset, destval);
+ break;
+ case 3: /* register to register */
+ destreg = DECODE_RM_BYTE_REGISTER(rl);
+ DECODE_PRINTF(",");
+ srcreg = DECODE_RM_BYTE_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = adc_byte(*destreg, *srcreg);
+ break;
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x11
+****************************************************************************/
+static void x86emuOp_adc_word_RM_R(u8 X86EMU_UNUSED(op1))
+{
+ int mod, rl, rh;
+ uint destoffset;
+
+ START_OF_INSTR();
+ DECODE_PRINTF("ADC\t");
+ FETCH_DECODE_MODRM(mod, rh, rl);
+ switch (mod) {
+ case 0:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 destval;
+ u32 *srcreg;
+
+ destoffset = decode_rm00_address(rl);
+ DECODE_PRINTF(",");
+ destval = fetch_data_long(destoffset);
+ srcreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ destval = adc_long(destval, *srcreg);
+ store_data_long(destoffset, destval);
+ } else {
+ u16 destval;
+ u16 *srcreg;
+
+ destoffset = decode_rm00_address(rl);
+ DECODE_PRINTF(",");
+ destval = fetch_data_word(destoffset);
+ srcreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ destval = adc_word(destval, *srcreg);
+ store_data_word(destoffset, destval);
+ }
+ break;
+ case 1:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 destval;
+ u32 *srcreg;
+
+ destoffset = decode_rm01_address(rl);
+ DECODE_PRINTF(",");
+ destval = fetch_data_long(destoffset);
+ srcreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ destval = adc_long(destval, *srcreg);
+ store_data_long(destoffset, destval);
+ } else {
+ u16 destval;
+ u16 *srcreg;
+
+ destoffset = decode_rm01_address(rl);
+ DECODE_PRINTF(",");
+ destval = fetch_data_word(destoffset);
+ srcreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ destval = adc_word(destval, *srcreg);
+ store_data_word(destoffset, destval);
+ }
+ break;
+ case 2:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 destval;
+ u32 *srcreg;
+
+ destoffset = decode_rm10_address(rl);
+ DECODE_PRINTF(",");
+ destval = fetch_data_long(destoffset);
+ srcreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ destval = adc_long(destval, *srcreg);
+ store_data_long(destoffset, destval);
+ } else {
+ u16 destval;
+ u16 *srcreg;
+
+ destoffset = decode_rm10_address(rl);
+ DECODE_PRINTF(",");
+ destval = fetch_data_word(destoffset);
+ srcreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ destval = adc_word(destval, *srcreg);
+ store_data_word(destoffset, destval);
+ }
+ break;
+ case 3: /* register to register */
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 *destreg,*srcreg;
+
+ destreg = DECODE_RM_LONG_REGISTER(rl);
+ DECODE_PRINTF(",");
+ srcreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = adc_long(*destreg, *srcreg);
+ } else {
+ u16 *destreg,*srcreg;
+
+ destreg = DECODE_RM_WORD_REGISTER(rl);
+ DECODE_PRINTF(",");
+ srcreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = adc_word(*destreg, *srcreg);
+ }
+ break;
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x12
+****************************************************************************/
+static void x86emuOp_adc_byte_R_RM(u8 X86EMU_UNUSED(op1))
+{
+ int mod, rl, rh;
+ u8 *destreg, *srcreg;
+ uint srcoffset;
+ u8 srcval;
+
+ START_OF_INSTR();
+ DECODE_PRINTF("ADC\t");
+ FETCH_DECODE_MODRM(mod, rh, rl);
+ switch (mod) {
+ case 0:
+ destreg = DECODE_RM_BYTE_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm00_address(rl);
+ srcval = fetch_data_byte(srcoffset);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = adc_byte(*destreg, srcval);
+ break;
+ case 1:
+ destreg = DECODE_RM_BYTE_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm01_address(rl);
+ srcval = fetch_data_byte(srcoffset);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = adc_byte(*destreg, srcval);
+ break;
+ case 2:
+ destreg = DECODE_RM_BYTE_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm10_address(rl);
+ srcval = fetch_data_byte(srcoffset);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = adc_byte(*destreg, srcval);
+ break;
+ case 3: /* register to register */
+ destreg = DECODE_RM_BYTE_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcreg = DECODE_RM_BYTE_REGISTER(rl);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = adc_byte(*destreg, *srcreg);
+ break;
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x13
+****************************************************************************/
+static void x86emuOp_adc_word_R_RM(u8 X86EMU_UNUSED(op1))
+{
+ int mod, rl, rh;
+ uint srcoffset;
+
+ START_OF_INSTR();
+ DECODE_PRINTF("ADC\t");
+ FETCH_DECODE_MODRM(mod, rh, rl);
+ switch (mod) {
+ case 0:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 *destreg;
+ u32 srcval;
+
+ destreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm00_address(rl);
+ srcval = fetch_data_long(srcoffset);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = adc_long(*destreg, srcval);
+ } else {
+ u16 *destreg;
+ u16 srcval;
+
+ destreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm00_address(rl);
+ srcval = fetch_data_word(srcoffset);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = adc_word(*destreg, srcval);
+ }
+ break;
+ case 1:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 *destreg;
+ u32 srcval;
+
+ destreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm01_address(rl);
+ srcval = fetch_data_long(srcoffset);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = adc_long(*destreg, srcval);
+ } else {
+ u16 *destreg;
+ u16 srcval;
+
+ destreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm01_address(rl);
+ srcval = fetch_data_word(srcoffset);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = adc_word(*destreg, srcval);
+ }
+ break;
+ case 2:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 *destreg;
+ u32 srcval;
+
+ destreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm10_address(rl);
+ srcval = fetch_data_long(srcoffset);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = adc_long(*destreg, srcval);
+ } else {
+ u16 *destreg;
+ u16 srcval;
+
+ destreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm10_address(rl);
+ srcval = fetch_data_word(srcoffset);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = adc_word(*destreg, srcval);
+ }
+ break;
+ case 3: /* register to register */
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 *destreg,*srcreg;
+
+ destreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcreg = DECODE_RM_LONG_REGISTER(rl);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = adc_long(*destreg, *srcreg);
+ } else {
+ u16 *destreg,*srcreg;
+
+ destreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcreg = DECODE_RM_WORD_REGISTER(rl);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = adc_word(*destreg, *srcreg);
+ }
+ break;
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x14
+****************************************************************************/
+static void x86emuOp_adc_byte_AL_IMM(u8 X86EMU_UNUSED(op1))
+{
+ u8 srcval;
+
+ START_OF_INSTR();
+ DECODE_PRINTF("ADC\tAL,");
+ srcval = fetch_byte_imm();
+ DECODE_PRINTF2("%x\n", srcval);
+ TRACE_AND_STEP();
+ M.x86.R_AL = adc_byte(M.x86.R_AL, srcval);
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x15
+****************************************************************************/
+static void x86emuOp_adc_word_AX_IMM(u8 X86EMU_UNUSED(op1))
+{
+ u32 srcval;
+
+ START_OF_INSTR();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ DECODE_PRINTF("ADC\tEAX,");
+ srcval = fetch_long_imm();
+ } else {
+ DECODE_PRINTF("ADC\tAX,");
+ srcval = fetch_word_imm();
+ }
+ DECODE_PRINTF2("%x\n", srcval);
+ TRACE_AND_STEP();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ M.x86.R_EAX = adc_long(M.x86.R_EAX, srcval);
+ } else {
+ M.x86.R_AX = adc_word(M.x86.R_AX, (u16)srcval);
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x16
+****************************************************************************/
+static void x86emuOp_push_SS(u8 X86EMU_UNUSED(op1))
+{
+ START_OF_INSTR();
+ DECODE_PRINTF("PUSH\tSS\n");
+ TRACE_AND_STEP();
+ push_word(M.x86.R_SS);
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x17
+****************************************************************************/
+static void x86emuOp_pop_SS(u8 X86EMU_UNUSED(op1))
+{
+ START_OF_INSTR();
+ DECODE_PRINTF("POP\tSS\n");
+ TRACE_AND_STEP();
+ M.x86.R_SS = pop_word();
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x18
+****************************************************************************/
+static void x86emuOp_sbb_byte_RM_R(u8 X86EMU_UNUSED(op1))
+{
+ int mod, rl, rh;
+ u8 *destreg, *srcreg;
+ uint destoffset;
+ u8 destval;
+
+ START_OF_INSTR();
+ DECODE_PRINTF("SBB\t");
+ FETCH_DECODE_MODRM(mod, rh, rl);
+ switch (mod) {
+ case 0:
+ destoffset = decode_rm00_address(rl);
+ DECODE_PRINTF(",");
+ destval = fetch_data_byte(destoffset);
+ srcreg = DECODE_RM_BYTE_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ destval = sbb_byte(destval, *srcreg);
+ store_data_byte(destoffset, destval);
+ break;
+ case 1:
+ destoffset = decode_rm01_address(rl);
+ DECODE_PRINTF(",");
+ destval = fetch_data_byte(destoffset);
+ srcreg = DECODE_RM_BYTE_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ destval = sbb_byte(destval, *srcreg);
+ store_data_byte(destoffset, destval);
+ break;
+ case 2:
+ destoffset = decode_rm10_address(rl);
+ DECODE_PRINTF(",");
+ destval = fetch_data_byte(destoffset);
+ srcreg = DECODE_RM_BYTE_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ destval = sbb_byte(destval, *srcreg);
+ store_data_byte(destoffset, destval);
+ break;
+ case 3: /* register to register */
+ destreg = DECODE_RM_BYTE_REGISTER(rl);
+ DECODE_PRINTF(",");
+ srcreg = DECODE_RM_BYTE_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = sbb_byte(*destreg, *srcreg);
+ break;
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x19
+****************************************************************************/
+static void x86emuOp_sbb_word_RM_R(u8 X86EMU_UNUSED(op1))
+{
+ int mod, rl, rh;
+ uint destoffset;
+
+ START_OF_INSTR();
+ DECODE_PRINTF("SBB\t");
+ FETCH_DECODE_MODRM(mod, rh, rl);
+ switch (mod) {
+ case 0:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 destval;
+ u32 *srcreg;
+
+ destoffset = decode_rm00_address(rl);
+ DECODE_PRINTF(",");
+ destval = fetch_data_long(destoffset);
+ srcreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ destval = sbb_long(destval, *srcreg);
+ store_data_long(destoffset, destval);
+ } else {
+ u16 destval;
+ u16 *srcreg;
+
+ destoffset = decode_rm00_address(rl);
+ DECODE_PRINTF(",");
+ destval = fetch_data_word(destoffset);
+ srcreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ destval = sbb_word(destval, *srcreg);
+ store_data_word(destoffset, destval);
+ }
+ break;
+ case 1:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 destval;
+ u32 *srcreg;
+
+ destoffset = decode_rm01_address(rl);
+ DECODE_PRINTF(",");
+ destval = fetch_data_long(destoffset);
+ srcreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ destval = sbb_long(destval, *srcreg);
+ store_data_long(destoffset, destval);
+ } else {
+ u16 destval;
+ u16 *srcreg;
+
+ destoffset = decode_rm01_address(rl);
+ DECODE_PRINTF(",");
+ destval = fetch_data_word(destoffset);
+ srcreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ destval = sbb_word(destval, *srcreg);
+ store_data_word(destoffset, destval);
+ }
+ break;
+ case 2:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 destval;
+ u32 *srcreg;
+
+ destoffset = decode_rm10_address(rl);
+ DECODE_PRINTF(",");
+ destval = fetch_data_long(destoffset);
+ srcreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ destval = sbb_long(destval, *srcreg);
+ store_data_long(destoffset, destval);
+ } else {
+ u16 destval;
+ u16 *srcreg;
+
+ destoffset = decode_rm10_address(rl);
+ DECODE_PRINTF(",");
+ destval = fetch_data_word(destoffset);
+ srcreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ destval = sbb_word(destval, *srcreg);
+ store_data_word(destoffset, destval);
+ }
+ break;
+ case 3: /* register to register */
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 *destreg,*srcreg;
+
+ destreg = DECODE_RM_LONG_REGISTER(rl);
+ DECODE_PRINTF(",");
+ srcreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = sbb_long(*destreg, *srcreg);
+ } else {
+ u16 *destreg,*srcreg;
+
+ destreg = DECODE_RM_WORD_REGISTER(rl);
+ DECODE_PRINTF(",");
+ srcreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = sbb_word(*destreg, *srcreg);
+ }
+ break;
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x1a
+****************************************************************************/
+static void x86emuOp_sbb_byte_R_RM(u8 X86EMU_UNUSED(op1))
+{
+ int mod, rl, rh;
+ u8 *destreg, *srcreg;
+ uint srcoffset;
+ u8 srcval;
+
+ START_OF_INSTR();
+ DECODE_PRINTF("SBB\t");
+ FETCH_DECODE_MODRM(mod, rh, rl);
+ switch (mod) {
+ case 0:
+ destreg = DECODE_RM_BYTE_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm00_address(rl);
+ srcval = fetch_data_byte(srcoffset);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = sbb_byte(*destreg, srcval);
+ break;
+ case 1:
+ destreg = DECODE_RM_BYTE_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm01_address(rl);
+ srcval = fetch_data_byte(srcoffset);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = sbb_byte(*destreg, srcval);
+ break;
+ case 2:
+ destreg = DECODE_RM_BYTE_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm10_address(rl);
+ srcval = fetch_data_byte(srcoffset);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = sbb_byte(*destreg, srcval);
+ break;
+ case 3: /* register to register */
+ destreg = DECODE_RM_BYTE_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcreg = DECODE_RM_BYTE_REGISTER(rl);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = sbb_byte(*destreg, *srcreg);
+ break;
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x1b
+****************************************************************************/
+static void x86emuOp_sbb_word_R_RM(u8 X86EMU_UNUSED(op1))
+{
+ int mod, rl, rh;
+ uint srcoffset;
+
+ START_OF_INSTR();
+ DECODE_PRINTF("SBB\t");
+ FETCH_DECODE_MODRM(mod, rh, rl);
+ switch (mod) {
+ case 0:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 *destreg;
+ u32 srcval;
+
+ destreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm00_address(rl);
+ srcval = fetch_data_long(srcoffset);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = sbb_long(*destreg, srcval);
+ } else {
+ u16 *destreg;
+ u16 srcval;
+
+ destreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm00_address(rl);
+ srcval = fetch_data_word(srcoffset);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = sbb_word(*destreg, srcval);
+ }
+ break;
+ case 1:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 *destreg;
+ u32 srcval;
+
+ destreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm01_address(rl);
+ srcval = fetch_data_long(srcoffset);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = sbb_long(*destreg, srcval);
+ } else {
+ u16 *destreg;
+ u16 srcval;
+
+ destreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm01_address(rl);
+ srcval = fetch_data_word(srcoffset);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = sbb_word(*destreg, srcval);
+ }
+ break;
+ case 2:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 *destreg;
+ u32 srcval;
+
+ destreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm10_address(rl);
+ srcval = fetch_data_long(srcoffset);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = sbb_long(*destreg, srcval);
+ } else {
+ u16 *destreg;
+ u16 srcval;
+
+ destreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm10_address(rl);
+ srcval = fetch_data_word(srcoffset);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = sbb_word(*destreg, srcval);
+ }
+ break;
+ case 3: /* register to register */
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 *destreg,*srcreg;
+
+ destreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcreg = DECODE_RM_LONG_REGISTER(rl);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = sbb_long(*destreg, *srcreg);
+ } else {
+ u16 *destreg,*srcreg;
+
+ destreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcreg = DECODE_RM_WORD_REGISTER(rl);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = sbb_word(*destreg, *srcreg);
+ }
+ break;
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x1c
+****************************************************************************/
+static void x86emuOp_sbb_byte_AL_IMM(u8 X86EMU_UNUSED(op1))
+{
+ u8 srcval;
+
+ START_OF_INSTR();
+ DECODE_PRINTF("SBB\tAL,");
+ srcval = fetch_byte_imm();
+ DECODE_PRINTF2("%x\n", srcval);
+ TRACE_AND_STEP();
+ M.x86.R_AL = sbb_byte(M.x86.R_AL, srcval);
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x1d
+****************************************************************************/
+static void x86emuOp_sbb_word_AX_IMM(u8 X86EMU_UNUSED(op1))
+{
+ u32 srcval;
+
+ START_OF_INSTR();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ DECODE_PRINTF("SBB\tEAX,");
+ srcval = fetch_long_imm();
+ } else {
+ DECODE_PRINTF("SBB\tAX,");
+ srcval = fetch_word_imm();
+ }
+ DECODE_PRINTF2("%x\n", srcval);
+ TRACE_AND_STEP();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ M.x86.R_EAX = sbb_long(M.x86.R_EAX, srcval);
+ } else {
+ M.x86.R_AX = sbb_word(M.x86.R_AX, (u16)srcval);
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x1e
+****************************************************************************/
+static void x86emuOp_push_DS(u8 X86EMU_UNUSED(op1))
+{
+ START_OF_INSTR();
+ DECODE_PRINTF("PUSH\tDS\n");
+ TRACE_AND_STEP();
+ push_word(M.x86.R_DS);
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x1f
+****************************************************************************/
+static void x86emuOp_pop_DS(u8 X86EMU_UNUSED(op1))
+{
+ START_OF_INSTR();
+ DECODE_PRINTF("POP\tDS\n");
+ TRACE_AND_STEP();
+ M.x86.R_DS = pop_word();
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x20
+****************************************************************************/
+static void x86emuOp_and_byte_RM_R(u8 X86EMU_UNUSED(op1))
+{
+ int mod, rl, rh;
+ u8 *destreg, *srcreg;
+ uint destoffset;
+ u8 destval;
+
+ START_OF_INSTR();
+ DECODE_PRINTF("AND\t");
+ FETCH_DECODE_MODRM(mod, rh, rl);
+
+ switch (mod) {
+ case 0:
+ destoffset = decode_rm00_address(rl);
+ DECODE_PRINTF(",");
+ destval = fetch_data_byte(destoffset);
+ srcreg = DECODE_RM_BYTE_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ destval = and_byte(destval, *srcreg);
+ store_data_byte(destoffset, destval);
+ break;
+
+ case 1:
+ destoffset = decode_rm01_address(rl);
+ DECODE_PRINTF(",");
+ destval = fetch_data_byte(destoffset);
+ srcreg = DECODE_RM_BYTE_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ destval = and_byte(destval, *srcreg);
+ store_data_byte(destoffset, destval);
+ break;
+
+ case 2:
+ destoffset = decode_rm10_address(rl);
+ DECODE_PRINTF(",");
+ destval = fetch_data_byte(destoffset);
+ srcreg = DECODE_RM_BYTE_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ destval = and_byte(destval, *srcreg);
+ store_data_byte(destoffset, destval);
+ break;
+
+ case 3: /* register to register */
+ destreg = DECODE_RM_BYTE_REGISTER(rl);
+ DECODE_PRINTF(",");
+ srcreg = DECODE_RM_BYTE_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = and_byte(*destreg, *srcreg);
+ break;
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x21
+****************************************************************************/
+static void x86emuOp_and_word_RM_R(u8 X86EMU_UNUSED(op1))
+{
+ int mod, rl, rh;
+ uint destoffset;
+
+ START_OF_INSTR();
+ DECODE_PRINTF("AND\t");
+ FETCH_DECODE_MODRM(mod, rh, rl);
+ switch (mod) {
+ case 0:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 destval;
+ u32 *srcreg;
+
+ destoffset = decode_rm00_address(rl);
+ DECODE_PRINTF(",");
+ destval = fetch_data_long(destoffset);
+ srcreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ destval = and_long(destval, *srcreg);
+ store_data_long(destoffset, destval);
+ } else {
+ u16 destval;
+ u16 *srcreg;
+
+ destoffset = decode_rm00_address(rl);
+ DECODE_PRINTF(",");
+ destval = fetch_data_word(destoffset);
+ srcreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ destval = and_word(destval, *srcreg);
+ store_data_word(destoffset, destval);
+ }
+ break;
+ case 1:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 destval;
+ u32 *srcreg;
+
+ destoffset = decode_rm01_address(rl);
+ DECODE_PRINTF(",");
+ destval = fetch_data_long(destoffset);
+ srcreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ destval = and_long(destval, *srcreg);
+ store_data_long(destoffset, destval);
+ } else {
+ u16 destval;
+ u16 *srcreg;
+
+ destoffset = decode_rm01_address(rl);
+ DECODE_PRINTF(",");
+ destval = fetch_data_word(destoffset);
+ srcreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ destval = and_word(destval, *srcreg);
+ store_data_word(destoffset, destval);
+ }
+ break;
+ case 2:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 destval;
+ u32 *srcreg;
+
+ destoffset = decode_rm10_address(rl);
+ DECODE_PRINTF(",");
+ destval = fetch_data_long(destoffset);
+ srcreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ destval = and_long(destval, *srcreg);
+ store_data_long(destoffset, destval);
+ } else {
+ u16 destval;
+ u16 *srcreg;
+
+ destoffset = decode_rm10_address(rl);
+ DECODE_PRINTF(",");
+ destval = fetch_data_word(destoffset);
+ srcreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ destval = and_word(destval, *srcreg);
+ store_data_word(destoffset, destval);
+ }
+ break;
+ case 3: /* register to register */
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 *destreg,*srcreg;
+
+ destreg = DECODE_RM_LONG_REGISTER(rl);
+ DECODE_PRINTF(",");
+ srcreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = and_long(*destreg, *srcreg);
+ } else {
+ u16 *destreg,*srcreg;
+
+ destreg = DECODE_RM_WORD_REGISTER(rl);
+ DECODE_PRINTF(",");
+ srcreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = and_word(*destreg, *srcreg);
+ }
+ break;
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x22
+****************************************************************************/
+static void x86emuOp_and_byte_R_RM(u8 X86EMU_UNUSED(op1))
+{
+ int mod, rl, rh;
+ u8 *destreg, *srcreg;
+ uint srcoffset;
+ u8 srcval;
+
+ START_OF_INSTR();
+ DECODE_PRINTF("AND\t");
+ FETCH_DECODE_MODRM(mod, rh, rl);
+ switch (mod) {
+ case 0:
+ destreg = DECODE_RM_BYTE_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm00_address(rl);
+ srcval = fetch_data_byte(srcoffset);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = and_byte(*destreg, srcval);
+ break;
+ case 1:
+ destreg = DECODE_RM_BYTE_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm01_address(rl);
+ srcval = fetch_data_byte(srcoffset);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = and_byte(*destreg, srcval);
+ break;
+ case 2:
+ destreg = DECODE_RM_BYTE_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm10_address(rl);
+ srcval = fetch_data_byte(srcoffset);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = and_byte(*destreg, srcval);
+ break;
+ case 3: /* register to register */
+ destreg = DECODE_RM_BYTE_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcreg = DECODE_RM_BYTE_REGISTER(rl);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = and_byte(*destreg, *srcreg);
+ break;
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x23
+****************************************************************************/
+static void x86emuOp_and_word_R_RM(u8 X86EMU_UNUSED(op1))
+{
+ int mod, rl, rh;
+ uint srcoffset;
+
+ START_OF_INSTR();
+ DECODE_PRINTF("AND\t");
+ FETCH_DECODE_MODRM(mod, rh, rl);
+ switch (mod) {
+ case 0:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 *destreg;
+ u32 srcval;
+
+ destreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm00_address(rl);
+ srcval = fetch_data_long(srcoffset);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = and_long(*destreg, srcval);
+ } else {
+ u16 *destreg;
+ u16 srcval;
+
+ destreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm00_address(rl);
+ srcval = fetch_data_word(srcoffset);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = and_word(*destreg, srcval);
+ }
+ break;
+ case 1:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 *destreg;
+ u32 srcval;
+
+ destreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm01_address(rl);
+ srcval = fetch_data_long(srcoffset);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = and_long(*destreg, srcval);
+ break;
+ } else {
+ u16 *destreg;
+ u16 srcval;
+
+ destreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm01_address(rl);
+ srcval = fetch_data_word(srcoffset);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = and_word(*destreg, srcval);
+ break;
+ }
+ case 2:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 *destreg;
+ u32 srcval;
+
+ destreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm10_address(rl);
+ srcval = fetch_data_long(srcoffset);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = and_long(*destreg, srcval);
+ } else {
+ u16 *destreg;
+ u16 srcval;
+
+ destreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm10_address(rl);
+ srcval = fetch_data_word(srcoffset);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = and_word(*destreg, srcval);
+ }
+ break;
+ case 3: /* register to register */
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 *destreg,*srcreg;
+
+ destreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcreg = DECODE_RM_LONG_REGISTER(rl);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = and_long(*destreg, *srcreg);
+ } else {
+ u16 *destreg,*srcreg;
+
+ destreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcreg = DECODE_RM_WORD_REGISTER(rl);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = and_word(*destreg, *srcreg);
+ }
+ break;
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x24
+****************************************************************************/
+static void x86emuOp_and_byte_AL_IMM(u8 X86EMU_UNUSED(op1))
+{
+ u8 srcval;
+
+ START_OF_INSTR();
+ DECODE_PRINTF("AND\tAL,");
+ srcval = fetch_byte_imm();
+ DECODE_PRINTF2("%x\n", srcval);
+ TRACE_AND_STEP();
+ M.x86.R_AL = and_byte(M.x86.R_AL, srcval);
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x25
+****************************************************************************/
+static void x86emuOp_and_word_AX_IMM(u8 X86EMU_UNUSED(op1))
+{
+ u32 srcval;
+
+ START_OF_INSTR();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ DECODE_PRINTF("AND\tEAX,");
+ srcval = fetch_long_imm();
+ } else {
+ DECODE_PRINTF("AND\tAX,");
+ srcval = fetch_word_imm();
+ }
+ DECODE_PRINTF2("%x\n", srcval);
+ TRACE_AND_STEP();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ M.x86.R_EAX = and_long(M.x86.R_EAX, srcval);
+ } else {
+ M.x86.R_AX = and_word(M.x86.R_AX, (u16)srcval);
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x26
+****************************************************************************/
+static void x86emuOp_segovr_ES(u8 X86EMU_UNUSED(op1))
+{
+ START_OF_INSTR();
+ DECODE_PRINTF("ES:\n");
+ TRACE_AND_STEP();
+ M.x86.mode |= SYSMODE_SEGOVR_ES;
+ /*
+ * note the lack of DECODE_CLEAR_SEGOVR(r) since, here is one of 4
+ * opcode subroutines we do not want to do this.
+ */
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x27
+****************************************************************************/
+static void x86emuOp_daa(u8 X86EMU_UNUSED(op1))
+{
+ START_OF_INSTR();
+ DECODE_PRINTF("DAA\n");
+ TRACE_AND_STEP();
+ M.x86.R_AL = daa_byte(M.x86.R_AL);
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x28
+****************************************************************************/
+static void x86emuOp_sub_byte_RM_R(u8 X86EMU_UNUSED(op1))
+{
+ int mod, rl, rh;
+ u8 *destreg, *srcreg;
+ uint destoffset;
+ u8 destval;
+
+ START_OF_INSTR();
+ DECODE_PRINTF("SUB\t");
+ FETCH_DECODE_MODRM(mod, rh, rl);
+ switch (mod) {
+ case 0:
+ destoffset = decode_rm00_address(rl);
+ DECODE_PRINTF(",");
+ destval = fetch_data_byte(destoffset);
+ srcreg = DECODE_RM_BYTE_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ destval = sub_byte(destval, *srcreg);
+ store_data_byte(destoffset, destval);
+ break;
+ case 1:
+ destoffset = decode_rm01_address(rl);
+ DECODE_PRINTF(",");
+ destval = fetch_data_byte(destoffset);
+ srcreg = DECODE_RM_BYTE_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ destval = sub_byte(destval, *srcreg);
+ store_data_byte(destoffset, destval);
+ break;
+ case 2:
+ destoffset = decode_rm10_address(rl);
+ DECODE_PRINTF(",");
+ destval = fetch_data_byte(destoffset);
+ srcreg = DECODE_RM_BYTE_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ destval = sub_byte(destval, *srcreg);
+ store_data_byte(destoffset, destval);
+ break;
+ case 3: /* register to register */
+ destreg = DECODE_RM_BYTE_REGISTER(rl);
+ DECODE_PRINTF(",");
+ srcreg = DECODE_RM_BYTE_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = sub_byte(*destreg, *srcreg);
+ break;
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x29
+****************************************************************************/
+static void x86emuOp_sub_word_RM_R(u8 X86EMU_UNUSED(op1))
+{
+ int mod, rl, rh;
+ uint destoffset;
+
+ START_OF_INSTR();
+ DECODE_PRINTF("SUB\t");
+ FETCH_DECODE_MODRM(mod, rh, rl);
+ switch (mod) {
+ case 0:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 destval;
+ u32 *srcreg;
+
+ destoffset = decode_rm00_address(rl);
+ DECODE_PRINTF(",");
+ destval = fetch_data_long(destoffset);
+ srcreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ destval = sub_long(destval, *srcreg);
+ store_data_long(destoffset, destval);
+ } else {
+ u16 destval;
+ u16 *srcreg;
+
+ destoffset = decode_rm00_address(rl);
+ DECODE_PRINTF(",");
+ destval = fetch_data_word(destoffset);
+ srcreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ destval = sub_word(destval, *srcreg);
+ store_data_word(destoffset, destval);
+ }
+ break;
+ case 1:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 destval;
+ u32 *srcreg;
+
+ destoffset = decode_rm01_address(rl);
+ DECODE_PRINTF(",");
+ destval = fetch_data_long(destoffset);
+ srcreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ destval = sub_long(destval, *srcreg);
+ store_data_long(destoffset, destval);
+ } else {
+ u16 destval;
+ u16 *srcreg;
+
+ destoffset = decode_rm01_address(rl);
+ DECODE_PRINTF(",");
+ destval = fetch_data_word(destoffset);
+ srcreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ destval = sub_word(destval, *srcreg);
+ store_data_word(destoffset, destval);
+ }
+ break;
+ case 2:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 destval;
+ u32 *srcreg;
+
+ destoffset = decode_rm10_address(rl);
+ DECODE_PRINTF(",");
+ destval = fetch_data_long(destoffset);
+ srcreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ destval = sub_long(destval, *srcreg);
+ store_data_long(destoffset, destval);
+ } else {
+ u16 destval;
+ u16 *srcreg;
+
+ destoffset = decode_rm10_address(rl);
+ DECODE_PRINTF(",");
+ destval = fetch_data_word(destoffset);
+ srcreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ destval = sub_word(destval, *srcreg);
+ store_data_word(destoffset, destval);
+ }
+ break;
+ case 3: /* register to register */
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 *destreg,*srcreg;
+
+ destreg = DECODE_RM_LONG_REGISTER(rl);
+ DECODE_PRINTF(",");
+ srcreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = sub_long(*destreg, *srcreg);
+ } else {
+ u16 *destreg,*srcreg;
+
+ destreg = DECODE_RM_WORD_REGISTER(rl);
+ DECODE_PRINTF(",");
+ srcreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = sub_word(*destreg, *srcreg);
+ }
+ break;
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x2a
+****************************************************************************/
+static void x86emuOp_sub_byte_R_RM(u8 X86EMU_UNUSED(op1))
+{
+ int mod, rl, rh;
+ u8 *destreg, *srcreg;
+ uint srcoffset;
+ u8 srcval;
+
+ START_OF_INSTR();
+ DECODE_PRINTF("SUB\t");
+ FETCH_DECODE_MODRM(mod, rh, rl);
+ switch (mod) {
+ case 0:
+ destreg = DECODE_RM_BYTE_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm00_address(rl);
+ srcval = fetch_data_byte(srcoffset);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = sub_byte(*destreg, srcval);
+ break;
+ case 1:
+ destreg = DECODE_RM_BYTE_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm01_address(rl);
+ srcval = fetch_data_byte(srcoffset);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = sub_byte(*destreg, srcval);
+ break;
+ case 2:
+ destreg = DECODE_RM_BYTE_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm10_address(rl);
+ srcval = fetch_data_byte(srcoffset);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = sub_byte(*destreg, srcval);
+ break;
+ case 3: /* register to register */
+ destreg = DECODE_RM_BYTE_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcreg = DECODE_RM_BYTE_REGISTER(rl);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = sub_byte(*destreg, *srcreg);
+ break;
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x2b
+****************************************************************************/
+static void x86emuOp_sub_word_R_RM(u8 X86EMU_UNUSED(op1))
+{
+ int mod, rl, rh;
+ uint srcoffset;
+
+ START_OF_INSTR();
+ DECODE_PRINTF("SUB\t");
+ FETCH_DECODE_MODRM(mod, rh, rl);
+ switch (mod) {
+ case 0:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 *destreg;
+ u32 srcval;
+
+ destreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm00_address(rl);
+ srcval = fetch_data_long(srcoffset);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = sub_long(*destreg, srcval);
+ } else {
+ u16 *destreg;
+ u16 srcval;
+
+ destreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm00_address(rl);
+ srcval = fetch_data_word(srcoffset);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = sub_word(*destreg, srcval);
+ }
+ break;
+ case 1:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 *destreg;
+ u32 srcval;
+
+ destreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm01_address(rl);
+ srcval = fetch_data_long(srcoffset);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = sub_long(*destreg, srcval);
+ } else {
+ u16 *destreg;
+ u16 srcval;
+
+ destreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm01_address(rl);
+ srcval = fetch_data_word(srcoffset);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = sub_word(*destreg, srcval);
+ }
+ break;
+ case 2:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 *destreg;
+ u32 srcval;
+
+ destreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm10_address(rl);
+ srcval = fetch_data_long(srcoffset);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = sub_long(*destreg, srcval);
+ } else {
+ u16 *destreg;
+ u16 srcval;
+
+ destreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm10_address(rl);
+ srcval = fetch_data_word(srcoffset);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = sub_word(*destreg, srcval);
+ }
+ break;
+ case 3: /* register to register */
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 *destreg,*srcreg;
+
+ destreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcreg = DECODE_RM_LONG_REGISTER(rl);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = sub_long(*destreg, *srcreg);
+ } else {
+ u16 *destreg,*srcreg;
+
+ destreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcreg = DECODE_RM_WORD_REGISTER(rl);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = sub_word(*destreg, *srcreg);
+ }
+ break;
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x2c
+****************************************************************************/
+static void x86emuOp_sub_byte_AL_IMM(u8 X86EMU_UNUSED(op1))
+{
+ u8 srcval;
+
+ START_OF_INSTR();
+ DECODE_PRINTF("SUB\tAL,");
+ srcval = fetch_byte_imm();
+ DECODE_PRINTF2("%x\n", srcval);
+ TRACE_AND_STEP();
+ M.x86.R_AL = sub_byte(M.x86.R_AL, srcval);
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x2d
+****************************************************************************/
+static void x86emuOp_sub_word_AX_IMM(u8 X86EMU_UNUSED(op1))
+{
+ u32 srcval;
+
+ START_OF_INSTR();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ DECODE_PRINTF("SUB\tEAX,");
+ srcval = fetch_long_imm();
+ } else {
+ DECODE_PRINTF("SUB\tAX,");
+ srcval = fetch_word_imm();
+ }
+ DECODE_PRINTF2("%x\n", srcval);
+ TRACE_AND_STEP();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ M.x86.R_EAX = sub_long(M.x86.R_EAX, srcval);
+ } else {
+ M.x86.R_AX = sub_word(M.x86.R_AX, (u16)srcval);
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x2e
+****************************************************************************/
+static void x86emuOp_segovr_CS(u8 X86EMU_UNUSED(op1))
+{
+ START_OF_INSTR();
+ DECODE_PRINTF("CS:\n");
+ TRACE_AND_STEP();
+ M.x86.mode |= SYSMODE_SEGOVR_CS;
+ /* note no DECODE_CLEAR_SEGOVR here. */
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x2f
+****************************************************************************/
+static void x86emuOp_das(u8 X86EMU_UNUSED(op1))
+{
+ START_OF_INSTR();
+ DECODE_PRINTF("DAS\n");
+ TRACE_AND_STEP();
+ M.x86.R_AL = das_byte(M.x86.R_AL);
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x30
+****************************************************************************/
+static void x86emuOp_xor_byte_RM_R(u8 X86EMU_UNUSED(op1))
+{
+ int mod, rl, rh;
+ u8 *destreg, *srcreg;
+ uint destoffset;
+ u8 destval;
+
+ START_OF_INSTR();
+ DECODE_PRINTF("XOR\t");
+ FETCH_DECODE_MODRM(mod, rh, rl);
+ switch (mod) {
+ case 0:
+ destoffset = decode_rm00_address(rl);
+ DECODE_PRINTF(",");
+ destval = fetch_data_byte(destoffset);
+ srcreg = DECODE_RM_BYTE_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ destval = xor_byte(destval, *srcreg);
+ store_data_byte(destoffset, destval);
+ break;
+ case 1:
+ destoffset = decode_rm01_address(rl);
+ DECODE_PRINTF(",");
+ destval = fetch_data_byte(destoffset);
+ srcreg = DECODE_RM_BYTE_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ destval = xor_byte(destval, *srcreg);
+ store_data_byte(destoffset, destval);
+ break;
+ case 2:
+ destoffset = decode_rm10_address(rl);
+ DECODE_PRINTF(",");
+ destval = fetch_data_byte(destoffset);
+ srcreg = DECODE_RM_BYTE_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ destval = xor_byte(destval, *srcreg);
+ store_data_byte(destoffset, destval);
+ break;
+ case 3: /* register to register */
+ destreg = DECODE_RM_BYTE_REGISTER(rl);
+ DECODE_PRINTF(",");
+ srcreg = DECODE_RM_BYTE_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = xor_byte(*destreg, *srcreg);
+ break;
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x31
+****************************************************************************/
+static void x86emuOp_xor_word_RM_R(u8 X86EMU_UNUSED(op1))
+{
+ int mod, rl, rh;
+ uint destoffset;
+
+ START_OF_INSTR();
+ DECODE_PRINTF("XOR\t");
+ FETCH_DECODE_MODRM(mod, rh, rl);
+ switch (mod) {
+ case 0:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 destval;
+ u32 *srcreg;
+
+ destoffset = decode_rm00_address(rl);
+ DECODE_PRINTF(",");
+ destval = fetch_data_long(destoffset);
+ srcreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ destval = xor_long(destval, *srcreg);
+ store_data_long(destoffset, destval);
+ } else {
+ u16 destval;
+ u16 *srcreg;
+
+ destoffset = decode_rm00_address(rl);
+ DECODE_PRINTF(",");
+ destval = fetch_data_word(destoffset);
+ srcreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ destval = xor_word(destval, *srcreg);
+ store_data_word(destoffset, destval);
+ }
+ break;
+ case 1:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 destval;
+ u32 *srcreg;
+
+ destoffset = decode_rm01_address(rl);
+ DECODE_PRINTF(",");
+ destval = fetch_data_long(destoffset);
+ srcreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ destval = xor_long(destval, *srcreg);
+ store_data_long(destoffset, destval);
+ } else {
+ u16 destval;
+ u16 *srcreg;
+
+ destoffset = decode_rm01_address(rl);
+ DECODE_PRINTF(",");
+ destval = fetch_data_word(destoffset);
+ srcreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ destval = xor_word(destval, *srcreg);
+ store_data_word(destoffset, destval);
+ }
+ break;
+ case 2:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 destval;
+ u32 *srcreg;
+
+ destoffset = decode_rm10_address(rl);
+ DECODE_PRINTF(",");
+ destval = fetch_data_long(destoffset);
+ srcreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ destval = xor_long(destval, *srcreg);
+ store_data_long(destoffset, destval);
+ } else {
+ u16 destval;
+ u16 *srcreg;
+
+ destoffset = decode_rm10_address(rl);
+ DECODE_PRINTF(",");
+ destval = fetch_data_word(destoffset);
+ srcreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ destval = xor_word(destval, *srcreg);
+ store_data_word(destoffset, destval);
+ }
+ break;
+ case 3: /* register to register */
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 *destreg,*srcreg;
+
+ destreg = DECODE_RM_LONG_REGISTER(rl);
+ DECODE_PRINTF(",");
+ srcreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = xor_long(*destreg, *srcreg);
+ } else {
+ u16 *destreg,*srcreg;
+
+ destreg = DECODE_RM_WORD_REGISTER(rl);
+ DECODE_PRINTF(",");
+ srcreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = xor_word(*destreg, *srcreg);
+ }
+ break;
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x32
+****************************************************************************/
+static void x86emuOp_xor_byte_R_RM(u8 X86EMU_UNUSED(op1))
+{
+ int mod, rl, rh;
+ u8 *destreg, *srcreg;
+ uint srcoffset;
+ u8 srcval;
+
+ START_OF_INSTR();
+ DECODE_PRINTF("XOR\t");
+ FETCH_DECODE_MODRM(mod, rh, rl);
+ switch (mod) {
+ case 0:
+ destreg = DECODE_RM_BYTE_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm00_address(rl);
+ srcval = fetch_data_byte(srcoffset);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = xor_byte(*destreg, srcval);
+ break;
+ case 1:
+ destreg = DECODE_RM_BYTE_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm01_address(rl);
+ srcval = fetch_data_byte(srcoffset);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = xor_byte(*destreg, srcval);
+ break;
+ case 2:
+ destreg = DECODE_RM_BYTE_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm10_address(rl);
+ srcval = fetch_data_byte(srcoffset);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = xor_byte(*destreg, srcval);
+ break;
+ case 3: /* register to register */
+ destreg = DECODE_RM_BYTE_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcreg = DECODE_RM_BYTE_REGISTER(rl);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = xor_byte(*destreg, *srcreg);
+ break;
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x33
+****************************************************************************/
+static void x86emuOp_xor_word_R_RM(u8 X86EMU_UNUSED(op1))
+{
+ int mod, rl, rh;
+ uint srcoffset;
+
+ START_OF_INSTR();
+ DECODE_PRINTF("XOR\t");
+ FETCH_DECODE_MODRM(mod, rh, rl);
+ switch (mod) {
+ case 0:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 *destreg;
+ u32 srcval;
+
+ destreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm00_address(rl);
+ srcval = fetch_data_long(srcoffset);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = xor_long(*destreg, srcval);
+ } else {
+ u16 *destreg;
+ u16 srcval;
+
+ destreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm00_address(rl);
+ srcval = fetch_data_word(srcoffset);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = xor_word(*destreg, srcval);
+ }
+ break;
+ case 1:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 *destreg;
+ u32 srcval;
+
+ destreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm01_address(rl);
+ srcval = fetch_data_long(srcoffset);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = xor_long(*destreg, srcval);
+ } else {
+ u16 *destreg;
+ u16 srcval;
+
+ destreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm01_address(rl);
+ srcval = fetch_data_word(srcoffset);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = xor_word(*destreg, srcval);
+ }
+ break;
+ case 2:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 *destreg;
+ u32 srcval;
+
+ destreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm10_address(rl);
+ srcval = fetch_data_long(srcoffset);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = xor_long(*destreg, srcval);
+ } else {
+ u16 *destreg;
+ u16 srcval;
+
+ destreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm10_address(rl);
+ srcval = fetch_data_word(srcoffset);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = xor_word(*destreg, srcval);
+ }
+ break;
+ case 3: /* register to register */
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 *destreg,*srcreg;
+
+ destreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcreg = DECODE_RM_LONG_REGISTER(rl);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = xor_long(*destreg, *srcreg);
+ } else {
+ u16 *destreg,*srcreg;
+
+ destreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcreg = DECODE_RM_WORD_REGISTER(rl);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = xor_word(*destreg, *srcreg);
+ }
+ break;
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x34
+****************************************************************************/
+static void x86emuOp_xor_byte_AL_IMM(u8 X86EMU_UNUSED(op1))
+{
+ u8 srcval;
+
+ START_OF_INSTR();
+ DECODE_PRINTF("XOR\tAL,");
+ srcval = fetch_byte_imm();
+ DECODE_PRINTF2("%x\n", srcval);
+ TRACE_AND_STEP();
+ M.x86.R_AL = xor_byte(M.x86.R_AL, srcval);
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x35
+****************************************************************************/
+static void x86emuOp_xor_word_AX_IMM(u8 X86EMU_UNUSED(op1))
+{
+ u32 srcval;
+
+ START_OF_INSTR();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ DECODE_PRINTF("XOR\tEAX,");
+ srcval = fetch_long_imm();
+ } else {
+ DECODE_PRINTF("XOR\tAX,");
+ srcval = fetch_word_imm();
+ }
+ DECODE_PRINTF2("%x\n", srcval);
+ TRACE_AND_STEP();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ M.x86.R_EAX = xor_long(M.x86.R_EAX, srcval);
+ } else {
+ M.x86.R_AX = xor_word(M.x86.R_AX, (u16)srcval);
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x36
+****************************************************************************/
+static void x86emuOp_segovr_SS(u8 X86EMU_UNUSED(op1))
+{
+ START_OF_INSTR();
+ DECODE_PRINTF("SS:\n");
+ TRACE_AND_STEP();
+ M.x86.mode |= SYSMODE_SEGOVR_SS;
+ /* no DECODE_CLEAR_SEGOVR ! */
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x37
+****************************************************************************/
+static void x86emuOp_aaa(u8 X86EMU_UNUSED(op1))
+{
+ START_OF_INSTR();
+ DECODE_PRINTF("AAA\n");
+ TRACE_AND_STEP();
+ M.x86.R_AX = aaa_word(M.x86.R_AX);
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x38
+****************************************************************************/
+static void x86emuOp_cmp_byte_RM_R(u8 X86EMU_UNUSED(op1))
+{
+ int mod, rl, rh;
+ uint destoffset;
+ u8 *destreg, *srcreg;
+ u8 destval;
+
+ START_OF_INSTR();
+ DECODE_PRINTF("CMP\t");
+ FETCH_DECODE_MODRM(mod, rh, rl);
+ switch (mod) {
+ case 0:
+ destoffset = decode_rm00_address(rl);
+ DECODE_PRINTF(",");
+ destval = fetch_data_byte(destoffset);
+ srcreg = DECODE_RM_BYTE_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ cmp_byte(destval, *srcreg);
+ break;
+ case 1:
+ destoffset = decode_rm01_address(rl);
+ DECODE_PRINTF(",");
+ destval = fetch_data_byte(destoffset);
+ srcreg = DECODE_RM_BYTE_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ cmp_byte(destval, *srcreg);
+ break;
+ case 2:
+ destoffset = decode_rm10_address(rl);
+ DECODE_PRINTF(",");
+ destval = fetch_data_byte(destoffset);
+ srcreg = DECODE_RM_BYTE_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ cmp_byte(destval, *srcreg);
+ break;
+ case 3: /* register to register */
+ destreg = DECODE_RM_BYTE_REGISTER(rl);
+ DECODE_PRINTF(",");
+ srcreg = DECODE_RM_BYTE_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ cmp_byte(*destreg, *srcreg);
+ break;
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x39
+****************************************************************************/
+static void x86emuOp_cmp_word_RM_R(u8 X86EMU_UNUSED(op1))
+{
+ int mod, rl, rh;
+ uint destoffset;
+
+ START_OF_INSTR();
+ DECODE_PRINTF("CMP\t");
+ FETCH_DECODE_MODRM(mod, rh, rl);
+ switch (mod) {
+ case 0:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 destval;
+ u32 *srcreg;
+
+ destoffset = decode_rm00_address(rl);
+ DECODE_PRINTF(",");
+ destval = fetch_data_long(destoffset);
+ srcreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ cmp_long(destval, *srcreg);
+ } else {
+ u16 destval;
+ u16 *srcreg;
+
+ destoffset = decode_rm00_address(rl);
+ DECODE_PRINTF(",");
+ destval = fetch_data_word(destoffset);
+ srcreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ cmp_word(destval, *srcreg);
+ }
+ break;
+ case 1:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 destval;
+ u32 *srcreg;
+
+ destoffset = decode_rm01_address(rl);
+ DECODE_PRINTF(",");
+ destval = fetch_data_long(destoffset);
+ srcreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ cmp_long(destval, *srcreg);
+ } else {
+ u16 destval;
+ u16 *srcreg;
+
+ destoffset = decode_rm01_address(rl);
+ DECODE_PRINTF(",");
+ destval = fetch_data_word(destoffset);
+ srcreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ cmp_word(destval, *srcreg);
+ }
+ break;
+ case 2:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 destval;
+ u32 *srcreg;
+
+ destoffset = decode_rm10_address(rl);
+ DECODE_PRINTF(",");
+ destval = fetch_data_long(destoffset);
+ srcreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ cmp_long(destval, *srcreg);
+ } else {
+ u16 destval;
+ u16 *srcreg;
+
+ destoffset = decode_rm10_address(rl);
+ DECODE_PRINTF(",");
+ destval = fetch_data_word(destoffset);
+ srcreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ cmp_word(destval, *srcreg);
+ }
+ break;
+ case 3: /* register to register */
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 *destreg,*srcreg;
+
+ destreg = DECODE_RM_LONG_REGISTER(rl);
+ DECODE_PRINTF(",");
+ srcreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ cmp_long(*destreg, *srcreg);
+ } else {
+ u16 *destreg,*srcreg;
+
+ destreg = DECODE_RM_WORD_REGISTER(rl);
+ DECODE_PRINTF(",");
+ srcreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ cmp_word(*destreg, *srcreg);
+ }
+ break;
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x3a
+****************************************************************************/
+static void x86emuOp_cmp_byte_R_RM(u8 X86EMU_UNUSED(op1))
+{
+ int mod, rl, rh;
+ u8 *destreg, *srcreg;
+ uint srcoffset;
+ u8 srcval;
+
+ START_OF_INSTR();
+ DECODE_PRINTF("CMP\t");
+ FETCH_DECODE_MODRM(mod, rh, rl);
+ switch (mod) {
+ case 0:
+ destreg = DECODE_RM_BYTE_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm00_address(rl);
+ srcval = fetch_data_byte(srcoffset);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ cmp_byte(*destreg, srcval);
+ break;
+ case 1:
+ destreg = DECODE_RM_BYTE_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm01_address(rl);
+ srcval = fetch_data_byte(srcoffset);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ cmp_byte(*destreg, srcval);
+ break;
+ case 2:
+ destreg = DECODE_RM_BYTE_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm10_address(rl);
+ srcval = fetch_data_byte(srcoffset);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ cmp_byte(*destreg, srcval);
+ break;
+ case 3: /* register to register */
+ destreg = DECODE_RM_BYTE_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcreg = DECODE_RM_BYTE_REGISTER(rl);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ cmp_byte(*destreg, *srcreg);
+ break;
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x3b
+****************************************************************************/
+static void x86emuOp_cmp_word_R_RM(u8 X86EMU_UNUSED(op1))
+{
+ int mod, rl, rh;
+ uint srcoffset;
+
+ START_OF_INSTR();
+ DECODE_PRINTF("CMP\t");
+ FETCH_DECODE_MODRM(mod, rh, rl);
+ switch (mod) {
+ case 0:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 *destreg;
+ u32 srcval;
+
+ destreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm00_address(rl);
+ srcval = fetch_data_long(srcoffset);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ cmp_long(*destreg, srcval);
+ } else {
+ u16 *destreg;
+ u16 srcval;
+
+ destreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm00_address(rl);
+ srcval = fetch_data_word(srcoffset);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ cmp_word(*destreg, srcval);
+ }
+ break;
+ case 1:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 *destreg;
+ u32 srcval;
+
+ destreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm01_address(rl);
+ srcval = fetch_data_long(srcoffset);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ cmp_long(*destreg, srcval);
+ } else {
+ u16 *destreg;
+ u16 srcval;
+
+ destreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm01_address(rl);
+ srcval = fetch_data_word(srcoffset);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ cmp_word(*destreg, srcval);
+ }
+ break;
+ case 2:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 *destreg;
+ u32 srcval;
+
+ destreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm10_address(rl);
+ srcval = fetch_data_long(srcoffset);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ cmp_long(*destreg, srcval);
+ } else {
+ u16 *destreg;
+ u16 srcval;
+
+ destreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm10_address(rl);
+ srcval = fetch_data_word(srcoffset);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ cmp_word(*destreg, srcval);
+ }
+ break;
+ case 3: /* register to register */
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 *destreg,*srcreg;
+
+ destreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcreg = DECODE_RM_LONG_REGISTER(rl);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ cmp_long(*destreg, *srcreg);
+ } else {
+ u16 *destreg,*srcreg;
+
+ destreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcreg = DECODE_RM_WORD_REGISTER(rl);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ cmp_word(*destreg, *srcreg);
+ }
+ break;
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x3c
+****************************************************************************/
+static void x86emuOp_cmp_byte_AL_IMM(u8 X86EMU_UNUSED(op1))
+{
+ u8 srcval;
+
+ START_OF_INSTR();
+ DECODE_PRINTF("CMP\tAL,");
+ srcval = fetch_byte_imm();
+ DECODE_PRINTF2("%x\n", srcval);
+ TRACE_AND_STEP();
+ cmp_byte(M.x86.R_AL, srcval);
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x3d
+****************************************************************************/
+static void x86emuOp_cmp_word_AX_IMM(u8 X86EMU_UNUSED(op1))
+{
+ u32 srcval;
+
+ START_OF_INSTR();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ DECODE_PRINTF("CMP\tEAX,");
+ srcval = fetch_long_imm();
+ } else {
+ DECODE_PRINTF("CMP\tAX,");
+ srcval = fetch_word_imm();
+ }
+ DECODE_PRINTF2("%x\n", srcval);
+ TRACE_AND_STEP();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ cmp_long(M.x86.R_EAX, srcval);
+ } else {
+ cmp_word(M.x86.R_AX, (u16)srcval);
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x3e
+****************************************************************************/
+static void x86emuOp_segovr_DS(u8 X86EMU_UNUSED(op1))
+{
+ START_OF_INSTR();
+ DECODE_PRINTF("DS:\n");
+ TRACE_AND_STEP();
+ M.x86.mode |= SYSMODE_SEGOVR_DS;
+ /* NO DECODE_CLEAR_SEGOVR! */
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x3f
+****************************************************************************/
+static void x86emuOp_aas(u8 X86EMU_UNUSED(op1))
+{
+ START_OF_INSTR();
+ DECODE_PRINTF("AAS\n");
+ TRACE_AND_STEP();
+ M.x86.R_AX = aas_word(M.x86.R_AX);
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x40
+****************************************************************************/
+static void x86emuOp_inc_AX(u8 X86EMU_UNUSED(op1))
+{
+ START_OF_INSTR();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ DECODE_PRINTF("INC\tEAX\n");
+ } else {
+ DECODE_PRINTF("INC\tAX\n");
+ }
+ TRACE_AND_STEP();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ M.x86.R_EAX = inc_long(M.x86.R_EAX);
+ } else {
+ M.x86.R_AX = inc_word(M.x86.R_AX);
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x41
+****************************************************************************/
+static void x86emuOp_inc_CX(u8 X86EMU_UNUSED(op1))
+{
+ START_OF_INSTR();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ DECODE_PRINTF("INC\tECX\n");
+ } else {
+ DECODE_PRINTF("INC\tCX\n");
+ }
+ TRACE_AND_STEP();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ M.x86.R_ECX = inc_long(M.x86.R_ECX);
+ } else {
+ M.x86.R_CX = inc_word(M.x86.R_CX);
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x42
+****************************************************************************/
+static void x86emuOp_inc_DX(u8 X86EMU_UNUSED(op1))
+{
+ START_OF_INSTR();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ DECODE_PRINTF("INC\tEDX\n");
+ } else {
+ DECODE_PRINTF("INC\tDX\n");
+ }
+ TRACE_AND_STEP();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ M.x86.R_EDX = inc_long(M.x86.R_EDX);
+ } else {
+ M.x86.R_DX = inc_word(M.x86.R_DX);
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x43
+****************************************************************************/
+static void x86emuOp_inc_BX(u8 X86EMU_UNUSED(op1))
+{
+ START_OF_INSTR();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ DECODE_PRINTF("INC\tEBX\n");
+ } else {
+ DECODE_PRINTF("INC\tBX\n");
+ }
+ TRACE_AND_STEP();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ M.x86.R_EBX = inc_long(M.x86.R_EBX);
+ } else {
+ M.x86.R_BX = inc_word(M.x86.R_BX);
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x44
+****************************************************************************/
+static void x86emuOp_inc_SP(u8 X86EMU_UNUSED(op1))
+{
+ START_OF_INSTR();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ DECODE_PRINTF("INC\tESP\n");
+ } else {
+ DECODE_PRINTF("INC\tSP\n");
+ }
+ TRACE_AND_STEP();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ M.x86.R_ESP = inc_long(M.x86.R_ESP);
+ } else {
+ M.x86.R_SP = inc_word(M.x86.R_SP);
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x45
+****************************************************************************/
+static void x86emuOp_inc_BP(u8 X86EMU_UNUSED(op1))
+{
+ START_OF_INSTR();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ DECODE_PRINTF("INC\tEBP\n");
+ } else {
+ DECODE_PRINTF("INC\tBP\n");
+ }
+ TRACE_AND_STEP();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ M.x86.R_EBP = inc_long(M.x86.R_EBP);
+ } else {
+ M.x86.R_BP = inc_word(M.x86.R_BP);
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x46
+****************************************************************************/
+static void x86emuOp_inc_SI(u8 X86EMU_UNUSED(op1))
+{
+ START_OF_INSTR();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ DECODE_PRINTF("INC\tESI\n");
+ } else {
+ DECODE_PRINTF("INC\tSI\n");
+ }
+ TRACE_AND_STEP();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ M.x86.R_ESI = inc_long(M.x86.R_ESI);
+ } else {
+ M.x86.R_SI = inc_word(M.x86.R_SI);
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x47
+****************************************************************************/
+static void x86emuOp_inc_DI(u8 X86EMU_UNUSED(op1))
+{
+ START_OF_INSTR();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ DECODE_PRINTF("INC\tEDI\n");
+ } else {
+ DECODE_PRINTF("INC\tDI\n");
+ }
+ TRACE_AND_STEP();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ M.x86.R_EDI = inc_long(M.x86.R_EDI);
+ } else {
+ M.x86.R_DI = inc_word(M.x86.R_DI);
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x48
+****************************************************************************/
+static void x86emuOp_dec_AX(u8 X86EMU_UNUSED(op1))
+{
+ START_OF_INSTR();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ DECODE_PRINTF("DEC\tEAX\n");
+ } else {
+ DECODE_PRINTF("DEC\tAX\n");
+ }
+ TRACE_AND_STEP();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ M.x86.R_EAX = dec_long(M.x86.R_EAX);
+ } else {
+ M.x86.R_AX = dec_word(M.x86.R_AX);
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x49
+****************************************************************************/
+static void x86emuOp_dec_CX(u8 X86EMU_UNUSED(op1))
+{
+ START_OF_INSTR();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ DECODE_PRINTF("DEC\tECX\n");
+ } else {
+ DECODE_PRINTF("DEC\tCX\n");
+ }
+ TRACE_AND_STEP();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ M.x86.R_ECX = dec_long(M.x86.R_ECX);
+ } else {
+ M.x86.R_CX = dec_word(M.x86.R_CX);
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x4a
+****************************************************************************/
+static void x86emuOp_dec_DX(u8 X86EMU_UNUSED(op1))
+{
+ START_OF_INSTR();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ DECODE_PRINTF("DEC\tEDX\n");
+ } else {
+ DECODE_PRINTF("DEC\tDX\n");
+ }
+ TRACE_AND_STEP();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ M.x86.R_EDX = dec_long(M.x86.R_EDX);
+ } else {
+ M.x86.R_DX = dec_word(M.x86.R_DX);
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x4b
+****************************************************************************/
+static void x86emuOp_dec_BX(u8 X86EMU_UNUSED(op1))
+{
+ START_OF_INSTR();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ DECODE_PRINTF("DEC\tEBX\n");
+ } else {
+ DECODE_PRINTF("DEC\tBX\n");
+ }
+ TRACE_AND_STEP();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ M.x86.R_EBX = dec_long(M.x86.R_EBX);
+ } else {
+ M.x86.R_BX = dec_word(M.x86.R_BX);
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x4c
+****************************************************************************/
+static void x86emuOp_dec_SP(u8 X86EMU_UNUSED(op1))
+{
+ START_OF_INSTR();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ DECODE_PRINTF("DEC\tESP\n");
+ } else {
+ DECODE_PRINTF("DEC\tSP\n");
+ }
+ TRACE_AND_STEP();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ M.x86.R_ESP = dec_long(M.x86.R_ESP);
+ } else {
+ M.x86.R_SP = dec_word(M.x86.R_SP);
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x4d
+****************************************************************************/
+static void x86emuOp_dec_BP(u8 X86EMU_UNUSED(op1))
+{
+ START_OF_INSTR();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ DECODE_PRINTF("DEC\tEBP\n");
+ } else {
+ DECODE_PRINTF("DEC\tBP\n");
+ }
+ TRACE_AND_STEP();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ M.x86.R_EBP = dec_long(M.x86.R_EBP);
+ } else {
+ M.x86.R_BP = dec_word(M.x86.R_BP);
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x4e
+****************************************************************************/
+static void x86emuOp_dec_SI(u8 X86EMU_UNUSED(op1))
+{
+ START_OF_INSTR();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ DECODE_PRINTF("DEC\tESI\n");
+ } else {
+ DECODE_PRINTF("DEC\tSI\n");
+ }
+ TRACE_AND_STEP();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ M.x86.R_ESI = dec_long(M.x86.R_ESI);
+ } else {
+ M.x86.R_SI = dec_word(M.x86.R_SI);
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x4f
+****************************************************************************/
+static void x86emuOp_dec_DI(u8 X86EMU_UNUSED(op1))
+{
+ START_OF_INSTR();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ DECODE_PRINTF("DEC\tEDI\n");
+ } else {
+ DECODE_PRINTF("DEC\tDI\n");
+ }
+ TRACE_AND_STEP();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ M.x86.R_EDI = dec_long(M.x86.R_EDI);
+ } else {
+ M.x86.R_DI = dec_word(M.x86.R_DI);
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x50
+****************************************************************************/
+static void x86emuOp_push_AX(u8 X86EMU_UNUSED(op1))
+{
+ START_OF_INSTR();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ DECODE_PRINTF("PUSH\tEAX\n");
+ } else {
+ DECODE_PRINTF("PUSH\tAX\n");
+ }
+ TRACE_AND_STEP();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ push_long(M.x86.R_EAX);
+ } else {
+ push_word(M.x86.R_AX);
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x51
+****************************************************************************/
+static void x86emuOp_push_CX(u8 X86EMU_UNUSED(op1))
+{
+ START_OF_INSTR();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ DECODE_PRINTF("PUSH\tECX\n");
+ } else {
+ DECODE_PRINTF("PUSH\tCX\n");
+ }
+ TRACE_AND_STEP();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ push_long(M.x86.R_ECX);
+ } else {
+ push_word(M.x86.R_CX);
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x52
+****************************************************************************/
+static void x86emuOp_push_DX(u8 X86EMU_UNUSED(op1))
+{
+ START_OF_INSTR();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ DECODE_PRINTF("PUSH\tEDX\n");
+ } else {
+ DECODE_PRINTF("PUSH\tDX\n");
+ }
+ TRACE_AND_STEP();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ push_long(M.x86.R_EDX);
+ } else {
+ push_word(M.x86.R_DX);
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x53
+****************************************************************************/
+static void x86emuOp_push_BX(u8 X86EMU_UNUSED(op1))
+{
+ START_OF_INSTR();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ DECODE_PRINTF("PUSH\tEBX\n");
+ } else {
+ DECODE_PRINTF("PUSH\tBX\n");
+ }
+ TRACE_AND_STEP();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ push_long(M.x86.R_EBX);
+ } else {
+ push_word(M.x86.R_BX);
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x54
+****************************************************************************/
+static void x86emuOp_push_SP(u8 X86EMU_UNUSED(op1))
+{
+ START_OF_INSTR();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ DECODE_PRINTF("PUSH\tESP\n");
+ } else {
+ DECODE_PRINTF("PUSH\tSP\n");
+ }
+ TRACE_AND_STEP();
+ /* Always push (E)SP, since we are emulating an i386 and above
+ * processor. This is necessary as some BIOS'es use this to check
+ * what type of processor is in the system.
+ */
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ push_long(M.x86.R_ESP);
+ } else {
+ push_word((u16)(M.x86.R_SP));
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x55
+****************************************************************************/
+static void x86emuOp_push_BP(u8 X86EMU_UNUSED(op1))
+{
+ START_OF_INSTR();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ DECODE_PRINTF("PUSH\tEBP\n");
+ } else {
+ DECODE_PRINTF("PUSH\tBP\n");
+ }
+ TRACE_AND_STEP();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ push_long(M.x86.R_EBP);
+ } else {
+ push_word(M.x86.R_BP);
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x56
+****************************************************************************/
+static void x86emuOp_push_SI(u8 X86EMU_UNUSED(op1))
+{
+ START_OF_INSTR();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ DECODE_PRINTF("PUSH\tESI\n");
+ } else {
+ DECODE_PRINTF("PUSH\tSI\n");
+ }
+ TRACE_AND_STEP();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ push_long(M.x86.R_ESI);
+ } else {
+ push_word(M.x86.R_SI);
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x57
+****************************************************************************/
+static void x86emuOp_push_DI(u8 X86EMU_UNUSED(op1))
+{
+ START_OF_INSTR();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ DECODE_PRINTF("PUSH\tEDI\n");
+ } else {
+ DECODE_PRINTF("PUSH\tDI\n");
+ }
+ TRACE_AND_STEP();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ push_long(M.x86.R_EDI);
+ } else {
+ push_word(M.x86.R_DI);
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x58
+****************************************************************************/
+static void x86emuOp_pop_AX(u8 X86EMU_UNUSED(op1))
+{
+ START_OF_INSTR();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ DECODE_PRINTF("POP\tEAX\n");
+ } else {
+ DECODE_PRINTF("POP\tAX\n");
+ }
+ TRACE_AND_STEP();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ M.x86.R_EAX = pop_long();
+ } else {
+ M.x86.R_AX = pop_word();
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x59
+****************************************************************************/
+static void x86emuOp_pop_CX(u8 X86EMU_UNUSED(op1))
+{
+ START_OF_INSTR();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ DECODE_PRINTF("POP\tECX\n");
+ } else {
+ DECODE_PRINTF("POP\tCX\n");
+ }
+ TRACE_AND_STEP();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ M.x86.R_ECX = pop_long();
+ } else {
+ M.x86.R_CX = pop_word();
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x5a
+****************************************************************************/
+static void x86emuOp_pop_DX(u8 X86EMU_UNUSED(op1))
+{
+ START_OF_INSTR();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ DECODE_PRINTF("POP\tEDX\n");
+ } else {
+ DECODE_PRINTF("POP\tDX\n");
+ }
+ TRACE_AND_STEP();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ M.x86.R_EDX = pop_long();
+ } else {
+ M.x86.R_DX = pop_word();
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x5b
+****************************************************************************/
+static void x86emuOp_pop_BX(u8 X86EMU_UNUSED(op1))
+{
+ START_OF_INSTR();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ DECODE_PRINTF("POP\tEBX\n");
+ } else {
+ DECODE_PRINTF("POP\tBX\n");
+ }
+ TRACE_AND_STEP();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ M.x86.R_EBX = pop_long();
+ } else {
+ M.x86.R_BX = pop_word();
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x5c
+****************************************************************************/
+static void x86emuOp_pop_SP(u8 X86EMU_UNUSED(op1))
+{
+ START_OF_INSTR();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ DECODE_PRINTF("POP\tESP\n");
+ } else {
+ DECODE_PRINTF("POP\tSP\n");
+ }
+ TRACE_AND_STEP();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ M.x86.R_ESP = pop_long();
+ } else {
+ M.x86.R_SP = pop_word();
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x5d
+****************************************************************************/
+static void x86emuOp_pop_BP(u8 X86EMU_UNUSED(op1))
+{
+ START_OF_INSTR();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ DECODE_PRINTF("POP\tEBP\n");
+ } else {
+ DECODE_PRINTF("POP\tBP\n");
+ }
+ TRACE_AND_STEP();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ M.x86.R_EBP = pop_long();
+ } else {
+ M.x86.R_BP = pop_word();
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x5e
+****************************************************************************/
+static void x86emuOp_pop_SI(u8 X86EMU_UNUSED(op1))
+{
+ START_OF_INSTR();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ DECODE_PRINTF("POP\tESI\n");
+ } else {
+ DECODE_PRINTF("POP\tSI\n");
+ }
+ TRACE_AND_STEP();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ M.x86.R_ESI = pop_long();
+ } else {
+ M.x86.R_SI = pop_word();
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x5f
+****************************************************************************/
+static void x86emuOp_pop_DI(u8 X86EMU_UNUSED(op1))
+{
+ START_OF_INSTR();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ DECODE_PRINTF("POP\tEDI\n");
+ } else {
+ DECODE_PRINTF("POP\tDI\n");
+ }
+ TRACE_AND_STEP();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ M.x86.R_EDI = pop_long();
+ } else {
+ M.x86.R_DI = pop_word();
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x60
+****************************************************************************/
+static void x86emuOp_push_all(u8 X86EMU_UNUSED(op1))
+{
+ START_OF_INSTR();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ DECODE_PRINTF("PUSHAD\n");
+ } else {
+ DECODE_PRINTF("PUSHA\n");
+ }
+ TRACE_AND_STEP();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 old_sp = M.x86.R_ESP;
+
+ push_long(M.x86.R_EAX);
+ push_long(M.x86.R_ECX);
+ push_long(M.x86.R_EDX);
+ push_long(M.x86.R_EBX);
+ push_long(old_sp);
+ push_long(M.x86.R_EBP);
+ push_long(M.x86.R_ESI);
+ push_long(M.x86.R_EDI);
+ } else {
+ u16 old_sp = M.x86.R_SP;
+
+ push_word(M.x86.R_AX);
+ push_word(M.x86.R_CX);
+ push_word(M.x86.R_DX);
+ push_word(M.x86.R_BX);
+ push_word(old_sp);
+ push_word(M.x86.R_BP);
+ push_word(M.x86.R_SI);
+ push_word(M.x86.R_DI);
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x61
+****************************************************************************/
+static void x86emuOp_pop_all(u8 X86EMU_UNUSED(op1))
+{
+ START_OF_INSTR();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ DECODE_PRINTF("POPAD\n");
+ } else {
+ DECODE_PRINTF("POPA\n");
+ }
+ TRACE_AND_STEP();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ M.x86.R_EDI = pop_long();
+ M.x86.R_ESI = pop_long();
+ M.x86.R_EBP = pop_long();
+ M.x86.R_ESP += 4; /* skip ESP */
+ M.x86.R_EBX = pop_long();
+ M.x86.R_EDX = pop_long();
+ M.x86.R_ECX = pop_long();
+ M.x86.R_EAX = pop_long();
+ } else {
+ M.x86.R_DI = pop_word();
+ M.x86.R_SI = pop_word();
+ M.x86.R_BP = pop_word();
+ M.x86.R_SP += 2; /* skip SP */
+ M.x86.R_BX = pop_word();
+ M.x86.R_DX = pop_word();
+ M.x86.R_CX = pop_word();
+ M.x86.R_AX = pop_word();
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/*opcode 0x62 ILLEGAL OP, calls x86emuOp_illegal_op() */
+/*opcode 0x63 ILLEGAL OP, calls x86emuOp_illegal_op() */
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x64
+****************************************************************************/
+static void x86emuOp_segovr_FS(u8 X86EMU_UNUSED(op1))
+{
+ START_OF_INSTR();
+ DECODE_PRINTF("FS:\n");
+ TRACE_AND_STEP();
+ M.x86.mode |= SYSMODE_SEGOVR_FS;
+ /*
+ * note the lack of DECODE_CLEAR_SEGOVR(r) since, here is one of 4
+ * opcode subroutines we do not want to do this.
+ */
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x65
+****************************************************************************/
+static void x86emuOp_segovr_GS(u8 X86EMU_UNUSED(op1))
+{
+ START_OF_INSTR();
+ DECODE_PRINTF("GS:\n");
+ TRACE_AND_STEP();
+ M.x86.mode |= SYSMODE_SEGOVR_GS;
+ /*
+ * note the lack of DECODE_CLEAR_SEGOVR(r) since, here is one of 4
+ * opcode subroutines we do not want to do this.
+ */
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x66 - prefix for 32-bit register
+****************************************************************************/
+static void x86emuOp_prefix_data(u8 X86EMU_UNUSED(op1))
+{
+ START_OF_INSTR();
+ DECODE_PRINTF("DATA:\n");
+ TRACE_AND_STEP();
+ M.x86.mode |= SYSMODE_PREFIX_DATA;
+ /* note no DECODE_CLEAR_SEGOVR here. */
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x67 - prefix for 32-bit address
+****************************************************************************/
+static void x86emuOp_prefix_addr(u8 X86EMU_UNUSED(op1))
+{
+ START_OF_INSTR();
+ DECODE_PRINTF("ADDR:\n");
+ TRACE_AND_STEP();
+ M.x86.mode |= SYSMODE_PREFIX_ADDR;
+ /* note no DECODE_CLEAR_SEGOVR here. */
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x68
+****************************************************************************/
+static void x86emuOp_push_word_IMM(u8 X86EMU_UNUSED(op1))
+{
+ u32 imm;
+
+ START_OF_INSTR();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ imm = fetch_long_imm();
+ } else {
+ imm = fetch_word_imm();
+ }
+ DECODE_PRINTF2("PUSH\t%x\n", imm);
+ TRACE_AND_STEP();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ push_long(imm);
+ } else {
+ push_word((u16)imm);
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x69
+****************************************************************************/
+static void x86emuOp_imul_word_IMM(u8 X86EMU_UNUSED(op1))
+{
+ int mod, rl, rh;
+ uint srcoffset;
+
+ START_OF_INSTR();
+ DECODE_PRINTF("IMUL\t");
+ FETCH_DECODE_MODRM(mod, rh, rl);
+ switch (mod) {
+ case 0:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 *destreg;
+ u32 srcval;
+ u32 res_lo,res_hi;
+ s32 imm;
+
+ destreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm00_address(rl);
+ srcval = fetch_data_long(srcoffset);
+ imm = fetch_long_imm();
+ DECODE_PRINTF2(",%d\n", (s32)imm);
+ TRACE_AND_STEP();
+ imul_long_direct(&res_lo,&res_hi,(s32)srcval,(s32)imm);
+ if (res_hi != 0) {
+ SET_FLAG(F_CF);
+ SET_FLAG(F_OF);
+ } else {
+ CLEAR_FLAG(F_CF);
+ CLEAR_FLAG(F_OF);
+ }
+ *destreg = (u32)res_lo;
+ } else {
+ u16 *destreg;
+ u16 srcval;
+ u32 res;
+ s16 imm;
+
+ destreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm00_address(rl);
+ srcval = fetch_data_word(srcoffset);
+ imm = fetch_word_imm();
+ DECODE_PRINTF2(",%d\n", (s32)imm);
+ TRACE_AND_STEP();
+ res = (s16)srcval * (s16)imm;
+ if (res > 0xFFFF) {
+ SET_FLAG(F_CF);
+ SET_FLAG(F_OF);
+ } else {
+ CLEAR_FLAG(F_CF);
+ CLEAR_FLAG(F_OF);
+ }
+ *destreg = (u16)res;
+ }
+ break;
+ case 1:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 *destreg;
+ u32 srcval;
+ u32 res_lo,res_hi;
+ s32 imm;
+
+ destreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm01_address(rl);
+ srcval = fetch_data_long(srcoffset);
+ imm = fetch_long_imm();
+ DECODE_PRINTF2(",%d\n", (s32)imm);
+ TRACE_AND_STEP();
+ imul_long_direct(&res_lo,&res_hi,(s32)srcval,(s32)imm);
+ if (res_hi != 0) {
+ SET_FLAG(F_CF);
+ SET_FLAG(F_OF);
+ } else {
+ CLEAR_FLAG(F_CF);
+ CLEAR_FLAG(F_OF);
+ }
+ *destreg = (u32)res_lo;
+ } else {
+ u16 *destreg;
+ u16 srcval;
+ u32 res;
+ s16 imm;
+
+ destreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm01_address(rl);
+ srcval = fetch_data_word(srcoffset);
+ imm = fetch_word_imm();
+ DECODE_PRINTF2(",%d\n", (s32)imm);
+ TRACE_AND_STEP();
+ res = (s16)srcval * (s16)imm;
+ if (res > 0xFFFF) {
+ SET_FLAG(F_CF);
+ SET_FLAG(F_OF);
+ } else {
+ CLEAR_FLAG(F_CF);
+ CLEAR_FLAG(F_OF);
+ }
+ *destreg = (u16)res;
+ }
+ break;
+ case 2:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 *destreg;
+ u32 srcval;
+ u32 res_lo,res_hi;
+ s32 imm;
+
+ destreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm10_address(rl);
+ srcval = fetch_data_long(srcoffset);
+ imm = fetch_long_imm();
+ DECODE_PRINTF2(",%d\n", (s32)imm);
+ TRACE_AND_STEP();
+ imul_long_direct(&res_lo,&res_hi,(s32)srcval,(s32)imm);
+ if (res_hi != 0) {
+ SET_FLAG(F_CF);
+ SET_FLAG(F_OF);
+ } else {
+ CLEAR_FLAG(F_CF);
+ CLEAR_FLAG(F_OF);
+ }
+ *destreg = (u32)res_lo;
+ } else {
+ u16 *destreg;
+ u16 srcval;
+ u32 res;
+ s16 imm;
+
+ destreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm10_address(rl);
+ srcval = fetch_data_word(srcoffset);
+ imm = fetch_word_imm();
+ DECODE_PRINTF2(",%d\n", (s32)imm);
+ TRACE_AND_STEP();
+ res = (s16)srcval * (s16)imm;
+ if (res > 0xFFFF) {
+ SET_FLAG(F_CF);
+ SET_FLAG(F_OF);
+ } else {
+ CLEAR_FLAG(F_CF);
+ CLEAR_FLAG(F_OF);
+ }
+ *destreg = (u16)res;
+ }
+ break;
+ case 3: /* register to register */
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 *destreg,*srcreg;
+ u32 res_lo,res_hi;
+ s32 imm;
+
+ destreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcreg = DECODE_RM_LONG_REGISTER(rl);
+ imm = fetch_long_imm();
+ DECODE_PRINTF2(",%d\n", (s32)imm);
+ TRACE_AND_STEP();
+ imul_long_direct(&res_lo,&res_hi,(s32)*srcreg,(s32)imm);
+ if (res_hi != 0) {
+ SET_FLAG(F_CF);
+ SET_FLAG(F_OF);
+ } else {
+ CLEAR_FLAG(F_CF);
+ CLEAR_FLAG(F_OF);
+ }
+ *destreg = (u32)res_lo;
+ } else {
+ u16 *destreg,*srcreg;
+ u32 res;
+ s16 imm;
+
+ destreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcreg = DECODE_RM_WORD_REGISTER(rl);
+ imm = fetch_word_imm();
+ DECODE_PRINTF2(",%d\n", (s32)imm);
+ res = (s16)*srcreg * (s16)imm;
+ if (res > 0xFFFF) {
+ SET_FLAG(F_CF);
+ SET_FLAG(F_OF);
+ } else {
+ CLEAR_FLAG(F_CF);
+ CLEAR_FLAG(F_OF);
+ }
+ *destreg = (u16)res;
+ }
+ break;
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x6a
+****************************************************************************/
+static void x86emuOp_push_byte_IMM(u8 X86EMU_UNUSED(op1))
+{
+ s16 imm;
+
+ START_OF_INSTR();
+ imm = (s8)fetch_byte_imm();
+ DECODE_PRINTF2("PUSH\t%d\n", imm);
+ TRACE_AND_STEP();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ push_long((s32)imm);
+ } else {
+ push_word(imm);
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x6b
+****************************************************************************/
+static void x86emuOp_imul_byte_IMM(u8 X86EMU_UNUSED(op1))
+{
+ int mod, rl, rh;
+ uint srcoffset;
+ s8 imm;
+
+ START_OF_INSTR();
+ DECODE_PRINTF("IMUL\t");
+ FETCH_DECODE_MODRM(mod, rh, rl);
+ switch (mod) {
+ case 0:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 *destreg;
+ u32 srcval;
+ u32 res_lo,res_hi;
+
+ destreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm00_address(rl);
+ srcval = fetch_data_long(srcoffset);
+ imm = fetch_byte_imm();
+ DECODE_PRINTF2(",%d\n", (s32)imm);
+ TRACE_AND_STEP();
+ imul_long_direct(&res_lo,&res_hi,(s32)srcval,(s32)imm);
+ if (res_hi != 0) {
+ SET_FLAG(F_CF);
+ SET_FLAG(F_OF);
+ } else {
+ CLEAR_FLAG(F_CF);
+ CLEAR_FLAG(F_OF);
+ }
+ *destreg = (u32)res_lo;
+ } else {
+ u16 *destreg;
+ u16 srcval;
+ u32 res;
+
+ destreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm00_address(rl);
+ srcval = fetch_data_word(srcoffset);
+ imm = fetch_byte_imm();
+ DECODE_PRINTF2(",%d\n", (s32)imm);
+ TRACE_AND_STEP();
+ res = (s16)srcval * (s16)imm;
+ if (res > 0xFFFF) {
+ SET_FLAG(F_CF);
+ SET_FLAG(F_OF);
+ } else {
+ CLEAR_FLAG(F_CF);
+ CLEAR_FLAG(F_OF);
+ }
+ *destreg = (u16)res;
+ }
+ break;
+ case 1:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 *destreg;
+ u32 srcval;
+ u32 res_lo,res_hi;
+
+ destreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm01_address(rl);
+ srcval = fetch_data_long(srcoffset);
+ imm = fetch_byte_imm();
+ DECODE_PRINTF2(",%d\n", (s32)imm);
+ TRACE_AND_STEP();
+ imul_long_direct(&res_lo,&res_hi,(s32)srcval,(s32)imm);
+ if (res_hi != 0) {
+ SET_FLAG(F_CF);
+ SET_FLAG(F_OF);
+ } else {
+ CLEAR_FLAG(F_CF);
+ CLEAR_FLAG(F_OF);
+ }
+ *destreg = (u32)res_lo;
+ } else {
+ u16 *destreg;
+ u16 srcval;
+ u32 res;
+
+ destreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm01_address(rl);
+ srcval = fetch_data_word(srcoffset);
+ imm = fetch_byte_imm();
+ DECODE_PRINTF2(",%d\n", (s32)imm);
+ TRACE_AND_STEP();
+ res = (s16)srcval * (s16)imm;
+ if (res > 0xFFFF) {
+ SET_FLAG(F_CF);
+ SET_FLAG(F_OF);
+ } else {
+ CLEAR_FLAG(F_CF);
+ CLEAR_FLAG(F_OF);
+ }
+ *destreg = (u16)res;
+ }
+ break;
+ case 2:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 *destreg;
+ u32 srcval;
+ u32 res_lo,res_hi;
+
+ destreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm10_address(rl);
+ srcval = fetch_data_long(srcoffset);
+ imm = fetch_byte_imm();
+ DECODE_PRINTF2(",%d\n", (s32)imm);
+ TRACE_AND_STEP();
+ imul_long_direct(&res_lo,&res_hi,(s32)srcval,(s32)imm);
+ if (res_hi != 0) {
+ SET_FLAG(F_CF);
+ SET_FLAG(F_OF);
+ } else {
+ CLEAR_FLAG(F_CF);
+ CLEAR_FLAG(F_OF);
+ }
+ *destreg = (u32)res_lo;
+ } else {
+ u16 *destreg;
+ u16 srcval;
+ u32 res;
+
+ destreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm10_address(rl);
+ srcval = fetch_data_word(srcoffset);
+ imm = fetch_byte_imm();
+ DECODE_PRINTF2(",%d\n", (s32)imm);
+ TRACE_AND_STEP();
+ res = (s16)srcval * (s16)imm;
+ if (res > 0xFFFF) {
+ SET_FLAG(F_CF);
+ SET_FLAG(F_OF);
+ } else {
+ CLEAR_FLAG(F_CF);
+ CLEAR_FLAG(F_OF);
+ }
+ *destreg = (u16)res;
+ }
+ break;
+ case 3: /* register to register */
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 *destreg,*srcreg;
+ u32 res_lo,res_hi;
+
+ destreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcreg = DECODE_RM_LONG_REGISTER(rl);
+ imm = fetch_byte_imm();
+ DECODE_PRINTF2(",%d\n", (s32)imm);
+ TRACE_AND_STEP();
+ imul_long_direct(&res_lo,&res_hi,(s32)*srcreg,(s32)imm);
+ if (res_hi != 0) {
+ SET_FLAG(F_CF);
+ SET_FLAG(F_OF);
+ } else {
+ CLEAR_FLAG(F_CF);
+ CLEAR_FLAG(F_OF);
+ }
+ *destreg = (u32)res_lo;
+ } else {
+ u16 *destreg,*srcreg;
+ u32 res;
+
+ destreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcreg = DECODE_RM_WORD_REGISTER(rl);
+ imm = fetch_byte_imm();
+ DECODE_PRINTF2(",%d\n", (s32)imm);
+ res = (s16)*srcreg * (s16)imm;
+ if (res > 0xFFFF) {
+ SET_FLAG(F_CF);
+ SET_FLAG(F_OF);
+ } else {
+ CLEAR_FLAG(F_CF);
+ CLEAR_FLAG(F_OF);
+ }
+ *destreg = (u16)res;
+ }
+ break;
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x6c
+****************************************************************************/
+static void x86emuOp_ins_byte(u8 X86EMU_UNUSED(op1))
+{
+ START_OF_INSTR();
+ DECODE_PRINTF("INSB\n");
+ ins(1);
+ TRACE_AND_STEP();
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x6d
+****************************************************************************/
+static void x86emuOp_ins_word(u8 X86EMU_UNUSED(op1))
+{
+ START_OF_INSTR();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ DECODE_PRINTF("INSD\n");
+ ins(4);
+ } else {
+ DECODE_PRINTF("INSW\n");
+ ins(2);
+ }
+ TRACE_AND_STEP();
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x6e
+****************************************************************************/
+static void x86emuOp_outs_byte(u8 X86EMU_UNUSED(op1))
+{
+ START_OF_INSTR();
+ DECODE_PRINTF("OUTSB\n");
+ outs(1);
+ TRACE_AND_STEP();
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x6f
+****************************************************************************/
+static void x86emuOp_outs_word(u8 X86EMU_UNUSED(op1))
+{
+ START_OF_INSTR();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ DECODE_PRINTF("OUTSD\n");
+ outs(4);
+ } else {
+ DECODE_PRINTF("OUTSW\n");
+ outs(2);
+ }
+ TRACE_AND_STEP();
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x70
+****************************************************************************/
+static void x86emuOp_jump_near_O(u8 X86EMU_UNUSED(op1))
+{
+ s8 offset;
+ u16 target;
+
+ /* jump to byte offset if overflow flag is set */
+ START_OF_INSTR();
+ DECODE_PRINTF("JO\t");
+ offset = (s8)fetch_byte_imm();
+ target = (u16)(M.x86.R_IP + (s16)offset);
+ DECODE_PRINTF2("%x\n", target);
+ TRACE_AND_STEP();
+ if (ACCESS_FLAG(F_OF))
+ M.x86.R_IP = target;
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x71
+****************************************************************************/
+static void x86emuOp_jump_near_NO(u8 X86EMU_UNUSED(op1))
+{
+ s8 offset;
+ u16 target;
+
+ /* jump to byte offset if overflow is not set */
+ START_OF_INSTR();
+ DECODE_PRINTF("JNO\t");
+ offset = (s8)fetch_byte_imm();
+ target = (u16)(M.x86.R_IP + (s16)offset);
+ DECODE_PRINTF2("%x\n", target);
+ TRACE_AND_STEP();
+ if (!ACCESS_FLAG(F_OF))
+ M.x86.R_IP = target;
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x72
+****************************************************************************/
+static void x86emuOp_jump_near_B(u8 X86EMU_UNUSED(op1))
+{
+ s8 offset;
+ u16 target;
+
+ /* jump to byte offset if carry flag is set. */
+ START_OF_INSTR();
+ DECODE_PRINTF("JB\t");
+ offset = (s8)fetch_byte_imm();
+ target = (u16)(M.x86.R_IP + (s16)offset);
+ DECODE_PRINTF2("%x\n", target);
+ TRACE_AND_STEP();
+ if (ACCESS_FLAG(F_CF))
+ M.x86.R_IP = target;
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x73
+****************************************************************************/
+static void x86emuOp_jump_near_NB(u8 X86EMU_UNUSED(op1))
+{
+ s8 offset;
+ u16 target;
+
+ /* jump to byte offset if carry flag is clear. */
+ START_OF_INSTR();
+ DECODE_PRINTF("JNB\t");
+ offset = (s8)fetch_byte_imm();
+ target = (u16)(M.x86.R_IP + (s16)offset);
+ DECODE_PRINTF2("%x\n", target);
+ TRACE_AND_STEP();
+ if (!ACCESS_FLAG(F_CF))
+ M.x86.R_IP = target;
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x74
+****************************************************************************/
+static void x86emuOp_jump_near_Z(u8 X86EMU_UNUSED(op1))
+{
+ s8 offset;
+ u16 target;
+
+ /* jump to byte offset if zero flag is set. */
+ START_OF_INSTR();
+ DECODE_PRINTF("JZ\t");
+ offset = (s8)fetch_byte_imm();
+ target = (u16)(M.x86.R_IP + (s16)offset);
+ DECODE_PRINTF2("%x\n", target);
+ TRACE_AND_STEP();
+ if (ACCESS_FLAG(F_ZF))
+ M.x86.R_IP = target;
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x75
+****************************************************************************/
+static void x86emuOp_jump_near_NZ(u8 X86EMU_UNUSED(op1))
+{
+ s8 offset;
+ u16 target;
+
+ /* jump to byte offset if zero flag is clear. */
+ START_OF_INSTR();
+ DECODE_PRINTF("JNZ\t");
+ offset = (s8)fetch_byte_imm();
+ target = (u16)(M.x86.R_IP + (s16)offset);
+ DECODE_PRINTF2("%x\n", target);
+ TRACE_AND_STEP();
+ if (!ACCESS_FLAG(F_ZF))
+ M.x86.R_IP = target;
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x76
+****************************************************************************/
+static void x86emuOp_jump_near_BE(u8 X86EMU_UNUSED(op1))
+{
+ s8 offset;
+ u16 target;
+
+ /* jump to byte offset if carry flag is set or if the zero
+ flag is set. */
+ START_OF_INSTR();
+ DECODE_PRINTF("JBE\t");
+ offset = (s8)fetch_byte_imm();
+ target = (u16)(M.x86.R_IP + (s16)offset);
+ DECODE_PRINTF2("%x\n", target);
+ TRACE_AND_STEP();
+ if (ACCESS_FLAG(F_CF) || ACCESS_FLAG(F_ZF))
+ M.x86.R_IP = target;
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x77
+****************************************************************************/
+static void x86emuOp_jump_near_NBE(u8 X86EMU_UNUSED(op1))
+{
+ s8 offset;
+ u16 target;
+
+ /* jump to byte offset if carry flag is clear and if the zero
+ flag is clear */
+ START_OF_INSTR();
+ DECODE_PRINTF("JNBE\t");
+ offset = (s8)fetch_byte_imm();
+ target = (u16)(M.x86.R_IP + (s16)offset);
+ DECODE_PRINTF2("%x\n", target);
+ TRACE_AND_STEP();
+ if (!(ACCESS_FLAG(F_CF) || ACCESS_FLAG(F_ZF)))
+ M.x86.R_IP = target;
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x78
+****************************************************************************/
+static void x86emuOp_jump_near_S(u8 X86EMU_UNUSED(op1))
+{
+ s8 offset;
+ u16 target;
+
+ /* jump to byte offset if sign flag is set */
+ START_OF_INSTR();
+ DECODE_PRINTF("JS\t");
+ offset = (s8)fetch_byte_imm();
+ target = (u16)(M.x86.R_IP + (s16)offset);
+ DECODE_PRINTF2("%x\n", target);
+ TRACE_AND_STEP();
+ if (ACCESS_FLAG(F_SF))
+ M.x86.R_IP = target;
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x79
+****************************************************************************/
+static void x86emuOp_jump_near_NS(u8 X86EMU_UNUSED(op1))
+{
+ s8 offset;
+ u16 target;
+
+ /* jump to byte offset if sign flag is clear */
+ START_OF_INSTR();
+ DECODE_PRINTF("JNS\t");
+ offset = (s8)fetch_byte_imm();
+ target = (u16)(M.x86.R_IP + (s16)offset);
+ DECODE_PRINTF2("%x\n", target);
+ TRACE_AND_STEP();
+ if (!ACCESS_FLAG(F_SF))
+ M.x86.R_IP = target;
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x7a
+****************************************************************************/
+static void x86emuOp_jump_near_P(u8 X86EMU_UNUSED(op1))
+{
+ s8 offset;
+ u16 target;
+
+ /* jump to byte offset if parity flag is set (even parity) */
+ START_OF_INSTR();
+ DECODE_PRINTF("JP\t");
+ offset = (s8)fetch_byte_imm();
+ target = (u16)(M.x86.R_IP + (s16)offset);
+ DECODE_PRINTF2("%x\n", target);
+ TRACE_AND_STEP();
+ if (ACCESS_FLAG(F_PF))
+ M.x86.R_IP = target;
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x7b
+****************************************************************************/
+static void x86emuOp_jump_near_NP(u8 X86EMU_UNUSED(op1))
+{
+ s8 offset;
+ u16 target;
+
+ /* jump to byte offset if parity flag is clear (odd parity) */
+ START_OF_INSTR();
+ DECODE_PRINTF("JNP\t");
+ offset = (s8)fetch_byte_imm();
+ target = (u16)(M.x86.R_IP + (s16)offset);
+ DECODE_PRINTF2("%x\n", target);
+ TRACE_AND_STEP();
+ if (!ACCESS_FLAG(F_PF))
+ M.x86.R_IP = target;
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x7c
+****************************************************************************/
+static void x86emuOp_jump_near_L(u8 X86EMU_UNUSED(op1))
+{
+ s8 offset;
+ u16 target;
+ int sf, of;
+
+ /* jump to byte offset if sign flag not equal to overflow flag. */
+ START_OF_INSTR();
+ DECODE_PRINTF("JL\t");
+ offset = (s8)fetch_byte_imm();
+ target = (u16)(M.x86.R_IP + (s16)offset);
+ DECODE_PRINTF2("%x\n", target);
+ TRACE_AND_STEP();
+ sf = ACCESS_FLAG(F_SF) != 0;
+ of = ACCESS_FLAG(F_OF) != 0;
+ if (sf ^ of)
+ M.x86.R_IP = target;
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x7d
+****************************************************************************/
+static void x86emuOp_jump_near_NL(u8 X86EMU_UNUSED(op1))
+{
+ s8 offset;
+ u16 target;
+ int sf, of;
+
+ /* jump to byte offset if sign flag not equal to overflow flag. */
+ START_OF_INSTR();
+ DECODE_PRINTF("JNL\t");
+ offset = (s8)fetch_byte_imm();
+ target = (u16)(M.x86.R_IP + (s16)offset);
+ DECODE_PRINTF2("%x\n", target);
+ TRACE_AND_STEP();
+ sf = ACCESS_FLAG(F_SF) != 0;
+ of = ACCESS_FLAG(F_OF) != 0;
+ /* note: inverse of above, but using == instead of xor. */
+ if (sf == of)
+ M.x86.R_IP = target;
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x7e
+****************************************************************************/
+static void x86emuOp_jump_near_LE(u8 X86EMU_UNUSED(op1))
+{
+ s8 offset;
+ u16 target;
+ int sf, of;
+
+ /* jump to byte offset if sign flag not equal to overflow flag
+ or the zero flag is set */
+ START_OF_INSTR();
+ DECODE_PRINTF("JLE\t");
+ offset = (s8)fetch_byte_imm();
+ target = (u16)(M.x86.R_IP + (s16)offset);
+ DECODE_PRINTF2("%x\n", target);
+ TRACE_AND_STEP();
+ sf = ACCESS_FLAG(F_SF) != 0;
+ of = ACCESS_FLAG(F_OF) != 0;
+ if ((sf ^ of) || ACCESS_FLAG(F_ZF))
+ M.x86.R_IP = target;
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x7f
+****************************************************************************/
+static void x86emuOp_jump_near_NLE(u8 X86EMU_UNUSED(op1))
+{
+ s8 offset;
+ u16 target;
+ int sf, of;
+
+ /* jump to byte offset if sign flag equal to overflow flag.
+ and the zero flag is clear */
+ START_OF_INSTR();
+ DECODE_PRINTF("JNLE\t");
+ offset = (s8)fetch_byte_imm();
+ target = (u16)(M.x86.R_IP + (s16)offset);
+ DECODE_PRINTF2("%x\n", target);
+ TRACE_AND_STEP();
+ sf = ACCESS_FLAG(F_SF) != 0;
+ of = ACCESS_FLAG(F_OF) != 0;
+ if ((sf == of) && !ACCESS_FLAG(F_ZF))
+ M.x86.R_IP = target;
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+static u8 (*opc80_byte_operation[])(u8 d, u8 s) =
+{
+ add_byte, /* 00 */
+ or_byte, /* 01 */
+ adc_byte, /* 02 */
+ sbb_byte, /* 03 */
+ and_byte, /* 04 */
+ sub_byte, /* 05 */
+ xor_byte, /* 06 */
+ cmp_byte, /* 07 */
+};
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x80
+****************************************************************************/
+static void x86emuOp_opc80_byte_RM_IMM(u8 X86EMU_UNUSED(op1))
+{
+ int mod, rl, rh;
+ u8 *destreg;
+ uint destoffset;
+ u8 imm;
+ u8 destval;
+
+ /*
+ * Weirdo special case instruction format. Part of the opcode
+ * held below in "RH". Doubly nested case would result, except
+ * that the decoded instruction
+ */
+ START_OF_INSTR();
+ FETCH_DECODE_MODRM(mod, rh, rl);
+#ifdef DEBUG
+ if (DEBUG_DECODE()) {
+ /* XXX DECODE_PRINTF may be changed to something more
+ general, so that it is important to leave the strings
+ in the same format, even though the result is that the
+ above test is done twice. */
+
+ switch (rh) {
+ case 0:
+ DECODE_PRINTF("ADD\t");
+ break;
+ case 1:
+ DECODE_PRINTF("OR\t");
+ break;
+ case 2:
+ DECODE_PRINTF("ADC\t");
+ break;
+ case 3:
+ DECODE_PRINTF("SBB\t");
+ break;
+ case 4:
+ DECODE_PRINTF("AND\t");
+ break;
+ case 5:
+ DECODE_PRINTF("SUB\t");
+ break;
+ case 6:
+ DECODE_PRINTF("XOR\t");
+ break;
+ case 7:
+ DECODE_PRINTF("CMP\t");
+ break;
+ }
+ }
+#endif
+ /* know operation, decode the mod byte to find the addressing
+ mode. */
+ switch (mod) {
+ case 0:
+ DECODE_PRINTF("BYTE PTR ");
+ destoffset = decode_rm00_address(rl);
+ DECODE_PRINTF(",");
+ destval = fetch_data_byte(destoffset);
+ imm = fetch_byte_imm();
+ DECODE_PRINTF2("%x\n", imm);
+ TRACE_AND_STEP();
+ destval = (*opc80_byte_operation[rh]) (destval, imm);
+ if (rh != 7)
+ store_data_byte(destoffset, destval);
+ break;
+ case 1:
+ DECODE_PRINTF("BYTE PTR ");
+ destoffset = decode_rm01_address(rl);
+ DECODE_PRINTF(",");
+ destval = fetch_data_byte(destoffset);
+ imm = fetch_byte_imm();
+ DECODE_PRINTF2("%x\n", imm);
+ TRACE_AND_STEP();
+ destval = (*opc80_byte_operation[rh]) (destval, imm);
+ if (rh != 7)
+ store_data_byte(destoffset, destval);
+ break;
+ case 2:
+ DECODE_PRINTF("BYTE PTR ");
+ destoffset = decode_rm10_address(rl);
+ DECODE_PRINTF(",");
+ destval = fetch_data_byte(destoffset);
+ imm = fetch_byte_imm();
+ DECODE_PRINTF2("%x\n", imm);
+ TRACE_AND_STEP();
+ destval = (*opc80_byte_operation[rh]) (destval, imm);
+ if (rh != 7)
+ store_data_byte(destoffset, destval);
+ break;
+ case 3: /* register to register */
+ destreg = DECODE_RM_BYTE_REGISTER(rl);
+ DECODE_PRINTF(",");
+ imm = fetch_byte_imm();
+ DECODE_PRINTF2("%x\n", imm);
+ TRACE_AND_STEP();
+ destval = (*opc80_byte_operation[rh]) (*destreg, imm);
+ if (rh != 7)
+ *destreg = destval;
+ break;
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+static u16 (*opc81_word_operation[])(u16 d, u16 s) =
+{
+ add_word, /*00 */
+ or_word, /*01 */
+ adc_word, /*02 */
+ sbb_word, /*03 */
+ and_word, /*04 */
+ sub_word, /*05 */
+ xor_word, /*06 */
+ cmp_word, /*07 */
+};
+
+static u32 (*opc81_long_operation[])(u32 d, u32 s) =
+{
+ add_long, /*00 */
+ or_long, /*01 */
+ adc_long, /*02 */
+ sbb_long, /*03 */
+ and_long, /*04 */
+ sub_long, /*05 */
+ xor_long, /*06 */
+ cmp_long, /*07 */
+};
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x81
+****************************************************************************/
+static void x86emuOp_opc81_word_RM_IMM(u8 X86EMU_UNUSED(op1))
+{
+ int mod, rl, rh;
+ uint destoffset;
+
+ /*
+ * Weirdo special case instruction format. Part of the opcode
+ * held below in "RH". Doubly nested case would result, except
+ * that the decoded instruction
+ */
+ START_OF_INSTR();
+ FETCH_DECODE_MODRM(mod, rh, rl);
+#ifdef DEBUG
+ if (DEBUG_DECODE()) {
+ /* XXX DECODE_PRINTF may be changed to something more
+ general, so that it is important to leave the strings
+ in the same format, even though the result is that the
+ above test is done twice. */
+
+ switch (rh) {
+ case 0:
+ DECODE_PRINTF("ADD\t");
+ break;
+ case 1:
+ DECODE_PRINTF("OR\t");
+ break;
+ case 2:
+ DECODE_PRINTF("ADC\t");
+ break;
+ case 3:
+ DECODE_PRINTF("SBB\t");
+ break;
+ case 4:
+ DECODE_PRINTF("AND\t");
+ break;
+ case 5:
+ DECODE_PRINTF("SUB\t");
+ break;
+ case 6:
+ DECODE_PRINTF("XOR\t");
+ break;
+ case 7:
+ DECODE_PRINTF("CMP\t");
+ break;
+ }
+ }
+#endif
+ /*
+ * Know operation, decode the mod byte to find the addressing
+ * mode.
+ */
+ switch (mod) {
+ case 0:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 destval,imm;
+
+ DECODE_PRINTF("DWORD PTR ");
+ destoffset = decode_rm00_address(rl);
+ DECODE_PRINTF(",");
+ destval = fetch_data_long(destoffset);
+ imm = fetch_long_imm();
+ DECODE_PRINTF2("%x\n", imm);
+ TRACE_AND_STEP();
+ destval = (*opc81_long_operation[rh]) (destval, imm);
+ if (rh != 7)
+ store_data_long(destoffset, destval);
+ } else {
+ u16 destval,imm;
+
+ DECODE_PRINTF("WORD PTR ");
+ destoffset = decode_rm00_address(rl);
+ DECODE_PRINTF(",");
+ destval = fetch_data_word(destoffset);
+ imm = fetch_word_imm();
+ DECODE_PRINTF2("%x\n", imm);
+ TRACE_AND_STEP();
+ destval = (*opc81_word_operation[rh]) (destval, imm);
+ if (rh != 7)
+ store_data_word(destoffset, destval);
+ }
+ break;
+ case 1:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 destval,imm;
+
+ DECODE_PRINTF("DWORD PTR ");
+ destoffset = decode_rm01_address(rl);
+ DECODE_PRINTF(",");
+ destval = fetch_data_long(destoffset);
+ imm = fetch_long_imm();
+ DECODE_PRINTF2("%x\n", imm);
+ TRACE_AND_STEP();
+ destval = (*opc81_long_operation[rh]) (destval, imm);
+ if (rh != 7)
+ store_data_long(destoffset, destval);
+ } else {
+ u16 destval,imm;
+
+ DECODE_PRINTF("WORD PTR ");
+ destoffset = decode_rm01_address(rl);
+ DECODE_PRINTF(",");
+ destval = fetch_data_word(destoffset);
+ imm = fetch_word_imm();
+ DECODE_PRINTF2("%x\n", imm);
+ TRACE_AND_STEP();
+ destval = (*opc81_word_operation[rh]) (destval, imm);
+ if (rh != 7)
+ store_data_word(destoffset, destval);
+ }
+ break;
+ case 2:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 destval,imm;
+
+ DECODE_PRINTF("DWORD PTR ");
+ destoffset = decode_rm10_address(rl);
+ DECODE_PRINTF(",");
+ destval = fetch_data_long(destoffset);
+ imm = fetch_long_imm();
+ DECODE_PRINTF2("%x\n", imm);
+ TRACE_AND_STEP();
+ destval = (*opc81_long_operation[rh]) (destval, imm);
+ if (rh != 7)
+ store_data_long(destoffset, destval);
+ } else {
+ u16 destval,imm;
+
+ DECODE_PRINTF("WORD PTR ");
+ destoffset = decode_rm10_address(rl);
+ DECODE_PRINTF(",");
+ destval = fetch_data_word(destoffset);
+ imm = fetch_word_imm();
+ DECODE_PRINTF2("%x\n", imm);
+ TRACE_AND_STEP();
+ destval = (*opc81_word_operation[rh]) (destval, imm);
+ if (rh != 7)
+ store_data_word(destoffset, destval);
+ }
+ break;
+ case 3: /* register to register */
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 *destreg;
+ u32 destval,imm;
+
+ destreg = DECODE_RM_LONG_REGISTER(rl);
+ DECODE_PRINTF(",");
+ imm = fetch_long_imm();
+ DECODE_PRINTF2("%x\n", imm);
+ TRACE_AND_STEP();
+ destval = (*opc81_long_operation[rh]) (*destreg, imm);
+ if (rh != 7)
+ *destreg = destval;
+ } else {
+ u16 *destreg;
+ u16 destval,imm;
+
+ destreg = DECODE_RM_WORD_REGISTER(rl);
+ DECODE_PRINTF(",");
+ imm = fetch_word_imm();
+ DECODE_PRINTF2("%x\n", imm);
+ TRACE_AND_STEP();
+ destval = (*opc81_word_operation[rh]) (*destreg, imm);
+ if (rh != 7)
+ *destreg = destval;
+ }
+ break;
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+static u8 (*opc82_byte_operation[])(u8 s, u8 d) =
+{
+ add_byte, /*00 */
+ or_byte, /*01 *//*YYY UNUSED ???? */
+ adc_byte, /*02 */
+ sbb_byte, /*03 */
+ and_byte, /*04 *//*YYY UNUSED ???? */
+ sub_byte, /*05 */
+ xor_byte, /*06 *//*YYY UNUSED ???? */
+ cmp_byte, /*07 */
+};
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x82
+****************************************************************************/
+static void x86emuOp_opc82_byte_RM_IMM(u8 X86EMU_UNUSED(op1))
+{
+ int mod, rl, rh;
+ u8 *destreg;
+ uint destoffset;
+ u8 imm;
+ u8 destval;
+
+ /*
+ * Weirdo special case instruction format. Part of the opcode
+ * held below in "RH". Doubly nested case would result, except
+ * that the decoded instruction Similar to opcode 81, except that
+ * the immediate byte is sign extended to a word length.
+ */
+ START_OF_INSTR();
+ FETCH_DECODE_MODRM(mod, rh, rl);
+#ifdef DEBUG
+ if (DEBUG_DECODE()) {
+ /* XXX DECODE_PRINTF may be changed to something more
+ general, so that it is important to leave the strings
+ in the same format, even though the result is that the
+ above test is done twice. */
+ switch (rh) {
+ case 0:
+ DECODE_PRINTF("ADD\t");
+ break;
+ case 1:
+ DECODE_PRINTF("OR\t");
+ break;
+ case 2:
+ DECODE_PRINTF("ADC\t");
+ break;
+ case 3:
+ DECODE_PRINTF("SBB\t");
+ break;
+ case 4:
+ DECODE_PRINTF("AND\t");
+ break;
+ case 5:
+ DECODE_PRINTF("SUB\t");
+ break;
+ case 6:
+ DECODE_PRINTF("XOR\t");
+ break;
+ case 7:
+ DECODE_PRINTF("CMP\t");
+ break;
+ }
+ }
+#endif
+ /* know operation, decode the mod byte to find the addressing
+ mode. */
+ switch (mod) {
+ case 0:
+ DECODE_PRINTF("BYTE PTR ");
+ destoffset = decode_rm00_address(rl);
+ destval = fetch_data_byte(destoffset);
+ imm = fetch_byte_imm();
+ DECODE_PRINTF2(",%x\n", imm);
+ TRACE_AND_STEP();
+ destval = (*opc82_byte_operation[rh]) (destval, imm);
+ if (rh != 7)
+ store_data_byte(destoffset, destval);
+ break;
+ case 1:
+ DECODE_PRINTF("BYTE PTR ");
+ destoffset = decode_rm01_address(rl);
+ destval = fetch_data_byte(destoffset);
+ imm = fetch_byte_imm();
+ DECODE_PRINTF2(",%x\n", imm);
+ TRACE_AND_STEP();
+ destval = (*opc82_byte_operation[rh]) (destval, imm);
+ if (rh != 7)
+ store_data_byte(destoffset, destval);
+ break;
+ case 2:
+ DECODE_PRINTF("BYTE PTR ");
+ destoffset = decode_rm10_address(rl);
+ destval = fetch_data_byte(destoffset);
+ imm = fetch_byte_imm();
+ DECODE_PRINTF2(",%x\n", imm);
+ TRACE_AND_STEP();
+ destval = (*opc82_byte_operation[rh]) (destval, imm);
+ if (rh != 7)
+ store_data_byte(destoffset, destval);
+ break;
+ case 3: /* register to register */
+ destreg = DECODE_RM_BYTE_REGISTER(rl);
+ imm = fetch_byte_imm();
+ DECODE_PRINTF2(",%x\n", imm);
+ TRACE_AND_STEP();
+ destval = (*opc82_byte_operation[rh]) (*destreg, imm);
+ if (rh != 7)
+ *destreg = destval;
+ break;
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+static u16 (*opc83_word_operation[])(u16 s, u16 d) =
+{
+ add_word, /*00 */
+ or_word, /*01 *//*YYY UNUSED ???? */
+ adc_word, /*02 */
+ sbb_word, /*03 */
+ and_word, /*04 *//*YYY UNUSED ???? */
+ sub_word, /*05 */
+ xor_word, /*06 *//*YYY UNUSED ???? */
+ cmp_word, /*07 */
+};
+
+static u32 (*opc83_long_operation[])(u32 s, u32 d) =
+{
+ add_long, /*00 */
+ or_long, /*01 *//*YYY UNUSED ???? */
+ adc_long, /*02 */
+ sbb_long, /*03 */
+ and_long, /*04 *//*YYY UNUSED ???? */
+ sub_long, /*05 */
+ xor_long, /*06 *//*YYY UNUSED ???? */
+ cmp_long, /*07 */
+};
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x83
+****************************************************************************/
+static void x86emuOp_opc83_word_RM_IMM(u8 X86EMU_UNUSED(op1))
+{
+ int mod, rl, rh;
+ uint destoffset;
+
+ /*
+ * Weirdo special case instruction format. Part of the opcode
+ * held below in "RH". Doubly nested case would result, except
+ * that the decoded instruction Similar to opcode 81, except that
+ * the immediate byte is sign extended to a word length.
+ */
+ START_OF_INSTR();
+ FETCH_DECODE_MODRM(mod, rh, rl);
+#ifdef DEBUG
+ if (DEBUG_DECODE()) {
+ /* XXX DECODE_PRINTF may be changed to something more
+ general, so that it is important to leave the strings
+ in the same format, even though the result is that the
+ above test is done twice. */
+ switch (rh) {
+ case 0:
+ DECODE_PRINTF("ADD\t");
+ break;
+ case 1:
+ DECODE_PRINTF("OR\t");
+ break;
+ case 2:
+ DECODE_PRINTF("ADC\t");
+ break;
+ case 3:
+ DECODE_PRINTF("SBB\t");
+ break;
+ case 4:
+ DECODE_PRINTF("AND\t");
+ break;
+ case 5:
+ DECODE_PRINTF("SUB\t");
+ break;
+ case 6:
+ DECODE_PRINTF("XOR\t");
+ break;
+ case 7:
+ DECODE_PRINTF("CMP\t");
+ break;
+ }
+ }
+#endif
+ /* know operation, decode the mod byte to find the addressing
+ mode. */
+ switch (mod) {
+ case 0:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 destval,imm;
+
+ DECODE_PRINTF("DWORD PTR ");
+ destoffset = decode_rm00_address(rl);
+ destval = fetch_data_long(destoffset);
+ imm = (s8) fetch_byte_imm();
+ DECODE_PRINTF2(",%x\n", imm);
+ TRACE_AND_STEP();
+ destval = (*opc83_long_operation[rh]) (destval, imm);
+ if (rh != 7)
+ store_data_long(destoffset, destval);
+ } else {
+ u16 destval,imm;
+
+ DECODE_PRINTF("WORD PTR ");
+ destoffset = decode_rm00_address(rl);
+ destval = fetch_data_word(destoffset);
+ imm = (s8) fetch_byte_imm();
+ DECODE_PRINTF2(",%x\n", imm);
+ TRACE_AND_STEP();
+ destval = (*opc83_word_operation[rh]) (destval, imm);
+ if (rh != 7)
+ store_data_word(destoffset, destval);
+ }
+ break;
+ case 1:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 destval,imm;
+
+ DECODE_PRINTF("DWORD PTR ");
+ destoffset = decode_rm01_address(rl);
+ destval = fetch_data_long(destoffset);
+ imm = (s8) fetch_byte_imm();
+ DECODE_PRINTF2(",%x\n", imm);
+ TRACE_AND_STEP();
+ destval = (*opc83_long_operation[rh]) (destval, imm);
+ if (rh != 7)
+ store_data_long(destoffset, destval);
+ } else {
+ u16 destval,imm;
+
+ DECODE_PRINTF("WORD PTR ");
+ destoffset = decode_rm01_address(rl);
+ destval = fetch_data_word(destoffset);
+ imm = (s8) fetch_byte_imm();
+ DECODE_PRINTF2(",%x\n", imm);
+ TRACE_AND_STEP();
+ destval = (*opc83_word_operation[rh]) (destval, imm);
+ if (rh != 7)
+ store_data_word(destoffset, destval);
+ }
+ break;
+ case 2:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 destval,imm;
+
+ DECODE_PRINTF("DWORD PTR ");
+ destoffset = decode_rm10_address(rl);
+ destval = fetch_data_long(destoffset);
+ imm = (s8) fetch_byte_imm();
+ DECODE_PRINTF2(",%x\n", imm);
+ TRACE_AND_STEP();
+ destval = (*opc83_long_operation[rh]) (destval, imm);
+ if (rh != 7)
+ store_data_long(destoffset, destval);
+ } else {
+ u16 destval,imm;
+
+ DECODE_PRINTF("WORD PTR ");
+ destoffset = decode_rm10_address(rl);
+ destval = fetch_data_word(destoffset);
+ imm = (s8) fetch_byte_imm();
+ DECODE_PRINTF2(",%x\n", imm);
+ TRACE_AND_STEP();
+ destval = (*opc83_word_operation[rh]) (destval, imm);
+ if (rh != 7)
+ store_data_word(destoffset, destval);
+ }
+ break;
+ case 3: /* register to register */
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 *destreg;
+ u32 destval,imm;
+
+ destreg = DECODE_RM_LONG_REGISTER(rl);
+ imm = (s8) fetch_byte_imm();
+ DECODE_PRINTF2(",%x\n", imm);
+ TRACE_AND_STEP();
+ destval = (*opc83_long_operation[rh]) (*destreg, imm);
+ if (rh != 7)
+ *destreg = destval;
+ } else {
+ u16 *destreg;
+ u16 destval,imm;
+
+ destreg = DECODE_RM_WORD_REGISTER(rl);
+ imm = (s8) fetch_byte_imm();
+ DECODE_PRINTF2(",%x\n", imm);
+ TRACE_AND_STEP();
+ destval = (*opc83_word_operation[rh]) (*destreg, imm);
+ if (rh != 7)
+ *destreg = destval;
+ }
+ break;
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x84
+****************************************************************************/
+static void x86emuOp_test_byte_RM_R(u8 X86EMU_UNUSED(op1))
+{
+ int mod, rl, rh;
+ u8 *destreg, *srcreg;
+ uint destoffset;
+ u8 destval;
+
+ START_OF_INSTR();
+ DECODE_PRINTF("TEST\t");
+ FETCH_DECODE_MODRM(mod, rh, rl);
+ switch (mod) {
+ case 0:
+ destoffset = decode_rm00_address(rl);
+ DECODE_PRINTF(",");
+ destval = fetch_data_byte(destoffset);
+ srcreg = DECODE_RM_BYTE_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ test_byte(destval, *srcreg);
+ break;
+ case 1:
+ destoffset = decode_rm01_address(rl);
+ DECODE_PRINTF(",");
+ destval = fetch_data_byte(destoffset);
+ srcreg = DECODE_RM_BYTE_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ test_byte(destval, *srcreg);
+ break;
+ case 2:
+ destoffset = decode_rm10_address(rl);
+ DECODE_PRINTF(",");
+ destval = fetch_data_byte(destoffset);
+ srcreg = DECODE_RM_BYTE_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ test_byte(destval, *srcreg);
+ break;
+ case 3: /* register to register */
+ destreg = DECODE_RM_BYTE_REGISTER(rl);
+ DECODE_PRINTF(",");
+ srcreg = DECODE_RM_BYTE_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ test_byte(*destreg, *srcreg);
+ break;
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x85
+****************************************************************************/
+static void x86emuOp_test_word_RM_R(u8 X86EMU_UNUSED(op1))
+{
+ int mod, rl, rh;
+ uint destoffset;
+
+ START_OF_INSTR();
+ DECODE_PRINTF("TEST\t");
+ FETCH_DECODE_MODRM(mod, rh, rl);
+ switch (mod) {
+ case 0:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 destval;
+ u32 *srcreg;
+
+ destoffset = decode_rm00_address(rl);
+ DECODE_PRINTF(",");
+ destval = fetch_data_long(destoffset);
+ srcreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ test_long(destval, *srcreg);
+ } else {
+ u16 destval;
+ u16 *srcreg;
+
+ destoffset = decode_rm00_address(rl);
+ DECODE_PRINTF(",");
+ destval = fetch_data_word(destoffset);
+ srcreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ test_word(destval, *srcreg);
+ }
+ break;
+ case 1:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 destval;
+ u32 *srcreg;
+
+ destoffset = decode_rm01_address(rl);
+ DECODE_PRINTF(",");
+ destval = fetch_data_long(destoffset);
+ srcreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ test_long(destval, *srcreg);
+ } else {
+ u16 destval;
+ u16 *srcreg;
+
+ destoffset = decode_rm01_address(rl);
+ DECODE_PRINTF(",");
+ destval = fetch_data_word(destoffset);
+ srcreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ test_word(destval, *srcreg);
+ }
+ break;
+ case 2:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 destval;
+ u32 *srcreg;
+
+ destoffset = decode_rm10_address(rl);
+ DECODE_PRINTF(",");
+ destval = fetch_data_long(destoffset);
+ srcreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ test_long(destval, *srcreg);
+ } else {
+ u16 destval;
+ u16 *srcreg;
+
+ destoffset = decode_rm10_address(rl);
+ DECODE_PRINTF(",");
+ destval = fetch_data_word(destoffset);
+ srcreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ test_word(destval, *srcreg);
+ }
+ break;
+ case 3: /* register to register */
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 *destreg,*srcreg;
+
+ destreg = DECODE_RM_LONG_REGISTER(rl);
+ DECODE_PRINTF(",");
+ srcreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ test_long(*destreg, *srcreg);
+ } else {
+ u16 *destreg,*srcreg;
+
+ destreg = DECODE_RM_WORD_REGISTER(rl);
+ DECODE_PRINTF(",");
+ srcreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ test_word(*destreg, *srcreg);
+ }
+ break;
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x86
+****************************************************************************/
+static void x86emuOp_xchg_byte_RM_R(u8 X86EMU_UNUSED(op1))
+{
+ int mod, rl, rh;
+ u8 *destreg, *srcreg;
+ uint destoffset;
+ u8 destval;
+ u8 tmp;
+
+ START_OF_INSTR();
+ DECODE_PRINTF("XCHG\t");
+ FETCH_DECODE_MODRM(mod, rh, rl);
+ switch (mod) {
+ case 0:
+ destoffset = decode_rm00_address(rl);
+ DECODE_PRINTF(",");
+ destval = fetch_data_byte(destoffset);
+ srcreg = DECODE_RM_BYTE_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ tmp = *srcreg;
+ *srcreg = destval;
+ destval = tmp;
+ store_data_byte(destoffset, destval);
+ break;
+ case 1:
+ destoffset = decode_rm01_address(rl);
+ DECODE_PRINTF(",");
+ destval = fetch_data_byte(destoffset);
+ srcreg = DECODE_RM_BYTE_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ tmp = *srcreg;
+ *srcreg = destval;
+ destval = tmp;
+ store_data_byte(destoffset, destval);
+ break;
+ case 2:
+ destoffset = decode_rm10_address(rl);
+ DECODE_PRINTF(",");
+ destval = fetch_data_byte(destoffset);
+ srcreg = DECODE_RM_BYTE_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ tmp = *srcreg;
+ *srcreg = destval;
+ destval = tmp;
+ store_data_byte(destoffset, destval);
+ break;
+ case 3: /* register to register */
+ destreg = DECODE_RM_BYTE_REGISTER(rl);
+ DECODE_PRINTF(",");
+ srcreg = DECODE_RM_BYTE_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ tmp = *srcreg;
+ *srcreg = *destreg;
+ *destreg = tmp;
+ break;
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x87
+****************************************************************************/
+static void x86emuOp_xchg_word_RM_R(u8 X86EMU_UNUSED(op1))
+{
+ int mod, rl, rh;
+ uint destoffset;
+
+ START_OF_INSTR();
+ DECODE_PRINTF("XCHG\t");
+ FETCH_DECODE_MODRM(mod, rh, rl);
+ switch (mod) {
+ case 0:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 *srcreg;
+ u32 destval,tmp;
+
+ destoffset = decode_rm00_address(rl);
+ DECODE_PRINTF(",");
+ destval = fetch_data_long(destoffset);
+ srcreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ tmp = *srcreg;
+ *srcreg = destval;
+ destval = tmp;
+ store_data_long(destoffset, destval);
+ } else {
+ u16 *srcreg;
+ u16 destval,tmp;
+
+ destoffset = decode_rm00_address(rl);
+ DECODE_PRINTF(",");
+ destval = fetch_data_word(destoffset);
+ srcreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ tmp = *srcreg;
+ *srcreg = destval;
+ destval = tmp;
+ store_data_word(destoffset, destval);
+ }
+ break;
+ case 1:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 *srcreg;
+ u32 destval,tmp;
+
+ destoffset = decode_rm01_address(rl);
+ DECODE_PRINTF(",");
+ destval = fetch_data_long(destoffset);
+ srcreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ tmp = *srcreg;
+ *srcreg = destval;
+ destval = tmp;
+ store_data_long(destoffset, destval);
+ } else {
+ u16 *srcreg;
+ u16 destval,tmp;
+
+ destoffset = decode_rm01_address(rl);
+ DECODE_PRINTF(",");
+ destval = fetch_data_word(destoffset);
+ srcreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ tmp = *srcreg;
+ *srcreg = destval;
+ destval = tmp;
+ store_data_word(destoffset, destval);
+ }
+ break;
+ case 2:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 *srcreg;
+ u32 destval,tmp;
+
+ destoffset = decode_rm10_address(rl);
+ DECODE_PRINTF(",");
+ destval = fetch_data_long(destoffset);
+ srcreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ tmp = *srcreg;
+ *srcreg = destval;
+ destval = tmp;
+ store_data_long(destoffset, destval);
+ } else {
+ u16 *srcreg;
+ u16 destval,tmp;
+
+ destoffset = decode_rm10_address(rl);
+ DECODE_PRINTF(",");
+ destval = fetch_data_word(destoffset);
+ srcreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ tmp = *srcreg;
+ *srcreg = destval;
+ destval = tmp;
+ store_data_word(destoffset, destval);
+ }
+ break;
+ case 3: /* register to register */
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 *destreg,*srcreg;
+ u32 tmp;
+
+ destreg = DECODE_RM_LONG_REGISTER(rl);
+ DECODE_PRINTF(",");
+ srcreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ tmp = *srcreg;
+ *srcreg = *destreg;
+ *destreg = tmp;
+ } else {
+ u16 *destreg,*srcreg;
+ u16 tmp;
+
+ destreg = DECODE_RM_WORD_REGISTER(rl);
+ DECODE_PRINTF(",");
+ srcreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ tmp = *srcreg;
+ *srcreg = *destreg;
+ *destreg = tmp;
+ }
+ break;
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x88
+****************************************************************************/
+static void x86emuOp_mov_byte_RM_R(u8 X86EMU_UNUSED(op1))
+{
+ int mod, rl, rh;
+ u8 *destreg, *srcreg;
+ uint destoffset;
+
+ START_OF_INSTR();
+ DECODE_PRINTF("MOV\t");
+ FETCH_DECODE_MODRM(mod, rh, rl);
+ switch (mod) {
+ case 0:
+ destoffset = decode_rm00_address(rl);
+ DECODE_PRINTF(",");
+ srcreg = DECODE_RM_BYTE_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ store_data_byte(destoffset, *srcreg);
+ break;
+ case 1:
+ destoffset = decode_rm01_address(rl);
+ DECODE_PRINTF(",");
+ srcreg = DECODE_RM_BYTE_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ store_data_byte(destoffset, *srcreg);
+ break;
+ case 2:
+ destoffset = decode_rm10_address(rl);
+ DECODE_PRINTF(",");
+ srcreg = DECODE_RM_BYTE_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ store_data_byte(destoffset, *srcreg);
+ break;
+ case 3: /* register to register */
+ destreg = DECODE_RM_BYTE_REGISTER(rl);
+ DECODE_PRINTF(",");
+ srcreg = DECODE_RM_BYTE_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = *srcreg;
+ break;
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x89
+****************************************************************************/
+static void x86emuOp_mov_word_RM_R(u8 X86EMU_UNUSED(op1))
+{
+ int mod, rl, rh;
+ u32 destoffset;
+
+ START_OF_INSTR();
+ DECODE_PRINTF("MOV\t");
+ FETCH_DECODE_MODRM(mod, rh, rl);
+ switch (mod) {
+ case 0:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 *srcreg;
+
+ destoffset = decode_rm00_address(rl);
+ DECODE_PRINTF(",");
+ srcreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ store_data_long(destoffset, *srcreg);
+ } else {
+ u16 *srcreg;
+
+ destoffset = decode_rm00_address(rl);
+ DECODE_PRINTF(",");
+ srcreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ store_data_word(destoffset, *srcreg);
+ }
+ break;
+ case 1:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 *srcreg;
+
+ destoffset = decode_rm01_address(rl);
+ DECODE_PRINTF(",");
+ srcreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ store_data_long(destoffset, *srcreg);
+ } else {
+ u16 *srcreg;
+
+ destoffset = decode_rm01_address(rl);
+ DECODE_PRINTF(",");
+ srcreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ store_data_word(destoffset, *srcreg);
+ }
+ break;
+ case 2:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 *srcreg;
+
+ destoffset = decode_rm10_address(rl);
+ DECODE_PRINTF(",");
+ srcreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ store_data_long(destoffset, *srcreg);
+ } else {
+ u16 *srcreg;
+
+ destoffset = decode_rm10_address(rl);
+ DECODE_PRINTF(",");
+ srcreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ store_data_word(destoffset, *srcreg);
+ }
+ break;
+ case 3: /* register to register */
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 *destreg,*srcreg;
+
+ destreg = DECODE_RM_LONG_REGISTER(rl);
+ DECODE_PRINTF(",");
+ srcreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = *srcreg;
+ } else {
+ u16 *destreg,*srcreg;
+
+ destreg = DECODE_RM_WORD_REGISTER(rl);
+ DECODE_PRINTF(",");
+ srcreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = *srcreg;
+ }
+ break;
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x8a
+****************************************************************************/
+static void x86emuOp_mov_byte_R_RM(u8 X86EMU_UNUSED(op1))
+{
+ int mod, rl, rh;
+ u8 *destreg, *srcreg;
+ uint srcoffset;
+ u8 srcval;
+
+ START_OF_INSTR();
+ DECODE_PRINTF("MOV\t");
+ FETCH_DECODE_MODRM(mod, rh, rl);
+ switch (mod) {
+ case 0:
+ destreg = DECODE_RM_BYTE_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm00_address(rl);
+ srcval = fetch_data_byte(srcoffset);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = srcval;
+ break;
+ case 1:
+ destreg = DECODE_RM_BYTE_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm01_address(rl);
+ srcval = fetch_data_byte(srcoffset);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = srcval;
+ break;
+ case 2:
+ destreg = DECODE_RM_BYTE_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm10_address(rl);
+ srcval = fetch_data_byte(srcoffset);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = srcval;
+ break;
+ case 3: /* register to register */
+ destreg = DECODE_RM_BYTE_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcreg = DECODE_RM_BYTE_REGISTER(rl);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = *srcreg;
+ break;
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x8b
+****************************************************************************/
+static void x86emuOp_mov_word_R_RM(u8 X86EMU_UNUSED(op1))
+{
+ int mod, rl, rh;
+ uint srcoffset;
+
+ START_OF_INSTR();
+ DECODE_PRINTF("MOV\t");
+ FETCH_DECODE_MODRM(mod, rh, rl);
+ switch (mod) {
+ case 0:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 *destreg;
+ u32 srcval;
+
+ destreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm00_address(rl);
+ srcval = fetch_data_long(srcoffset);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = srcval;
+ } else {
+ u16 *destreg;
+ u16 srcval;
+
+ destreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm00_address(rl);
+ srcval = fetch_data_word(srcoffset);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = srcval;
+ }
+ break;
+ case 1:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 *destreg;
+ u32 srcval;
+
+ destreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm01_address(rl);
+ srcval = fetch_data_long(srcoffset);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = srcval;
+ } else {
+ u16 *destreg;
+ u16 srcval;
+
+ destreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm01_address(rl);
+ srcval = fetch_data_word(srcoffset);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = srcval;
+ }
+ break;
+ case 2:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 *destreg;
+ u32 srcval;
+
+ destreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm10_address(rl);
+ srcval = fetch_data_long(srcoffset);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = srcval;
+ } else {
+ u16 *destreg;
+ u16 srcval;
+
+ destreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm10_address(rl);
+ srcval = fetch_data_word(srcoffset);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = srcval;
+ }
+ break;
+ case 3: /* register to register */
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 *destreg, *srcreg;
+
+ destreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcreg = DECODE_RM_LONG_REGISTER(rl);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = *srcreg;
+ } else {
+ u16 *destreg, *srcreg;
+
+ destreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcreg = DECODE_RM_WORD_REGISTER(rl);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = *srcreg;
+ }
+ break;
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x8c
+****************************************************************************/
+static void x86emuOp_mov_word_RM_SR(u8 X86EMU_UNUSED(op1))
+{
+ int mod, rl, rh;
+ u16 *destreg, *srcreg;
+ uint destoffset;
+ u16 destval;
+
+ START_OF_INSTR();
+ DECODE_PRINTF("MOV\t");
+ FETCH_DECODE_MODRM(mod, rh, rl);
+ switch (mod) {
+ case 0:
+ destoffset = decode_rm00_address(rl);
+ DECODE_PRINTF(",");
+ srcreg = decode_rm_seg_register(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ destval = *srcreg;
+ store_data_word(destoffset, destval);
+ break;
+ case 1:
+ destoffset = decode_rm01_address(rl);
+ DECODE_PRINTF(",");
+ srcreg = decode_rm_seg_register(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ destval = *srcreg;
+ store_data_word(destoffset, destval);
+ break;
+ case 2:
+ destoffset = decode_rm10_address(rl);
+ DECODE_PRINTF(",");
+ srcreg = decode_rm_seg_register(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ destval = *srcreg;
+ store_data_word(destoffset, destval);
+ break;
+ case 3: /* register to register */
+ destreg = DECODE_RM_WORD_REGISTER(rl);
+ DECODE_PRINTF(",");
+ srcreg = decode_rm_seg_register(rh);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = *srcreg;
+ break;
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x8d
+****************************************************************************/
+static void x86emuOp_lea_word_R_M(u8 X86EMU_UNUSED(op1))
+{
+ int mod, rl, rh;
+ u16 *srcreg;
+ uint destoffset;
+
+/*
+ * TODO: Need to handle address size prefix!
+ *
+ * lea eax,[eax+ebx*2] ??
+ */
+
+ START_OF_INSTR();
+ DECODE_PRINTF("LEA\t");
+ FETCH_DECODE_MODRM(mod, rh, rl);
+ switch (mod) {
+ case 0:
+ srcreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF(",");
+ destoffset = decode_rm00_address(rl);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *srcreg = (u16)destoffset;
+ break;
+ case 1:
+ srcreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF(",");
+ destoffset = decode_rm01_address(rl);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *srcreg = (u16)destoffset;
+ break;
+ case 2:
+ srcreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF(",");
+ destoffset = decode_rm10_address(rl);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *srcreg = (u16)destoffset;
+ break;
+ case 3: /* register to register */
+ /* undefined. Do nothing. */
+ break;
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x8e
+****************************************************************************/
+static void x86emuOp_mov_word_SR_RM(u8 X86EMU_UNUSED(op1))
+{
+ int mod, rl, rh;
+ u16 *destreg, *srcreg;
+ uint srcoffset;
+ u16 srcval;
+
+ START_OF_INSTR();
+ DECODE_PRINTF("MOV\t");
+ FETCH_DECODE_MODRM(mod, rh, rl);
+ switch (mod) {
+ case 0:
+ destreg = decode_rm_seg_register(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm00_address(rl);
+ srcval = fetch_data_word(srcoffset);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = srcval;
+ break;
+ case 1:
+ destreg = decode_rm_seg_register(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm01_address(rl);
+ srcval = fetch_data_word(srcoffset);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = srcval;
+ break;
+ case 2:
+ destreg = decode_rm_seg_register(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm10_address(rl);
+ srcval = fetch_data_word(srcoffset);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = srcval;
+ break;
+ case 3: /* register to register */
+ destreg = decode_rm_seg_register(rh);
+ DECODE_PRINTF(",");
+ srcreg = DECODE_RM_WORD_REGISTER(rl);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = *srcreg;
+ break;
+ }
+ /*
+ * Clean up, and reset all the R_xSP pointers to the correct
+ * locations. This is about 3x too much overhead (doing all the
+ * segreg ptrs when only one is needed, but this instruction
+ * *cannot* be that common, and this isn't too much work anyway.
+ */
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x8f
+****************************************************************************/
+static void x86emuOp_pop_RM(u8 X86EMU_UNUSED(op1))
+{
+ int mod, rl, rh;
+ uint destoffset;
+
+ START_OF_INSTR();
+ DECODE_PRINTF("POP\t");
+ FETCH_DECODE_MODRM(mod, rh, rl);
+ if (rh != 0) {
+ DECODE_PRINTF("ILLEGAL DECODE OF OPCODE 8F\n");
+ HALT_SYS();
+ }
+ switch (mod) {
+ case 0:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 destval;
+
+ destoffset = decode_rm00_address(rl);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ destval = pop_long();
+ store_data_long(destoffset, destval);
+ } else {
+ u16 destval;
+
+ destoffset = decode_rm00_address(rl);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ destval = pop_word();
+ store_data_word(destoffset, destval);
+ }
+ break;
+ case 1:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 destval;
+
+ destoffset = decode_rm01_address(rl);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ destval = pop_long();
+ store_data_long(destoffset, destval);
+ } else {
+ u16 destval;
+
+ destoffset = decode_rm01_address(rl);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ destval = pop_word();
+ store_data_word(destoffset, destval);
+ }
+ break;
+ case 2:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 destval;
+
+ destoffset = decode_rm10_address(rl);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ destval = pop_long();
+ store_data_long(destoffset, destval);
+ } else {
+ u16 destval;
+
+ destoffset = decode_rm10_address(rl);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ destval = pop_word();
+ store_data_word(destoffset, destval);
+ }
+ break;
+ case 3: /* register to register */
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 *destreg;
+
+ destreg = DECODE_RM_LONG_REGISTER(rl);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = pop_long();
+ } else {
+ u16 *destreg;
+
+ destreg = DECODE_RM_WORD_REGISTER(rl);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = pop_word();
+ }
+ break;
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x90
+****************************************************************************/
+static void x86emuOp_nop(u8 X86EMU_UNUSED(op1))
+{
+ START_OF_INSTR();
+ DECODE_PRINTF("NOP\n");
+ TRACE_AND_STEP();
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x91
+****************************************************************************/
+static void x86emuOp_xchg_word_AX_CX(u8 X86EMU_UNUSED(op1))
+{
+ u32 tmp;
+
+ START_OF_INSTR();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ DECODE_PRINTF("XCHG\tEAX,ECX\n");
+ } else {
+ DECODE_PRINTF("XCHG\tAX,CX\n");
+ }
+ TRACE_AND_STEP();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ tmp = M.x86.R_EAX;
+ M.x86.R_EAX = M.x86.R_ECX;
+ M.x86.R_ECX = tmp;
+ } else {
+ tmp = M.x86.R_AX;
+ M.x86.R_AX = M.x86.R_CX;
+ M.x86.R_CX = (u16)tmp;
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x92
+****************************************************************************/
+static void x86emuOp_xchg_word_AX_DX(u8 X86EMU_UNUSED(op1))
+{
+ u32 tmp;
+
+ START_OF_INSTR();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ DECODE_PRINTF("XCHG\tEAX,EDX\n");
+ } else {
+ DECODE_PRINTF("XCHG\tAX,DX\n");
+ }
+ TRACE_AND_STEP();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ tmp = M.x86.R_EAX;
+ M.x86.R_EAX = M.x86.R_EDX;
+ M.x86.R_EDX = tmp;
+ } else {
+ tmp = M.x86.R_AX;
+ M.x86.R_AX = M.x86.R_DX;
+ M.x86.R_DX = (u16)tmp;
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x93
+****************************************************************************/
+static void x86emuOp_xchg_word_AX_BX(u8 X86EMU_UNUSED(op1))
+{
+ u32 tmp;
+
+ START_OF_INSTR();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ DECODE_PRINTF("XCHG\tEAX,EBX\n");
+ } else {
+ DECODE_PRINTF("XCHG\tAX,BX\n");
+ }
+ TRACE_AND_STEP();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ tmp = M.x86.R_EAX;
+ M.x86.R_EAX = M.x86.R_EBX;
+ M.x86.R_EBX = tmp;
+ } else {
+ tmp = M.x86.R_AX;
+ M.x86.R_AX = M.x86.R_BX;
+ M.x86.R_BX = (u16)tmp;
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x94
+****************************************************************************/
+static void x86emuOp_xchg_word_AX_SP(u8 X86EMU_UNUSED(op1))
+{
+ u32 tmp;
+
+ START_OF_INSTR();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ DECODE_PRINTF("XCHG\tEAX,ESP\n");
+ } else {
+ DECODE_PRINTF("XCHG\tAX,SP\n");
+ }
+ TRACE_AND_STEP();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ tmp = M.x86.R_EAX;
+ M.x86.R_EAX = M.x86.R_ESP;
+ M.x86.R_ESP = tmp;
+ } else {
+ tmp = M.x86.R_AX;
+ M.x86.R_AX = M.x86.R_SP;
+ M.x86.R_SP = (u16)tmp;
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x95
+****************************************************************************/
+static void x86emuOp_xchg_word_AX_BP(u8 X86EMU_UNUSED(op1))
+{
+ u32 tmp;
+
+ START_OF_INSTR();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ DECODE_PRINTF("XCHG\tEAX,EBP\n");
+ } else {
+ DECODE_PRINTF("XCHG\tAX,BP\n");
+ }
+ TRACE_AND_STEP();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ tmp = M.x86.R_EAX;
+ M.x86.R_EAX = M.x86.R_EBP;
+ M.x86.R_EBP = tmp;
+ } else {
+ tmp = M.x86.R_AX;
+ M.x86.R_AX = M.x86.R_BP;
+ M.x86.R_BP = (u16)tmp;
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x96
+****************************************************************************/
+static void x86emuOp_xchg_word_AX_SI(u8 X86EMU_UNUSED(op1))
+{
+ u32 tmp;
+
+ START_OF_INSTR();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ DECODE_PRINTF("XCHG\tEAX,ESI\n");
+ } else {
+ DECODE_PRINTF("XCHG\tAX,SI\n");
+ }
+ TRACE_AND_STEP();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ tmp = M.x86.R_EAX;
+ M.x86.R_EAX = M.x86.R_ESI;
+ M.x86.R_ESI = tmp;
+ } else {
+ tmp = M.x86.R_AX;
+ M.x86.R_AX = M.x86.R_SI;
+ M.x86.R_SI = (u16)tmp;
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x97
+****************************************************************************/
+static void x86emuOp_xchg_word_AX_DI(u8 X86EMU_UNUSED(op1))
+{
+ u32 tmp;
+
+ START_OF_INSTR();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ DECODE_PRINTF("XCHG\tEAX,EDI\n");
+ } else {
+ DECODE_PRINTF("XCHG\tAX,DI\n");
+ }
+ TRACE_AND_STEP();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ tmp = M.x86.R_EAX;
+ M.x86.R_EAX = M.x86.R_EDI;
+ M.x86.R_EDI = tmp;
+ } else {
+ tmp = M.x86.R_AX;
+ M.x86.R_AX = M.x86.R_DI;
+ M.x86.R_DI = (u16)tmp;
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x98
+****************************************************************************/
+static void x86emuOp_cbw(u8 X86EMU_UNUSED(op1))
+{
+ START_OF_INSTR();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ DECODE_PRINTF("CWDE\n");
+ } else {
+ DECODE_PRINTF("CBW\n");
+ }
+ TRACE_AND_STEP();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ if (M.x86.R_AX & 0x8000) {
+ M.x86.R_EAX |= 0xffff0000;
+ } else {
+ M.x86.R_EAX &= 0x0000ffff;
+ }
+ } else {
+ if (M.x86.R_AL & 0x80) {
+ M.x86.R_AH = 0xff;
+ } else {
+ M.x86.R_AH = 0x0;
+ }
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x99
+****************************************************************************/
+static void x86emuOp_cwd(u8 X86EMU_UNUSED(op1))
+{
+ START_OF_INSTR();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ DECODE_PRINTF("CDQ\n");
+ } else {
+ DECODE_PRINTF("CWD\n");
+ }
+ DECODE_PRINTF("CWD\n");
+ TRACE_AND_STEP();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ if (M.x86.R_EAX & 0x80000000) {
+ M.x86.R_EDX = 0xffffffff;
+ } else {
+ M.x86.R_EDX = 0x0;
+ }
+ } else {
+ if (M.x86.R_AX & 0x8000) {
+ M.x86.R_DX = 0xffff;
+ } else {
+ M.x86.R_DX = 0x0;
+ }
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x9a
+****************************************************************************/
+static void x86emuOp_call_far_IMM(u8 X86EMU_UNUSED(op1))
+{
+ u16 farseg, faroff;
+
+ START_OF_INSTR();
+ DECODE_PRINTF("CALL\t");
+ faroff = fetch_word_imm();
+ farseg = fetch_word_imm();
+ DECODE_PRINTF2("%04x:", farseg);
+ DECODE_PRINTF2("%04x\n", faroff);
+ CALL_TRACE(M.x86.saved_cs, M.x86.saved_ip, farseg, faroff, "FAR ");
+
+ /* XXX
+ *
+ * Hooked interrupt vectors calling into our "BIOS" will cause
+ * problems unless all intersegment stuff is checked for BIOS
+ * access. Check needed here. For moment, let it alone.
+ */
+ TRACE_AND_STEP();
+ push_word(M.x86.R_CS);
+ M.x86.R_CS = farseg;
+ push_word(M.x86.R_IP);
+ M.x86.R_IP = faroff;
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x9b
+****************************************************************************/
+static void x86emuOp_wait(u8 X86EMU_UNUSED(op1))
+{
+ START_OF_INSTR();
+ DECODE_PRINTF("WAIT");
+ TRACE_AND_STEP();
+ /* NADA. */
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x9c
+****************************************************************************/
+static void x86emuOp_pushf_word(u8 X86EMU_UNUSED(op1))
+{
+ u32 flags;
+
+ START_OF_INSTR();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ DECODE_PRINTF("PUSHFD\n");
+ } else {
+ DECODE_PRINTF("PUSHF\n");
+ }
+ TRACE_AND_STEP();
+
+ /* clear out *all* bits not representing flags, and turn on real bits */
+ flags = (M.x86.R_EFLG & F_MSK) | F_ALWAYS_ON;
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ push_long(flags);
+ } else {
+ push_word((u16)flags);
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x9d
+****************************************************************************/
+static void x86emuOp_popf_word(u8 X86EMU_UNUSED(op1))
+{
+ START_OF_INSTR();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ DECODE_PRINTF("POPFD\n");
+ } else {
+ DECODE_PRINTF("POPF\n");
+ }
+ TRACE_AND_STEP();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ M.x86.R_EFLG = pop_long();
+ } else {
+ M.x86.R_FLG = pop_word();
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x9e
+****************************************************************************/
+static void x86emuOp_sahf(u8 X86EMU_UNUSED(op1))
+{
+ START_OF_INSTR();
+ DECODE_PRINTF("SAHF\n");
+ TRACE_AND_STEP();
+ /* clear the lower bits of the flag register */
+ M.x86.R_FLG &= 0xffffff00;
+ /* or in the AH register into the flags register */
+ M.x86.R_FLG |= M.x86.R_AH;
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x9f
+****************************************************************************/
+static void x86emuOp_lahf(u8 X86EMU_UNUSED(op1))
+{
+ START_OF_INSTR();
+ DECODE_PRINTF("LAHF\n");
+ TRACE_AND_STEP();
+ M.x86.R_AH = (u8)(M.x86.R_FLG & 0xff);
+ /*undocumented TC++ behavior??? Nope. It's documented, but
+ you have too look real hard to notice it. */
+ M.x86.R_AH |= 0x2;
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0xa0
+****************************************************************************/
+static void x86emuOp_mov_AL_M_IMM(u8 X86EMU_UNUSED(op1))
+{
+ u16 offset;
+
+ START_OF_INSTR();
+ DECODE_PRINTF("MOV\tAL,");
+ offset = fetch_word_imm();
+ DECODE_PRINTF2("[%04x]\n", offset);
+ TRACE_AND_STEP();
+ M.x86.R_AL = fetch_data_byte(offset);
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0xa1
+****************************************************************************/
+static void x86emuOp_mov_AX_M_IMM(u8 X86EMU_UNUSED(op1))
+{
+ u16 offset;
+
+ START_OF_INSTR();
+ offset = fetch_word_imm();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ DECODE_PRINTF2("MOV\tEAX,[%04x]\n", offset);
+ } else {
+ DECODE_PRINTF2("MOV\tAX,[%04x]\n", offset);
+ }
+ TRACE_AND_STEP();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ M.x86.R_EAX = fetch_data_long(offset);
+ } else {
+ M.x86.R_AX = fetch_data_word(offset);
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0xa2
+****************************************************************************/
+static void x86emuOp_mov_M_AL_IMM(u8 X86EMU_UNUSED(op1))
+{
+ u16 offset;
+
+ START_OF_INSTR();
+ DECODE_PRINTF("MOV\t");
+ offset = fetch_word_imm();
+ DECODE_PRINTF2("[%04x],AL\n", offset);
+ TRACE_AND_STEP();
+ store_data_byte(offset, M.x86.R_AL);
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0xa3
+****************************************************************************/
+static void x86emuOp_mov_M_AX_IMM(u8 X86EMU_UNUSED(op1))
+{
+ u16 offset;
+
+ START_OF_INSTR();
+ offset = fetch_word_imm();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ DECODE_PRINTF2("MOV\t[%04x],EAX\n", offset);
+ } else {
+ DECODE_PRINTF2("MOV\t[%04x],AX\n", offset);
+ }
+ TRACE_AND_STEP();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ store_data_long(offset, M.x86.R_EAX);
+ } else {
+ store_data_word(offset, M.x86.R_AX);
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0xa4
+****************************************************************************/
+static void x86emuOp_movs_byte(u8 X86EMU_UNUSED(op1))
+{
+ u8 val;
+ u32 count;
+ int inc;
+
+ START_OF_INSTR();
+ DECODE_PRINTF("MOVS\tBYTE\n");
+ if (ACCESS_FLAG(F_DF)) /* down */
+ inc = -1;
+ else
+ inc = 1;
+ TRACE_AND_STEP();
+ count = 1;
+ if (M.x86.mode & (SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE)) {
+ /* dont care whether REPE or REPNE */
+ /* move them until CX is ZERO. */
+ count = M.x86.R_CX;
+ M.x86.R_CX = 0;
+ M.x86.mode &= ~(SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE);
+ }
+ while (count--) {
+ val = fetch_data_byte(M.x86.R_SI);
+ store_data_byte_abs(M.x86.R_ES, M.x86.R_DI, val);
+ M.x86.R_SI += inc;
+ M.x86.R_DI += inc;
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0xa5
+****************************************************************************/
+static void x86emuOp_movs_word(u8 X86EMU_UNUSED(op1))
+{
+ u32 val;
+ int inc;
+ u32 count;
+
+ START_OF_INSTR();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ DECODE_PRINTF("MOVS\tDWORD\n");
+ if (ACCESS_FLAG(F_DF)) /* down */
+ inc = -4;
+ else
+ inc = 4;
+ } else {
+ DECODE_PRINTF("MOVS\tWORD\n");
+ if (ACCESS_FLAG(F_DF)) /* down */
+ inc = -2;
+ else
+ inc = 2;
+ }
+ TRACE_AND_STEP();
+ count = 1;
+ if (M.x86.mode & (SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE)) {
+ /* dont care whether REPE or REPNE */
+ /* move them until CX is ZERO. */
+ count = M.x86.R_CX;
+ M.x86.R_CX = 0;
+ M.x86.mode &= ~(SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE);
+ }
+ while (count--) {
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ val = fetch_data_long(M.x86.R_SI);
+ store_data_long_abs(M.x86.R_ES, M.x86.R_DI, val);
+ } else {
+ val = fetch_data_word(M.x86.R_SI);
+ store_data_word_abs(M.x86.R_ES, M.x86.R_DI, (u16)val);
+ }
+ M.x86.R_SI += inc;
+ M.x86.R_DI += inc;
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0xa6
+****************************************************************************/
+static void x86emuOp_cmps_byte(u8 X86EMU_UNUSED(op1))
+{
+ s8 val1, val2;
+ int inc;
+
+ START_OF_INSTR();
+ DECODE_PRINTF("CMPS\tBYTE\n");
+ TRACE_AND_STEP();
+ if (ACCESS_FLAG(F_DF)) /* down */
+ inc = -1;
+ else
+ inc = 1;
+
+ if (M.x86.mode & SYSMODE_PREFIX_REPE) {
+ /* REPE */
+ /* move them until CX is ZERO. */
+ while (M.x86.R_CX != 0) {
+ val1 = fetch_data_byte(M.x86.R_SI);
+ val2 = fetch_data_byte_abs(M.x86.R_ES, M.x86.R_DI);
+ cmp_byte(val1, val2);
+ M.x86.R_CX -= 1;
+ M.x86.R_SI += inc;
+ M.x86.R_DI += inc;
+ if (ACCESS_FLAG(F_ZF) == 0)
+ break;
+ }
+ M.x86.mode &= ~SYSMODE_PREFIX_REPE;
+ } else if (M.x86.mode & SYSMODE_PREFIX_REPNE) {
+ /* REPNE */
+ /* move them until CX is ZERO. */
+ while (M.x86.R_CX != 0) {
+ val1 = fetch_data_byte(M.x86.R_SI);
+ val2 = fetch_data_byte_abs(M.x86.R_ES, M.x86.R_DI);
+ cmp_byte(val1, val2);
+ M.x86.R_CX -= 1;
+ M.x86.R_SI += inc;
+ M.x86.R_DI += inc;
+ if (ACCESS_FLAG(F_ZF))
+ break; /* zero flag set means equal */
+ }
+ M.x86.mode &= ~SYSMODE_PREFIX_REPNE;
+ } else {
+ val1 = fetch_data_byte(M.x86.R_SI);
+ val2 = fetch_data_byte_abs(M.x86.R_ES, M.x86.R_DI);
+ cmp_byte(val1, val2);
+ M.x86.R_SI += inc;
+ M.x86.R_DI += inc;
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0xa7
+****************************************************************************/
+static void x86emuOp_cmps_word(u8 X86EMU_UNUSED(op1))
+{
+ u32 val1,val2;
+ int inc;
+
+ START_OF_INSTR();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ DECODE_PRINTF("CMPS\tDWORD\n");
+ if (ACCESS_FLAG(F_DF)) /* down */
+ inc = -4;
+ else
+ inc = 4;
+ } else {
+ DECODE_PRINTF("CMPS\tWORD\n");
+ if (ACCESS_FLAG(F_DF)) /* down */
+ inc = -2;
+ else
+ inc = 2;
+ }
+ TRACE_AND_STEP();
+ if (M.x86.mode & SYSMODE_PREFIX_REPE) {
+ /* REPE */
+ /* move them until CX is ZERO. */
+ while (M.x86.R_CX != 0) {
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ val1 = fetch_data_long(M.x86.R_SI);
+ val2 = fetch_data_long_abs(M.x86.R_ES, M.x86.R_DI);
+ cmp_long(val1, val2);
+ } else {
+ val1 = fetch_data_word(M.x86.R_SI);
+ val2 = fetch_data_word_abs(M.x86.R_ES, M.x86.R_DI);
+ cmp_word((u16)val1, (u16)val2);
+ }
+ M.x86.R_CX -= 1;
+ M.x86.R_SI += inc;
+ M.x86.R_DI += inc;
+ if (ACCESS_FLAG(F_ZF) == 0)
+ break;
+ }
+ M.x86.mode &= ~SYSMODE_PREFIX_REPE;
+ } else if (M.x86.mode & SYSMODE_PREFIX_REPNE) {
+ /* REPNE */
+ /* move them until CX is ZERO. */
+ while (M.x86.R_CX != 0) {
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ val1 = fetch_data_long(M.x86.R_SI);
+ val2 = fetch_data_long_abs(M.x86.R_ES, M.x86.R_DI);
+ cmp_long(val1, val2);
+ } else {
+ val1 = fetch_data_word(M.x86.R_SI);
+ val2 = fetch_data_word_abs(M.x86.R_ES, M.x86.R_DI);
+ cmp_word((u16)val1, (u16)val2);
+ }
+ M.x86.R_CX -= 1;
+ M.x86.R_SI += inc;
+ M.x86.R_DI += inc;
+ if (ACCESS_FLAG(F_ZF))
+ break; /* zero flag set means equal */
+ }
+ M.x86.mode &= ~SYSMODE_PREFIX_REPNE;
+ } else {
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ val1 = fetch_data_long(M.x86.R_SI);
+ val2 = fetch_data_long_abs(M.x86.R_ES, M.x86.R_DI);
+ cmp_long(val1, val2);
+ } else {
+ val1 = fetch_data_word(M.x86.R_SI);
+ val2 = fetch_data_word_abs(M.x86.R_ES, M.x86.R_DI);
+ cmp_word((u16)val1, (u16)val2);
+ }
+ M.x86.R_SI += inc;
+ M.x86.R_DI += inc;
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0xa8
+****************************************************************************/
+static void x86emuOp_test_AL_IMM(u8 X86EMU_UNUSED(op1))
+{
+ int imm;
+
+ START_OF_INSTR();
+ DECODE_PRINTF("TEST\tAL,");
+ imm = fetch_byte_imm();
+ DECODE_PRINTF2("%04x\n", imm);
+ TRACE_AND_STEP();
+ test_byte(M.x86.R_AL, (u8)imm);
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0xa9
+****************************************************************************/
+static void x86emuOp_test_AX_IMM(u8 X86EMU_UNUSED(op1))
+{
+ u32 srcval;
+
+ START_OF_INSTR();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ DECODE_PRINTF("TEST\tEAX,");
+ srcval = fetch_long_imm();
+ } else {
+ DECODE_PRINTF("TEST\tAX,");
+ srcval = fetch_word_imm();
+ }
+ DECODE_PRINTF2("%x\n", srcval);
+ TRACE_AND_STEP();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ test_long(M.x86.R_EAX, srcval);
+ } else {
+ test_word(M.x86.R_AX, (u16)srcval);
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0xaa
+****************************************************************************/
+static void x86emuOp_stos_byte(u8 X86EMU_UNUSED(op1))
+{
+ int inc;
+
+ START_OF_INSTR();
+ DECODE_PRINTF("STOS\tBYTE\n");
+ if (ACCESS_FLAG(F_DF)) /* down */
+ inc = -1;
+ else
+ inc = 1;
+ TRACE_AND_STEP();
+ if (M.x86.mode & (SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE)) {
+ /* dont care whether REPE or REPNE */
+ /* move them until CX is ZERO. */
+ while (M.x86.R_CX != 0) {
+ store_data_byte_abs(M.x86.R_ES, M.x86.R_DI, M.x86.R_AL);
+ M.x86.R_CX -= 1;
+ M.x86.R_DI += inc;
+ }
+ M.x86.mode &= ~(SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE);
+ } else {
+ store_data_byte_abs(M.x86.R_ES, M.x86.R_DI, M.x86.R_AL);
+ M.x86.R_DI += inc;
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0xab
+****************************************************************************/
+static void x86emuOp_stos_word(u8 X86EMU_UNUSED(op1))
+{
+ int inc;
+ u32 count;
+
+ START_OF_INSTR();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ DECODE_PRINTF("STOS\tDWORD\n");
+ if (ACCESS_FLAG(F_DF)) /* down */
+ inc = -4;
+ else
+ inc = 4;
+ } else {
+ DECODE_PRINTF("STOS\tWORD\n");
+ if (ACCESS_FLAG(F_DF)) /* down */
+ inc = -2;
+ else
+ inc = 2;
+ }
+ TRACE_AND_STEP();
+ count = 1;
+ if (M.x86.mode & (SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE)) {
+ /* dont care whether REPE or REPNE */
+ /* move them until CX is ZERO. */
+ count = M.x86.R_CX;
+ M.x86.R_CX = 0;
+ M.x86.mode &= ~(SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE);
+ }
+ while (count--) {
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ store_data_long_abs(M.x86.R_ES, M.x86.R_DI, M.x86.R_EAX);
+ } else {
+ store_data_word_abs(M.x86.R_ES, M.x86.R_DI, M.x86.R_AX);
+ }
+ M.x86.R_DI += inc;
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0xac
+****************************************************************************/
+static void x86emuOp_lods_byte(u8 X86EMU_UNUSED(op1))
+{
+ int inc;
+
+ START_OF_INSTR();
+ DECODE_PRINTF("LODS\tBYTE\n");
+ TRACE_AND_STEP();
+ if (ACCESS_FLAG(F_DF)) /* down */
+ inc = -1;
+ else
+ inc = 1;
+ if (M.x86.mode & (SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE)) {
+ /* dont care whether REPE or REPNE */
+ /* move them until CX is ZERO. */
+ while (M.x86.R_CX != 0) {
+ M.x86.R_AL = fetch_data_byte(M.x86.R_SI);
+ M.x86.R_CX -= 1;
+ M.x86.R_SI += inc;
+ }
+ M.x86.mode &= ~(SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE);
+ } else {
+ M.x86.R_AL = fetch_data_byte(M.x86.R_SI);
+ M.x86.R_SI += inc;
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0xad
+****************************************************************************/
+static void x86emuOp_lods_word(u8 X86EMU_UNUSED(op1))
+{
+ int inc;
+ u32 count;
+
+ START_OF_INSTR();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ DECODE_PRINTF("LODS\tDWORD\n");
+ if (ACCESS_FLAG(F_DF)) /* down */
+ inc = -4;
+ else
+ inc = 4;
+ } else {
+ DECODE_PRINTF("LODS\tWORD\n");
+ if (ACCESS_FLAG(F_DF)) /* down */
+ inc = -2;
+ else
+ inc = 2;
+ }
+ TRACE_AND_STEP();
+ count = 1;
+ if (M.x86.mode & (SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE)) {
+ /* dont care whether REPE or REPNE */
+ /* move them until CX is ZERO. */
+ count = M.x86.R_CX;
+ M.x86.R_CX = 0;
+ M.x86.mode &= ~(SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE);
+ }
+ while (count--) {
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ M.x86.R_EAX = fetch_data_long(M.x86.R_SI);
+ } else {
+ M.x86.R_AX = fetch_data_word(M.x86.R_SI);
+ }
+ M.x86.R_SI += inc;
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0xae
+****************************************************************************/
+static void x86emuOp_scas_byte(u8 X86EMU_UNUSED(op1))
+{
+ s8 val2;
+ int inc;
+
+ START_OF_INSTR();
+ DECODE_PRINTF("SCAS\tBYTE\n");
+ TRACE_AND_STEP();
+ if (ACCESS_FLAG(F_DF)) /* down */
+ inc = -1;
+ else
+ inc = 1;
+ if (M.x86.mode & SYSMODE_PREFIX_REPE) {
+ /* REPE */
+ /* move them until CX is ZERO. */
+ while (M.x86.R_CX != 0) {
+ val2 = fetch_data_byte_abs(M.x86.R_ES, M.x86.R_DI);
+ cmp_byte(M.x86.R_AL, val2);
+ M.x86.R_CX -= 1;
+ M.x86.R_DI += inc;
+ if (ACCESS_FLAG(F_ZF) == 0)
+ break;
+ }
+ M.x86.mode &= ~SYSMODE_PREFIX_REPE;
+ } else if (M.x86.mode & SYSMODE_PREFIX_REPNE) {
+ /* REPNE */
+ /* move them until CX is ZERO. */
+ while (M.x86.R_CX != 0) {
+ val2 = fetch_data_byte_abs(M.x86.R_ES, M.x86.R_DI);
+ cmp_byte(M.x86.R_AL, val2);
+ M.x86.R_CX -= 1;
+ M.x86.R_DI += inc;
+ if (ACCESS_FLAG(F_ZF))
+ break; /* zero flag set means equal */
+ }
+ M.x86.mode &= ~SYSMODE_PREFIX_REPNE;
+ } else {
+ val2 = fetch_data_byte_abs(M.x86.R_ES, M.x86.R_DI);
+ cmp_byte(M.x86.R_AL, val2);
+ M.x86.R_DI += inc;
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0xaf
+****************************************************************************/
+static void x86emuOp_scas_word(u8 X86EMU_UNUSED(op1))
+{
+ int inc;
+ u32 val;
+
+ START_OF_INSTR();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ DECODE_PRINTF("SCAS\tDWORD\n");
+ if (ACCESS_FLAG(F_DF)) /* down */
+ inc = -4;
+ else
+ inc = 4;
+ } else {
+ DECODE_PRINTF("SCAS\tWORD\n");
+ if (ACCESS_FLAG(F_DF)) /* down */
+ inc = -2;
+ else
+ inc = 2;
+ }
+ TRACE_AND_STEP();
+ if (M.x86.mode & SYSMODE_PREFIX_REPE) {
+ /* REPE */
+ /* move them until CX is ZERO. */
+ while (M.x86.R_CX != 0) {
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ val = fetch_data_long_abs(M.x86.R_ES, M.x86.R_DI);
+ cmp_long(M.x86.R_EAX, val);
+ } else {
+ val = fetch_data_word_abs(M.x86.R_ES, M.x86.R_DI);
+ cmp_word(M.x86.R_AX, (u16)val);
+ }
+ M.x86.R_CX -= 1;
+ M.x86.R_DI += inc;
+ if (ACCESS_FLAG(F_ZF) == 0)
+ break;
+ }
+ M.x86.mode &= ~SYSMODE_PREFIX_REPE;
+ } else if (M.x86.mode & SYSMODE_PREFIX_REPNE) {
+ /* REPNE */
+ /* move them until CX is ZERO. */
+ while (M.x86.R_CX != 0) {
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ val = fetch_data_long_abs(M.x86.R_ES, M.x86.R_DI);
+ cmp_long(M.x86.R_EAX, val);
+ } else {
+ val = fetch_data_word_abs(M.x86.R_ES, M.x86.R_DI);
+ cmp_word(M.x86.R_AX, (u16)val);
+ }
+ M.x86.R_CX -= 1;
+ M.x86.R_DI += inc;
+ if (ACCESS_FLAG(F_ZF))
+ break; /* zero flag set means equal */
+ }
+ M.x86.mode &= ~SYSMODE_PREFIX_REPNE;
+ } else {
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ val = fetch_data_long_abs(M.x86.R_ES, M.x86.R_DI);
+ cmp_long(M.x86.R_EAX, val);
+ } else {
+ val = fetch_data_word_abs(M.x86.R_ES, M.x86.R_DI);
+ cmp_word(M.x86.R_AX, (u16)val);
+ }
+ M.x86.R_DI += inc;
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0xb0
+****************************************************************************/
+static void x86emuOp_mov_byte_AL_IMM(u8 X86EMU_UNUSED(op1))
+{
+ u8 imm;
+
+ START_OF_INSTR();
+ DECODE_PRINTF("MOV\tAL,");
+ imm = fetch_byte_imm();
+ DECODE_PRINTF2("%x\n", imm);
+ TRACE_AND_STEP();
+ M.x86.R_AL = imm;
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0xb1
+****************************************************************************/
+static void x86emuOp_mov_byte_CL_IMM(u8 X86EMU_UNUSED(op1))
+{
+ u8 imm;
+
+ START_OF_INSTR();
+ DECODE_PRINTF("MOV\tCL,");
+ imm = fetch_byte_imm();
+ DECODE_PRINTF2("%x\n", imm);
+ TRACE_AND_STEP();
+ M.x86.R_CL = imm;
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0xb2
+****************************************************************************/
+static void x86emuOp_mov_byte_DL_IMM(u8 X86EMU_UNUSED(op1))
+{
+ u8 imm;
+
+ START_OF_INSTR();
+ DECODE_PRINTF("MOV\tDL,");
+ imm = fetch_byte_imm();
+ DECODE_PRINTF2("%x\n", imm);
+ TRACE_AND_STEP();
+ M.x86.R_DL = imm;
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0xb3
+****************************************************************************/
+static void x86emuOp_mov_byte_BL_IMM(u8 X86EMU_UNUSED(op1))
+{
+ u8 imm;
+
+ START_OF_INSTR();
+ DECODE_PRINTF("MOV\tBL,");
+ imm = fetch_byte_imm();
+ DECODE_PRINTF2("%x\n", imm);
+ TRACE_AND_STEP();
+ M.x86.R_BL = imm;
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0xb4
+****************************************************************************/
+static void x86emuOp_mov_byte_AH_IMM(u8 X86EMU_UNUSED(op1))
+{
+ u8 imm;
+
+ START_OF_INSTR();
+ DECODE_PRINTF("MOV\tAH,");
+ imm = fetch_byte_imm();
+ DECODE_PRINTF2("%x\n", imm);
+ TRACE_AND_STEP();
+ M.x86.R_AH = imm;
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0xb5
+****************************************************************************/
+static void x86emuOp_mov_byte_CH_IMM(u8 X86EMU_UNUSED(op1))
+{
+ u8 imm;
+
+ START_OF_INSTR();
+ DECODE_PRINTF("MOV\tCH,");
+ imm = fetch_byte_imm();
+ DECODE_PRINTF2("%x\n", imm);
+ TRACE_AND_STEP();
+ M.x86.R_CH = imm;
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0xb6
+****************************************************************************/
+static void x86emuOp_mov_byte_DH_IMM(u8 X86EMU_UNUSED(op1))
+{
+ u8 imm;
+
+ START_OF_INSTR();
+ DECODE_PRINTF("MOV\tDH,");
+ imm = fetch_byte_imm();
+ DECODE_PRINTF2("%x\n", imm);
+ TRACE_AND_STEP();
+ M.x86.R_DH = imm;
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0xb7
+****************************************************************************/
+static void x86emuOp_mov_byte_BH_IMM(u8 X86EMU_UNUSED(op1))
+{
+ u8 imm;
+
+ START_OF_INSTR();
+ DECODE_PRINTF("MOV\tBH,");
+ imm = fetch_byte_imm();
+ DECODE_PRINTF2("%x\n", imm);
+ TRACE_AND_STEP();
+ M.x86.R_BH = imm;
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0xb8
+****************************************************************************/
+static void x86emuOp_mov_word_AX_IMM(u8 X86EMU_UNUSED(op1))
+{
+ u32 srcval;
+
+ START_OF_INSTR();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ DECODE_PRINTF("MOV\tEAX,");
+ srcval = fetch_long_imm();
+ } else {
+ DECODE_PRINTF("MOV\tAX,");
+ srcval = fetch_word_imm();
+ }
+ DECODE_PRINTF2("%x\n", srcval);
+ TRACE_AND_STEP();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ M.x86.R_EAX = srcval;
+ } else {
+ M.x86.R_AX = (u16)srcval;
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0xb9
+****************************************************************************/
+static void x86emuOp_mov_word_CX_IMM(u8 X86EMU_UNUSED(op1))
+{
+ u32 srcval;
+
+ START_OF_INSTR();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ DECODE_PRINTF("MOV\tECX,");
+ srcval = fetch_long_imm();
+ } else {
+ DECODE_PRINTF("MOV\tCX,");
+ srcval = fetch_word_imm();
+ }
+ DECODE_PRINTF2("%x\n", srcval);
+ TRACE_AND_STEP();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ M.x86.R_ECX = srcval;
+ } else {
+ M.x86.R_CX = (u16)srcval;
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0xba
+****************************************************************************/
+static void x86emuOp_mov_word_DX_IMM(u8 X86EMU_UNUSED(op1))
+{
+ u32 srcval;
+
+ START_OF_INSTR();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ DECODE_PRINTF("MOV\tEDX,");
+ srcval = fetch_long_imm();
+ } else {
+ DECODE_PRINTF("MOV\tDX,");
+ srcval = fetch_word_imm();
+ }
+ DECODE_PRINTF2("%x\n", srcval);
+ TRACE_AND_STEP();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ M.x86.R_EDX = srcval;
+ } else {
+ M.x86.R_DX = (u16)srcval;
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0xbb
+****************************************************************************/
+static void x86emuOp_mov_word_BX_IMM(u8 X86EMU_UNUSED(op1))
+{
+ u32 srcval;
+
+ START_OF_INSTR();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ DECODE_PRINTF("MOV\tEBX,");
+ srcval = fetch_long_imm();
+ } else {
+ DECODE_PRINTF("MOV\tBX,");
+ srcval = fetch_word_imm();
+ }
+ DECODE_PRINTF2("%x\n", srcval);
+ TRACE_AND_STEP();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ M.x86.R_EBX = srcval;
+ } else {
+ M.x86.R_BX = (u16)srcval;
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0xbc
+****************************************************************************/
+static void x86emuOp_mov_word_SP_IMM(u8 X86EMU_UNUSED(op1))
+{
+ u32 srcval;
+
+ START_OF_INSTR();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ DECODE_PRINTF("MOV\tESP,");
+ srcval = fetch_long_imm();
+ } else {
+ DECODE_PRINTF("MOV\tSP,");
+ srcval = fetch_word_imm();
+ }
+ DECODE_PRINTF2("%x\n", srcval);
+ TRACE_AND_STEP();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ M.x86.R_ESP = srcval;
+ } else {
+ M.x86.R_SP = (u16)srcval;
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0xbd
+****************************************************************************/
+static void x86emuOp_mov_word_BP_IMM(u8 X86EMU_UNUSED(op1))
+{
+ u32 srcval;
+
+ START_OF_INSTR();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ DECODE_PRINTF("MOV\tEBP,");
+ srcval = fetch_long_imm();
+ } else {
+ DECODE_PRINTF("MOV\tBP,");
+ srcval = fetch_word_imm();
+ }
+ DECODE_PRINTF2("%x\n", srcval);
+ TRACE_AND_STEP();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ M.x86.R_EBP = srcval;
+ } else {
+ M.x86.R_BP = (u16)srcval;
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0xbe
+****************************************************************************/
+static void x86emuOp_mov_word_SI_IMM(u8 X86EMU_UNUSED(op1))
+{
+ u32 srcval;
+
+ START_OF_INSTR();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ DECODE_PRINTF("MOV\tESI,");
+ srcval = fetch_long_imm();
+ } else {
+ DECODE_PRINTF("MOV\tSI,");
+ srcval = fetch_word_imm();
+ }
+ DECODE_PRINTF2("%x\n", srcval);
+ TRACE_AND_STEP();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ M.x86.R_ESI = srcval;
+ } else {
+ M.x86.R_SI = (u16)srcval;
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0xbf
+****************************************************************************/
+static void x86emuOp_mov_word_DI_IMM(u8 X86EMU_UNUSED(op1))
+{
+ u32 srcval;
+
+ START_OF_INSTR();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ DECODE_PRINTF("MOV\tEDI,");
+ srcval = fetch_long_imm();
+ } else {
+ DECODE_PRINTF("MOV\tDI,");
+ srcval = fetch_word_imm();
+ }
+ DECODE_PRINTF2("%x\n", srcval);
+ TRACE_AND_STEP();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ M.x86.R_EDI = srcval;
+ } else {
+ M.x86.R_DI = (u16)srcval;
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/* used by opcodes c0, d0, and d2. */
+static u8(*opcD0_byte_operation[])(u8 d, u8 s) =
+{
+ rol_byte,
+ ror_byte,
+ rcl_byte,
+ rcr_byte,
+ shl_byte,
+ shr_byte,
+ shl_byte, /* sal_byte === shl_byte by definition */
+ sar_byte,
+};
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0xc0
+****************************************************************************/
+static void x86emuOp_opcC0_byte_RM_MEM(u8 X86EMU_UNUSED(op1))
+{
+ int mod, rl, rh;
+ u8 *destreg;
+ uint destoffset;
+ u8 destval;
+ u8 amt;
+
+ /*
+ * Yet another weirdo special case instruction format. Part of
+ * the opcode held below in "RH". Doubly nested case would
+ * result, except that the decoded instruction
+ */
+ START_OF_INSTR();
+ FETCH_DECODE_MODRM(mod, rh, rl);
+#ifdef DEBUG
+ if (DEBUG_DECODE()) {
+ /* XXX DECODE_PRINTF may be changed to something more
+ general, so that it is important to leave the strings
+ in the same format, even though the result is that the
+ above test is done twice. */
+
+ switch (rh) {
+ case 0:
+ DECODE_PRINTF("ROL\t");
+ break;
+ case 1:
+ DECODE_PRINTF("ROR\t");
+ break;
+ case 2:
+ DECODE_PRINTF("RCL\t");
+ break;
+ case 3:
+ DECODE_PRINTF("RCR\t");
+ break;
+ case 4:
+ DECODE_PRINTF("SHL\t");
+ break;
+ case 5:
+ DECODE_PRINTF("SHR\t");
+ break;
+ case 6:
+ DECODE_PRINTF("SAL\t");
+ break;
+ case 7:
+ DECODE_PRINTF("SAR\t");
+ break;
+ }
+ }
+#endif
+ /* know operation, decode the mod byte to find the addressing
+ mode. */
+ switch (mod) {
+ case 0:
+ DECODE_PRINTF("BYTE PTR ");
+ destoffset = decode_rm00_address(rl);
+ amt = fetch_byte_imm();
+ DECODE_PRINTF2(",%x\n", amt);
+ destval = fetch_data_byte(destoffset);
+ TRACE_AND_STEP();
+ destval = (*opcD0_byte_operation[rh]) (destval, amt);
+ store_data_byte(destoffset, destval);
+ break;
+ case 1:
+ DECODE_PRINTF("BYTE PTR ");
+ destoffset = decode_rm01_address(rl);
+ amt = fetch_byte_imm();
+ DECODE_PRINTF2(",%x\n", amt);
+ destval = fetch_data_byte(destoffset);
+ TRACE_AND_STEP();
+ destval = (*opcD0_byte_operation[rh]) (destval, amt);
+ store_data_byte(destoffset, destval);
+ break;
+ case 2:
+ DECODE_PRINTF("BYTE PTR ");
+ destoffset = decode_rm10_address(rl);
+ amt = fetch_byte_imm();
+ DECODE_PRINTF2(",%x\n", amt);
+ destval = fetch_data_byte(destoffset);
+ TRACE_AND_STEP();
+ destval = (*opcD0_byte_operation[rh]) (destval, amt);
+ store_data_byte(destoffset, destval);
+ break;
+ case 3: /* register to register */
+ destreg = DECODE_RM_BYTE_REGISTER(rl);
+ amt = fetch_byte_imm();
+ DECODE_PRINTF2(",%x\n", amt);
+ TRACE_AND_STEP();
+ destval = (*opcD0_byte_operation[rh]) (*destreg, amt);
+ *destreg = destval;
+ break;
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/* used by opcodes c1, d1, and d3. */
+static u16(*opcD1_word_operation[])(u16 s, u8 d) =
+{
+ rol_word,
+ ror_word,
+ rcl_word,
+ rcr_word,
+ shl_word,
+ shr_word,
+ shl_word, /* sal_byte === shl_byte by definition */
+ sar_word,
+};
+
+/* used by opcodes c1, d1, and d3. */
+static u32 (*opcD1_long_operation[])(u32 s, u8 d) =
+{
+ rol_long,
+ ror_long,
+ rcl_long,
+ rcr_long,
+ shl_long,
+ shr_long,
+ shl_long, /* sal_byte === shl_byte by definition */
+ sar_long,
+};
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0xc1
+****************************************************************************/
+static void x86emuOp_opcC1_word_RM_MEM(u8 X86EMU_UNUSED(op1))
+{
+ int mod, rl, rh;
+ uint destoffset;
+ u8 amt;
+
+ /*
+ * Yet another weirdo special case instruction format. Part of
+ * the opcode held below in "RH". Doubly nested case would
+ * result, except that the decoded instruction
+ */
+ START_OF_INSTR();
+ FETCH_DECODE_MODRM(mod, rh, rl);
+#ifdef DEBUG
+ if (DEBUG_DECODE()) {
+ /* XXX DECODE_PRINTF may be changed to something more
+ general, so that it is important to leave the strings
+ in the same format, even though the result is that the
+ above test is done twice. */
+
+ switch (rh) {
+ case 0:
+ DECODE_PRINTF("ROL\t");
+ break;
+ case 1:
+ DECODE_PRINTF("ROR\t");
+ break;
+ case 2:
+ DECODE_PRINTF("RCL\t");
+ break;
+ case 3:
+ DECODE_PRINTF("RCR\t");
+ break;
+ case 4:
+ DECODE_PRINTF("SHL\t");
+ break;
+ case 5:
+ DECODE_PRINTF("SHR\t");
+ break;
+ case 6:
+ DECODE_PRINTF("SAL\t");
+ break;
+ case 7:
+ DECODE_PRINTF("SAR\t");
+ break;
+ }
+ }
+#endif
+ /* know operation, decode the mod byte to find the addressing
+ mode. */
+ switch (mod) {
+ case 0:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 destval;
+
+ DECODE_PRINTF("DWORD PTR ");
+ destoffset = decode_rm00_address(rl);
+ amt = fetch_byte_imm();
+ DECODE_PRINTF2(",%x\n", amt);
+ destval = fetch_data_long(destoffset);
+ TRACE_AND_STEP();
+ destval = (*opcD1_long_operation[rh]) (destval, amt);
+ store_data_long(destoffset, destval);
+ } else {
+ u16 destval;
+
+ DECODE_PRINTF("WORD PTR ");
+ destoffset = decode_rm00_address(rl);
+ amt = fetch_byte_imm();
+ DECODE_PRINTF2(",%x\n", amt);
+ destval = fetch_data_word(destoffset);
+ TRACE_AND_STEP();
+ destval = (*opcD1_word_operation[rh]) (destval, amt);
+ store_data_word(destoffset, destval);
+ }
+ break;
+ case 1:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 destval;
+
+ DECODE_PRINTF("DWORD PTR ");
+ destoffset = decode_rm01_address(rl);
+ amt = fetch_byte_imm();
+ DECODE_PRINTF2(",%x\n", amt);
+ destval = fetch_data_long(destoffset);
+ TRACE_AND_STEP();
+ destval = (*opcD1_long_operation[rh]) (destval, amt);
+ store_data_long(destoffset, destval);
+ } else {
+ u16 destval;
+
+ DECODE_PRINTF("WORD PTR ");
+ destoffset = decode_rm01_address(rl);
+ amt = fetch_byte_imm();
+ DECODE_PRINTF2(",%x\n", amt);
+ destval = fetch_data_word(destoffset);
+ TRACE_AND_STEP();
+ destval = (*opcD1_word_operation[rh]) (destval, amt);
+ store_data_word(destoffset, destval);
+ }
+ break;
+ case 2:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 destval;
+
+ DECODE_PRINTF("DWORD PTR ");
+ destoffset = decode_rm10_address(rl);
+ amt = fetch_byte_imm();
+ DECODE_PRINTF2(",%x\n", amt);
+ destval = fetch_data_long(destoffset);
+ TRACE_AND_STEP();
+ destval = (*opcD1_long_operation[rh]) (destval, amt);
+ store_data_long(destoffset, destval);
+ } else {
+ u16 destval;
+
+ DECODE_PRINTF("WORD PTR ");
+ destoffset = decode_rm10_address(rl);
+ amt = fetch_byte_imm();
+ DECODE_PRINTF2(",%x\n", amt);
+ destval = fetch_data_word(destoffset);
+ TRACE_AND_STEP();
+ destval = (*opcD1_word_operation[rh]) (destval, amt);
+ store_data_word(destoffset, destval);
+ }
+ break;
+ case 3: /* register to register */
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 *destreg;
+
+ destreg = DECODE_RM_LONG_REGISTER(rl);
+ amt = fetch_byte_imm();
+ DECODE_PRINTF2(",%x\n", amt);
+ TRACE_AND_STEP();
+ *destreg = (*opcD1_long_operation[rh]) (*destreg, amt);
+ } else {
+ u16 *destreg;
+
+ destreg = DECODE_RM_WORD_REGISTER(rl);
+ amt = fetch_byte_imm();
+ DECODE_PRINTF2(",%x\n", amt);
+ TRACE_AND_STEP();
+ *destreg = (*opcD1_word_operation[rh]) (*destreg, amt);
+ }
+ break;
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0xc2
+****************************************************************************/
+static void x86emuOp_ret_near_IMM(u8 X86EMU_UNUSED(op1))
+{
+ u16 imm;
+
+ START_OF_INSTR();
+ DECODE_PRINTF("RET\t");
+ imm = fetch_word_imm();
+ DECODE_PRINTF2("%x\n", imm);
+ RETURN_TRACE("RET",M.x86.saved_cs,M.x86.saved_ip);
+ TRACE_AND_STEP();
+ M.x86.R_IP = pop_word();
+ M.x86.R_SP += imm;
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0xc3
+****************************************************************************/
+static void x86emuOp_ret_near(u8 X86EMU_UNUSED(op1))
+{
+ START_OF_INSTR();
+ DECODE_PRINTF("RET\n");
+ RETURN_TRACE("RET",M.x86.saved_cs,M.x86.saved_ip);
+ TRACE_AND_STEP();
+ M.x86.R_IP = pop_word();
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0xc4
+****************************************************************************/
+static void x86emuOp_les_R_IMM(u8 X86EMU_UNUSED(op1))
+{
+ int mod, rh, rl;
+ u16 *dstreg;
+ uint srcoffset;
+
+ START_OF_INSTR();
+ DECODE_PRINTF("LES\t");
+ FETCH_DECODE_MODRM(mod, rh, rl);
+ switch (mod) {
+ case 0:
+ dstreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm00_address(rl);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *dstreg = fetch_data_word(srcoffset);
+ M.x86.R_ES = fetch_data_word(srcoffset + 2);
+ break;
+ case 1:
+ dstreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm01_address(rl);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *dstreg = fetch_data_word(srcoffset);
+ M.x86.R_ES = fetch_data_word(srcoffset + 2);
+ break;
+ case 2:
+ dstreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm10_address(rl);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *dstreg = fetch_data_word(srcoffset);
+ M.x86.R_ES = fetch_data_word(srcoffset + 2);
+ break;
+ case 3: /* register to register */
+ /* UNDEFINED! */
+ TRACE_AND_STEP();
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0xc5
+****************************************************************************/
+static void x86emuOp_lds_R_IMM(u8 X86EMU_UNUSED(op1))
+{
+ int mod, rh, rl;
+ u16 *dstreg;
+ uint srcoffset;
+
+ START_OF_INSTR();
+ DECODE_PRINTF("LDS\t");
+ FETCH_DECODE_MODRM(mod, rh, rl);
+ switch (mod) {
+ case 0:
+ dstreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm00_address(rl);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *dstreg = fetch_data_word(srcoffset);
+ M.x86.R_DS = fetch_data_word(srcoffset + 2);
+ break;
+ case 1:
+ dstreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm01_address(rl);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *dstreg = fetch_data_word(srcoffset);
+ M.x86.R_DS = fetch_data_word(srcoffset + 2);
+ break;
+ case 2:
+ dstreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm10_address(rl);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *dstreg = fetch_data_word(srcoffset);
+ M.x86.R_DS = fetch_data_word(srcoffset + 2);
+ break;
+ case 3: /* register to register */
+ /* UNDEFINED! */
+ TRACE_AND_STEP();
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0xc6
+****************************************************************************/
+static void x86emuOp_mov_byte_RM_IMM(u8 X86EMU_UNUSED(op1))
+{
+ int mod, rl, rh;
+ u8 *destreg;
+ uint destoffset;
+ u8 imm;
+
+ START_OF_INSTR();
+ DECODE_PRINTF("MOV\t");
+ FETCH_DECODE_MODRM(mod, rh, rl);
+ if (rh != 0) {
+ DECODE_PRINTF("ILLEGAL DECODE OF OPCODE c6\n");
+ HALT_SYS();
+ }
+ switch (mod) {
+ case 0:
+ DECODE_PRINTF("BYTE PTR ");
+ destoffset = decode_rm00_address(rl);
+ imm = fetch_byte_imm();
+ DECODE_PRINTF2(",%2x\n", imm);
+ TRACE_AND_STEP();
+ store_data_byte(destoffset, imm);
+ break;
+ case 1:
+ DECODE_PRINTF("BYTE PTR ");
+ destoffset = decode_rm01_address(rl);
+ imm = fetch_byte_imm();
+ DECODE_PRINTF2(",%2x\n", imm);
+ TRACE_AND_STEP();
+ store_data_byte(destoffset, imm);
+ break;
+ case 2:
+ DECODE_PRINTF("BYTE PTR ");
+ destoffset = decode_rm10_address(rl);
+ imm = fetch_byte_imm();
+ DECODE_PRINTF2(",%2x\n", imm);
+ TRACE_AND_STEP();
+ store_data_byte(destoffset, imm);
+ break;
+ case 3: /* register to register */
+ destreg = DECODE_RM_BYTE_REGISTER(rl);
+ imm = fetch_byte_imm();
+ DECODE_PRINTF2(",%2x\n", imm);
+ TRACE_AND_STEP();
+ *destreg = imm;
+ break;
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0xc7
+****************************************************************************/
+static void x86emuOp_mov_word_RM_IMM(u8 X86EMU_UNUSED(op1))
+{
+ int mod, rl, rh;
+ uint destoffset;
+
+ START_OF_INSTR();
+ DECODE_PRINTF("MOV\t");
+ FETCH_DECODE_MODRM(mod, rh, rl);
+ if (rh != 0) {
+ DECODE_PRINTF("ILLEGAL DECODE OF OPCODE 8F\n");
+ HALT_SYS();
+ }
+ switch (mod) {
+ case 0:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 imm;
+
+ DECODE_PRINTF("DWORD PTR ");
+ destoffset = decode_rm00_address(rl);
+ imm = fetch_long_imm();
+ DECODE_PRINTF2(",%x\n", imm);
+ TRACE_AND_STEP();
+ store_data_long(destoffset, imm);
+ } else {
+ u16 imm;
+
+ DECODE_PRINTF("WORD PTR ");
+ destoffset = decode_rm00_address(rl);
+ imm = fetch_word_imm();
+ DECODE_PRINTF2(",%x\n", imm);
+ TRACE_AND_STEP();
+ store_data_word(destoffset, imm);
+ }
+ break;
+ case 1:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 imm;
+
+ DECODE_PRINTF("DWORD PTR ");
+ destoffset = decode_rm01_address(rl);
+ imm = fetch_long_imm();
+ DECODE_PRINTF2(",%x\n", imm);
+ TRACE_AND_STEP();
+ store_data_long(destoffset, imm);
+ } else {
+ u16 imm;
+
+ DECODE_PRINTF("WORD PTR ");
+ destoffset = decode_rm01_address(rl);
+ imm = fetch_word_imm();
+ DECODE_PRINTF2(",%x\n", imm);
+ TRACE_AND_STEP();
+ store_data_word(destoffset, imm);
+ }
+ break;
+ case 2:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 imm;
+
+ DECODE_PRINTF("DWORD PTR ");
+ destoffset = decode_rm10_address(rl);
+ imm = fetch_long_imm();
+ DECODE_PRINTF2(",%x\n", imm);
+ TRACE_AND_STEP();
+ store_data_long(destoffset, imm);
+ } else {
+ u16 imm;
+
+ DECODE_PRINTF("WORD PTR ");
+ destoffset = decode_rm10_address(rl);
+ imm = fetch_word_imm();
+ DECODE_PRINTF2(",%x\n", imm);
+ TRACE_AND_STEP();
+ store_data_word(destoffset, imm);
+ }
+ break;
+ case 3: /* register to register */
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 *destreg;
+ u32 imm;
+
+ destreg = DECODE_RM_LONG_REGISTER(rl);
+ imm = fetch_long_imm();
+ DECODE_PRINTF2(",%x\n", imm);
+ TRACE_AND_STEP();
+ *destreg = imm;
+ } else {
+ u16 *destreg;
+ u16 imm;
+
+ destreg = DECODE_RM_WORD_REGISTER(rl);
+ imm = fetch_word_imm();
+ DECODE_PRINTF2(",%x\n", imm);
+ TRACE_AND_STEP();
+ *destreg = imm;
+ }
+ break;
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0xc8
+****************************************************************************/
+static void x86emuOp_enter(u8 X86EMU_UNUSED(op1))
+{
+ u16 local,frame_pointer;
+ u8 nesting;
+ int i;
+
+ START_OF_INSTR();
+ local = fetch_word_imm();
+ nesting = fetch_byte_imm();
+ DECODE_PRINTF2("ENTER %x\n", local);
+ DECODE_PRINTF2(",%x\n", nesting);
+ TRACE_AND_STEP();
+ push_word(M.x86.R_BP);
+ frame_pointer = M.x86.R_SP;
+ if (nesting > 0) {
+ for (i = 1; i < nesting; i++) {
+ M.x86.R_BP -= 2;
+ push_word(fetch_data_word_abs(M.x86.R_SS, M.x86.R_BP));
+ }
+ push_word(frame_pointer);
+ }
+ M.x86.R_BP = frame_pointer;
+ M.x86.R_SP = (u16)(M.x86.R_SP - local);
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0xc9
+****************************************************************************/
+static void x86emuOp_leave(u8 X86EMU_UNUSED(op1))
+{
+ START_OF_INSTR();
+ DECODE_PRINTF("LEAVE\n");
+ TRACE_AND_STEP();
+ M.x86.R_SP = M.x86.R_BP;
+ M.x86.R_BP = pop_word();
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0xca
+****************************************************************************/
+static void x86emuOp_ret_far_IMM(u8 X86EMU_UNUSED(op1))
+{
+ u16 imm;
+
+ START_OF_INSTR();
+ DECODE_PRINTF("RETF\t");
+ imm = fetch_word_imm();
+ DECODE_PRINTF2("%x\n", imm);
+ RETURN_TRACE("RETF",M.x86.saved_cs,M.x86.saved_ip);
+ TRACE_AND_STEP();
+ M.x86.R_IP = pop_word();
+ M.x86.R_CS = pop_word();
+ M.x86.R_SP += imm;
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0xcb
+****************************************************************************/
+static void x86emuOp_ret_far(u8 X86EMU_UNUSED(op1))
+{
+ START_OF_INSTR();
+ DECODE_PRINTF("RETF\n");
+ RETURN_TRACE("RETF",M.x86.saved_cs,M.x86.saved_ip);
+ TRACE_AND_STEP();
+ M.x86.R_IP = pop_word();
+ M.x86.R_CS = pop_word();
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0xcc
+****************************************************************************/
+static void x86emuOp_int3(u8 X86EMU_UNUSED(op1))
+{
+ START_OF_INSTR();
+ DECODE_PRINTF("INT 3\n");
+ TRACE_AND_STEP();
+ if (_X86EMU_intrTab[3]) {
+ (*_X86EMU_intrTab[3])(3);
+ } else {
+ push_word((u16)M.x86.R_FLG);
+ CLEAR_FLAG(F_IF);
+ CLEAR_FLAG(F_TF);
+ push_word(M.x86.R_CS);
+ M.x86.R_CS = mem_access_word(3 * 4 + 2);
+ push_word(M.x86.R_IP);
+ M.x86.R_IP = mem_access_word(3 * 4);
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0xcd
+****************************************************************************/
+static void x86emuOp_int_IMM(u8 X86EMU_UNUSED(op1))
+{
+ u8 intnum;
+
+ START_OF_INSTR();
+ DECODE_PRINTF("INT\t");
+ intnum = fetch_byte_imm();
+ DECODE_PRINTF2("%x\n", intnum);
+ TRACE_AND_STEP();
+ if (_X86EMU_intrTab[intnum]) {
+ (*_X86EMU_intrTab[intnum])(intnum);
+ } else {
+ push_word((u16)M.x86.R_FLG);
+ CLEAR_FLAG(F_IF);
+ CLEAR_FLAG(F_TF);
+ push_word(M.x86.R_CS);
+ M.x86.R_CS = mem_access_word(intnum * 4 + 2);
+ push_word(M.x86.R_IP);
+ M.x86.R_IP = mem_access_word(intnum * 4);
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0xce
+****************************************************************************/
+static void x86emuOp_into(u8 X86EMU_UNUSED(op1))
+{
+ START_OF_INSTR();
+ DECODE_PRINTF("INTO\n");
+ TRACE_AND_STEP();
+ if (ACCESS_FLAG(F_OF)) {
+ if (_X86EMU_intrTab[4]) {
+ (*_X86EMU_intrTab[4])(4);
+ } else {
+ push_word((u16)M.x86.R_FLG);
+ CLEAR_FLAG(F_IF);
+ CLEAR_FLAG(F_TF);
+ push_word(M.x86.R_CS);
+ M.x86.R_CS = mem_access_word(4 * 4 + 2);
+ push_word(M.x86.R_IP);
+ M.x86.R_IP = mem_access_word(4 * 4);
+ }
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0xcf
+****************************************************************************/
+static void x86emuOp_iret(u8 X86EMU_UNUSED(op1))
+{
+ START_OF_INSTR();
+ DECODE_PRINTF("IRET\n");
+
+ TRACE_AND_STEP();
+
+ M.x86.R_IP = pop_word();
+ M.x86.R_CS = pop_word();
+ M.x86.R_FLG = pop_word();
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0xd0
+****************************************************************************/
+static void x86emuOp_opcD0_byte_RM_1(u8 X86EMU_UNUSED(op1))
+{
+ int mod, rl, rh;
+ u8 *destreg;
+ uint destoffset;
+ u8 destval;
+
+ /*
+ * Yet another weirdo special case instruction format. Part of
+ * the opcode held below in "RH". Doubly nested case would
+ * result, except that the decoded instruction
+ */
+ START_OF_INSTR();
+ FETCH_DECODE_MODRM(mod, rh, rl);
+#ifdef DEBUG
+ if (DEBUG_DECODE()) {
+ /* XXX DECODE_PRINTF may be changed to something more
+ general, so that it is important to leave the strings
+ in the same format, even though the result is that the
+ above test is done twice. */
+ switch (rh) {
+ case 0:
+ DECODE_PRINTF("ROL\t");
+ break;
+ case 1:
+ DECODE_PRINTF("ROR\t");
+ break;
+ case 2:
+ DECODE_PRINTF("RCL\t");
+ break;
+ case 3:
+ DECODE_PRINTF("RCR\t");
+ break;
+ case 4:
+ DECODE_PRINTF("SHL\t");
+ break;
+ case 5:
+ DECODE_PRINTF("SHR\t");
+ break;
+ case 6:
+ DECODE_PRINTF("SAL\t");
+ break;
+ case 7:
+ DECODE_PRINTF("SAR\t");
+ break;
+ }
+ }
+#endif
+ /* know operation, decode the mod byte to find the addressing
+ mode. */
+ switch (mod) {
+ case 0:
+ DECODE_PRINTF("BYTE PTR ");
+ destoffset = decode_rm00_address(rl);
+ DECODE_PRINTF(",1\n");
+ destval = fetch_data_byte(destoffset);
+ TRACE_AND_STEP();
+ destval = (*opcD0_byte_operation[rh]) (destval, 1);
+ store_data_byte(destoffset, destval);
+ break;
+ case 1:
+ DECODE_PRINTF("BYTE PTR ");
+ destoffset = decode_rm01_address(rl);
+ DECODE_PRINTF(",1\n");
+ destval = fetch_data_byte(destoffset);
+ TRACE_AND_STEP();
+ destval = (*opcD0_byte_operation[rh]) (destval, 1);
+ store_data_byte(destoffset, destval);
+ break;
+ case 2:
+ DECODE_PRINTF("BYTE PTR ");
+ destoffset = decode_rm10_address(rl);
+ DECODE_PRINTF(",1\n");
+ destval = fetch_data_byte(destoffset);
+ TRACE_AND_STEP();
+ destval = (*opcD0_byte_operation[rh]) (destval, 1);
+ store_data_byte(destoffset, destval);
+ break;
+ case 3: /* register to register */
+ destreg = DECODE_RM_BYTE_REGISTER(rl);
+ DECODE_PRINTF(",1\n");
+ TRACE_AND_STEP();
+ destval = (*opcD0_byte_operation[rh]) (*destreg, 1);
+ *destreg = destval;
+ break;
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0xd1
+****************************************************************************/
+static void x86emuOp_opcD1_word_RM_1(u8 X86EMU_UNUSED(op1))
+{
+ int mod, rl, rh;
+ uint destoffset;
+
+ /*
+ * Yet another weirdo special case instruction format. Part of
+ * the opcode held below in "RH". Doubly nested case would
+ * result, except that the decoded instruction
+ */
+ START_OF_INSTR();
+ FETCH_DECODE_MODRM(mod, rh, rl);
+#ifdef DEBUG
+ if (DEBUG_DECODE()) {
+ /* XXX DECODE_PRINTF may be changed to something more
+ general, so that it is important to leave the strings
+ in the same format, even though the result is that the
+ above test is done twice. */
+ switch (rh) {
+ case 0:
+ DECODE_PRINTF("ROL\t");
+ break;
+ case 1:
+ DECODE_PRINTF("ROR\t");
+ break;
+ case 2:
+ DECODE_PRINTF("RCL\t");
+ break;
+ case 3:
+ DECODE_PRINTF("RCR\t");
+ break;
+ case 4:
+ DECODE_PRINTF("SHL\t");
+ break;
+ case 5:
+ DECODE_PRINTF("SHR\t");
+ break;
+ case 6:
+ DECODE_PRINTF("SAL\t");
+ break;
+ case 7:
+ DECODE_PRINTF("SAR\t");
+ break;
+ }
+ }
+#endif
+ /* know operation, decode the mod byte to find the addressing
+ mode. */
+ switch (mod) {
+ case 0:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 destval;
+
+ DECODE_PRINTF("DWORD PTR ");
+ destoffset = decode_rm00_address(rl);
+ DECODE_PRINTF(",1\n");
+ destval = fetch_data_long(destoffset);
+ TRACE_AND_STEP();
+ destval = (*opcD1_long_operation[rh]) (destval, 1);
+ store_data_long(destoffset, destval);
+ } else {
+ u16 destval;
+
+ DECODE_PRINTF("WORD PTR ");
+ destoffset = decode_rm00_address(rl);
+ DECODE_PRINTF(",1\n");
+ destval = fetch_data_word(destoffset);
+ TRACE_AND_STEP();
+ destval = (*opcD1_word_operation[rh]) (destval, 1);
+ store_data_word(destoffset, destval);
+ }
+ break;
+ case 1:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 destval;
+
+ DECODE_PRINTF("DWORD PTR ");
+ destoffset = decode_rm01_address(rl);
+ DECODE_PRINTF(",1\n");
+ destval = fetch_data_long(destoffset);
+ TRACE_AND_STEP();
+ destval = (*opcD1_long_operation[rh]) (destval, 1);
+ store_data_long(destoffset, destval);
+ } else {
+ u16 destval;
+
+ DECODE_PRINTF("WORD PTR ");
+ destoffset = decode_rm01_address(rl);
+ DECODE_PRINTF(",1\n");
+ destval = fetch_data_word(destoffset);
+ TRACE_AND_STEP();
+ destval = (*opcD1_word_operation[rh]) (destval, 1);
+ store_data_word(destoffset, destval);
+ }
+ break;
+ case 2:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 destval;
+
+ DECODE_PRINTF("DWORD PTR ");
+ destoffset = decode_rm10_address(rl);
+ DECODE_PRINTF(",1\n");
+ destval = fetch_data_long(destoffset);
+ TRACE_AND_STEP();
+ destval = (*opcD1_long_operation[rh]) (destval, 1);
+ store_data_long(destoffset, destval);
+ } else {
+ u16 destval;
+
+ DECODE_PRINTF("BYTE PTR ");
+ destoffset = decode_rm10_address(rl);
+ DECODE_PRINTF(",1\n");
+ destval = fetch_data_word(destoffset);
+ TRACE_AND_STEP();
+ destval = (*opcD1_word_operation[rh]) (destval, 1);
+ store_data_word(destoffset, destval);
+ }
+ break;
+ case 3: /* register to register */
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 destval;
+ u32 *destreg;
+
+ destreg = DECODE_RM_LONG_REGISTER(rl);
+ DECODE_PRINTF(",1\n");
+ TRACE_AND_STEP();
+ destval = (*opcD1_long_operation[rh]) (*destreg, 1);
+ *destreg = destval;
+ } else {
+ u16 destval;
+ u16 *destreg;
+
+ destreg = DECODE_RM_WORD_REGISTER(rl);
+ DECODE_PRINTF(",1\n");
+ TRACE_AND_STEP();
+ destval = (*opcD1_word_operation[rh]) (*destreg, 1);
+ *destreg = destval;
+ }
+ break;
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0xd2
+****************************************************************************/
+static void x86emuOp_opcD2_byte_RM_CL(u8 X86EMU_UNUSED(op1))
+{
+ int mod, rl, rh;
+ u8 *destreg;
+ uint destoffset;
+ u8 destval;
+ u8 amt;
+
+ /*
+ * Yet another weirdo special case instruction format. Part of
+ * the opcode held below in "RH". Doubly nested case would
+ * result, except that the decoded instruction
+ */
+ START_OF_INSTR();
+ FETCH_DECODE_MODRM(mod, rh, rl);
+#ifdef DEBUG
+ if (DEBUG_DECODE()) {
+ /* XXX DECODE_PRINTF may be changed to something more
+ general, so that it is important to leave the strings
+ in the same format, even though the result is that the
+ above test is done twice. */
+ switch (rh) {
+ case 0:
+ DECODE_PRINTF("ROL\t");
+ break;
+ case 1:
+ DECODE_PRINTF("ROR\t");
+ break;
+ case 2:
+ DECODE_PRINTF("RCL\t");
+ break;
+ case 3:
+ DECODE_PRINTF("RCR\t");
+ break;
+ case 4:
+ DECODE_PRINTF("SHL\t");
+ break;
+ case 5:
+ DECODE_PRINTF("SHR\t");
+ break;
+ case 6:
+ DECODE_PRINTF("SAL\t");
+ break;
+ case 7:
+ DECODE_PRINTF("SAR\t");
+ break;
+ }
+ }
+#endif
+ /* know operation, decode the mod byte to find the addressing
+ mode. */
+ amt = M.x86.R_CL;
+ switch (mod) {
+ case 0:
+ DECODE_PRINTF("BYTE PTR ");
+ destoffset = decode_rm00_address(rl);
+ DECODE_PRINTF(",CL\n");
+ destval = fetch_data_byte(destoffset);
+ TRACE_AND_STEP();
+ destval = (*opcD0_byte_operation[rh]) (destval, amt);
+ store_data_byte(destoffset, destval);
+ break;
+ case 1:
+ DECODE_PRINTF("BYTE PTR ");
+ destoffset = decode_rm01_address(rl);
+ DECODE_PRINTF(",CL\n");
+ destval = fetch_data_byte(destoffset);
+ TRACE_AND_STEP();
+ destval = (*opcD0_byte_operation[rh]) (destval, amt);
+ store_data_byte(destoffset, destval);
+ break;
+ case 2:
+ DECODE_PRINTF("BYTE PTR ");
+ destoffset = decode_rm10_address(rl);
+ DECODE_PRINTF(",CL\n");
+ destval = fetch_data_byte(destoffset);
+ TRACE_AND_STEP();
+ destval = (*opcD0_byte_operation[rh]) (destval, amt);
+ store_data_byte(destoffset, destval);
+ break;
+ case 3: /* register to register */
+ destreg = DECODE_RM_BYTE_REGISTER(rl);
+ DECODE_PRINTF(",CL\n");
+ TRACE_AND_STEP();
+ destval = (*opcD0_byte_operation[rh]) (*destreg, amt);
+ *destreg = destval;
+ break;
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0xd3
+****************************************************************************/
+static void x86emuOp_opcD3_word_RM_CL(u8 X86EMU_UNUSED(op1))
+{
+ int mod, rl, rh;
+ uint destoffset;
+ u8 amt;
+
+ /*
+ * Yet another weirdo special case instruction format. Part of
+ * the opcode held below in "RH". Doubly nested case would
+ * result, except that the decoded instruction
+ */
+ START_OF_INSTR();
+ FETCH_DECODE_MODRM(mod, rh, rl);
+#ifdef DEBUG
+ if (DEBUG_DECODE()) {
+ /* XXX DECODE_PRINTF may be changed to something more
+ general, so that it is important to leave the strings
+ in the same format, even though the result is that the
+ above test is done twice. */
+ switch (rh) {
+ case 0:
+ DECODE_PRINTF("ROL\t");
+ break;
+ case 1:
+ DECODE_PRINTF("ROR\t");
+ break;
+ case 2:
+ DECODE_PRINTF("RCL\t");
+ break;
+ case 3:
+ DECODE_PRINTF("RCR\t");
+ break;
+ case 4:
+ DECODE_PRINTF("SHL\t");
+ break;
+ case 5:
+ DECODE_PRINTF("SHR\t");
+ break;
+ case 6:
+ DECODE_PRINTF("SAL\t");
+ break;
+ case 7:
+ DECODE_PRINTF("SAR\t");
+ break;
+ }
+ }
+#endif
+ /* know operation, decode the mod byte to find the addressing
+ mode. */
+ amt = M.x86.R_CL;
+ switch (mod) {
+ case 0:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 destval;
+
+ DECODE_PRINTF("DWORD PTR ");
+ destoffset = decode_rm00_address(rl);
+ DECODE_PRINTF(",CL\n");
+ destval = fetch_data_long(destoffset);
+ TRACE_AND_STEP();
+ destval = (*opcD1_long_operation[rh]) (destval, amt);
+ store_data_long(destoffset, destval);
+ } else {
+ u16 destval;
+
+ DECODE_PRINTF("WORD PTR ");
+ destoffset = decode_rm00_address(rl);
+ DECODE_PRINTF(",CL\n");
+ destval = fetch_data_word(destoffset);
+ TRACE_AND_STEP();
+ destval = (*opcD1_word_operation[rh]) (destval, amt);
+ store_data_word(destoffset, destval);
+ }
+ break;
+ case 1:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 destval;
+
+ DECODE_PRINTF("DWORD PTR ");
+ destoffset = decode_rm01_address(rl);
+ DECODE_PRINTF(",CL\n");
+ destval = fetch_data_long(destoffset);
+ TRACE_AND_STEP();
+ destval = (*opcD1_long_operation[rh]) (destval, amt);
+ store_data_long(destoffset, destval);
+ } else {
+ u16 destval;
+
+ DECODE_PRINTF("WORD PTR ");
+ destoffset = decode_rm01_address(rl);
+ DECODE_PRINTF(",CL\n");
+ destval = fetch_data_word(destoffset);
+ TRACE_AND_STEP();
+ destval = (*opcD1_word_operation[rh]) (destval, amt);
+ store_data_word(destoffset, destval);
+ }
+ break;
+ case 2:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 destval;
+
+ DECODE_PRINTF("DWORD PTR ");
+ destoffset = decode_rm10_address(rl);
+ DECODE_PRINTF(",CL\n");
+ destval = fetch_data_long(destoffset);
+ TRACE_AND_STEP();
+ destval = (*opcD1_long_operation[rh]) (destval, amt);
+ store_data_long(destoffset, destval);
+ } else {
+ u16 destval;
+
+ DECODE_PRINTF("WORD PTR ");
+ destoffset = decode_rm10_address(rl);
+ DECODE_PRINTF(",CL\n");
+ destval = fetch_data_word(destoffset);
+ TRACE_AND_STEP();
+ destval = (*opcD1_word_operation[rh]) (destval, amt);
+ store_data_word(destoffset, destval);
+ }
+ break;
+ case 3: /* register to register */
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 *destreg;
+
+ destreg = DECODE_RM_LONG_REGISTER(rl);
+ DECODE_PRINTF(",CL\n");
+ TRACE_AND_STEP();
+ *destreg = (*opcD1_long_operation[rh]) (*destreg, amt);
+ } else {
+ u16 *destreg;
+
+ destreg = DECODE_RM_WORD_REGISTER(rl);
+ DECODE_PRINTF(",CL\n");
+ TRACE_AND_STEP();
+ *destreg = (*opcD1_word_operation[rh]) (*destreg, amt);
+ }
+ break;
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0xd4
+****************************************************************************/
+static void x86emuOp_aam(u8 X86EMU_UNUSED(op1))
+{
+ u8 a;
+
+ START_OF_INSTR();
+ DECODE_PRINTF("AAM\n");
+ a = fetch_byte_imm(); /* this is a stupid encoding. */
+ if (a != 10) {
+ /* fix: add base decoding
+ aam_word(u8 val, int base a) */
+ DECODE_PRINTF("ERROR DECODING AAM\n");
+ TRACE_REGS();
+ HALT_SYS();
+ }
+ TRACE_AND_STEP();
+ /* note the type change here --- returning AL and AH in AX. */
+ M.x86.R_AX = aam_word(M.x86.R_AL);
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0xd5
+****************************************************************************/
+static void x86emuOp_aad(u8 X86EMU_UNUSED(op1))
+{
+ u8 a;
+
+ START_OF_INSTR();
+ DECODE_PRINTF("AAD\n");
+ a = fetch_byte_imm();
+ if (a != 10) {
+ /* fix: add base decoding
+ aad_word(u16 val, int base a) */
+ DECODE_PRINTF("ERROR DECODING AAM\n");
+ TRACE_REGS();
+ HALT_SYS();
+ }
+ TRACE_AND_STEP();
+ M.x86.R_AX = aad_word(M.x86.R_AX);
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/* opcode 0xd6 ILLEGAL OPCODE */
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0xd7
+****************************************************************************/
+static void x86emuOp_xlat(u8 X86EMU_UNUSED(op1))
+{
+ u16 addr;
+
+ START_OF_INSTR();
+ DECODE_PRINTF("XLAT\n");
+ TRACE_AND_STEP();
+ addr = (u16)(M.x86.R_BX + (u8)M.x86.R_AL);
+ M.x86.R_AL = fetch_data_byte(addr);
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/* instuctions D8 .. DF are in i87_ops.c */
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0xe0
+****************************************************************************/
+static void x86emuOp_loopne(u8 X86EMU_UNUSED(op1))
+{
+ s16 ip;
+
+ START_OF_INSTR();
+ DECODE_PRINTF("LOOPNE\t");
+ ip = (s8) fetch_byte_imm();
+ ip += (s16) M.x86.R_IP;
+ DECODE_PRINTF2("%04x\n", ip);
+ TRACE_AND_STEP();
+ M.x86.R_CX -= 1;
+ if (M.x86.R_CX != 0 && !ACCESS_FLAG(F_ZF)) /* CX != 0 and !ZF */
+ M.x86.R_IP = ip;
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0xe1
+****************************************************************************/
+static void x86emuOp_loope(u8 X86EMU_UNUSED(op1))
+{
+ s16 ip;
+
+ START_OF_INSTR();
+ DECODE_PRINTF("LOOPE\t");
+ ip = (s8) fetch_byte_imm();
+ ip += (s16) M.x86.R_IP;
+ DECODE_PRINTF2("%04x\n", ip);
+ TRACE_AND_STEP();
+ M.x86.R_CX -= 1;
+ if (M.x86.R_CX != 0 && ACCESS_FLAG(F_ZF)) /* CX != 0 and ZF */
+ M.x86.R_IP = ip;
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0xe2
+****************************************************************************/
+static void x86emuOp_loop(u8 X86EMU_UNUSED(op1))
+{
+ s16 ip;
+
+ START_OF_INSTR();
+ DECODE_PRINTF("LOOP\t");
+ ip = (s8) fetch_byte_imm();
+ ip += (s16) M.x86.R_IP;
+ DECODE_PRINTF2("%04x\n", ip);
+ TRACE_AND_STEP();
+ M.x86.R_CX -= 1;
+ if (M.x86.R_CX != 0)
+ M.x86.R_IP = ip;
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0xe3
+****************************************************************************/
+static void x86emuOp_jcxz(u8 X86EMU_UNUSED(op1))
+{
+ u16 target;
+ s8 offset;
+
+ /* jump to byte offset if overflow flag is set */
+ START_OF_INSTR();
+ DECODE_PRINTF("JCXZ\t");
+ offset = (s8)fetch_byte_imm();
+ target = (u16)(M.x86.R_IP + offset);
+ DECODE_PRINTF2("%x\n", target);
+ TRACE_AND_STEP();
+ if (M.x86.R_CX == 0)
+ M.x86.R_IP = target;
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0xe4
+****************************************************************************/
+static void x86emuOp_in_byte_AL_IMM(u8 X86EMU_UNUSED(op1))
+{
+ u8 port;
+
+ START_OF_INSTR();
+ DECODE_PRINTF("IN\t");
+ port = (u8) fetch_byte_imm();
+ DECODE_PRINTF2("%x,AL\n", port);
+ TRACE_AND_STEP();
+ M.x86.R_AL = (*sys_inb)(port);
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0xe5
+****************************************************************************/
+static void x86emuOp_in_word_AX_IMM(u8 X86EMU_UNUSED(op1))
+{
+ u8 port;
+
+ START_OF_INSTR();
+ DECODE_PRINTF("IN\t");
+ port = (u8) fetch_byte_imm();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ DECODE_PRINTF2("EAX,%x\n", port);
+ } else {
+ DECODE_PRINTF2("AX,%x\n", port);
+ }
+ TRACE_AND_STEP();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ M.x86.R_EAX = (*sys_inl)(port);
+ } else {
+ M.x86.R_AX = (*sys_inw)(port);
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0xe6
+****************************************************************************/
+static void x86emuOp_out_byte_IMM_AL(u8 X86EMU_UNUSED(op1))
+{
+ u8 port;
+
+ START_OF_INSTR();
+ DECODE_PRINTF("OUT\t");
+ port = (u8) fetch_byte_imm();
+ DECODE_PRINTF2("%x,AL\n", port);
+ TRACE_AND_STEP();
+ (*sys_outb)(port, M.x86.R_AL);
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0xe7
+****************************************************************************/
+static void x86emuOp_out_word_IMM_AX(u8 X86EMU_UNUSED(op1))
+{
+ u8 port;
+
+ START_OF_INSTR();
+ DECODE_PRINTF("OUT\t");
+ port = (u8) fetch_byte_imm();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ DECODE_PRINTF2("%x,EAX\n", port);
+ } else {
+ DECODE_PRINTF2("%x,AX\n", port);
+ }
+ TRACE_AND_STEP();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ (*sys_outl)(port, M.x86.R_EAX);
+ } else {
+ (*sys_outw)(port, M.x86.R_AX);
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0xe8
+****************************************************************************/
+static void x86emuOp_call_near_IMM(u8 X86EMU_UNUSED(op1))
+{
+ s16 ip;
+
+ START_OF_INSTR();
+ DECODE_PRINTF("CALL\t");
+ ip = (s16) fetch_word_imm();
+ ip += (s16) M.x86.R_IP; /* CHECK SIGN */
+ DECODE_PRINTF2("%04x\n", (u16)ip);
+ CALL_TRACE(M.x86.saved_cs, M.x86.saved_ip, M.x86.R_CS, ip, "");
+ TRACE_AND_STEP();
+ push_word(M.x86.R_IP);
+ M.x86.R_IP = ip;
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0xe9
+****************************************************************************/
+static void x86emuOp_jump_near_IMM(u8 X86EMU_UNUSED(op1))
+{
+ int ip;
+
+ START_OF_INSTR();
+ DECODE_PRINTF("JMP\t");
+ ip = (s16)fetch_word_imm();
+ ip += (s16)M.x86.R_IP;
+ DECODE_PRINTF2("%04x\n", (u16)ip);
+ TRACE_AND_STEP();
+ M.x86.R_IP = (u16)ip;
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0xea
+****************************************************************************/
+static void x86emuOp_jump_far_IMM(u8 X86EMU_UNUSED(op1))
+{
+ u16 cs, ip;
+
+ START_OF_INSTR();
+ DECODE_PRINTF("JMP\tFAR ");
+ ip = fetch_word_imm();
+ cs = fetch_word_imm();
+ DECODE_PRINTF2("%04x:", cs);
+ DECODE_PRINTF2("%04x\n", ip);
+ TRACE_AND_STEP();
+ M.x86.R_IP = ip;
+ M.x86.R_CS = cs;
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0xeb
+****************************************************************************/
+static void x86emuOp_jump_byte_IMM(u8 X86EMU_UNUSED(op1))
+{
+ u16 target;
+ s8 offset;
+
+ START_OF_INSTR();
+ DECODE_PRINTF("JMP\t");
+ offset = (s8)fetch_byte_imm();
+ target = (u16)(M.x86.R_IP + offset);
+ DECODE_PRINTF2("%x\n", target);
+ TRACE_AND_STEP();
+ M.x86.R_IP = target;
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0xec
+****************************************************************************/
+static void x86emuOp_in_byte_AL_DX(u8 X86EMU_UNUSED(op1))
+{
+ START_OF_INSTR();
+ DECODE_PRINTF("IN\tAL,DX\n");
+ TRACE_AND_STEP();
+ M.x86.R_AL = (*sys_inb)(M.x86.R_DX);
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0xed
+****************************************************************************/
+static void x86emuOp_in_word_AX_DX(u8 X86EMU_UNUSED(op1))
+{
+ START_OF_INSTR();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ DECODE_PRINTF("IN\tEAX,DX\n");
+ } else {
+ DECODE_PRINTF("IN\tAX,DX\n");
+ }
+ TRACE_AND_STEP();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ M.x86.R_EAX = (*sys_inl)(M.x86.R_DX);
+ } else {
+ M.x86.R_AX = (*sys_inw)(M.x86.R_DX);
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0xee
+****************************************************************************/
+static void x86emuOp_out_byte_DX_AL(u8 X86EMU_UNUSED(op1))
+{
+ START_OF_INSTR();
+ DECODE_PRINTF("OUT\tDX,AL\n");
+ TRACE_AND_STEP();
+ (*sys_outb)(M.x86.R_DX, M.x86.R_AL);
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0xef
+****************************************************************************/
+static void x86emuOp_out_word_DX_AX(u8 X86EMU_UNUSED(op1))
+{
+ START_OF_INSTR();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ DECODE_PRINTF("OUT\tDX,EAX\n");
+ } else {
+ DECODE_PRINTF("OUT\tDX,AX\n");
+ }
+ TRACE_AND_STEP();
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ (*sys_outl)(M.x86.R_DX, M.x86.R_EAX);
+ } else {
+ (*sys_outw)(M.x86.R_DX, M.x86.R_AX);
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0xf0
+****************************************************************************/
+static void x86emuOp_lock(u8 X86EMU_UNUSED(op1))
+{
+ START_OF_INSTR();
+ DECODE_PRINTF("LOCK:\n");
+ TRACE_AND_STEP();
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/*opcode 0xf1 ILLEGAL OPERATION */
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0xf2
+****************************************************************************/
+static void x86emuOp_repne(u8 X86EMU_UNUSED(op1))
+{
+ START_OF_INSTR();
+ DECODE_PRINTF("REPNE\n");
+ TRACE_AND_STEP();
+ M.x86.mode |= SYSMODE_PREFIX_REPNE;
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0xf3
+****************************************************************************/
+static void x86emuOp_repe(u8 X86EMU_UNUSED(op1))
+{
+ START_OF_INSTR();
+ DECODE_PRINTF("REPE\n");
+ TRACE_AND_STEP();
+ M.x86.mode |= SYSMODE_PREFIX_REPE;
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0xf4
+****************************************************************************/
+static void x86emuOp_halt(u8 X86EMU_UNUSED(op1))
+{
+ START_OF_INSTR();
+ DECODE_PRINTF("HALT\n");
+ TRACE_AND_STEP();
+ HALT_SYS();
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0xf5
+****************************************************************************/
+static void x86emuOp_cmc(u8 X86EMU_UNUSED(op1))
+{
+ /* complement the carry flag. */
+ START_OF_INSTR();
+ DECODE_PRINTF("CMC\n");
+ TRACE_AND_STEP();
+ TOGGLE_FLAG(F_CF);
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0xf6
+****************************************************************************/
+static void x86emuOp_opcF6_byte_RM(u8 X86EMU_UNUSED(op1))
+{
+ int mod, rl, rh;
+ u8 *destreg;
+ uint destoffset;
+ u8 destval, srcval;
+
+ /* long, drawn out code follows. Double switch for a total
+ of 32 cases. */
+ START_OF_INSTR();
+ FETCH_DECODE_MODRM(mod, rh, rl);
+ switch (mod) {
+ case 0: /* mod=00 */
+ switch (rh) {
+ case 0: /* test byte imm */
+ DECODE_PRINTF("TEST\tBYTE PTR ");
+ destoffset = decode_rm00_address(rl);
+ DECODE_PRINTF(",");
+ srcval = fetch_byte_imm();
+ DECODE_PRINTF2("%02x\n", srcval);
+ destval = fetch_data_byte(destoffset);
+ TRACE_AND_STEP();
+ test_byte(destval, srcval);
+ break;
+ case 1:
+ DECODE_PRINTF("ILLEGAL OP MOD=00 RH=01 OP=F6\n");
+ HALT_SYS();
+ break;
+ case 2:
+ DECODE_PRINTF("NOT\tBYTE PTR ");
+ destoffset = decode_rm00_address(rl);
+ DECODE_PRINTF("\n");
+ destval = fetch_data_byte(destoffset);
+ TRACE_AND_STEP();
+ destval = not_byte(destval);
+ store_data_byte(destoffset, destval);
+ break;
+ case 3:
+ DECODE_PRINTF("NEG\tBYTE PTR ");
+ destoffset = decode_rm00_address(rl);
+ DECODE_PRINTF("\n");
+ destval = fetch_data_byte(destoffset);
+ TRACE_AND_STEP();
+ destval = neg_byte(destval);
+ store_data_byte(destoffset, destval);
+ break;
+ case 4:
+ DECODE_PRINTF("MUL\tBYTE PTR ");
+ destoffset = decode_rm00_address(rl);
+ DECODE_PRINTF("\n");
+ destval = fetch_data_byte(destoffset);
+ TRACE_AND_STEP();
+ mul_byte(destval);
+ break;
+ case 5:
+ DECODE_PRINTF("IMUL\tBYTE PTR ");
+ destoffset = decode_rm00_address(rl);
+ DECODE_PRINTF("\n");
+ destval = fetch_data_byte(destoffset);
+ TRACE_AND_STEP();
+ imul_byte(destval);
+ break;
+ case 6:
+ DECODE_PRINTF("DIV\tBYTE PTR ");
+ destoffset = decode_rm00_address(rl);
+ DECODE_PRINTF("\n");
+ destval = fetch_data_byte(destoffset);
+ TRACE_AND_STEP();
+ div_byte(destval);
+ break;
+ case 7:
+ DECODE_PRINTF("IDIV\tBYTE PTR ");
+ destoffset = decode_rm00_address(rl);
+ DECODE_PRINTF("\n");
+ destval = fetch_data_byte(destoffset);
+ TRACE_AND_STEP();
+ idiv_byte(destval);
+ break;
+ }
+ break; /* end mod==00 */
+ case 1: /* mod=01 */
+ switch (rh) {
+ case 0: /* test byte imm */
+ DECODE_PRINTF("TEST\tBYTE PTR ");
+ destoffset = decode_rm01_address(rl);
+ DECODE_PRINTF(",");
+ srcval = fetch_byte_imm();
+ DECODE_PRINTF2("%02x\n", srcval);
+ destval = fetch_data_byte(destoffset);
+ TRACE_AND_STEP();
+ test_byte(destval, srcval);
+ break;
+ case 1:
+ DECODE_PRINTF("ILLEGAL OP MOD=01 RH=01 OP=F6\n");
+ HALT_SYS();
+ break;
+ case 2:
+ DECODE_PRINTF("NOT\tBYTE PTR ");
+ destoffset = decode_rm01_address(rl);
+ DECODE_PRINTF("\n");
+ destval = fetch_data_byte(destoffset);
+ TRACE_AND_STEP();
+ destval = not_byte(destval);
+ store_data_byte(destoffset, destval);
+ break;
+ case 3:
+ DECODE_PRINTF("NEG\tBYTE PTR ");
+ destoffset = decode_rm01_address(rl);
+ DECODE_PRINTF("\n");
+ destval = fetch_data_byte(destoffset);
+ TRACE_AND_STEP();
+ destval = neg_byte(destval);
+ store_data_byte(destoffset, destval);
+ break;
+ case 4:
+ DECODE_PRINTF("MUL\tBYTE PTR ");
+ destoffset = decode_rm01_address(rl);
+ DECODE_PRINTF("\n");
+ destval = fetch_data_byte(destoffset);
+ TRACE_AND_STEP();
+ mul_byte(destval);
+ break;
+ case 5:
+ DECODE_PRINTF("IMUL\tBYTE PTR ");
+ destoffset = decode_rm01_address(rl);
+ DECODE_PRINTF("\n");
+ destval = fetch_data_byte(destoffset);
+ TRACE_AND_STEP();
+ imul_byte(destval);
+ break;
+ case 6:
+ DECODE_PRINTF("DIV\tBYTE PTR ");
+ destoffset = decode_rm01_address(rl);
+ DECODE_PRINTF("\n");
+ destval = fetch_data_byte(destoffset);
+ TRACE_AND_STEP();
+ div_byte(destval);
+ break;
+ case 7:
+ DECODE_PRINTF("IDIV\tBYTE PTR ");
+ destoffset = decode_rm01_address(rl);
+ DECODE_PRINTF("\n");
+ destval = fetch_data_byte(destoffset);
+ TRACE_AND_STEP();
+ idiv_byte(destval);
+ break;
+ }
+ break; /* end mod==01 */
+ case 2: /* mod=10 */
+ switch (rh) {
+ case 0: /* test byte imm */
+ DECODE_PRINTF("TEST\tBYTE PTR ");
+ destoffset = decode_rm10_address(rl);
+ DECODE_PRINTF(",");
+ srcval = fetch_byte_imm();
+ DECODE_PRINTF2("%02x\n", srcval);
+ destval = fetch_data_byte(destoffset);
+ TRACE_AND_STEP();
+ test_byte(destval, srcval);
+ break;
+ case 1:
+ DECODE_PRINTF("ILLEGAL OP MOD=10 RH=01 OP=F6\n");
+ HALT_SYS();
+ break;
+ case 2:
+ DECODE_PRINTF("NOT\tBYTE PTR ");
+ destoffset = decode_rm10_address(rl);
+ DECODE_PRINTF("\n");
+ destval = fetch_data_byte(destoffset);
+ TRACE_AND_STEP();
+ destval = not_byte(destval);
+ store_data_byte(destoffset, destval);
+ break;
+ case 3:
+ DECODE_PRINTF("NEG\tBYTE PTR ");
+ destoffset = decode_rm10_address(rl);
+ DECODE_PRINTF("\n");
+ destval = fetch_data_byte(destoffset);
+ TRACE_AND_STEP();
+ destval = neg_byte(destval);
+ store_data_byte(destoffset, destval);
+ break;
+ case 4:
+ DECODE_PRINTF("MUL\tBYTE PTR ");
+ destoffset = decode_rm10_address(rl);
+ DECODE_PRINTF("\n");
+ destval = fetch_data_byte(destoffset);
+ TRACE_AND_STEP();
+ mul_byte(destval);
+ break;
+ case 5:
+ DECODE_PRINTF("IMUL\tBYTE PTR ");
+ destoffset = decode_rm10_address(rl);
+ DECODE_PRINTF("\n");
+ destval = fetch_data_byte(destoffset);
+ TRACE_AND_STEP();
+ imul_byte(destval);
+ break;
+ case 6:
+ DECODE_PRINTF("DIV\tBYTE PTR ");
+ destoffset = decode_rm10_address(rl);
+ DECODE_PRINTF("\n");
+ destval = fetch_data_byte(destoffset);
+ TRACE_AND_STEP();
+ div_byte(destval);
+ break;
+ case 7:
+ DECODE_PRINTF("IDIV\tBYTE PTR ");
+ destoffset = decode_rm10_address(rl);
+ DECODE_PRINTF("\n");
+ destval = fetch_data_byte(destoffset);
+ TRACE_AND_STEP();
+ idiv_byte(destval);
+ break;
+ }
+ break; /* end mod==10 */
+ case 3: /* mod=11 */
+ switch (rh) {
+ case 0: /* test byte imm */
+ DECODE_PRINTF("TEST\t");
+ destreg = DECODE_RM_BYTE_REGISTER(rl);
+ DECODE_PRINTF(",");
+ srcval = fetch_byte_imm();
+ DECODE_PRINTF2("%02x\n", srcval);
+ TRACE_AND_STEP();
+ test_byte(*destreg, srcval);
+ break;
+ case 1:
+ DECODE_PRINTF("ILLEGAL OP MOD=00 RH=01 OP=F6\n");
+ HALT_SYS();
+ break;
+ case 2:
+ DECODE_PRINTF("NOT\t");
+ destreg = DECODE_RM_BYTE_REGISTER(rl);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = not_byte(*destreg);
+ break;
+ case 3:
+ DECODE_PRINTF("NEG\t");
+ destreg = DECODE_RM_BYTE_REGISTER(rl);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = neg_byte(*destreg);
+ break;
+ case 4:
+ DECODE_PRINTF("MUL\t");
+ destreg = DECODE_RM_BYTE_REGISTER(rl);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ mul_byte(*destreg); /*!!! */
+ break;
+ case 5:
+ DECODE_PRINTF("IMUL\t");
+ destreg = DECODE_RM_BYTE_REGISTER(rl);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ imul_byte(*destreg);
+ break;
+ case 6:
+ DECODE_PRINTF("DIV\t");
+ destreg = DECODE_RM_BYTE_REGISTER(rl);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ div_byte(*destreg);
+ break;
+ case 7:
+ DECODE_PRINTF("IDIV\t");
+ destreg = DECODE_RM_BYTE_REGISTER(rl);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ idiv_byte(*destreg);
+ break;
+ }
+ break; /* end mod==11 */
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0xf7
+****************************************************************************/
+static void x86emuOp_opcF7_word_RM(u8 X86EMU_UNUSED(op1))
+{
+ int mod, rl, rh;
+ uint destoffset;
+
+ /* long, drawn out code follows. Double switch for a total
+ of 32 cases. */
+ START_OF_INSTR();
+ FETCH_DECODE_MODRM(mod, rh, rl);
+ switch (mod) {
+ case 0: /* mod=00 */
+ switch (rh) {
+ case 0: /* test word imm */
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 destval,srcval;
+
+ DECODE_PRINTF("TEST\tDWORD PTR ");
+ destoffset = decode_rm00_address(rl);
+ DECODE_PRINTF(",");
+ srcval = fetch_long_imm();
+ DECODE_PRINTF2("%x\n", srcval);
+ destval = fetch_data_long(destoffset);
+ TRACE_AND_STEP();
+ test_long(destval, srcval);
+ } else {
+ u16 destval,srcval;
+
+ DECODE_PRINTF("TEST\tWORD PTR ");
+ destoffset = decode_rm00_address(rl);
+ DECODE_PRINTF(",");
+ srcval = fetch_word_imm();
+ DECODE_PRINTF2("%x\n", srcval);
+ destval = fetch_data_word(destoffset);
+ TRACE_AND_STEP();
+ test_word(destval, srcval);
+ }
+ break;
+ case 1:
+ DECODE_PRINTF("ILLEGAL OP MOD=00 RH=01 OP=F7\n");
+ HALT_SYS();
+ break;
+ case 2:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 destval;
+
+ DECODE_PRINTF("NOT\tDWORD PTR ");
+ destoffset = decode_rm00_address(rl);
+ DECODE_PRINTF("\n");
+ destval = fetch_data_long(destoffset);
+ TRACE_AND_STEP();
+ destval = not_long(destval);
+ store_data_long(destoffset, destval);
+ } else {
+ u16 destval;
+
+ DECODE_PRINTF("NOT\tWORD PTR ");
+ destoffset = decode_rm00_address(rl);
+ DECODE_PRINTF("\n");
+ destval = fetch_data_word(destoffset);
+ TRACE_AND_STEP();
+ destval = not_word(destval);
+ store_data_word(destoffset, destval);
+ }
+ break;
+ case 3:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 destval;
+
+ DECODE_PRINTF("NEG\tDWORD PTR ");
+ destoffset = decode_rm00_address(rl);
+ DECODE_PRINTF("\n");
+ destval = fetch_data_long(destoffset);
+ TRACE_AND_STEP();
+ destval = neg_long(destval);
+ store_data_long(destoffset, destval);
+ } else {
+ u16 destval;
+
+ DECODE_PRINTF("NEG\tWORD PTR ");
+ destoffset = decode_rm00_address(rl);
+ DECODE_PRINTF("\n");
+ destval = fetch_data_word(destoffset);
+ TRACE_AND_STEP();
+ destval = neg_word(destval);
+ store_data_word(destoffset, destval);
+ }
+ break;
+ case 4:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 destval;
+
+ DECODE_PRINTF("MUL\tDWORD PTR ");
+ destoffset = decode_rm00_address(rl);
+ DECODE_PRINTF("\n");
+ destval = fetch_data_long(destoffset);
+ TRACE_AND_STEP();
+ mul_long(destval);
+ } else {
+ u16 destval;
+
+ DECODE_PRINTF("MUL\tWORD PTR ");
+ destoffset = decode_rm00_address(rl);
+ DECODE_PRINTF("\n");
+ destval = fetch_data_word(destoffset);
+ TRACE_AND_STEP();
+ mul_word(destval);
+ }
+ break;
+ case 5:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 destval;
+
+ DECODE_PRINTF("IMUL\tDWORD PTR ");
+ destoffset = decode_rm00_address(rl);
+ DECODE_PRINTF("\n");
+ destval = fetch_data_long(destoffset);
+ TRACE_AND_STEP();
+ imul_long(destval);
+ } else {
+ u16 destval;
+
+ DECODE_PRINTF("IMUL\tWORD PTR ");
+ destoffset = decode_rm00_address(rl);
+ DECODE_PRINTF("\n");
+ destval = fetch_data_word(destoffset);
+ TRACE_AND_STEP();
+ imul_word(destval);
+ }
+ break;
+ case 6:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 destval;
+
+ DECODE_PRINTF("DIV\tDWORD PTR ");
+ destoffset = decode_rm00_address(rl);
+ DECODE_PRINTF("\n");
+ destval = fetch_data_long(destoffset);
+ TRACE_AND_STEP();
+ div_long(destval);
+ } else {
+ u16 destval;
+
+ DECODE_PRINTF("DIV\tWORD PTR ");
+ destoffset = decode_rm00_address(rl);
+ DECODE_PRINTF("\n");
+ destval = fetch_data_word(destoffset);
+ TRACE_AND_STEP();
+ div_word(destval);
+ }
+ break;
+ case 7:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 destval;
+
+ DECODE_PRINTF("IDIV\tDWORD PTR ");
+ destoffset = decode_rm00_address(rl);
+ DECODE_PRINTF("\n");
+ destval = fetch_data_long(destoffset);
+ TRACE_AND_STEP();
+ idiv_long(destval);
+ } else {
+ u16 destval;
+
+ DECODE_PRINTF("IDIV\tWORD PTR ");
+ destoffset = decode_rm00_address(rl);
+ DECODE_PRINTF("\n");
+ destval = fetch_data_word(destoffset);
+ TRACE_AND_STEP();
+ idiv_word(destval);
+ }
+ break;
+ }
+ break; /* end mod==00 */
+ case 1: /* mod=01 */
+ switch (rh) {
+ case 0: /* test word imm */
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 destval,srcval;
+
+ DECODE_PRINTF("TEST\tDWORD PTR ");
+ destoffset = decode_rm01_address(rl);
+ DECODE_PRINTF(",");
+ srcval = fetch_long_imm();
+ DECODE_PRINTF2("%x\n", srcval);
+ destval = fetch_data_long(destoffset);
+ TRACE_AND_STEP();
+ test_long(destval, srcval);
+ } else {
+ u16 destval,srcval;
+
+ DECODE_PRINTF("TEST\tWORD PTR ");
+ destoffset = decode_rm01_address(rl);
+ DECODE_PRINTF(",");
+ srcval = fetch_word_imm();
+ DECODE_PRINTF2("%x\n", srcval);
+ destval = fetch_data_word(destoffset);
+ TRACE_AND_STEP();
+ test_word(destval, srcval);
+ }
+ break;
+ case 1:
+ DECODE_PRINTF("ILLEGAL OP MOD=01 RH=01 OP=F6\n");
+ HALT_SYS();
+ break;
+ case 2:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 destval;
+
+ DECODE_PRINTF("NOT\tDWORD PTR ");
+ destoffset = decode_rm01_address(rl);
+ DECODE_PRINTF("\n");
+ destval = fetch_data_long(destoffset);
+ TRACE_AND_STEP();
+ destval = not_long(destval);
+ store_data_long(destoffset, destval);
+ } else {
+ u16 destval;
+
+ DECODE_PRINTF("NOT\tWORD PTR ");
+ destoffset = decode_rm01_address(rl);
+ DECODE_PRINTF("\n");
+ destval = fetch_data_word(destoffset);
+ TRACE_AND_STEP();
+ destval = not_word(destval);
+ store_data_word(destoffset, destval);
+ }
+ break;
+ case 3:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 destval;
+
+ DECODE_PRINTF("NEG\tDWORD PTR ");
+ destoffset = decode_rm01_address(rl);
+ DECODE_PRINTF("\n");
+ destval = fetch_data_long(destoffset);
+ TRACE_AND_STEP();
+ destval = neg_long(destval);
+ store_data_long(destoffset, destval);
+ } else {
+ u16 destval;
+
+ DECODE_PRINTF("NEG\tWORD PTR ");
+ destoffset = decode_rm01_address(rl);
+ DECODE_PRINTF("\n");
+ destval = fetch_data_word(destoffset);
+ TRACE_AND_STEP();
+ destval = neg_word(destval);
+ store_data_word(destoffset, destval);
+ }
+ break;
+ case 4:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 destval;
+
+ DECODE_PRINTF("MUL\tDWORD PTR ");
+ destoffset = decode_rm01_address(rl);
+ DECODE_PRINTF("\n");
+ destval = fetch_data_long(destoffset);
+ TRACE_AND_STEP();
+ mul_long(destval);
+ } else {
+ u16 destval;
+
+ DECODE_PRINTF("MUL\tWORD PTR ");
+ destoffset = decode_rm01_address(rl);
+ DECODE_PRINTF("\n");
+ destval = fetch_data_word(destoffset);
+ TRACE_AND_STEP();
+ mul_word(destval);
+ }
+ break;
+ case 5:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 destval;
+
+ DECODE_PRINTF("IMUL\tDWORD PTR ");
+ destoffset = decode_rm01_address(rl);
+ DECODE_PRINTF("\n");
+ destval = fetch_data_long(destoffset);
+ TRACE_AND_STEP();
+ imul_long(destval);
+ } else {
+ u16 destval;
+
+ DECODE_PRINTF("IMUL\tWORD PTR ");
+ destoffset = decode_rm01_address(rl);
+ DECODE_PRINTF("\n");
+ destval = fetch_data_word(destoffset);
+ TRACE_AND_STEP();
+ imul_word(destval);
+ }
+ break;
+ case 6:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 destval;
+
+ DECODE_PRINTF("DIV\tDWORD PTR ");
+ destoffset = decode_rm01_address(rl);
+ DECODE_PRINTF("\n");
+ destval = fetch_data_long(destoffset);
+ TRACE_AND_STEP();
+ div_long(destval);
+ } else {
+ u16 destval;
+
+ DECODE_PRINTF("DIV\tWORD PTR ");
+ destoffset = decode_rm01_address(rl);
+ DECODE_PRINTF("\n");
+ destval = fetch_data_word(destoffset);
+ TRACE_AND_STEP();
+ div_word(destval);
+ }
+ break;
+ case 7:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 destval;
+
+ DECODE_PRINTF("IDIV\tDWORD PTR ");
+ destoffset = decode_rm01_address(rl);
+ DECODE_PRINTF("\n");
+ destval = fetch_data_long(destoffset);
+ TRACE_AND_STEP();
+ idiv_long(destval);
+ } else {
+ u16 destval;
+
+ DECODE_PRINTF("IDIV\tWORD PTR ");
+ destoffset = decode_rm01_address(rl);
+ DECODE_PRINTF("\n");
+ destval = fetch_data_word(destoffset);
+ TRACE_AND_STEP();
+ idiv_word(destval);
+ }
+ break;
+ }
+ break; /* end mod==01 */
+ case 2: /* mod=10 */
+ switch (rh) {
+ case 0: /* test word imm */
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 destval,srcval;
+
+ DECODE_PRINTF("TEST\tDWORD PTR ");
+ destoffset = decode_rm10_address(rl);
+ DECODE_PRINTF(",");
+ srcval = fetch_long_imm();
+ DECODE_PRINTF2("%x\n", srcval);
+ destval = fetch_data_long(destoffset);
+ TRACE_AND_STEP();
+ test_long(destval, srcval);
+ } else {
+ u16 destval,srcval;
+
+ DECODE_PRINTF("TEST\tWORD PTR ");
+ destoffset = decode_rm10_address(rl);
+ DECODE_PRINTF(",");
+ srcval = fetch_word_imm();
+ DECODE_PRINTF2("%x\n", srcval);
+ destval = fetch_data_word(destoffset);
+ TRACE_AND_STEP();
+ test_word(destval, srcval);
+ }
+ break;
+ case 1:
+ DECODE_PRINTF("ILLEGAL OP MOD=10 RH=01 OP=F6\n");
+ HALT_SYS();
+ break;
+ case 2:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 destval;
+
+ DECODE_PRINTF("NOT\tDWORD PTR ");
+ destoffset = decode_rm10_address(rl);
+ DECODE_PRINTF("\n");
+ destval = fetch_data_long(destoffset);
+ TRACE_AND_STEP();
+ destval = not_long(destval);
+ store_data_long(destoffset, destval);
+ } else {
+ u16 destval;
+
+ DECODE_PRINTF("NOT\tWORD PTR ");
+ destoffset = decode_rm10_address(rl);
+ DECODE_PRINTF("\n");
+ destval = fetch_data_word(destoffset);
+ TRACE_AND_STEP();
+ destval = not_word(destval);
+ store_data_word(destoffset, destval);
+ }
+ break;
+ case 3:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 destval;
+
+ DECODE_PRINTF("NEG\tDWORD PTR ");
+ destoffset = decode_rm10_address(rl);
+ DECODE_PRINTF("\n");
+ destval = fetch_data_long(destoffset);
+ TRACE_AND_STEP();
+ destval = neg_long(destval);
+ store_data_long(destoffset, destval);
+ } else {
+ u16 destval;
+
+ DECODE_PRINTF("NEG\tWORD PTR ");
+ destoffset = decode_rm10_address(rl);
+ DECODE_PRINTF("\n");
+ destval = fetch_data_word(destoffset);
+ TRACE_AND_STEP();
+ destval = neg_word(destval);
+ store_data_word(destoffset, destval);
+ }
+ break;
+ case 4:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 destval;
+
+ DECODE_PRINTF("MUL\tDWORD PTR ");
+ destoffset = decode_rm10_address(rl);
+ DECODE_PRINTF("\n");
+ destval = fetch_data_long(destoffset);
+ TRACE_AND_STEP();
+ mul_long(destval);
+ } else {
+ u16 destval;
+
+ DECODE_PRINTF("MUL\tWORD PTR ");
+ destoffset = decode_rm10_address(rl);
+ DECODE_PRINTF("\n");
+ destval = fetch_data_word(destoffset);
+ TRACE_AND_STEP();
+ mul_word(destval);
+ }
+ break;
+ case 5:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 destval;
+
+ DECODE_PRINTF("IMUL\tDWORD PTR ");
+ destoffset = decode_rm10_address(rl);
+ DECODE_PRINTF("\n");
+ destval = fetch_data_long(destoffset);
+ TRACE_AND_STEP();
+ imul_long(destval);
+ } else {
+ u16 destval;
+
+ DECODE_PRINTF("IMUL\tWORD PTR ");
+ destoffset = decode_rm10_address(rl);
+ DECODE_PRINTF("\n");
+ destval = fetch_data_word(destoffset);
+ TRACE_AND_STEP();
+ imul_word(destval);
+ }
+ break;
+ case 6:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 destval;
+
+ DECODE_PRINTF("DIV\tDWORD PTR ");
+ destoffset = decode_rm10_address(rl);
+ DECODE_PRINTF("\n");
+ destval = fetch_data_long(destoffset);
+ TRACE_AND_STEP();
+ div_long(destval);
+ } else {
+ u16 destval;
+
+ DECODE_PRINTF("DIV\tWORD PTR ");
+ destoffset = decode_rm10_address(rl);
+ DECODE_PRINTF("\n");
+ destval = fetch_data_word(destoffset);
+ TRACE_AND_STEP();
+ div_word(destval);
+ }
+ break;
+ case 7:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 destval;
+
+ DECODE_PRINTF("IDIV\tDWORD PTR ");
+ destoffset = decode_rm10_address(rl);
+ DECODE_PRINTF("\n");
+ destval = fetch_data_long(destoffset);
+ TRACE_AND_STEP();
+ idiv_long(destval);
+ } else {
+ u16 destval;
+
+ DECODE_PRINTF("IDIV\tWORD PTR ");
+ destoffset = decode_rm10_address(rl);
+ DECODE_PRINTF("\n");
+ destval = fetch_data_word(destoffset);
+ TRACE_AND_STEP();
+ idiv_word(destval);
+ }
+ break;
+ }
+ break; /* end mod==10 */
+ case 3: /* mod=11 */
+ switch (rh) {
+ case 0: /* test word imm */
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 *destreg;
+ u32 srcval;
+
+ DECODE_PRINTF("TEST\t");
+ destreg = DECODE_RM_LONG_REGISTER(rl);
+ DECODE_PRINTF(",");
+ srcval = fetch_long_imm();
+ DECODE_PRINTF2("%x\n", srcval);
+ TRACE_AND_STEP();
+ test_long(*destreg, srcval);
+ } else {
+ u16 *destreg;
+ u16 srcval;
+
+ DECODE_PRINTF("TEST\t");
+ destreg = DECODE_RM_WORD_REGISTER(rl);
+ DECODE_PRINTF(",");
+ srcval = fetch_word_imm();
+ DECODE_PRINTF2("%x\n", srcval);
+ TRACE_AND_STEP();
+ test_word(*destreg, srcval);
+ }
+ break;
+ case 1:
+ DECODE_PRINTF("ILLEGAL OP MOD=00 RH=01 OP=F6\n");
+ HALT_SYS();
+ break;
+ case 2:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 *destreg;
+
+ DECODE_PRINTF("NOT\t");
+ destreg = DECODE_RM_LONG_REGISTER(rl);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = not_long(*destreg);
+ } else {
+ u16 *destreg;
+
+ DECODE_PRINTF("NOT\t");
+ destreg = DECODE_RM_WORD_REGISTER(rl);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = not_word(*destreg);
+ }
+ break;
+ case 3:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 *destreg;
+
+ DECODE_PRINTF("NEG\t");
+ destreg = DECODE_RM_LONG_REGISTER(rl);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = neg_long(*destreg);
+ } else {
+ u16 *destreg;
+
+ DECODE_PRINTF("NEG\t");
+ destreg = DECODE_RM_WORD_REGISTER(rl);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = neg_word(*destreg);
+ }
+ break;
+ case 4:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 *destreg;
+
+ DECODE_PRINTF("MUL\t");
+ destreg = DECODE_RM_LONG_REGISTER(rl);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ mul_long(*destreg); /*!!! */
+ } else {
+ u16 *destreg;
+
+ DECODE_PRINTF("MUL\t");
+ destreg = DECODE_RM_WORD_REGISTER(rl);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ mul_word(*destreg); /*!!! */
+ }
+ break;
+ case 5:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 *destreg;
+
+ DECODE_PRINTF("IMUL\t");
+ destreg = DECODE_RM_LONG_REGISTER(rl);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ imul_long(*destreg);
+ } else {
+ u16 *destreg;
+
+ DECODE_PRINTF("IMUL\t");
+ destreg = DECODE_RM_WORD_REGISTER(rl);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ imul_word(*destreg);
+ }
+ break;
+ case 6:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 *destreg;
+
+ DECODE_PRINTF("DIV\t");
+ destreg = DECODE_RM_LONG_REGISTER(rl);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ div_long(*destreg);
+ } else {
+ u16 *destreg;
+
+ DECODE_PRINTF("DIV\t");
+ destreg = DECODE_RM_WORD_REGISTER(rl);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ div_word(*destreg);
+ }
+ break;
+ case 7:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 *destreg;
+
+ DECODE_PRINTF("IDIV\t");
+ destreg = DECODE_RM_LONG_REGISTER(rl);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ idiv_long(*destreg);
+ } else {
+ u16 *destreg;
+
+ DECODE_PRINTF("IDIV\t");
+ destreg = DECODE_RM_WORD_REGISTER(rl);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ idiv_word(*destreg);
+ }
+ break;
+ }
+ break; /* end mod==11 */
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0xf8
+****************************************************************************/
+static void x86emuOp_clc(u8 X86EMU_UNUSED(op1))
+{
+ /* clear the carry flag. */
+ START_OF_INSTR();
+ DECODE_PRINTF("CLC\n");
+ TRACE_AND_STEP();
+ CLEAR_FLAG(F_CF);
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0xf9
+****************************************************************************/
+static void x86emuOp_stc(u8 X86EMU_UNUSED(op1))
+{
+ /* set the carry flag. */
+ START_OF_INSTR();
+ DECODE_PRINTF("STC\n");
+ TRACE_AND_STEP();
+ SET_FLAG(F_CF);
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0xfa
+****************************************************************************/
+static void x86emuOp_cli(u8 X86EMU_UNUSED(op1))
+{
+ /* clear interrupts. */
+ START_OF_INSTR();
+ DECODE_PRINTF("CLI\n");
+ TRACE_AND_STEP();
+ CLEAR_FLAG(F_IF);
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0xfb
+****************************************************************************/
+static void x86emuOp_sti(u8 X86EMU_UNUSED(op1))
+{
+ /* enable interrupts. */
+ START_OF_INSTR();
+ DECODE_PRINTF("STI\n");
+ TRACE_AND_STEP();
+ SET_FLAG(F_IF);
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0xfc
+****************************************************************************/
+static void x86emuOp_cld(u8 X86EMU_UNUSED(op1))
+{
+ /* clear interrupts. */
+ START_OF_INSTR();
+ DECODE_PRINTF("CLD\n");
+ TRACE_AND_STEP();
+ CLEAR_FLAG(F_DF);
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0xfd
+****************************************************************************/
+static void x86emuOp_std(u8 X86EMU_UNUSED(op1))
+{
+ /* clear interrupts. */
+ START_OF_INSTR();
+ DECODE_PRINTF("STD\n");
+ TRACE_AND_STEP();
+ SET_FLAG(F_DF);
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0xfe
+****************************************************************************/
+static void x86emuOp_opcFE_byte_RM(u8 X86EMU_UNUSED(op1))
+{
+ int mod, rh, rl;
+ u8 destval;
+ uint destoffset;
+ u8 *destreg;
+
+ /* Yet another special case instruction. */
+ START_OF_INSTR();
+ FETCH_DECODE_MODRM(mod, rh, rl);
+#ifdef DEBUG
+ if (DEBUG_DECODE()) {
+ /* XXX DECODE_PRINTF may be changed to something more
+ general, so that it is important to leave the strings
+ in the same format, even though the result is that the
+ above test is done twice. */
+
+ switch (rh) {
+ case 0:
+ DECODE_PRINTF("INC\t");
+ break;
+ case 1:
+ DECODE_PRINTF("DEC\t");
+ break;
+ case 2:
+ case 3:
+ case 4:
+ case 5:
+ case 6:
+ case 7:
+ DECODE_PRINTF2("ILLEGAL OP MAJOR OP 0xFE MINOR OP %x \n", mod);
+ HALT_SYS();
+ break;
+ }
+ }
+#endif
+ switch (mod) {
+ case 0:
+ DECODE_PRINTF("BYTE PTR ");
+ destoffset = decode_rm00_address(rl);
+ DECODE_PRINTF("\n");
+ switch (rh) {
+ case 0: /* inc word ptr ... */
+ destval = fetch_data_byte(destoffset);
+ TRACE_AND_STEP();
+ destval = inc_byte(destval);
+ store_data_byte(destoffset, destval);
+ break;
+ case 1: /* dec word ptr ... */
+ destval = fetch_data_byte(destoffset);
+ TRACE_AND_STEP();
+ destval = dec_byte(destval);
+ store_data_byte(destoffset, destval);
+ break;
+ }
+ break;
+ case 1:
+ DECODE_PRINTF("BYTE PTR ");
+ destoffset = decode_rm01_address(rl);
+ DECODE_PRINTF("\n");
+ switch (rh) {
+ case 0:
+ destval = fetch_data_byte(destoffset);
+ TRACE_AND_STEP();
+ destval = inc_byte(destval);
+ store_data_byte(destoffset, destval);
+ break;
+ case 1:
+ destval = fetch_data_byte(destoffset);
+ TRACE_AND_STEP();
+ destval = dec_byte(destval);
+ store_data_byte(destoffset, destval);
+ break;
+ }
+ break;
+ case 2:
+ DECODE_PRINTF("BYTE PTR ");
+ destoffset = decode_rm10_address(rl);
+ DECODE_PRINTF("\n");
+ switch (rh) {
+ case 0:
+ destval = fetch_data_byte(destoffset);
+ TRACE_AND_STEP();
+ destval = inc_byte(destval);
+ store_data_byte(destoffset, destval);
+ break;
+ case 1:
+ destval = fetch_data_byte(destoffset);
+ TRACE_AND_STEP();
+ destval = dec_byte(destval);
+ store_data_byte(destoffset, destval);
+ break;
+ }
+ break;
+ case 3:
+ destreg = DECODE_RM_BYTE_REGISTER(rl);
+ DECODE_PRINTF("\n");
+ switch (rh) {
+ case 0:
+ TRACE_AND_STEP();
+ *destreg = inc_byte(*destreg);
+ break;
+ case 1:
+ TRACE_AND_STEP();
+ *destreg = dec_byte(*destreg);
+ break;
+ }
+ break;
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0xff
+****************************************************************************/
+static void x86emuOp_opcFF_word_RM(u8 X86EMU_UNUSED(op1))
+{
+ int mod, rh, rl;
+ uint destoffset = 0;
+ u16 *destreg;
+ u16 destval,destval2;
+
+ /* Yet another special case instruction. */
+ START_OF_INSTR();
+ FETCH_DECODE_MODRM(mod, rh, rl);
+#ifdef DEBUG
+ if (DEBUG_DECODE()) {
+ /* XXX DECODE_PRINTF may be changed to something more
+ general, so that it is important to leave the strings
+ in the same format, even though the result is that the
+ above test is done twice. */
+
+ switch (rh) {
+ case 0:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ DECODE_PRINTF("INC\tDWORD PTR ");
+ } else {
+ DECODE_PRINTF("INC\tWORD PTR ");
+ }
+ break;
+ case 1:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ DECODE_PRINTF("DEC\tDWORD PTR ");
+ } else {
+ DECODE_PRINTF("DEC\tWORD PTR ");
+ }
+ break;
+ case 2:
+ DECODE_PRINTF("CALL\t");
+ break;
+ case 3:
+ DECODE_PRINTF("CALL\tFAR ");
+ break;
+ case 4:
+ DECODE_PRINTF("JMP\t");
+ break;
+ case 5:
+ DECODE_PRINTF("JMP\tFAR ");
+ break;
+ case 6:
+ DECODE_PRINTF("PUSH\t");
+ break;
+ case 7:
+ DECODE_PRINTF("ILLEGAL DECODING OF OPCODE FF\t");
+ HALT_SYS();
+ break;
+ }
+ }
+#endif
+ switch (mod) {
+ case 0:
+ destoffset = decode_rm00_address(rl);
+ DECODE_PRINTF("\n");
+ switch (rh) {
+ case 0: /* inc word ptr ... */
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 destval;
+
+ destval = fetch_data_long(destoffset);
+ TRACE_AND_STEP();
+ destval = inc_long(destval);
+ store_data_long(destoffset, destval);
+ } else {
+ u16 destval;
+
+ destval = fetch_data_word(destoffset);
+ TRACE_AND_STEP();
+ destval = inc_word(destval);
+ store_data_word(destoffset, destval);
+ }
+ break;
+ case 1: /* dec word ptr ... */
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 destval;
+
+ destval = fetch_data_long(destoffset);
+ TRACE_AND_STEP();
+ destval = dec_long(destval);
+ store_data_long(destoffset, destval);
+ } else {
+ u16 destval;
+
+ destval = fetch_data_word(destoffset);
+ TRACE_AND_STEP();
+ destval = dec_word(destval);
+ store_data_word(destoffset, destval);
+ }
+ break;
+ case 2: /* call word ptr ... */
+ destval = fetch_data_word(destoffset);
+ TRACE_AND_STEP();
+ push_word(M.x86.R_IP);
+ M.x86.R_IP = destval;
+ break;
+ case 3: /* call far ptr ... */
+ destval = fetch_data_word(destoffset);
+ destval2 = fetch_data_word(destoffset + 2);
+ TRACE_AND_STEP();
+ push_word(M.x86.R_CS);
+ M.x86.R_CS = destval2;
+ push_word(M.x86.R_IP);
+ M.x86.R_IP = destval;
+ break;
+ case 4: /* jmp word ptr ... */
+ destval = fetch_data_word(destoffset);
+ TRACE_AND_STEP();
+ M.x86.R_IP = destval;
+ break;
+ case 5: /* jmp far ptr ... */
+ destval = fetch_data_word(destoffset);
+ destval2 = fetch_data_word(destoffset + 2);
+ TRACE_AND_STEP();
+ M.x86.R_IP = destval;
+ M.x86.R_CS = destval2;
+ break;
+ case 6: /* push word ptr ... */
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 destval;
+
+ destval = fetch_data_long(destoffset);
+ TRACE_AND_STEP();
+ push_long(destval);
+ } else {
+ u16 destval;
+
+ destval = fetch_data_word(destoffset);
+ TRACE_AND_STEP();
+ push_word(destval);
+ }
+ break;
+ }
+ break;
+ case 1:
+ destoffset = decode_rm01_address(rl);
+ DECODE_PRINTF("\n");
+ switch (rh) {
+ case 0:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 destval;
+
+ destval = fetch_data_long(destoffset);
+ TRACE_AND_STEP();
+ destval = inc_long(destval);
+ store_data_long(destoffset, destval);
+ } else {
+ u16 destval;
+
+ destval = fetch_data_word(destoffset);
+ TRACE_AND_STEP();
+ destval = inc_word(destval);
+ store_data_word(destoffset, destval);
+ }
+ break;
+ case 1:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 destval;
+
+ destval = fetch_data_long(destoffset);
+ TRACE_AND_STEP();
+ destval = dec_long(destval);
+ store_data_long(destoffset, destval);
+ } else {
+ u16 destval;
+
+ destval = fetch_data_word(destoffset);
+ TRACE_AND_STEP();
+ destval = dec_word(destval);
+ store_data_word(destoffset, destval);
+ }
+ break;
+ case 2: /* call word ptr ... */
+ destval = fetch_data_word(destoffset);
+ TRACE_AND_STEP();
+ push_word(M.x86.R_IP);
+ M.x86.R_IP = destval;
+ break;
+ case 3: /* call far ptr ... */
+ destval = fetch_data_word(destoffset);
+ destval2 = fetch_data_word(destoffset + 2);
+ TRACE_AND_STEP();
+ push_word(M.x86.R_CS);
+ M.x86.R_CS = destval2;
+ push_word(M.x86.R_IP);
+ M.x86.R_IP = destval;
+ break;
+ case 4: /* jmp word ptr ... */
+ destval = fetch_data_word(destoffset);
+ TRACE_AND_STEP();
+ M.x86.R_IP = destval;
+ break;
+ case 5: /* jmp far ptr ... */
+ destval = fetch_data_word(destoffset);
+ destval2 = fetch_data_word(destoffset + 2);
+ TRACE_AND_STEP();
+ M.x86.R_IP = destval;
+ M.x86.R_CS = destval2;
+ break;
+ case 6: /* push word ptr ... */
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 destval;
+
+ destval = fetch_data_long(destoffset);
+ TRACE_AND_STEP();
+ push_long(destval);
+ } else {
+ u16 destval;
+
+ destval = fetch_data_word(destoffset);
+ TRACE_AND_STEP();
+ push_word(destval);
+ }
+ break;
+ }
+ break;
+ case 2:
+ destoffset = decode_rm10_address(rl);
+ DECODE_PRINTF("\n");
+ switch (rh) {
+ case 0:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 destval;
+
+ destval = fetch_data_long(destoffset);
+ TRACE_AND_STEP();
+ destval = inc_long(destval);
+ store_data_long(destoffset, destval);
+ } else {
+ u16 destval;
+
+ destval = fetch_data_word(destoffset);
+ TRACE_AND_STEP();
+ destval = inc_word(destval);
+ store_data_word(destoffset, destval);
+ }
+ break;
+ case 1:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 destval;
+
+ destval = fetch_data_long(destoffset);
+ TRACE_AND_STEP();
+ destval = dec_long(destval);
+ store_data_long(destoffset, destval);
+ } else {
+ u16 destval;
+
+ destval = fetch_data_word(destoffset);
+ TRACE_AND_STEP();
+ destval = dec_word(destval);
+ store_data_word(destoffset, destval);
+ }
+ break;
+ case 2: /* call word ptr ... */
+ destval = fetch_data_word(destoffset);
+ TRACE_AND_STEP();
+ push_word(M.x86.R_IP);
+ M.x86.R_IP = destval;
+ break;
+ case 3: /* call far ptr ... */
+ destval = fetch_data_word(destoffset);
+ destval2 = fetch_data_word(destoffset + 2);
+ TRACE_AND_STEP();
+ push_word(M.x86.R_CS);
+ M.x86.R_CS = destval2;
+ push_word(M.x86.R_IP);
+ M.x86.R_IP = destval;
+ break;
+ case 4: /* jmp word ptr ... */
+ destval = fetch_data_word(destoffset);
+ TRACE_AND_STEP();
+ M.x86.R_IP = destval;
+ break;
+ case 5: /* jmp far ptr ... */
+ destval = fetch_data_word(destoffset);
+ destval2 = fetch_data_word(destoffset + 2);
+ TRACE_AND_STEP();
+ M.x86.R_IP = destval;
+ M.x86.R_CS = destval2;
+ break;
+ case 6: /* push word ptr ... */
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 destval;
+
+ destval = fetch_data_long(destoffset);
+ TRACE_AND_STEP();
+ push_long(destval);
+ } else {
+ u16 destval;
+
+ destval = fetch_data_word(destoffset);
+ TRACE_AND_STEP();
+ push_word(destval);
+ }
+ break;
+ }
+ break;
+ case 3:
+ switch (rh) {
+ case 0:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 *destreg;
+
+ destreg = DECODE_RM_LONG_REGISTER(rl);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = inc_long(*destreg);
+ } else {
+ u16 *destreg;
+
+ destreg = DECODE_RM_WORD_REGISTER(rl);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = inc_word(*destreg);
+ }
+ break;
+ case 1:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 *destreg;
+
+ destreg = DECODE_RM_LONG_REGISTER(rl);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = dec_long(*destreg);
+ } else {
+ u16 *destreg;
+
+ destreg = DECODE_RM_WORD_REGISTER(rl);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = dec_word(*destreg);
+ }
+ break;
+ case 2: /* call word ptr ... */
+ destreg = DECODE_RM_WORD_REGISTER(rl);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ push_word(M.x86.R_IP);
+ M.x86.R_IP = *destreg;
+ break;
+ case 3: /* jmp far ptr ... */
+ DECODE_PRINTF("OPERATION UNDEFINED 0XFF \n");
+ TRACE_AND_STEP();
+ HALT_SYS();
+ break;
+
+ case 4: /* jmp ... */
+ destreg = DECODE_RM_WORD_REGISTER(rl);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ M.x86.R_IP = (u16) (*destreg);
+ break;
+ case 5: /* jmp far ptr ... */
+ DECODE_PRINTF("OPERATION UNDEFINED 0XFF \n");
+ TRACE_AND_STEP();
+ HALT_SYS();
+ break;
+ case 6:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 *destreg;
+
+ destreg = DECODE_RM_LONG_REGISTER(rl);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ push_long(*destreg);
+ } else {
+ u16 *destreg;
+
+ destreg = DECODE_RM_WORD_REGISTER(rl);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ push_word(*destreg);
+ }
+ break;
+ }
+ break;
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/***************************************************************************
+ * Single byte operation code table:
+ **************************************************************************/
+void (*x86emu_optab[256])(u8) =
+{
+/* 0x00 */ x86emuOp_add_byte_RM_R,
+/* 0x01 */ x86emuOp_add_word_RM_R,
+/* 0x02 */ x86emuOp_add_byte_R_RM,
+/* 0x03 */ x86emuOp_add_word_R_RM,
+/* 0x04 */ x86emuOp_add_byte_AL_IMM,
+/* 0x05 */ x86emuOp_add_word_AX_IMM,
+/* 0x06 */ x86emuOp_push_ES,
+/* 0x07 */ x86emuOp_pop_ES,
+
+/* 0x08 */ x86emuOp_or_byte_RM_R,
+/* 0x09 */ x86emuOp_or_word_RM_R,
+/* 0x0a */ x86emuOp_or_byte_R_RM,
+/* 0x0b */ x86emuOp_or_word_R_RM,
+/* 0x0c */ x86emuOp_or_byte_AL_IMM,
+/* 0x0d */ x86emuOp_or_word_AX_IMM,
+/* 0x0e */ x86emuOp_push_CS,
+/* 0x0f */ x86emuOp_two_byte,
+
+/* 0x10 */ x86emuOp_adc_byte_RM_R,
+/* 0x11 */ x86emuOp_adc_word_RM_R,
+/* 0x12 */ x86emuOp_adc_byte_R_RM,
+/* 0x13 */ x86emuOp_adc_word_R_RM,
+/* 0x14 */ x86emuOp_adc_byte_AL_IMM,
+/* 0x15 */ x86emuOp_adc_word_AX_IMM,
+/* 0x16 */ x86emuOp_push_SS,
+/* 0x17 */ x86emuOp_pop_SS,
+
+/* 0x18 */ x86emuOp_sbb_byte_RM_R,
+/* 0x19 */ x86emuOp_sbb_word_RM_R,
+/* 0x1a */ x86emuOp_sbb_byte_R_RM,
+/* 0x1b */ x86emuOp_sbb_word_R_RM,
+/* 0x1c */ x86emuOp_sbb_byte_AL_IMM,
+/* 0x1d */ x86emuOp_sbb_word_AX_IMM,
+/* 0x1e */ x86emuOp_push_DS,
+/* 0x1f */ x86emuOp_pop_DS,
+
+/* 0x20 */ x86emuOp_and_byte_RM_R,
+/* 0x21 */ x86emuOp_and_word_RM_R,
+/* 0x22 */ x86emuOp_and_byte_R_RM,
+/* 0x23 */ x86emuOp_and_word_R_RM,
+/* 0x24 */ x86emuOp_and_byte_AL_IMM,
+/* 0x25 */ x86emuOp_and_word_AX_IMM,
+/* 0x26 */ x86emuOp_segovr_ES,
+/* 0x27 */ x86emuOp_daa,
+
+/* 0x28 */ x86emuOp_sub_byte_RM_R,
+/* 0x29 */ x86emuOp_sub_word_RM_R,
+/* 0x2a */ x86emuOp_sub_byte_R_RM,
+/* 0x2b */ x86emuOp_sub_word_R_RM,
+/* 0x2c */ x86emuOp_sub_byte_AL_IMM,
+/* 0x2d */ x86emuOp_sub_word_AX_IMM,
+/* 0x2e */ x86emuOp_segovr_CS,
+/* 0x2f */ x86emuOp_das,
+
+/* 0x30 */ x86emuOp_xor_byte_RM_R,
+/* 0x31 */ x86emuOp_xor_word_RM_R,
+/* 0x32 */ x86emuOp_xor_byte_R_RM,
+/* 0x33 */ x86emuOp_xor_word_R_RM,
+/* 0x34 */ x86emuOp_xor_byte_AL_IMM,
+/* 0x35 */ x86emuOp_xor_word_AX_IMM,
+/* 0x36 */ x86emuOp_segovr_SS,
+/* 0x37 */ x86emuOp_aaa,
+
+/* 0x38 */ x86emuOp_cmp_byte_RM_R,
+/* 0x39 */ x86emuOp_cmp_word_RM_R,
+/* 0x3a */ x86emuOp_cmp_byte_R_RM,
+/* 0x3b */ x86emuOp_cmp_word_R_RM,
+/* 0x3c */ x86emuOp_cmp_byte_AL_IMM,
+/* 0x3d */ x86emuOp_cmp_word_AX_IMM,
+/* 0x3e */ x86emuOp_segovr_DS,
+/* 0x3f */ x86emuOp_aas,
+
+/* 0x40 */ x86emuOp_inc_AX,
+/* 0x41 */ x86emuOp_inc_CX,
+/* 0x42 */ x86emuOp_inc_DX,
+/* 0x43 */ x86emuOp_inc_BX,
+/* 0x44 */ x86emuOp_inc_SP,
+/* 0x45 */ x86emuOp_inc_BP,
+/* 0x46 */ x86emuOp_inc_SI,
+/* 0x47 */ x86emuOp_inc_DI,
+
+/* 0x48 */ x86emuOp_dec_AX,
+/* 0x49 */ x86emuOp_dec_CX,
+/* 0x4a */ x86emuOp_dec_DX,
+/* 0x4b */ x86emuOp_dec_BX,
+/* 0x4c */ x86emuOp_dec_SP,
+/* 0x4d */ x86emuOp_dec_BP,
+/* 0x4e */ x86emuOp_dec_SI,
+/* 0x4f */ x86emuOp_dec_DI,
+
+/* 0x50 */ x86emuOp_push_AX,
+/* 0x51 */ x86emuOp_push_CX,
+/* 0x52 */ x86emuOp_push_DX,
+/* 0x53 */ x86emuOp_push_BX,
+/* 0x54 */ x86emuOp_push_SP,
+/* 0x55 */ x86emuOp_push_BP,
+/* 0x56 */ x86emuOp_push_SI,
+/* 0x57 */ x86emuOp_push_DI,
+
+/* 0x58 */ x86emuOp_pop_AX,
+/* 0x59 */ x86emuOp_pop_CX,
+/* 0x5a */ x86emuOp_pop_DX,
+/* 0x5b */ x86emuOp_pop_BX,
+/* 0x5c */ x86emuOp_pop_SP,
+/* 0x5d */ x86emuOp_pop_BP,
+/* 0x5e */ x86emuOp_pop_SI,
+/* 0x5f */ x86emuOp_pop_DI,
+
+/* 0x60 */ x86emuOp_push_all,
+/* 0x61 */ x86emuOp_pop_all,
+/* 0x62 */ x86emuOp_illegal_op, /* bound */
+/* 0x63 */ x86emuOp_illegal_op, /* arpl */
+/* 0x64 */ x86emuOp_segovr_FS,
+/* 0x65 */ x86emuOp_segovr_GS,
+/* 0x66 */ x86emuOp_prefix_data,
+/* 0x67 */ x86emuOp_prefix_addr,
+
+/* 0x68 */ x86emuOp_push_word_IMM,
+/* 0x69 */ x86emuOp_imul_word_IMM,
+/* 0x6a */ x86emuOp_push_byte_IMM,
+/* 0x6b */ x86emuOp_imul_byte_IMM,
+/* 0x6c */ x86emuOp_ins_byte,
+/* 0x6d */ x86emuOp_ins_word,
+/* 0x6e */ x86emuOp_outs_byte,
+/* 0x6f */ x86emuOp_outs_word,
+
+/* 0x70 */ x86emuOp_jump_near_O,
+/* 0x71 */ x86emuOp_jump_near_NO,
+/* 0x72 */ x86emuOp_jump_near_B,
+/* 0x73 */ x86emuOp_jump_near_NB,
+/* 0x74 */ x86emuOp_jump_near_Z,
+/* 0x75 */ x86emuOp_jump_near_NZ,
+/* 0x76 */ x86emuOp_jump_near_BE,
+/* 0x77 */ x86emuOp_jump_near_NBE,
+
+/* 0x78 */ x86emuOp_jump_near_S,
+/* 0x79 */ x86emuOp_jump_near_NS,
+/* 0x7a */ x86emuOp_jump_near_P,
+/* 0x7b */ x86emuOp_jump_near_NP,
+/* 0x7c */ x86emuOp_jump_near_L,
+/* 0x7d */ x86emuOp_jump_near_NL,
+/* 0x7e */ x86emuOp_jump_near_LE,
+/* 0x7f */ x86emuOp_jump_near_NLE,
+
+/* 0x80 */ x86emuOp_opc80_byte_RM_IMM,
+/* 0x81 */ x86emuOp_opc81_word_RM_IMM,
+/* 0x82 */ x86emuOp_opc82_byte_RM_IMM,
+/* 0x83 */ x86emuOp_opc83_word_RM_IMM,
+/* 0x84 */ x86emuOp_test_byte_RM_R,
+/* 0x85 */ x86emuOp_test_word_RM_R,
+/* 0x86 */ x86emuOp_xchg_byte_RM_R,
+/* 0x87 */ x86emuOp_xchg_word_RM_R,
+
+/* 0x88 */ x86emuOp_mov_byte_RM_R,
+/* 0x89 */ x86emuOp_mov_word_RM_R,
+/* 0x8a */ x86emuOp_mov_byte_R_RM,
+/* 0x8b */ x86emuOp_mov_word_R_RM,
+/* 0x8c */ x86emuOp_mov_word_RM_SR,
+/* 0x8d */ x86emuOp_lea_word_R_M,
+/* 0x8e */ x86emuOp_mov_word_SR_RM,
+/* 0x8f */ x86emuOp_pop_RM,
+
+/* 0x90 */ x86emuOp_nop,
+/* 0x91 */ x86emuOp_xchg_word_AX_CX,
+/* 0x92 */ x86emuOp_xchg_word_AX_DX,
+/* 0x93 */ x86emuOp_xchg_word_AX_BX,
+/* 0x94 */ x86emuOp_xchg_word_AX_SP,
+/* 0x95 */ x86emuOp_xchg_word_AX_BP,
+/* 0x96 */ x86emuOp_xchg_word_AX_SI,
+/* 0x97 */ x86emuOp_xchg_word_AX_DI,
+
+/* 0x98 */ x86emuOp_cbw,
+/* 0x99 */ x86emuOp_cwd,
+/* 0x9a */ x86emuOp_call_far_IMM,
+/* 0x9b */ x86emuOp_wait,
+/* 0x9c */ x86emuOp_pushf_word,
+/* 0x9d */ x86emuOp_popf_word,
+/* 0x9e */ x86emuOp_sahf,
+/* 0x9f */ x86emuOp_lahf,
+
+/* 0xa0 */ x86emuOp_mov_AL_M_IMM,
+/* 0xa1 */ x86emuOp_mov_AX_M_IMM,
+/* 0xa2 */ x86emuOp_mov_M_AL_IMM,
+/* 0xa3 */ x86emuOp_mov_M_AX_IMM,
+/* 0xa4 */ x86emuOp_movs_byte,
+/* 0xa5 */ x86emuOp_movs_word,
+/* 0xa6 */ x86emuOp_cmps_byte,
+/* 0xa7 */ x86emuOp_cmps_word,
+/* 0xa8 */ x86emuOp_test_AL_IMM,
+/* 0xa9 */ x86emuOp_test_AX_IMM,
+/* 0xaa */ x86emuOp_stos_byte,
+/* 0xab */ x86emuOp_stos_word,
+/* 0xac */ x86emuOp_lods_byte,
+/* 0xad */ x86emuOp_lods_word,
+/* 0xac */ x86emuOp_scas_byte,
+/* 0xad */ x86emuOp_scas_word,
+
+
+/* 0xb0 */ x86emuOp_mov_byte_AL_IMM,
+/* 0xb1 */ x86emuOp_mov_byte_CL_IMM,
+/* 0xb2 */ x86emuOp_mov_byte_DL_IMM,
+/* 0xb3 */ x86emuOp_mov_byte_BL_IMM,
+/* 0xb4 */ x86emuOp_mov_byte_AH_IMM,
+/* 0xb5 */ x86emuOp_mov_byte_CH_IMM,
+/* 0xb6 */ x86emuOp_mov_byte_DH_IMM,
+/* 0xb7 */ x86emuOp_mov_byte_BH_IMM,
+
+/* 0xb8 */ x86emuOp_mov_word_AX_IMM,
+/* 0xb9 */ x86emuOp_mov_word_CX_IMM,
+/* 0xba */ x86emuOp_mov_word_DX_IMM,
+/* 0xbb */ x86emuOp_mov_word_BX_IMM,
+/* 0xbc */ x86emuOp_mov_word_SP_IMM,
+/* 0xbd */ x86emuOp_mov_word_BP_IMM,
+/* 0xbe */ x86emuOp_mov_word_SI_IMM,
+/* 0xbf */ x86emuOp_mov_word_DI_IMM,
+
+/* 0xc0 */ x86emuOp_opcC0_byte_RM_MEM,
+/* 0xc1 */ x86emuOp_opcC1_word_RM_MEM,
+/* 0xc2 */ x86emuOp_ret_near_IMM,
+/* 0xc3 */ x86emuOp_ret_near,
+/* 0xc4 */ x86emuOp_les_R_IMM,
+/* 0xc5 */ x86emuOp_lds_R_IMM,
+/* 0xc6 */ x86emuOp_mov_byte_RM_IMM,
+/* 0xc7 */ x86emuOp_mov_word_RM_IMM,
+/* 0xc8 */ x86emuOp_enter,
+/* 0xc9 */ x86emuOp_leave,
+/* 0xca */ x86emuOp_ret_far_IMM,
+/* 0xcb */ x86emuOp_ret_far,
+/* 0xcc */ x86emuOp_int3,
+/* 0xcd */ x86emuOp_int_IMM,
+/* 0xce */ x86emuOp_into,
+/* 0xcf */ x86emuOp_iret,
+
+/* 0xd0 */ x86emuOp_opcD0_byte_RM_1,
+/* 0xd1 */ x86emuOp_opcD1_word_RM_1,
+/* 0xd2 */ x86emuOp_opcD2_byte_RM_CL,
+/* 0xd3 */ x86emuOp_opcD3_word_RM_CL,
+/* 0xd4 */ x86emuOp_aam,
+/* 0xd5 */ x86emuOp_aad,
+/* 0xd6 */ x86emuOp_illegal_op, /* Undocumented SETALC instruction */
+/* 0xd7 */ x86emuOp_xlat,
+/* 0xd8 */ x86emuOp_esc_coprocess_d8,
+/* 0xd9 */ x86emuOp_esc_coprocess_d9,
+/* 0xda */ x86emuOp_esc_coprocess_da,
+/* 0xdb */ x86emuOp_esc_coprocess_db,
+/* 0xdc */ x86emuOp_esc_coprocess_dc,
+/* 0xdd */ x86emuOp_esc_coprocess_dd,
+/* 0xde */ x86emuOp_esc_coprocess_de,
+/* 0xdf */ x86emuOp_esc_coprocess_df,
+
+/* 0xe0 */ x86emuOp_loopne,
+/* 0xe1 */ x86emuOp_loope,
+/* 0xe2 */ x86emuOp_loop,
+/* 0xe3 */ x86emuOp_jcxz,
+/* 0xe4 */ x86emuOp_in_byte_AL_IMM,
+/* 0xe5 */ x86emuOp_in_word_AX_IMM,
+/* 0xe6 */ x86emuOp_out_byte_IMM_AL,
+/* 0xe7 */ x86emuOp_out_word_IMM_AX,
+
+/* 0xe8 */ x86emuOp_call_near_IMM,
+/* 0xe9 */ x86emuOp_jump_near_IMM,
+/* 0xea */ x86emuOp_jump_far_IMM,
+/* 0xeb */ x86emuOp_jump_byte_IMM,
+/* 0xec */ x86emuOp_in_byte_AL_DX,
+/* 0xed */ x86emuOp_in_word_AX_DX,
+/* 0xee */ x86emuOp_out_byte_DX_AL,
+/* 0xef */ x86emuOp_out_word_DX_AX,
+
+/* 0xf0 */ x86emuOp_lock,
+/* 0xf1 */ x86emuOp_illegal_op,
+/* 0xf2 */ x86emuOp_repne,
+/* 0xf3 */ x86emuOp_repe,
+/* 0xf4 */ x86emuOp_halt,
+/* 0xf5 */ x86emuOp_cmc,
+/* 0xf6 */ x86emuOp_opcF6_byte_RM,
+/* 0xf7 */ x86emuOp_opcF7_word_RM,
+
+/* 0xf8 */ x86emuOp_clc,
+/* 0xf9 */ x86emuOp_stc,
+/* 0xfa */ x86emuOp_cli,
+/* 0xfb */ x86emuOp_sti,
+/* 0xfc */ x86emuOp_cld,
+/* 0xfd */ x86emuOp_std,
+/* 0xfe */ x86emuOp_opcFE_byte_RM,
+/* 0xff */ x86emuOp_opcFF_word_RM,
+};
--- /dev/null
+/****************************************************************************
+*
+* Realmode X86 Emulator Library
+*
+* Copyright (C) 1996-1999 SciTech Software, Inc.
+* Copyright (C) David Mosberger-Tang
+* Copyright (C) 1999 Egbert Eich
+*
+* ========================================================================
+*
+* Permission to use, copy, modify, distribute, and sell this software and
+* its documentation for any purpose is hereby granted without fee,
+* provided that the above copyright notice appear in all copies and that
+* both that copyright notice and this permission notice appear in
+* supporting documentation, and that the name of the authors not be used
+* in advertising or publicity pertaining to distribution of the software
+* without specific, written prior permission. The authors makes no
+* representations about the suitability of this software for any purpose.
+* It is provided "as is" without express or implied warranty.
+*
+* THE AUTHORS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+* EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
+* USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
+* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+* PERFORMANCE OF THIS SOFTWARE.
+*
+* ========================================================================
+*
+* Language: ANSI C
+* Environment: Any
+* Developer: Kendall Bennett
+*
+* Description: This file includes subroutines to implement the decoding
+* and emulation of all the x86 extended two-byte processor
+* instructions.
+*
+****************************************************************************/
+/* $XFree86: xc/extras/x86emu/src/x86emu/ops2.c,v 1.6tsi Exp $ */
+
+#include "x86emu/x86emui.h"
+
+/*----------------------------- Implementation ----------------------------*/
+
+/****************************************************************************
+PARAMETERS:
+op1 - Instruction op code
+
+REMARKS:
+Handles illegal opcodes.
+****************************************************************************/
+static void x86emuOp2_illegal_op(
+ u8 op2)
+{
+ START_OF_INSTR();
+ DECODE_PRINTF("ILLEGAL EXTENDED X86 OPCODE\n");
+ TRACE_REGS();
+ printk("%04x:%04x: %02X ILLEGAL EXTENDED X86 OPCODE!\n",
+ M.x86.R_CS, M.x86.R_IP-2,op2);
+ HALT_SYS();
+ END_OF_INSTR();
+}
+
+#define xorl(a,b) ((a) && !(b)) || (!(a) && (b))
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x0f,0x80-0x8F
+****************************************************************************/
+static void x86emuOp2_long_jump(u8 op2)
+{
+ s32 target;
+ char *name = 0;
+ int cond = 0;
+
+ /* conditional jump to word offset. */
+ START_OF_INSTR();
+ switch (op2) {
+ case 0x80:
+ name = "JO\t";
+ cond = ACCESS_FLAG(F_OF);
+ break;
+ case 0x81:
+ name = "JNO\t";
+ cond = !ACCESS_FLAG(F_OF);
+ break;
+ case 0x82:
+ name = "JB\t";
+ cond = ACCESS_FLAG(F_CF);
+ break;
+ case 0x83:
+ name = "JNB\t";
+ cond = !ACCESS_FLAG(F_CF);
+ break;
+ case 0x84:
+ name = "JZ\t";
+ cond = ACCESS_FLAG(F_ZF);
+ break;
+ case 0x85:
+ name = "JNZ\t";
+ cond = !ACCESS_FLAG(F_ZF);
+ break;
+ case 0x86:
+ name = "JBE\t";
+ cond = ACCESS_FLAG(F_CF) || ACCESS_FLAG(F_ZF);
+ break;
+ case 0x87:
+ name = "JNBE\t";
+ cond = !(ACCESS_FLAG(F_CF) || ACCESS_FLAG(F_ZF));
+ break;
+ case 0x88:
+ name = "JS\t";
+ cond = ACCESS_FLAG(F_SF);
+ break;
+ case 0x89:
+ name = "JNS\t";
+ cond = !ACCESS_FLAG(F_SF);
+ break;
+ case 0x8a:
+ name = "JP\t";
+ cond = ACCESS_FLAG(F_PF);
+ break;
+ case 0x8b:
+ name = "JNP\t";
+ cond = !ACCESS_FLAG(F_PF);
+ break;
+ case 0x8c:
+ name = "JL\t";
+ cond = xorl(ACCESS_FLAG(F_SF), ACCESS_FLAG(F_OF));
+ break;
+ case 0x8d:
+ name = "JNL\t";
+ cond = xorl(ACCESS_FLAG(F_SF), ACCESS_FLAG(F_OF));
+ break;
+ case 0x8e:
+ name = "JLE\t";
+ cond = (xorl(ACCESS_FLAG(F_SF), ACCESS_FLAG(F_OF)) ||
+ ACCESS_FLAG(F_ZF));
+ break;
+ case 0x8f:
+ name = "JNLE\t";
+ cond = !(xorl(ACCESS_FLAG(F_SF), ACCESS_FLAG(F_OF)) ||
+ ACCESS_FLAG(F_ZF));
+ break;
+ }
+ DECODE_PRINTF(name);
+ (void)name;
+ target = (s16) fetch_word_imm();
+ target += (s16) M.x86.R_IP;
+ DECODE_PRINTF2("%04x\n", target);
+ TRACE_AND_STEP();
+ if (cond)
+ M.x86.R_IP = (u16)target;
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x0f,0x90-0x9F
+****************************************************************************/
+static void x86emuOp2_set_byte(u8 op2)
+{
+ int mod, rl, rh;
+ uint destoffset;
+ u8 *destreg;
+ char *name = 0;
+ int cond = 0;
+
+ START_OF_INSTR();
+ switch (op2) {
+ case 0x90:
+ name = "SETO\t";
+ cond = ACCESS_FLAG(F_OF);
+ break;
+ case 0x91:
+ name = "SETNO\t";
+ cond = !ACCESS_FLAG(F_OF);
+ break;
+ case 0x92:
+ name = "SETB\t";
+ cond = ACCESS_FLAG(F_CF);
+ break;
+ case 0x93:
+ name = "SETNB\t";
+ cond = !ACCESS_FLAG(F_CF);
+ break;
+ case 0x94:
+ name = "SETZ\t";
+ cond = ACCESS_FLAG(F_ZF);
+ break;
+ case 0x95:
+ name = "SETNZ\t";
+ cond = !ACCESS_FLAG(F_ZF);
+ break;
+ case 0x96:
+ name = "SETBE\t";
+ cond = ACCESS_FLAG(F_CF) || ACCESS_FLAG(F_ZF);
+ break;
+ case 0x97:
+ name = "SETNBE\t";
+ cond = !(ACCESS_FLAG(F_CF) || ACCESS_FLAG(F_ZF));
+ break;
+ case 0x98:
+ name = "SETS\t";
+ cond = ACCESS_FLAG(F_SF);
+ break;
+ case 0x99:
+ name = "SETNS\t";
+ cond = !ACCESS_FLAG(F_SF);
+ break;
+ case 0x9a:
+ name = "SETP\t";
+ cond = ACCESS_FLAG(F_PF);
+ break;
+ case 0x9b:
+ name = "SETNP\t";
+ cond = !ACCESS_FLAG(F_PF);
+ break;
+ case 0x9c:
+ name = "SETL\t";
+ cond = xorl(ACCESS_FLAG(F_SF), ACCESS_FLAG(F_OF));
+ break;
+ case 0x9d:
+ name = "SETNL\t";
+ cond = xorl(ACCESS_FLAG(F_SF), ACCESS_FLAG(F_OF));
+ break;
+ case 0x9e:
+ name = "SETLE\t";
+ cond = (xorl(ACCESS_FLAG(F_SF), ACCESS_FLAG(F_OF)) ||
+ ACCESS_FLAG(F_ZF));
+ break;
+ case 0x9f:
+ name = "SETNLE\t";
+ cond = !(xorl(ACCESS_FLAG(F_SF), ACCESS_FLAG(F_OF)) ||
+ ACCESS_FLAG(F_ZF));
+ break;
+ }
+ DECODE_PRINTF(name);
+ (void)name;
+ FETCH_DECODE_MODRM(mod, rh, rl);
+ switch (mod) {
+ case 0:
+ destoffset = decode_rm00_address(rl);
+ TRACE_AND_STEP();
+ store_data_byte(destoffset, cond ? 0x01 : 0x00);
+ break;
+ case 1:
+ destoffset = decode_rm01_address(rl);
+ TRACE_AND_STEP();
+ store_data_byte(destoffset, cond ? 0x01 : 0x00);
+ break;
+ case 2:
+ destoffset = decode_rm10_address(rl);
+ TRACE_AND_STEP();
+ store_data_byte(destoffset, cond ? 0x01 : 0x00);
+ break;
+ case 3: /* register to register */
+ destreg = DECODE_RM_BYTE_REGISTER(rl);
+ TRACE_AND_STEP();
+ *destreg = cond ? 0x01 : 0x00;
+ break;
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x0f,0xa0
+****************************************************************************/
+static void x86emuOp2_push_FS(u8 X86EMU_UNUSED(op2))
+{
+ START_OF_INSTR();
+ DECODE_PRINTF("PUSH\tFS\n");
+ TRACE_AND_STEP();
+ push_word(M.x86.R_FS);
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x0f,0xa1
+****************************************************************************/
+static void x86emuOp2_pop_FS(u8 X86EMU_UNUSED(op2))
+{
+ START_OF_INSTR();
+ DECODE_PRINTF("POP\tFS\n");
+ TRACE_AND_STEP();
+ M.x86.R_FS = pop_word();
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x0f,0xa3
+****************************************************************************/
+static void x86emuOp2_bt_R(u8 X86EMU_UNUSED(op2))
+{
+ int mod, rl, rh;
+ uint srcoffset;
+ int bit,disp;
+
+ START_OF_INSTR();
+ DECODE_PRINTF("BT\t");
+ FETCH_DECODE_MODRM(mod, rh, rl);
+ switch (mod) {
+ case 0:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 srcval;
+ u32 *shiftreg;
+
+ srcoffset = decode_rm00_address(rl);
+ DECODE_PRINTF(",");
+ shiftreg = DECODE_RM_LONG_REGISTER(rh);
+ TRACE_AND_STEP();
+ bit = *shiftreg & 0x1F;
+ disp = (s16)*shiftreg >> 5;
+ srcval = fetch_data_long(srcoffset+disp);
+ CONDITIONAL_SET_FLAG(srcval & (0x1 << bit),F_CF);
+ } else {
+ u16 srcval;
+ u16 *shiftreg;
+
+ srcoffset = decode_rm00_address(rl);
+ DECODE_PRINTF(",");
+ shiftreg = DECODE_RM_WORD_REGISTER(rh);
+ TRACE_AND_STEP();
+ bit = *shiftreg & 0xF;
+ disp = (s16)*shiftreg >> 4;
+ srcval = fetch_data_word(srcoffset+disp);
+ CONDITIONAL_SET_FLAG(srcval & (0x1 << bit),F_CF);
+ }
+ break;
+ case 1:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 srcval;
+ u32 *shiftreg;
+
+ srcoffset = decode_rm01_address(rl);
+ DECODE_PRINTF(",");
+ shiftreg = DECODE_RM_LONG_REGISTER(rh);
+ TRACE_AND_STEP();
+ bit = *shiftreg & 0x1F;
+ disp = (s16)*shiftreg >> 5;
+ srcval = fetch_data_long(srcoffset+disp);
+ CONDITIONAL_SET_FLAG(srcval & (0x1 << bit),F_CF);
+ } else {
+ u16 srcval;
+ u16 *shiftreg;
+
+ srcoffset = decode_rm01_address(rl);
+ DECODE_PRINTF(",");
+ shiftreg = DECODE_RM_WORD_REGISTER(rh);
+ TRACE_AND_STEP();
+ bit = *shiftreg & 0xF;
+ disp = (s16)*shiftreg >> 4;
+ srcval = fetch_data_word(srcoffset+disp);
+ CONDITIONAL_SET_FLAG(srcval & (0x1 << bit),F_CF);
+ }
+ break;
+ case 2:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 srcval;
+ u32 *shiftreg;
+
+ srcoffset = decode_rm10_address(rl);
+ DECODE_PRINTF(",");
+ shiftreg = DECODE_RM_LONG_REGISTER(rh);
+ TRACE_AND_STEP();
+ bit = *shiftreg & 0x1F;
+ disp = (s16)*shiftreg >> 5;
+ srcval = fetch_data_long(srcoffset+disp);
+ CONDITIONAL_SET_FLAG(srcval & (0x1 << bit),F_CF);
+ } else {
+ u16 srcval;
+ u16 *shiftreg;
+
+ srcoffset = decode_rm10_address(rl);
+ DECODE_PRINTF(",");
+ shiftreg = DECODE_RM_WORD_REGISTER(rh);
+ TRACE_AND_STEP();
+ bit = *shiftreg & 0xF;
+ disp = (s16)*shiftreg >> 4;
+ srcval = fetch_data_word(srcoffset+disp);
+ CONDITIONAL_SET_FLAG(srcval & (0x1 << bit),F_CF);
+ }
+ break;
+ case 3: /* register to register */
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 *srcreg,*shiftreg;
+
+ srcreg = DECODE_RM_LONG_REGISTER(rl);
+ DECODE_PRINTF(",");
+ shiftreg = DECODE_RM_LONG_REGISTER(rh);
+ TRACE_AND_STEP();
+ bit = *shiftreg & 0x1F;
+ CONDITIONAL_SET_FLAG(*srcreg & (0x1 << bit),F_CF);
+ } else {
+ u16 *srcreg,*shiftreg;
+
+ srcreg = DECODE_RM_WORD_REGISTER(rl);
+ DECODE_PRINTF(",");
+ shiftreg = DECODE_RM_WORD_REGISTER(rh);
+ TRACE_AND_STEP();
+ bit = *shiftreg & 0xF;
+ CONDITIONAL_SET_FLAG(*srcreg & (0x1 << bit),F_CF);
+ }
+ break;
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x0f,0xa4
+****************************************************************************/
+static void x86emuOp2_shld_IMM(u8 X86EMU_UNUSED(op2))
+{
+ int mod, rl, rh;
+ uint destoffset;
+ u8 shift;
+
+ START_OF_INSTR();
+ DECODE_PRINTF("SHLD\t");
+ FETCH_DECODE_MODRM(mod, rh, rl);
+ switch (mod) {
+ case 0:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 destval;
+ u32 *shiftreg;
+
+ destoffset = decode_rm00_address(rl);
+ DECODE_PRINTF(",");
+ shiftreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF(",");
+ shift = fetch_byte_imm();
+ DECODE_PRINTF2("%d\n", shift);
+ TRACE_AND_STEP();
+ destval = fetch_data_long(destoffset);
+ destval = shld_long(destval,*shiftreg,shift);
+ store_data_long(destoffset, destval);
+ } else {
+ u16 destval;
+ u16 *shiftreg;
+
+ destoffset = decode_rm00_address(rl);
+ DECODE_PRINTF(",");
+ shiftreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF(",");
+ shift = fetch_byte_imm();
+ DECODE_PRINTF2("%d\n", shift);
+ TRACE_AND_STEP();
+ destval = fetch_data_word(destoffset);
+ destval = shld_word(destval,*shiftreg,shift);
+ store_data_word(destoffset, destval);
+ }
+ break;
+ case 1:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 destval;
+ u32 *shiftreg;
+
+ destoffset = decode_rm01_address(rl);
+ DECODE_PRINTF(",");
+ shiftreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF(",");
+ shift = fetch_byte_imm();
+ DECODE_PRINTF2("%d\n", shift);
+ TRACE_AND_STEP();
+ destval = fetch_data_long(destoffset);
+ destval = shld_long(destval,*shiftreg,shift);
+ store_data_long(destoffset, destval);
+ } else {
+ u16 destval;
+ u16 *shiftreg;
+
+ destoffset = decode_rm01_address(rl);
+ DECODE_PRINTF(",");
+ shiftreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF(",");
+ shift = fetch_byte_imm();
+ DECODE_PRINTF2("%d\n", shift);
+ TRACE_AND_STEP();
+ destval = fetch_data_word(destoffset);
+ destval = shld_word(destval,*shiftreg,shift);
+ store_data_word(destoffset, destval);
+ }
+ break;
+ case 2:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 destval;
+ u32 *shiftreg;
+
+ destoffset = decode_rm10_address(rl);
+ DECODE_PRINTF(",");
+ shiftreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF(",");
+ shift = fetch_byte_imm();
+ DECODE_PRINTF2("%d\n", shift);
+ TRACE_AND_STEP();
+ destval = fetch_data_long(destoffset);
+ destval = shld_long(destval,*shiftreg,shift);
+ store_data_long(destoffset, destval);
+ } else {
+ u16 destval;
+ u16 *shiftreg;
+
+ destoffset = decode_rm10_address(rl);
+ DECODE_PRINTF(",");
+ shiftreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF(",");
+ shift = fetch_byte_imm();
+ DECODE_PRINTF2("%d\n", shift);
+ TRACE_AND_STEP();
+ destval = fetch_data_word(destoffset);
+ destval = shld_word(destval,*shiftreg,shift);
+ store_data_word(destoffset, destval);
+ }
+ break;
+ case 3: /* register to register */
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 *destreg,*shiftreg;
+
+ destreg = DECODE_RM_LONG_REGISTER(rl);
+ DECODE_PRINTF(",");
+ shiftreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF(",");
+ shift = fetch_byte_imm();
+ DECODE_PRINTF2("%d\n", shift);
+ TRACE_AND_STEP();
+ *destreg = shld_long(*destreg,*shiftreg,shift);
+ } else {
+ u16 *destreg,*shiftreg;
+
+ destreg = DECODE_RM_WORD_REGISTER(rl);
+ DECODE_PRINTF(",");
+ shiftreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF(",");
+ shift = fetch_byte_imm();
+ DECODE_PRINTF2("%d\n", shift);
+ TRACE_AND_STEP();
+ *destreg = shld_word(*destreg,*shiftreg,shift);
+ }
+ break;
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x0f,0xa5
+****************************************************************************/
+static void x86emuOp2_shld_CL(u8 X86EMU_UNUSED(op2))
+{
+ int mod, rl, rh;
+ uint destoffset;
+
+ START_OF_INSTR();
+ DECODE_PRINTF("SHLD\t");
+ FETCH_DECODE_MODRM(mod, rh, rl);
+ switch (mod) {
+ case 0:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 destval;
+ u32 *shiftreg;
+
+ destoffset = decode_rm00_address(rl);
+ DECODE_PRINTF(",");
+ shiftreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF(",CL\n");
+ TRACE_AND_STEP();
+ destval = fetch_data_long(destoffset);
+ destval = shld_long(destval,*shiftreg,M.x86.R_CL);
+ store_data_long(destoffset, destval);
+ } else {
+ u16 destval;
+ u16 *shiftreg;
+
+ destoffset = decode_rm00_address(rl);
+ DECODE_PRINTF(",");
+ shiftreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF(",CL\n");
+ TRACE_AND_STEP();
+ destval = fetch_data_word(destoffset);
+ destval = shld_word(destval,*shiftreg,M.x86.R_CL);
+ store_data_word(destoffset, destval);
+ }
+ break;
+ case 1:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 destval;
+ u32 *shiftreg;
+
+ destoffset = decode_rm01_address(rl);
+ DECODE_PRINTF(",");
+ shiftreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF(",CL\n");
+ TRACE_AND_STEP();
+ destval = fetch_data_long(destoffset);
+ destval = shld_long(destval,*shiftreg,M.x86.R_CL);
+ store_data_long(destoffset, destval);
+ } else {
+ u16 destval;
+ u16 *shiftreg;
+
+ destoffset = decode_rm01_address(rl);
+ DECODE_PRINTF(",");
+ shiftreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF(",CL\n");
+ TRACE_AND_STEP();
+ destval = fetch_data_word(destoffset);
+ destval = shld_word(destval,*shiftreg,M.x86.R_CL);
+ store_data_word(destoffset, destval);
+ }
+ break;
+ case 2:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 destval;
+ u32 *shiftreg;
+
+ destoffset = decode_rm10_address(rl);
+ DECODE_PRINTF(",");
+ shiftreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF(",CL\n");
+ TRACE_AND_STEP();
+ destval = fetch_data_long(destoffset);
+ destval = shld_long(destval,*shiftreg,M.x86.R_CL);
+ store_data_long(destoffset, destval);
+ } else {
+ u16 destval;
+ u16 *shiftreg;
+
+ destoffset = decode_rm10_address(rl);
+ DECODE_PRINTF(",");
+ shiftreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF(",CL\n");
+ TRACE_AND_STEP();
+ destval = fetch_data_word(destoffset);
+ destval = shld_word(destval,*shiftreg,M.x86.R_CL);
+ store_data_word(destoffset, destval);
+ }
+ break;
+ case 3: /* register to register */
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 *destreg,*shiftreg;
+
+ destreg = DECODE_RM_LONG_REGISTER(rl);
+ DECODE_PRINTF(",");
+ shiftreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF(",CL\n");
+ TRACE_AND_STEP();
+ *destreg = shld_long(*destreg,*shiftreg,M.x86.R_CL);
+ } else {
+ u16 *destreg,*shiftreg;
+
+ destreg = DECODE_RM_WORD_REGISTER(rl);
+ DECODE_PRINTF(",");
+ shiftreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF(",CL\n");
+ TRACE_AND_STEP();
+ *destreg = shld_word(*destreg,*shiftreg,M.x86.R_CL);
+ }
+ break;
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x0f,0xa8
+****************************************************************************/
+static void x86emuOp2_push_GS(u8 X86EMU_UNUSED(op2))
+{
+ START_OF_INSTR();
+ DECODE_PRINTF("PUSH\tGS\n");
+ TRACE_AND_STEP();
+ push_word(M.x86.R_GS);
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x0f,0xa9
+****************************************************************************/
+static void x86emuOp2_pop_GS(u8 X86EMU_UNUSED(op2))
+{
+ START_OF_INSTR();
+ DECODE_PRINTF("POP\tGS\n");
+ TRACE_AND_STEP();
+ M.x86.R_GS = pop_word();
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+#if 0
+/****************************************************************************
+REMARKS:
+Handles opcode 0x0f,0xaa
+****************************************************************************/
+static void x86emuOp2_bts_R(u8 X86EMU_UNUSED(op2))
+{
+ int mod, rl, rh;
+ uint srcoffset;
+ int bit,disp;
+
+ START_OF_INSTR();
+ DECODE_PRINTF("BTS\t");
+ FETCH_DECODE_MODRM(mod, rh, rl);
+ switch (mod) {
+ case 0:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 srcval,mask;
+ u32 *shiftreg;
+
+ srcoffset = decode_rm00_address(rl);
+ DECODE_PRINTF(",");
+ shiftreg = DECODE_RM_LONG_REGISTER(rh);
+ TRACE_AND_STEP();
+ bit = *shiftreg & 0x1F;
+ disp = (s16)*shiftreg >> 5;
+ srcval = fetch_data_long(srcoffset+disp);
+ mask = (0x1 << bit);
+ CONDITIONAL_SET_FLAG(srcval & mask,F_CF);
+ store_data_long(srcoffset+disp, srcval | mask);
+ } else {
+ u16 srcval,mask;
+ u16 *shiftreg;
+
+ srcoffset = decode_rm00_address(rl);
+ DECODE_PRINTF(",");
+ shiftreg = DECODE_RM_WORD_REGISTER(rh);
+ TRACE_AND_STEP();
+ bit = *shiftreg & 0xF;
+ disp = (s16)*shiftreg >> 4;
+ srcval = fetch_data_word(srcoffset+disp);
+ mask = (u16)(0x1 << bit);
+ CONDITIONAL_SET_FLAG(srcval & mask,F_CF);
+ store_data_word(srcoffset+disp, srcval | mask);
+ }
+ break;
+ case 1:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 srcval,mask;
+ u32 *shiftreg;
+
+ srcoffset = decode_rm01_address(rl);
+ DECODE_PRINTF(",");
+ shiftreg = DECODE_RM_LONG_REGISTER(rh);
+ TRACE_AND_STEP();
+ bit = *shiftreg & 0x1F;
+ disp = (s16)*shiftreg >> 5;
+ srcval = fetch_data_long(srcoffset+disp);
+ mask = (0x1 << bit);
+ CONDITIONAL_SET_FLAG(srcval & mask,F_CF);
+ store_data_long(srcoffset+disp, srcval | mask);
+ } else {
+ u16 srcval,mask;
+ u16 *shiftreg;
+
+ srcoffset = decode_rm01_address(rl);
+ DECODE_PRINTF(",");
+ shiftreg = DECODE_RM_WORD_REGISTER(rh);
+ TRACE_AND_STEP();
+ bit = *shiftreg & 0xF;
+ disp = (s16)*shiftreg >> 4;
+ srcval = fetch_data_word(srcoffset+disp);
+ mask = (u16)(0x1 << bit);
+ CONDITIONAL_SET_FLAG(srcval & mask,F_CF);
+ store_data_word(srcoffset+disp, srcval | mask);
+ }
+ break;
+ case 2:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 srcval,mask;
+ u32 *shiftreg;
+
+ srcoffset = decode_rm10_address(rl);
+ DECODE_PRINTF(",");
+ shiftreg = DECODE_RM_LONG_REGISTER(rh);
+ TRACE_AND_STEP();
+ bit = *shiftreg & 0x1F;
+ disp = (s16)*shiftreg >> 5;
+ srcval = fetch_data_long(srcoffset+disp);
+ mask = (0x1 << bit);
+ CONDITIONAL_SET_FLAG(srcval & mask,F_CF);
+ store_data_long(srcoffset+disp, srcval | mask);
+ } else {
+ u16 srcval,mask;
+ u16 *shiftreg;
+
+ srcoffset = decode_rm10_address(rl);
+ DECODE_PRINTF(",");
+ shiftreg = DECODE_RM_WORD_REGISTER(rh);
+ TRACE_AND_STEP();
+ bit = *shiftreg & 0xF;
+ disp = (s16)*shiftreg >> 4;
+ srcval = fetch_data_word(srcoffset+disp);
+ mask = (u16)(0x1 << bit);
+ CONDITIONAL_SET_FLAG(srcval & mask,F_CF);
+ store_data_word(srcoffset+disp, srcval | mask);
+ }
+ break;
+ case 3: /* register to register */
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 *srcreg,*shiftreg;
+ u32 mask;
+
+ srcreg = DECODE_RM_LONG_REGISTER(rl);
+ DECODE_PRINTF(",");
+ shiftreg = DECODE_RM_LONG_REGISTER(rh);
+ TRACE_AND_STEP();
+ bit = *shiftreg & 0x1F;
+ mask = (0x1 << bit);
+ CONDITIONAL_SET_FLAG(*srcreg & mask,F_CF);
+ *srcreg |= mask;
+ } else {
+ u16 *srcreg,*shiftreg;
+ u16 mask;
+
+ srcreg = DECODE_RM_WORD_REGISTER(rl);
+ DECODE_PRINTF(",");
+ shiftreg = DECODE_RM_WORD_REGISTER(rh);
+ TRACE_AND_STEP();
+ bit = *shiftreg & 0xF;
+ mask = (u16)(0x1 << bit);
+ CONDITIONAL_SET_FLAG(*srcreg & mask,F_CF);
+ *srcreg |= mask;
+ }
+ break;
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+#endif
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x0f,0xac
+****************************************************************************/
+static void x86emuOp2_shrd_IMM(u8 X86EMU_UNUSED(op2))
+{
+ int mod, rl, rh;
+ uint destoffset;
+ u8 shift;
+
+ START_OF_INSTR();
+ DECODE_PRINTF("SHLD\t");
+ FETCH_DECODE_MODRM(mod, rh, rl);
+ switch (mod) {
+ case 0:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 destval;
+ u32 *shiftreg;
+
+ destoffset = decode_rm00_address(rl);
+ DECODE_PRINTF(",");
+ shiftreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF(",");
+ shift = fetch_byte_imm();
+ DECODE_PRINTF2("%d\n", shift);
+ TRACE_AND_STEP();
+ destval = fetch_data_long(destoffset);
+ destval = shrd_long(destval,*shiftreg,shift);
+ store_data_long(destoffset, destval);
+ } else {
+ u16 destval;
+ u16 *shiftreg;
+
+ destoffset = decode_rm00_address(rl);
+ DECODE_PRINTF(",");
+ shiftreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF(",");
+ shift = fetch_byte_imm();
+ DECODE_PRINTF2("%d\n", shift);
+ TRACE_AND_STEP();
+ destval = fetch_data_word(destoffset);
+ destval = shrd_word(destval,*shiftreg,shift);
+ store_data_word(destoffset, destval);
+ }
+ break;
+ case 1:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 destval;
+ u32 *shiftreg;
+
+ destoffset = decode_rm01_address(rl);
+ DECODE_PRINTF(",");
+ shiftreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF(",");
+ shift = fetch_byte_imm();
+ DECODE_PRINTF2("%d\n", shift);
+ TRACE_AND_STEP();
+ destval = fetch_data_long(destoffset);
+ destval = shrd_long(destval,*shiftreg,shift);
+ store_data_long(destoffset, destval);
+ } else {
+ u16 destval;
+ u16 *shiftreg;
+
+ destoffset = decode_rm01_address(rl);
+ DECODE_PRINTF(",");
+ shiftreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF(",");
+ shift = fetch_byte_imm();
+ DECODE_PRINTF2("%d\n", shift);
+ TRACE_AND_STEP();
+ destval = fetch_data_word(destoffset);
+ destval = shrd_word(destval,*shiftreg,shift);
+ store_data_word(destoffset, destval);
+ }
+ break;
+ case 2:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 destval;
+ u32 *shiftreg;
+
+ destoffset = decode_rm10_address(rl);
+ DECODE_PRINTF(",");
+ shiftreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF(",");
+ shift = fetch_byte_imm();
+ DECODE_PRINTF2("%d\n", shift);
+ TRACE_AND_STEP();
+ destval = fetch_data_long(destoffset);
+ destval = shrd_long(destval,*shiftreg,shift);
+ store_data_long(destoffset, destval);
+ } else {
+ u16 destval;
+ u16 *shiftreg;
+
+ destoffset = decode_rm10_address(rl);
+ DECODE_PRINTF(",");
+ shiftreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF(",");
+ shift = fetch_byte_imm();
+ DECODE_PRINTF2("%d\n", shift);
+ TRACE_AND_STEP();
+ destval = fetch_data_word(destoffset);
+ destval = shrd_word(destval,*shiftreg,shift);
+ store_data_word(destoffset, destval);
+ }
+ break;
+ case 3: /* register to register */
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 *destreg,*shiftreg;
+
+ destreg = DECODE_RM_LONG_REGISTER(rl);
+ DECODE_PRINTF(",");
+ shiftreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF(",");
+ shift = fetch_byte_imm();
+ DECODE_PRINTF2("%d\n", shift);
+ TRACE_AND_STEP();
+ *destreg = shrd_long(*destreg,*shiftreg,shift);
+ } else {
+ u16 *destreg,*shiftreg;
+
+ destreg = DECODE_RM_WORD_REGISTER(rl);
+ DECODE_PRINTF(",");
+ shiftreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF(",");
+ shift = fetch_byte_imm();
+ DECODE_PRINTF2("%d\n", shift);
+ TRACE_AND_STEP();
+ *destreg = shrd_word(*destreg,*shiftreg,shift);
+ }
+ break;
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x0f,0xad
+****************************************************************************/
+static void x86emuOp2_shrd_CL(u8 X86EMU_UNUSED(op2))
+{
+ int mod, rl, rh;
+ uint destoffset;
+
+ START_OF_INSTR();
+ DECODE_PRINTF("SHLD\t");
+ FETCH_DECODE_MODRM(mod, rh, rl);
+ switch (mod) {
+ case 0:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 destval;
+ u32 *shiftreg;
+
+ destoffset = decode_rm00_address(rl);
+ DECODE_PRINTF(",");
+ shiftreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF(",CL\n");
+ TRACE_AND_STEP();
+ destval = fetch_data_long(destoffset);
+ destval = shrd_long(destval,*shiftreg,M.x86.R_CL);
+ store_data_long(destoffset, destval);
+ } else {
+ u16 destval;
+ u16 *shiftreg;
+
+ destoffset = decode_rm00_address(rl);
+ DECODE_PRINTF(",");
+ shiftreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF(",CL\n");
+ TRACE_AND_STEP();
+ destval = fetch_data_word(destoffset);
+ destval = shrd_word(destval,*shiftreg,M.x86.R_CL);
+ store_data_word(destoffset, destval);
+ }
+ break;
+ case 1:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 destval;
+ u32 *shiftreg;
+
+ destoffset = decode_rm01_address(rl);
+ DECODE_PRINTF(",");
+ shiftreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF(",CL\n");
+ TRACE_AND_STEP();
+ destval = fetch_data_long(destoffset);
+ destval = shrd_long(destval,*shiftreg,M.x86.R_CL);
+ store_data_long(destoffset, destval);
+ } else {
+ u16 destval;
+ u16 *shiftreg;
+
+ destoffset = decode_rm01_address(rl);
+ DECODE_PRINTF(",");
+ shiftreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF(",CL\n");
+ TRACE_AND_STEP();
+ destval = fetch_data_word(destoffset);
+ destval = shrd_word(destval,*shiftreg,M.x86.R_CL);
+ store_data_word(destoffset, destval);
+ }
+ break;
+ case 2:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 destval;
+ u32 *shiftreg;
+
+ destoffset = decode_rm10_address(rl);
+ DECODE_PRINTF(",");
+ shiftreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF(",CL\n");
+ TRACE_AND_STEP();
+ destval = fetch_data_long(destoffset);
+ destval = shrd_long(destval,*shiftreg,M.x86.R_CL);
+ store_data_long(destoffset, destval);
+ } else {
+ u16 destval;
+ u16 *shiftreg;
+
+ destoffset = decode_rm10_address(rl);
+ DECODE_PRINTF(",");
+ shiftreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF(",CL\n");
+ TRACE_AND_STEP();
+ destval = fetch_data_word(destoffset);
+ destval = shrd_word(destval,*shiftreg,M.x86.R_CL);
+ store_data_word(destoffset, destval);
+ }
+ break;
+ case 3: /* register to register */
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 *destreg,*shiftreg;
+
+ destreg = DECODE_RM_LONG_REGISTER(rl);
+ DECODE_PRINTF(",");
+ shiftreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF(",CL\n");
+ TRACE_AND_STEP();
+ *destreg = shrd_long(*destreg,*shiftreg,M.x86.R_CL);
+ } else {
+ u16 *destreg,*shiftreg;
+
+ destreg = DECODE_RM_WORD_REGISTER(rl);
+ DECODE_PRINTF(",");
+ shiftreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF(",CL\n");
+ TRACE_AND_STEP();
+ *destreg = shrd_word(*destreg,*shiftreg,M.x86.R_CL);
+ }
+ break;
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x0f,0xaf
+****************************************************************************/
+static void x86emuOp2_imul_R_RM(u8 X86EMU_UNUSED(op2))
+{
+ int mod, rl, rh;
+ uint srcoffset;
+
+ START_OF_INSTR();
+ DECODE_PRINTF("IMUL\t");
+ FETCH_DECODE_MODRM(mod, rh, rl);
+ switch (mod) {
+ case 0:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 *destreg;
+ u32 srcval;
+ u32 res_lo,res_hi;
+
+ destreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm00_address(rl);
+ srcval = fetch_data_long(srcoffset);
+ TRACE_AND_STEP();
+ imul_long_direct(&res_lo,&res_hi,(s32)*destreg,(s32)srcval);
+ if (res_hi != 0) {
+ SET_FLAG(F_CF);
+ SET_FLAG(F_OF);
+ } else {
+ CLEAR_FLAG(F_CF);
+ CLEAR_FLAG(F_OF);
+ }
+ *destreg = (u32)res_lo;
+ } else {
+ u16 *destreg;
+ u16 srcval;
+ u32 res;
+
+ destreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm00_address(rl);
+ srcval = fetch_data_word(srcoffset);
+ TRACE_AND_STEP();
+ res = (s16)*destreg * (s16)srcval;
+ if (res > 0xFFFF) {
+ SET_FLAG(F_CF);
+ SET_FLAG(F_OF);
+ } else {
+ CLEAR_FLAG(F_CF);
+ CLEAR_FLAG(F_OF);
+ }
+ *destreg = (u16)res;
+ }
+ break;
+ case 1:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 *destreg;
+ u32 srcval;
+ u32 res_lo,res_hi;
+
+ destreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm01_address(rl);
+ srcval = fetch_data_long(srcoffset);
+ TRACE_AND_STEP();
+ imul_long_direct(&res_lo,&res_hi,(s32)*destreg,(s32)srcval);
+ if (res_hi != 0) {
+ SET_FLAG(F_CF);
+ SET_FLAG(F_OF);
+ } else {
+ CLEAR_FLAG(F_CF);
+ CLEAR_FLAG(F_OF);
+ }
+ *destreg = (u32)res_lo;
+ } else {
+ u16 *destreg;
+ u16 srcval;
+ u32 res;
+
+ destreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm01_address(rl);
+ srcval = fetch_data_word(srcoffset);
+ TRACE_AND_STEP();
+ res = (s16)*destreg * (s16)srcval;
+ if (res > 0xFFFF) {
+ SET_FLAG(F_CF);
+ SET_FLAG(F_OF);
+ } else {
+ CLEAR_FLAG(F_CF);
+ CLEAR_FLAG(F_OF);
+ }
+ *destreg = (u16)res;
+ }
+ break;
+ case 2:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 *destreg;
+ u32 srcval;
+ u32 res_lo,res_hi;
+
+ destreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm10_address(rl);
+ srcval = fetch_data_long(srcoffset);
+ TRACE_AND_STEP();
+ imul_long_direct(&res_lo,&res_hi,(s32)*destreg,(s32)srcval);
+ if (res_hi != 0) {
+ SET_FLAG(F_CF);
+ SET_FLAG(F_OF);
+ } else {
+ CLEAR_FLAG(F_CF);
+ CLEAR_FLAG(F_OF);
+ }
+ *destreg = (u32)res_lo;
+ } else {
+ u16 *destreg;
+ u16 srcval;
+ u32 res;
+
+ destreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm10_address(rl);
+ srcval = fetch_data_word(srcoffset);
+ TRACE_AND_STEP();
+ res = (s16)*destreg * (s16)srcval;
+ if (res > 0xFFFF) {
+ SET_FLAG(F_CF);
+ SET_FLAG(F_OF);
+ } else {
+ CLEAR_FLAG(F_CF);
+ CLEAR_FLAG(F_OF);
+ }
+ *destreg = (u16)res;
+ }
+ break;
+ case 3: /* register to register */
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 *destreg,*srcreg;
+ u32 res_lo,res_hi;
+
+ destreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcreg = DECODE_RM_LONG_REGISTER(rl);
+ TRACE_AND_STEP();
+ imul_long_direct(&res_lo,&res_hi,(s32)*destreg,(s32)*srcreg);
+ if (res_hi != 0) {
+ SET_FLAG(F_CF);
+ SET_FLAG(F_OF);
+ } else {
+ CLEAR_FLAG(F_CF);
+ CLEAR_FLAG(F_OF);
+ }
+ *destreg = (u32)res_lo;
+ } else {
+ u16 *destreg,*srcreg;
+ u32 res;
+
+ destreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcreg = DECODE_RM_WORD_REGISTER(rl);
+ res = (s16)*destreg * (s16)*srcreg;
+ if (res > 0xFFFF) {
+ SET_FLAG(F_CF);
+ SET_FLAG(F_OF);
+ } else {
+ CLEAR_FLAG(F_CF);
+ CLEAR_FLAG(F_OF);
+ }
+ *destreg = (u16)res;
+ }
+ break;
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x0f,0xb2
+****************************************************************************/
+static void x86emuOp2_lss_R_IMM(u8 X86EMU_UNUSED(op2))
+{
+ int mod, rh, rl;
+ u16 *dstreg;
+ uint srcoffset;
+
+ START_OF_INSTR();
+ DECODE_PRINTF("LSS\t");
+ FETCH_DECODE_MODRM(mod, rh, rl);
+ switch (mod) {
+ case 0:
+ dstreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm00_address(rl);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *dstreg = fetch_data_word(srcoffset);
+ M.x86.R_SS = fetch_data_word(srcoffset + 2);
+ break;
+ case 1:
+ dstreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm01_address(rl);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *dstreg = fetch_data_word(srcoffset);
+ M.x86.R_SS = fetch_data_word(srcoffset + 2);
+ break;
+ case 2:
+ dstreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm10_address(rl);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *dstreg = fetch_data_word(srcoffset);
+ M.x86.R_SS = fetch_data_word(srcoffset + 2);
+ break;
+ case 3: /* register to register */
+ /* UNDEFINED! */
+ TRACE_AND_STEP();
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x0f,0xb3
+****************************************************************************/
+static void x86emuOp2_btr_R(u8 X86EMU_UNUSED(op2))
+{
+ int mod, rl, rh;
+ uint srcoffset;
+ int bit,disp;
+
+ START_OF_INSTR();
+ DECODE_PRINTF("BTR\t");
+ FETCH_DECODE_MODRM(mod, rh, rl);
+ switch (mod) {
+ case 0:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 srcval,mask;
+ u32 *shiftreg;
+
+ srcoffset = decode_rm00_address(rl);
+ DECODE_PRINTF(",");
+ shiftreg = DECODE_RM_LONG_REGISTER(rh);
+ TRACE_AND_STEP();
+ bit = *shiftreg & 0x1F;
+ disp = (s16)*shiftreg >> 5;
+ srcval = fetch_data_long(srcoffset+disp);
+ mask = (0x1 << bit);
+ CONDITIONAL_SET_FLAG(srcval & mask,F_CF);
+ store_data_long(srcoffset+disp, srcval & ~mask);
+ } else {
+ u16 srcval,mask;
+ u16 *shiftreg;
+
+ srcoffset = decode_rm00_address(rl);
+ DECODE_PRINTF(",");
+ shiftreg = DECODE_RM_WORD_REGISTER(rh);
+ TRACE_AND_STEP();
+ bit = *shiftreg & 0xF;
+ disp = (s16)*shiftreg >> 4;
+ srcval = fetch_data_word(srcoffset+disp);
+ mask = (u16)(0x1 << bit);
+ CONDITIONAL_SET_FLAG(srcval & mask,F_CF);
+ store_data_word(srcoffset+disp, (u16)(srcval & ~mask));
+ }
+ break;
+ case 1:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 srcval,mask;
+ u32 *shiftreg;
+
+ srcoffset = decode_rm01_address(rl);
+ DECODE_PRINTF(",");
+ shiftreg = DECODE_RM_LONG_REGISTER(rh);
+ TRACE_AND_STEP();
+ bit = *shiftreg & 0x1F;
+ disp = (s16)*shiftreg >> 5;
+ srcval = fetch_data_long(srcoffset+disp);
+ mask = (0x1 << bit);
+ CONDITIONAL_SET_FLAG(srcval & mask,F_CF);
+ store_data_long(srcoffset+disp, srcval & ~mask);
+ } else {
+ u16 srcval,mask;
+ u16 *shiftreg;
+
+ srcoffset = decode_rm01_address(rl);
+ DECODE_PRINTF(",");
+ shiftreg = DECODE_RM_WORD_REGISTER(rh);
+ TRACE_AND_STEP();
+ bit = *shiftreg & 0xF;
+ disp = (s16)*shiftreg >> 4;
+ srcval = fetch_data_word(srcoffset+disp);
+ mask = (u16)(0x1 << bit);
+ CONDITIONAL_SET_FLAG(srcval & mask,F_CF);
+ store_data_word(srcoffset+disp, (u16)(srcval & ~mask));
+ }
+ break;
+ case 2:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 srcval,mask;
+ u32 *shiftreg;
+
+ srcoffset = decode_rm10_address(rl);
+ DECODE_PRINTF(",");
+ shiftreg = DECODE_RM_LONG_REGISTER(rh);
+ TRACE_AND_STEP();
+ bit = *shiftreg & 0x1F;
+ disp = (s16)*shiftreg >> 5;
+ srcval = fetch_data_long(srcoffset+disp);
+ mask = (0x1 << bit);
+ CONDITIONAL_SET_FLAG(srcval & mask,F_CF);
+ store_data_long(srcoffset+disp, srcval & ~mask);
+ } else {
+ u16 srcval,mask;
+ u16 *shiftreg;
+
+ srcoffset = decode_rm10_address(rl);
+ DECODE_PRINTF(",");
+ shiftreg = DECODE_RM_WORD_REGISTER(rh);
+ TRACE_AND_STEP();
+ bit = *shiftreg & 0xF;
+ disp = (s16)*shiftreg >> 4;
+ srcval = fetch_data_word(srcoffset+disp);
+ mask = (u16)(0x1 << bit);
+ CONDITIONAL_SET_FLAG(srcval & mask,F_CF);
+ store_data_word(srcoffset+disp, (u16)(srcval & ~mask));
+ }
+ break;
+ case 3: /* register to register */
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 *srcreg,*shiftreg;
+ u32 mask;
+
+ srcreg = DECODE_RM_LONG_REGISTER(rl);
+ DECODE_PRINTF(",");
+ shiftreg = DECODE_RM_LONG_REGISTER(rh);
+ TRACE_AND_STEP();
+ bit = *shiftreg & 0x1F;
+ mask = (0x1 << bit);
+ CONDITIONAL_SET_FLAG(*srcreg & mask,F_CF);
+ *srcreg &= ~mask;
+ } else {
+ u16 *srcreg,*shiftreg;
+ u16 mask;
+
+ srcreg = DECODE_RM_WORD_REGISTER(rl);
+ DECODE_PRINTF(",");
+ shiftreg = DECODE_RM_WORD_REGISTER(rh);
+ TRACE_AND_STEP();
+ bit = *shiftreg & 0xF;
+ mask = (u16)(0x1 << bit);
+ CONDITIONAL_SET_FLAG(*srcreg & mask,F_CF);
+ *srcreg &= ~mask;
+ }
+ break;
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x0f,0xb4
+****************************************************************************/
+static void x86emuOp2_lfs_R_IMM(u8 X86EMU_UNUSED(op2))
+{
+ int mod, rh, rl;
+ u16 *dstreg;
+ uint srcoffset;
+
+ START_OF_INSTR();
+ DECODE_PRINTF("LFS\t");
+ FETCH_DECODE_MODRM(mod, rh, rl);
+ switch (mod) {
+ case 0:
+ dstreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm00_address(rl);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *dstreg = fetch_data_word(srcoffset);
+ M.x86.R_FS = fetch_data_word(srcoffset + 2);
+ break;
+ case 1:
+ dstreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm01_address(rl);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *dstreg = fetch_data_word(srcoffset);
+ M.x86.R_FS = fetch_data_word(srcoffset + 2);
+ break;
+ case 2:
+ dstreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm10_address(rl);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *dstreg = fetch_data_word(srcoffset);
+ M.x86.R_FS = fetch_data_word(srcoffset + 2);
+ break;
+ case 3: /* register to register */
+ /* UNDEFINED! */
+ TRACE_AND_STEP();
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x0f,0xb5
+****************************************************************************/
+static void x86emuOp2_lgs_R_IMM(u8 X86EMU_UNUSED(op2))
+{
+ int mod, rh, rl;
+ u16 *dstreg;
+ uint srcoffset;
+
+ START_OF_INSTR();
+ DECODE_PRINTF("LGS\t");
+ FETCH_DECODE_MODRM(mod, rh, rl);
+ switch (mod) {
+ case 0:
+ dstreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm00_address(rl);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *dstreg = fetch_data_word(srcoffset);
+ M.x86.R_GS = fetch_data_word(srcoffset + 2);
+ break;
+ case 1:
+ dstreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm01_address(rl);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *dstreg = fetch_data_word(srcoffset);
+ M.x86.R_GS = fetch_data_word(srcoffset + 2);
+ break;
+ case 2:
+ dstreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm10_address(rl);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *dstreg = fetch_data_word(srcoffset);
+ M.x86.R_GS = fetch_data_word(srcoffset + 2);
+ break;
+ case 3: /* register to register */
+ /* UNDEFINED! */
+ TRACE_AND_STEP();
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x0f,0xb6
+****************************************************************************/
+static void x86emuOp2_movzx_byte_R_RM(u8 X86EMU_UNUSED(op2))
+{
+ int mod, rl, rh;
+ uint srcoffset;
+
+ START_OF_INSTR();
+ DECODE_PRINTF("MOVZX\t");
+ FETCH_DECODE_MODRM(mod, rh, rl);
+ switch (mod) {
+ case 0:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 *destreg;
+ u32 srcval;
+
+ destreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm00_address(rl);
+ srcval = fetch_data_byte(srcoffset);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = srcval;
+ } else {
+ u16 *destreg;
+ u16 srcval;
+
+ destreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm00_address(rl);
+ srcval = fetch_data_byte(srcoffset);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = srcval;
+ }
+ break;
+ case 1:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 *destreg;
+ u32 srcval;
+
+ destreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm01_address(rl);
+ srcval = fetch_data_byte(srcoffset);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = srcval;
+ } else {
+ u16 *destreg;
+ u16 srcval;
+
+ destreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm01_address(rl);
+ srcval = fetch_data_byte(srcoffset);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = srcval;
+ }
+ break;
+ case 2:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 *destreg;
+ u32 srcval;
+
+ destreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm10_address(rl);
+ srcval = fetch_data_byte(srcoffset);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = srcval;
+ } else {
+ u16 *destreg;
+ u16 srcval;
+
+ destreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm10_address(rl);
+ srcval = fetch_data_byte(srcoffset);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = srcval;
+ }
+ break;
+ case 3: /* register to register */
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 *destreg;
+ u8 *srcreg;
+
+ destreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcreg = DECODE_RM_BYTE_REGISTER(rl);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = *srcreg;
+ } else {
+ u16 *destreg;
+ u8 *srcreg;
+
+ destreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcreg = DECODE_RM_BYTE_REGISTER(rl);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = *srcreg;
+ }
+ break;
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x0f,0xb7
+****************************************************************************/
+static void x86emuOp2_movzx_word_R_RM(u8 X86EMU_UNUSED(op2))
+{
+ int mod, rl, rh;
+ uint srcoffset;
+ u32 *destreg;
+ u32 srcval;
+ u16 *srcreg;
+
+ START_OF_INSTR();
+ DECODE_PRINTF("MOVZX\t");
+ FETCH_DECODE_MODRM(mod, rh, rl);
+ switch (mod) {
+ case 0:
+ destreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm00_address(rl);
+ srcval = fetch_data_word(srcoffset);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = srcval;
+ break;
+ case 1:
+ destreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm01_address(rl);
+ srcval = fetch_data_word(srcoffset);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = srcval;
+ break;
+ case 2:
+ destreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm10_address(rl);
+ srcval = fetch_data_word(srcoffset);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = srcval;
+ break;
+ case 3: /* register to register */
+ destreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcreg = DECODE_RM_WORD_REGISTER(rl);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = *srcreg;
+ break;
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x0f,0xba
+****************************************************************************/
+static void x86emuOp2_btX_I(u8 X86EMU_UNUSED(op2))
+{
+ int mod, rl, rh;
+ uint srcoffset;
+ int bit;
+
+ START_OF_INSTR();
+ FETCH_DECODE_MODRM(mod, rh, rl);
+ switch (rh) {
+ case 4:
+ DECODE_PRINTF("BT\t");
+ break;
+ case 5:
+ DECODE_PRINTF("BTS\t");
+ break;
+ case 6:
+ DECODE_PRINTF("BTR\t");
+ break;
+ case 7:
+ DECODE_PRINTF("BTC\t");
+ break;
+ default:
+ DECODE_PRINTF("ILLEGAL EXTENDED X86 OPCODE\n");
+ TRACE_REGS();
+ printk("%04x:%04x: %02X%02X ILLEGAL EXTENDED X86 OPCODE EXTENSION!\n",
+ M.x86.R_CS, M.x86.R_IP-3,op2, (mod<<6)|(rh<<3)|rl);
+ HALT_SYS();
+ }
+ switch (mod) {
+ case 0:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 srcval, mask;
+ u8 shift;
+
+ srcoffset = decode_rm00_address(rl);
+ DECODE_PRINTF(",");
+ shift = fetch_byte_imm();
+ TRACE_AND_STEP();
+ bit = shift & 0x1F;
+ srcval = fetch_data_long(srcoffset);
+ mask = (0x1 << bit);
+ CONDITIONAL_SET_FLAG(srcval & mask,F_CF);
+ switch (rh) {
+ case 5:
+ store_data_long(srcoffset, srcval | mask);
+ break;
+ case 6:
+ store_data_long(srcoffset, srcval & ~mask);
+ break;
+ case 7:
+ store_data_long(srcoffset, srcval ^ mask);
+ break;
+ default:
+ break;
+ }
+ } else {
+ u16 srcval, mask;
+ u8 shift;
+
+ srcoffset = decode_rm00_address(rl);
+ DECODE_PRINTF(",");
+ shift = fetch_byte_imm();
+ TRACE_AND_STEP();
+ bit = shift & 0xF;
+ srcval = fetch_data_word(srcoffset);
+ mask = (0x1 << bit);
+ CONDITIONAL_SET_FLAG(srcval & mask,F_CF);
+ switch (rh) {
+ case 5:
+ store_data_word(srcoffset, srcval | mask);
+ break;
+ case 6:
+ store_data_word(srcoffset, srcval & ~mask);
+ break;
+ case 7:
+ store_data_word(srcoffset, srcval ^ mask);
+ break;
+ default:
+ break;
+ }
+ }
+ break;
+ case 1:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 srcval, mask;
+ u8 shift;
+
+ srcoffset = decode_rm01_address(rl);
+ DECODE_PRINTF(",");
+ shift = fetch_byte_imm();
+ TRACE_AND_STEP();
+ bit = shift & 0x1F;
+ srcval = fetch_data_long(srcoffset);
+ mask = (0x1 << bit);
+ CONDITIONAL_SET_FLAG(srcval & mask,F_CF);
+ switch (rh) {
+ case 5:
+ store_data_long(srcoffset, srcval | mask);
+ break;
+ case 6:
+ store_data_long(srcoffset, srcval & ~mask);
+ break;
+ case 7:
+ store_data_long(srcoffset, srcval ^ mask);
+ break;
+ default:
+ break;
+ }
+ } else {
+ u16 srcval, mask;
+ u8 shift;
+
+ srcoffset = decode_rm01_address(rl);
+ DECODE_PRINTF(",");
+ shift = fetch_byte_imm();
+ TRACE_AND_STEP();
+ bit = shift & 0xF;
+ srcval = fetch_data_word(srcoffset);
+ mask = (0x1 << bit);
+ CONDITIONAL_SET_FLAG(srcval & mask,F_CF);
+ switch (rh) {
+ case 5:
+ store_data_word(srcoffset, srcval | mask);
+ break;
+ case 6:
+ store_data_word(srcoffset, srcval & ~mask);
+ break;
+ case 7:
+ store_data_word(srcoffset, srcval ^ mask);
+ break;
+ default:
+ break;
+ }
+ }
+ break;
+ case 2:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 srcval, mask;
+ u8 shift;
+
+ srcoffset = decode_rm10_address(rl);
+ DECODE_PRINTF(",");
+ shift = fetch_byte_imm();
+ TRACE_AND_STEP();
+ bit = shift & 0x1F;
+ srcval = fetch_data_long(srcoffset);
+ mask = (0x1 << bit);
+ CONDITIONAL_SET_FLAG(srcval & mask,F_CF);
+ switch (rh) {
+ case 5:
+ store_data_long(srcoffset, srcval | mask);
+ break;
+ case 6:
+ store_data_long(srcoffset, srcval & ~mask);
+ break;
+ case 7:
+ store_data_long(srcoffset, srcval ^ mask);
+ break;
+ default:
+ break;
+ }
+ } else {
+ u16 srcval, mask;
+ u8 shift;
+
+ srcoffset = decode_rm10_address(rl);
+ DECODE_PRINTF(",");
+ shift = fetch_byte_imm();
+ TRACE_AND_STEP();
+ bit = shift & 0xF;
+ srcval = fetch_data_word(srcoffset);
+ mask = (0x1 << bit);
+ CONDITIONAL_SET_FLAG(srcval & mask,F_CF);
+ switch (rh) {
+ case 5:
+ store_data_word(srcoffset, srcval | mask);
+ break;
+ case 6:
+ store_data_word(srcoffset, srcval & ~mask);
+ break;
+ case 7:
+ store_data_word(srcoffset, srcval ^ mask);
+ break;
+ default:
+ break;
+ }
+ }
+ break;
+ case 3: /* register to register */
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 *srcreg;
+ u32 mask;
+ u8 shift;
+
+ srcreg = DECODE_RM_LONG_REGISTER(rl);
+ DECODE_PRINTF(",");
+ shift = fetch_byte_imm();
+ TRACE_AND_STEP();
+ bit = shift & 0x1F;
+ mask = (0x1 << bit);
+ CONDITIONAL_SET_FLAG(*srcreg & mask,F_CF);
+ switch (rh) {
+ case 5:
+ *srcreg |= mask;
+ break;
+ case 6:
+ *srcreg &= ~mask;
+ break;
+ case 7:
+ *srcreg ^= mask;
+ break;
+ default:
+ break;
+ }
+ } else {
+ u16 *srcreg;
+ u16 mask;
+ u8 shift;
+
+ srcreg = DECODE_RM_WORD_REGISTER(rl);
+ DECODE_PRINTF(",");
+ shift = fetch_byte_imm();
+ TRACE_AND_STEP();
+ bit = shift & 0xF;
+ mask = (0x1 << bit);
+ CONDITIONAL_SET_FLAG(*srcreg & mask,F_CF);
+ switch (rh) {
+ case 5:
+ *srcreg |= mask;
+ break;
+ case 6:
+ *srcreg &= ~mask;
+ break;
+ case 7:
+ *srcreg ^= mask;
+ break;
+ default:
+ break;
+ }
+ }
+ break;
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x0f,0xbb
+****************************************************************************/
+static void x86emuOp2_btc_R(u8 X86EMU_UNUSED(op2))
+{
+ int mod, rl, rh;
+ uint srcoffset;
+ int bit,disp;
+
+ START_OF_INSTR();
+ DECODE_PRINTF("BTC\t");
+ FETCH_DECODE_MODRM(mod, rh, rl);
+ switch (mod) {
+ case 0:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 srcval,mask;
+ u32 *shiftreg;
+
+ srcoffset = decode_rm00_address(rl);
+ DECODE_PRINTF(",");
+ shiftreg = DECODE_RM_LONG_REGISTER(rh);
+ TRACE_AND_STEP();
+ bit = *shiftreg & 0x1F;
+ disp = (s16)*shiftreg >> 5;
+ srcval = fetch_data_long(srcoffset+disp);
+ mask = (0x1 << bit);
+ CONDITIONAL_SET_FLAG(srcval & mask,F_CF);
+ store_data_long(srcoffset+disp, srcval ^ mask);
+ } else {
+ u16 srcval,mask;
+ u16 *shiftreg;
+
+ srcoffset = decode_rm00_address(rl);
+ DECODE_PRINTF(",");
+ shiftreg = DECODE_RM_WORD_REGISTER(rh);
+ TRACE_AND_STEP();
+ bit = *shiftreg & 0xF;
+ disp = (s16)*shiftreg >> 4;
+ srcval = fetch_data_word(srcoffset+disp);
+ mask = (u16)(0x1 << bit);
+ CONDITIONAL_SET_FLAG(srcval & mask,F_CF);
+ store_data_word(srcoffset+disp, (u16)(srcval ^ mask));
+ }
+ break;
+ case 1:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 srcval,mask;
+ u32 *shiftreg;
+
+ srcoffset = decode_rm01_address(rl);
+ DECODE_PRINTF(",");
+ shiftreg = DECODE_RM_LONG_REGISTER(rh);
+ TRACE_AND_STEP();
+ bit = *shiftreg & 0x1F;
+ disp = (s16)*shiftreg >> 5;
+ srcval = fetch_data_long(srcoffset+disp);
+ mask = (0x1 << bit);
+ CONDITIONAL_SET_FLAG(srcval & mask,F_CF);
+ store_data_long(srcoffset+disp, srcval ^ mask);
+ } else {
+ u16 srcval,mask;
+ u16 *shiftreg;
+
+ srcoffset = decode_rm01_address(rl);
+ DECODE_PRINTF(",");
+ shiftreg = DECODE_RM_WORD_REGISTER(rh);
+ TRACE_AND_STEP();
+ bit = *shiftreg & 0xF;
+ disp = (s16)*shiftreg >> 4;
+ srcval = fetch_data_word(srcoffset+disp);
+ mask = (u16)(0x1 << bit);
+ CONDITIONAL_SET_FLAG(srcval & mask,F_CF);
+ store_data_word(srcoffset+disp, (u16)(srcval ^ mask));
+ }
+ break;
+ case 2:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 srcval,mask;
+ u32 *shiftreg;
+
+ srcoffset = decode_rm10_address(rl);
+ DECODE_PRINTF(",");
+ shiftreg = DECODE_RM_LONG_REGISTER(rh);
+ TRACE_AND_STEP();
+ bit = *shiftreg & 0x1F;
+ disp = (s16)*shiftreg >> 5;
+ srcval = fetch_data_long(srcoffset+disp);
+ mask = (0x1 << bit);
+ CONDITIONAL_SET_FLAG(srcval & mask,F_CF);
+ store_data_long(srcoffset+disp, srcval ^ mask);
+ } else {
+ u16 srcval,mask;
+ u16 *shiftreg;
+
+ srcoffset = decode_rm10_address(rl);
+ DECODE_PRINTF(",");
+ shiftreg = DECODE_RM_WORD_REGISTER(rh);
+ TRACE_AND_STEP();
+ bit = *shiftreg & 0xF;
+ disp = (s16)*shiftreg >> 4;
+ srcval = fetch_data_word(srcoffset+disp);
+ mask = (u16)(0x1 << bit);
+ CONDITIONAL_SET_FLAG(srcval & mask,F_CF);
+ store_data_word(srcoffset+disp, (u16)(srcval ^ mask));
+ }
+ break;
+ case 3: /* register to register */
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 *srcreg,*shiftreg;
+ u32 mask;
+
+ srcreg = DECODE_RM_LONG_REGISTER(rl);
+ DECODE_PRINTF(",");
+ shiftreg = DECODE_RM_LONG_REGISTER(rh);
+ TRACE_AND_STEP();
+ bit = *shiftreg & 0x1F;
+ mask = (0x1 << bit);
+ CONDITIONAL_SET_FLAG(*srcreg & mask,F_CF);
+ *srcreg ^= mask;
+ } else {
+ u16 *srcreg,*shiftreg;
+ u16 mask;
+
+ srcreg = DECODE_RM_WORD_REGISTER(rl);
+ DECODE_PRINTF(",");
+ shiftreg = DECODE_RM_WORD_REGISTER(rh);
+ TRACE_AND_STEP();
+ bit = *shiftreg & 0xF;
+ mask = (u16)(0x1 << bit);
+ CONDITIONAL_SET_FLAG(*srcreg & mask,F_CF);
+ *srcreg ^= mask;
+ }
+ break;
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x0f,0xbc
+****************************************************************************/
+static void x86emuOp2_bsf(u8 X86EMU_UNUSED(op2))
+{
+ int mod, rl, rh;
+ uint srcoffset;
+
+ START_OF_INSTR();
+ DECODE_PRINTF("BSF\n");
+ FETCH_DECODE_MODRM(mod, rh, rl);
+ switch(mod) {
+ case 0:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 srcval, *dstreg;
+
+ srcoffset = decode_rm00_address(rl);
+ DECODE_PRINTF(",");
+ dstreg = DECODE_RM_LONG_REGISTER(rh);
+ TRACE_AND_STEP();
+ srcval = fetch_data_long(srcoffset);
+ CONDITIONAL_SET_FLAG(srcval == 0, F_ZF);
+ for(*dstreg = 0; *dstreg < 32; (*dstreg)++)
+ if ((srcval >> *dstreg) & 1) break;
+ } else {
+ u16 srcval, *dstreg;
+
+ srcoffset = decode_rm00_address(rl);
+ DECODE_PRINTF(",");
+ dstreg = DECODE_RM_WORD_REGISTER(rh);
+ TRACE_AND_STEP();
+ srcval = fetch_data_word(srcoffset);
+ CONDITIONAL_SET_FLAG(srcval == 0, F_ZF);
+ for(*dstreg = 0; *dstreg < 16; (*dstreg)++)
+ if ((srcval >> *dstreg) & 1) break;
+ }
+ break;
+ case 1:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 srcval, *dstreg;
+
+ srcoffset = decode_rm01_address(rl);
+ DECODE_PRINTF(",");
+ dstreg = DECODE_RM_LONG_REGISTER(rh);
+ TRACE_AND_STEP();
+ srcval = fetch_data_long(srcoffset);
+ CONDITIONAL_SET_FLAG(srcval == 0, F_ZF);
+ for(*dstreg = 0; *dstreg < 32; (*dstreg)++)
+ if ((srcval >> *dstreg) & 1) break;
+ } else {
+ u16 srcval, *dstreg;
+
+ srcoffset = decode_rm01_address(rl);
+ DECODE_PRINTF(",");
+ dstreg = DECODE_RM_WORD_REGISTER(rh);
+ TRACE_AND_STEP();
+ srcval = fetch_data_word(srcoffset);
+ CONDITIONAL_SET_FLAG(srcval == 0, F_ZF);
+ for(*dstreg = 0; *dstreg < 16; (*dstreg)++)
+ if ((srcval >> *dstreg) & 1) break;
+ }
+ break;
+ case 2:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 srcval, *dstreg;
+
+ srcoffset = decode_rm10_address(rl);
+ DECODE_PRINTF(",");
+ dstreg = DECODE_RM_LONG_REGISTER(rh);
+ TRACE_AND_STEP();
+ srcval = fetch_data_long(srcoffset);
+ CONDITIONAL_SET_FLAG(srcval == 0, F_ZF);
+ for(*dstreg = 0; *dstreg < 32; (*dstreg)++)
+ if ((srcval >> *dstreg) & 1) break;
+ } else {
+ u16 srcval, *dstreg;
+
+ srcoffset = decode_rm10_address(rl);
+ DECODE_PRINTF(",");
+ dstreg = DECODE_RM_WORD_REGISTER(rh);
+ TRACE_AND_STEP();
+ srcval = fetch_data_word(srcoffset);
+ CONDITIONAL_SET_FLAG(srcval == 0, F_ZF);
+ for(*dstreg = 0; *dstreg < 16; (*dstreg)++)
+ if ((srcval >> *dstreg) & 1) break;
+ }
+ break;
+ case 3: /* register to register */
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 *srcreg, *dstreg;
+
+ srcreg = DECODE_RM_LONG_REGISTER(rl);
+ DECODE_PRINTF(",");
+ dstreg = DECODE_RM_LONG_REGISTER(rh);
+ TRACE_AND_STEP();
+ CONDITIONAL_SET_FLAG(*srcreg == 0, F_ZF);
+ for(*dstreg = 0; *dstreg < 32; (*dstreg)++)
+ if ((*srcreg >> *dstreg) & 1) break;
+ } else {
+ u16 *srcreg, *dstreg;
+
+ srcreg = DECODE_RM_WORD_REGISTER(rl);
+ DECODE_PRINTF(",");
+ dstreg = DECODE_RM_WORD_REGISTER(rh);
+ TRACE_AND_STEP();
+ CONDITIONAL_SET_FLAG(*srcreg == 0, F_ZF);
+ for(*dstreg = 0; *dstreg < 16; (*dstreg)++)
+ if ((*srcreg >> *dstreg) & 1) break;
+ }
+ break;
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x0f,0xbd
+****************************************************************************/
+static void x86emuOp2_bsr(u8 X86EMU_UNUSED(op2))
+{
+ int mod, rl, rh;
+ uint srcoffset;
+
+ START_OF_INSTR();
+ DECODE_PRINTF("BSF\n");
+ FETCH_DECODE_MODRM(mod, rh, rl);
+ switch(mod) {
+ case 0:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 srcval, *dstreg;
+
+ srcoffset = decode_rm00_address(rl);
+ DECODE_PRINTF(",");
+ dstreg = DECODE_RM_LONG_REGISTER(rh);
+ TRACE_AND_STEP();
+ srcval = fetch_data_long(srcoffset);
+ CONDITIONAL_SET_FLAG(srcval == 0, F_ZF);
+ for(*dstreg = 31; *dstreg > 0; (*dstreg)--)
+ if ((srcval >> *dstreg) & 1) break;
+ } else {
+ u16 srcval, *dstreg;
+
+ srcoffset = decode_rm00_address(rl);
+ DECODE_PRINTF(",");
+ dstreg = DECODE_RM_WORD_REGISTER(rh);
+ TRACE_AND_STEP();
+ srcval = fetch_data_word(srcoffset);
+ CONDITIONAL_SET_FLAG(srcval == 0, F_ZF);
+ for(*dstreg = 15; *dstreg > 0; (*dstreg)--)
+ if ((srcval >> *dstreg) & 1) break;
+ }
+ break;
+ case 1:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 srcval, *dstreg;
+
+ srcoffset = decode_rm01_address(rl);
+ DECODE_PRINTF(",");
+ dstreg = DECODE_RM_LONG_REGISTER(rh);
+ TRACE_AND_STEP();
+ srcval = fetch_data_long(srcoffset);
+ CONDITIONAL_SET_FLAG(srcval == 0, F_ZF);
+ for(*dstreg = 31; *dstreg > 0; (*dstreg)--)
+ if ((srcval >> *dstreg) & 1) break;
+ } else {
+ u16 srcval, *dstreg;
+
+ srcoffset = decode_rm01_address(rl);
+ DECODE_PRINTF(",");
+ dstreg = DECODE_RM_WORD_REGISTER(rh);
+ TRACE_AND_STEP();
+ srcval = fetch_data_word(srcoffset);
+ CONDITIONAL_SET_FLAG(srcval == 0, F_ZF);
+ for(*dstreg = 15; *dstreg > 0; (*dstreg)--)
+ if ((srcval >> *dstreg) & 1) break;
+ }
+ break;
+ case 2:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 srcval, *dstreg;
+
+ srcoffset = decode_rm10_address(rl);
+ DECODE_PRINTF(",");
+ dstreg = DECODE_RM_LONG_REGISTER(rh);
+ TRACE_AND_STEP();
+ srcval = fetch_data_long(srcoffset);
+ CONDITIONAL_SET_FLAG(srcval == 0, F_ZF);
+ for(*dstreg = 31; *dstreg > 0; (*dstreg)--)
+ if ((srcval >> *dstreg) & 1) break;
+ } else {
+ u16 srcval, *dstreg;
+
+ srcoffset = decode_rm10_address(rl);
+ DECODE_PRINTF(",");
+ dstreg = DECODE_RM_WORD_REGISTER(rh);
+ TRACE_AND_STEP();
+ srcval = fetch_data_word(srcoffset);
+ CONDITIONAL_SET_FLAG(srcval == 0, F_ZF);
+ for(*dstreg = 15; *dstreg > 0; (*dstreg)--)
+ if ((srcval >> *dstreg) & 1) break;
+ }
+ break;
+ case 3: /* register to register */
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 *srcreg, *dstreg;
+
+ srcreg = DECODE_RM_LONG_REGISTER(rl);
+ DECODE_PRINTF(",");
+ dstreg = DECODE_RM_LONG_REGISTER(rh);
+ TRACE_AND_STEP();
+ CONDITIONAL_SET_FLAG(*srcreg == 0, F_ZF);
+ for(*dstreg = 31; *dstreg > 0; (*dstreg)--)
+ if ((*srcreg >> *dstreg) & 1) break;
+ } else {
+ u16 *srcreg, *dstreg;
+
+ srcreg = DECODE_RM_WORD_REGISTER(rl);
+ DECODE_PRINTF(",");
+ dstreg = DECODE_RM_WORD_REGISTER(rh);
+ TRACE_AND_STEP();
+ CONDITIONAL_SET_FLAG(*srcreg == 0, F_ZF);
+ for(*dstreg = 15; *dstreg > 0; (*dstreg)--)
+ if ((*srcreg >> *dstreg) & 1) break;
+ }
+ break;
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x0f,0xbe
+****************************************************************************/
+static void x86emuOp2_movsx_byte_R_RM(u8 X86EMU_UNUSED(op2))
+{
+ int mod, rl, rh;
+ uint srcoffset;
+
+ START_OF_INSTR();
+ DECODE_PRINTF("MOVSX\t");
+ FETCH_DECODE_MODRM(mod, rh, rl);
+ switch (mod) {
+ case 0:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 *destreg;
+ u32 srcval;
+
+ destreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm00_address(rl);
+ srcval = (s32)((s8)fetch_data_byte(srcoffset));
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = srcval;
+ } else {
+ u16 *destreg;
+ u16 srcval;
+
+ destreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm00_address(rl);
+ srcval = (s16)((s8)fetch_data_byte(srcoffset));
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = srcval;
+ }
+ break;
+ case 1:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 *destreg;
+ u32 srcval;
+
+ destreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm01_address(rl);
+ srcval = (s32)((s8)fetch_data_byte(srcoffset));
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = srcval;
+ } else {
+ u16 *destreg;
+ u16 srcval;
+
+ destreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm01_address(rl);
+ srcval = (s16)((s8)fetch_data_byte(srcoffset));
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = srcval;
+ }
+ break;
+ case 2:
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 *destreg;
+ u32 srcval;
+
+ destreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm10_address(rl);
+ srcval = (s32)((s8)fetch_data_byte(srcoffset));
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = srcval;
+ } else {
+ u16 *destreg;
+ u16 srcval;
+
+ destreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm10_address(rl);
+ srcval = (s16)((s8)fetch_data_byte(srcoffset));
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = srcval;
+ }
+ break;
+ case 3: /* register to register */
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ u32 *destreg;
+ u8 *srcreg;
+
+ destreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcreg = DECODE_RM_BYTE_REGISTER(rl);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = (s32)((s8)*srcreg);
+ } else {
+ u16 *destreg;
+ u8 *srcreg;
+
+ destreg = DECODE_RM_WORD_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcreg = DECODE_RM_BYTE_REGISTER(rl);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = (s16)((s8)*srcreg);
+ }
+ break;
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/****************************************************************************
+REMARKS:
+Handles opcode 0x0f,0xbf
+****************************************************************************/
+static void x86emuOp2_movsx_word_R_RM(u8 X86EMU_UNUSED(op2))
+{
+ int mod, rl, rh;
+ uint srcoffset;
+ u32 *destreg;
+ u32 srcval;
+ u16 *srcreg;
+
+ START_OF_INSTR();
+ DECODE_PRINTF("MOVSX\t");
+ FETCH_DECODE_MODRM(mod, rh, rl);
+ switch (mod) {
+ case 0:
+ destreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm00_address(rl);
+ srcval = (s32)((s16)fetch_data_word(srcoffset));
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = srcval;
+ break;
+ case 1:
+ destreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm01_address(rl);
+ srcval = (s32)((s16)fetch_data_word(srcoffset));
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = srcval;
+ break;
+ case 2:
+ destreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcoffset = decode_rm10_address(rl);
+ srcval = (s32)((s16)fetch_data_word(srcoffset));
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = srcval;
+ break;
+ case 3: /* register to register */
+ destreg = DECODE_RM_LONG_REGISTER(rh);
+ DECODE_PRINTF(",");
+ srcreg = DECODE_RM_WORD_REGISTER(rl);
+ DECODE_PRINTF("\n");
+ TRACE_AND_STEP();
+ *destreg = (s32)((s16)*srcreg);
+ break;
+ }
+ DECODE_CLEAR_SEGOVR();
+ END_OF_INSTR();
+}
+
+/***************************************************************************
+ * Double byte operation code table:
+ **************************************************************************/
+void (*x86emu_optab2[256])(u8) =
+{
+/* 0x00 */ x86emuOp2_illegal_op, /* Group F (ring 0 PM) */
+/* 0x01 */ x86emuOp2_illegal_op, /* Group G (ring 0 PM) */
+/* 0x02 */ x86emuOp2_illegal_op, /* lar (ring 0 PM) */
+/* 0x03 */ x86emuOp2_illegal_op, /* lsl (ring 0 PM) */
+/* 0x04 */ x86emuOp2_illegal_op,
+/* 0x05 */ x86emuOp2_illegal_op, /* loadall (undocumented) */
+/* 0x06 */ x86emuOp2_illegal_op, /* clts (ring 0 PM) */
+/* 0x07 */ x86emuOp2_illegal_op, /* loadall (undocumented) */
+/* 0x08 */ x86emuOp2_illegal_op, /* invd (ring 0 PM) */
+/* 0x09 */ x86emuOp2_illegal_op, /* wbinvd (ring 0 PM) */
+/* 0x0a */ x86emuOp2_illegal_op,
+/* 0x0b */ x86emuOp2_illegal_op,
+/* 0x0c */ x86emuOp2_illegal_op,
+/* 0x0d */ x86emuOp2_illegal_op,
+/* 0x0e */ x86emuOp2_illegal_op,
+/* 0x0f */ x86emuOp2_illegal_op,
+
+/* 0x10 */ x86emuOp2_illegal_op,
+/* 0x11 */ x86emuOp2_illegal_op,
+/* 0x12 */ x86emuOp2_illegal_op,
+/* 0x13 */ x86emuOp2_illegal_op,
+/* 0x14 */ x86emuOp2_illegal_op,
+/* 0x15 */ x86emuOp2_illegal_op,
+/* 0x16 */ x86emuOp2_illegal_op,
+/* 0x17 */ x86emuOp2_illegal_op,
+/* 0x18 */ x86emuOp2_illegal_op,
+/* 0x19 */ x86emuOp2_illegal_op,
+/* 0x1a */ x86emuOp2_illegal_op,
+/* 0x1b */ x86emuOp2_illegal_op,
+/* 0x1c */ x86emuOp2_illegal_op,
+/* 0x1d */ x86emuOp2_illegal_op,
+/* 0x1e */ x86emuOp2_illegal_op,
+/* 0x1f */ x86emuOp2_illegal_op,
+
+/* 0x20 */ x86emuOp2_illegal_op, /* mov reg32,creg (ring 0 PM) */
+/* 0x21 */ x86emuOp2_illegal_op, /* mov reg32,dreg (ring 0 PM) */
+/* 0x22 */ x86emuOp2_illegal_op, /* mov creg,reg32 (ring 0 PM) */
+/* 0x23 */ x86emuOp2_illegal_op, /* mov dreg,reg32 (ring 0 PM) */
+/* 0x24 */ x86emuOp2_illegal_op, /* mov reg32,treg (ring 0 PM) */
+/* 0x25 */ x86emuOp2_illegal_op,
+/* 0x26 */ x86emuOp2_illegal_op, /* mov treg,reg32 (ring 0 PM) */
+/* 0x27 */ x86emuOp2_illegal_op,
+/* 0x28 */ x86emuOp2_illegal_op,
+/* 0x29 */ x86emuOp2_illegal_op,
+/* 0x2a */ x86emuOp2_illegal_op,
+/* 0x2b */ x86emuOp2_illegal_op,
+/* 0x2c */ x86emuOp2_illegal_op,
+/* 0x2d */ x86emuOp2_illegal_op,
+/* 0x2e */ x86emuOp2_illegal_op,
+/* 0x2f */ x86emuOp2_illegal_op,
+
+/* 0x30 */ x86emuOp2_illegal_op,
+/* 0x31 */ x86emuOp2_illegal_op,
+/* 0x32 */ x86emuOp2_illegal_op,
+/* 0x33 */ x86emuOp2_illegal_op,
+/* 0x34 */ x86emuOp2_illegal_op,
+/* 0x35 */ x86emuOp2_illegal_op,
+/* 0x36 */ x86emuOp2_illegal_op,
+/* 0x37 */ x86emuOp2_illegal_op,
+/* 0x38 */ x86emuOp2_illegal_op,
+/* 0x39 */ x86emuOp2_illegal_op,
+/* 0x3a */ x86emuOp2_illegal_op,
+/* 0x3b */ x86emuOp2_illegal_op,
+/* 0x3c */ x86emuOp2_illegal_op,
+/* 0x3d */ x86emuOp2_illegal_op,
+/* 0x3e */ x86emuOp2_illegal_op,
+/* 0x3f */ x86emuOp2_illegal_op,
+
+/* 0x40 */ x86emuOp2_illegal_op,
+/* 0x41 */ x86emuOp2_illegal_op,
+/* 0x42 */ x86emuOp2_illegal_op,
+/* 0x43 */ x86emuOp2_illegal_op,
+/* 0x44 */ x86emuOp2_illegal_op,
+/* 0x45 */ x86emuOp2_illegal_op,
+/* 0x46 */ x86emuOp2_illegal_op,
+/* 0x47 */ x86emuOp2_illegal_op,
+/* 0x48 */ x86emuOp2_illegal_op,
+/* 0x49 */ x86emuOp2_illegal_op,
+/* 0x4a */ x86emuOp2_illegal_op,
+/* 0x4b */ x86emuOp2_illegal_op,
+/* 0x4c */ x86emuOp2_illegal_op,
+/* 0x4d */ x86emuOp2_illegal_op,
+/* 0x4e */ x86emuOp2_illegal_op,
+/* 0x4f */ x86emuOp2_illegal_op,
+
+/* 0x50 */ x86emuOp2_illegal_op,
+/* 0x51 */ x86emuOp2_illegal_op,
+/* 0x52 */ x86emuOp2_illegal_op,
+/* 0x53 */ x86emuOp2_illegal_op,
+/* 0x54 */ x86emuOp2_illegal_op,
+/* 0x55 */ x86emuOp2_illegal_op,
+/* 0x56 */ x86emuOp2_illegal_op,
+/* 0x57 */ x86emuOp2_illegal_op,
+/* 0x58 */ x86emuOp2_illegal_op,
+/* 0x59 */ x86emuOp2_illegal_op,
+/* 0x5a */ x86emuOp2_illegal_op,
+/* 0x5b */ x86emuOp2_illegal_op,
+/* 0x5c */ x86emuOp2_illegal_op,
+/* 0x5d */ x86emuOp2_illegal_op,
+/* 0x5e */ x86emuOp2_illegal_op,
+/* 0x5f */ x86emuOp2_illegal_op,
+
+/* 0x60 */ x86emuOp2_illegal_op,
+/* 0x61 */ x86emuOp2_illegal_op,
+/* 0x62 */ x86emuOp2_illegal_op,
+/* 0x63 */ x86emuOp2_illegal_op,
+/* 0x64 */ x86emuOp2_illegal_op,
+/* 0x65 */ x86emuOp2_illegal_op,
+/* 0x66 */ x86emuOp2_illegal_op,
+/* 0x67 */ x86emuOp2_illegal_op,
+/* 0x68 */ x86emuOp2_illegal_op,
+/* 0x69 */ x86emuOp2_illegal_op,
+/* 0x6a */ x86emuOp2_illegal_op,
+/* 0x6b */ x86emuOp2_illegal_op,
+/* 0x6c */ x86emuOp2_illegal_op,
+/* 0x6d */ x86emuOp2_illegal_op,
+/* 0x6e */ x86emuOp2_illegal_op,
+/* 0x6f */ x86emuOp2_illegal_op,
+
+/* 0x70 */ x86emuOp2_illegal_op,
+/* 0x71 */ x86emuOp2_illegal_op,
+/* 0x72 */ x86emuOp2_illegal_op,
+/* 0x73 */ x86emuOp2_illegal_op,
+/* 0x74 */ x86emuOp2_illegal_op,
+/* 0x75 */ x86emuOp2_illegal_op,
+/* 0x76 */ x86emuOp2_illegal_op,
+/* 0x77 */ x86emuOp2_illegal_op,
+/* 0x78 */ x86emuOp2_illegal_op,
+/* 0x79 */ x86emuOp2_illegal_op,
+/* 0x7a */ x86emuOp2_illegal_op,
+/* 0x7b */ x86emuOp2_illegal_op,
+/* 0x7c */ x86emuOp2_illegal_op,
+/* 0x7d */ x86emuOp2_illegal_op,
+/* 0x7e */ x86emuOp2_illegal_op,
+/* 0x7f */ x86emuOp2_illegal_op,
+
+/* 0x80 */ x86emuOp2_long_jump,
+/* 0x81 */ x86emuOp2_long_jump,
+/* 0x82 */ x86emuOp2_long_jump,
+/* 0x83 */ x86emuOp2_long_jump,
+/* 0x84 */ x86emuOp2_long_jump,
+/* 0x85 */ x86emuOp2_long_jump,
+/* 0x86 */ x86emuOp2_long_jump,
+/* 0x87 */ x86emuOp2_long_jump,
+/* 0x88 */ x86emuOp2_long_jump,
+/* 0x89 */ x86emuOp2_long_jump,
+/* 0x8a */ x86emuOp2_long_jump,
+/* 0x8b */ x86emuOp2_long_jump,
+/* 0x8c */ x86emuOp2_long_jump,
+/* 0x8d */ x86emuOp2_long_jump,
+/* 0x8e */ x86emuOp2_long_jump,
+/* 0x8f */ x86emuOp2_long_jump,
+
+/* 0x90 */ x86emuOp2_set_byte,
+/* 0x91 */ x86emuOp2_set_byte,
+/* 0x92 */ x86emuOp2_set_byte,
+/* 0x93 */ x86emuOp2_set_byte,
+/* 0x94 */ x86emuOp2_set_byte,
+/* 0x95 */ x86emuOp2_set_byte,
+/* 0x96 */ x86emuOp2_set_byte,
+/* 0x97 */ x86emuOp2_set_byte,
+/* 0x98 */ x86emuOp2_set_byte,
+/* 0x99 */ x86emuOp2_set_byte,
+/* 0x9a */ x86emuOp2_set_byte,
+/* 0x9b */ x86emuOp2_set_byte,
+/* 0x9c */ x86emuOp2_set_byte,
+/* 0x9d */ x86emuOp2_set_byte,
+/* 0x9e */ x86emuOp2_set_byte,
+/* 0x9f */ x86emuOp2_set_byte,
+
+/* 0xa0 */ x86emuOp2_push_FS,
+/* 0xa1 */ x86emuOp2_pop_FS,
+/* 0xa2 */ x86emuOp2_illegal_op,
+/* 0xa3 */ x86emuOp2_bt_R,
+/* 0xa4 */ x86emuOp2_shld_IMM,
+/* 0xa5 */ x86emuOp2_shld_CL,
+/* 0xa6 */ x86emuOp2_illegal_op,
+/* 0xa7 */ x86emuOp2_illegal_op,
+/* 0xa8 */ x86emuOp2_push_GS,
+/* 0xa9 */ x86emuOp2_pop_GS,
+/* 0xaa */ x86emuOp2_illegal_op,
+/* 0xab */ x86emuOp2_bt_R,
+/* 0xac */ x86emuOp2_shrd_IMM,
+/* 0xad */ x86emuOp2_shrd_CL,
+/* 0xae */ x86emuOp2_illegal_op,
+/* 0xaf */ x86emuOp2_imul_R_RM,
+
+/* 0xb0 */ x86emuOp2_illegal_op, /* TODO: cmpxchg */
+/* 0xb1 */ x86emuOp2_illegal_op, /* TODO: cmpxchg */
+/* 0xb2 */ x86emuOp2_lss_R_IMM,
+/* 0xb3 */ x86emuOp2_btr_R,
+/* 0xb4 */ x86emuOp2_lfs_R_IMM,
+/* 0xb5 */ x86emuOp2_lgs_R_IMM,
+/* 0xb6 */ x86emuOp2_movzx_byte_R_RM,
+/* 0xb7 */ x86emuOp2_movzx_word_R_RM,
+/* 0xb8 */ x86emuOp2_illegal_op,
+/* 0xb9 */ x86emuOp2_illegal_op,
+/* 0xba */ x86emuOp2_btX_I,
+/* 0xbb */ x86emuOp2_btc_R,
+/* 0xbc */ x86emuOp2_bsf,
+/* 0xbd */ x86emuOp2_bsr,
+/* 0xbe */ x86emuOp2_movsx_byte_R_RM,
+/* 0xbf */ x86emuOp2_movsx_word_R_RM,
+
+/* 0xc0 */ x86emuOp2_illegal_op, /* TODO: xadd */
+/* 0xc1 */ x86emuOp2_illegal_op, /* TODO: xadd */
+/* 0xc2 */ x86emuOp2_illegal_op,
+/* 0xc3 */ x86emuOp2_illegal_op,
+/* 0xc4 */ x86emuOp2_illegal_op,
+/* 0xc5 */ x86emuOp2_illegal_op,
+/* 0xc6 */ x86emuOp2_illegal_op,
+/* 0xc7 */ x86emuOp2_illegal_op,
+/* 0xc8 */ x86emuOp2_illegal_op, /* TODO: bswap */
+/* 0xc9 */ x86emuOp2_illegal_op, /* TODO: bswap */
+/* 0xca */ x86emuOp2_illegal_op, /* TODO: bswap */
+/* 0xcb */ x86emuOp2_illegal_op, /* TODO: bswap */
+/* 0xcc */ x86emuOp2_illegal_op, /* TODO: bswap */
+/* 0xcd */ x86emuOp2_illegal_op, /* TODO: bswap */
+/* 0xce */ x86emuOp2_illegal_op, /* TODO: bswap */
+/* 0xcf */ x86emuOp2_illegal_op, /* TODO: bswap */
+
+/* 0xd0 */ x86emuOp2_illegal_op,
+/* 0xd1 */ x86emuOp2_illegal_op,
+/* 0xd2 */ x86emuOp2_illegal_op,
+/* 0xd3 */ x86emuOp2_illegal_op,
+/* 0xd4 */ x86emuOp2_illegal_op,
+/* 0xd5 */ x86emuOp2_illegal_op,
+/* 0xd6 */ x86emuOp2_illegal_op,
+/* 0xd7 */ x86emuOp2_illegal_op,
+/* 0xd8 */ x86emuOp2_illegal_op,
+/* 0xd9 */ x86emuOp2_illegal_op,
+/* 0xda */ x86emuOp2_illegal_op,
+/* 0xdb */ x86emuOp2_illegal_op,
+/* 0xdc */ x86emuOp2_illegal_op,
+/* 0xdd */ x86emuOp2_illegal_op,
+/* 0xde */ x86emuOp2_illegal_op,
+/* 0xdf */ x86emuOp2_illegal_op,
+
+/* 0xe0 */ x86emuOp2_illegal_op,
+/* 0xe1 */ x86emuOp2_illegal_op,
+/* 0xe2 */ x86emuOp2_illegal_op,
+/* 0xe3 */ x86emuOp2_illegal_op,
+/* 0xe4 */ x86emuOp2_illegal_op,
+/* 0xe5 */ x86emuOp2_illegal_op,
+/* 0xe6 */ x86emuOp2_illegal_op,
+/* 0xe7 */ x86emuOp2_illegal_op,
+/* 0xe8 */ x86emuOp2_illegal_op,
+/* 0xe9 */ x86emuOp2_illegal_op,
+/* 0xea */ x86emuOp2_illegal_op,
+/* 0xeb */ x86emuOp2_illegal_op,
+/* 0xec */ x86emuOp2_illegal_op,
+/* 0xed */ x86emuOp2_illegal_op,
+/* 0xee */ x86emuOp2_illegal_op,
+/* 0xef */ x86emuOp2_illegal_op,
+
+/* 0xf0 */ x86emuOp2_illegal_op,
+/* 0xf1 */ x86emuOp2_illegal_op,
+/* 0xf2 */ x86emuOp2_illegal_op,
+/* 0xf3 */ x86emuOp2_illegal_op,
+/* 0xf4 */ x86emuOp2_illegal_op,
+/* 0xf5 */ x86emuOp2_illegal_op,
+/* 0xf6 */ x86emuOp2_illegal_op,
+/* 0xf7 */ x86emuOp2_illegal_op,
+/* 0xf8 */ x86emuOp2_illegal_op,
+/* 0xf9 */ x86emuOp2_illegal_op,
+/* 0xfa */ x86emuOp2_illegal_op,
+/* 0xfb */ x86emuOp2_illegal_op,
+/* 0xfc */ x86emuOp2_illegal_op,
+/* 0xfd */ x86emuOp2_illegal_op,
+/* 0xfe */ x86emuOp2_illegal_op,
+/* 0xff */ x86emuOp2_illegal_op,
+};
--- /dev/null
+/****************************************************************************
+*
+* Realmode X86 Emulator Library
+*
+* Copyright (C) 1996-1999 SciTech Software, Inc.
+* Copyright (C) David Mosberger-Tang
+* Copyright (C) 1999 Egbert Eich
+*
+* ========================================================================
+*
+* Permission to use, copy, modify, distribute, and sell this software and
+* its documentation for any purpose is hereby granted without fee,
+* provided that the above copyright notice appear in all copies and that
+* both that copyright notice and this permission notice appear in
+* supporting documentation, and that the name of the authors not be used
+* in advertising or publicity pertaining to distribution of the software
+* without specific, written prior permission. The authors makes no
+* representations about the suitability of this software for any purpose.
+* It is provided "as is" without express or implied warranty.
+*
+* THE AUTHORS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+* EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
+* USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
+* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+* PERFORMANCE OF THIS SOFTWARE.
+*
+* ========================================================================
+*
+* Language: ANSI C
+* Environment: Any
+* Developer: Kendall Bennett
+*
+* Description: This file contains the code to implement the primitive
+* machine operations used by the emulation code in ops.c
+*
+* Carry Chain Calculation
+*
+* This represents a somewhat expensive calculation which is
+* apparently required to emulate the setting of the OF and AF flag.
+* The latter is not so important, but the former is. The overflow
+* flag is the XOR of the top two bits of the carry chain for an
+* addition (similar for subtraction). Since we do not want to
+* simulate the addition in a bitwise manner, we try to calculate the
+* carry chain given the two operands and the result.
+*
+* So, given the following table, which represents the addition of two
+* bits, we can derive a formula for the carry chain.
+*
+* a b cin r cout
+* 0 0 0 0 0
+* 0 0 1 1 0
+* 0 1 0 1 0
+* 0 1 1 0 1
+* 1 0 0 1 0
+* 1 0 1 0 1
+* 1 1 0 0 1
+* 1 1 1 1 1
+*
+* Construction of table for cout:
+*
+* ab
+* r \ 00 01 11 10
+* |------------------
+* 0 | 0 1 1 1
+* 1 | 0 0 1 0
+*
+* By inspection, one gets: cc = ab + r'(a + b)
+*
+* That represents alot of operations, but NO CHOICE....
+*
+* Borrow Chain Calculation.
+*
+* The following table represents the subtraction of two bits, from
+* which we can derive a formula for the borrow chain.
+*
+* a b bin r bout
+* 0 0 0 0 0
+* 0 0 1 1 1
+* 0 1 0 1 1
+* 0 1 1 0 1
+* 1 0 0 1 0
+* 1 0 1 0 0
+* 1 1 0 0 0
+* 1 1 1 1 1
+*
+* Construction of table for cout:
+*
+* ab
+* r \ 00 01 11 10
+* |------------------
+* 0 | 0 1 0 0
+* 1 | 1 1 1 0
+*
+* By inspection, one gets: bc = a'b + r(a' + b)
+*
+****************************************************************************/
+
+#define PRIM_OPS_NO_REDEFINE_ASM
+#include "x86emu/x86emui.h"
+
+/*------------------------- Global Variables ------------------------------*/
+
+static u32 x86emu_parity_tab[8] =
+{
+ 0x96696996,
+ 0x69969669,
+ 0x69969669,
+ 0x96696996,
+ 0x69969669,
+ 0x96696996,
+ 0x96696996,
+ 0x69969669,
+};
+
+#define PARITY(x) (((x86emu_parity_tab[(x) / 32] >> ((x) % 32)) & 1) == 0)
+#define XOR2(x) (((x) ^ ((x)>>1)) & 0x1)
+
+/*----------------------------- Implementation ----------------------------*/
+
+/****************************************************************************
+REMARKS:
+Implements the AAA instruction and side effects.
+****************************************************************************/
+u16 aaa_word(u16 d)
+{
+ u16 res;
+ if ((d & 0xf) > 0x9 || ACCESS_FLAG(F_AF)) {
+ d += 0x6;
+ d += 0x100;
+ SET_FLAG(F_AF);
+ SET_FLAG(F_CF);
+ } else {
+ CLEAR_FLAG(F_CF);
+ CLEAR_FLAG(F_AF);
+ }
+ res = (u16)(d & 0xFF0F);
+ CLEAR_FLAG(F_SF);
+ CONDITIONAL_SET_FLAG(res == 0, F_ZF);
+ CONDITIONAL_SET_FLAG(PARITY(res & 0xff), F_PF);
+ return res;
+}
+
+/****************************************************************************
+REMARKS:
+Implements the AAA instruction and side effects.
+****************************************************************************/
+u16 aas_word(u16 d)
+{
+ u16 res;
+ if ((d & 0xf) > 0x9 || ACCESS_FLAG(F_AF)) {
+ d -= 0x6;
+ d -= 0x100;
+ SET_FLAG(F_AF);
+ SET_FLAG(F_CF);
+ } else {
+ CLEAR_FLAG(F_CF);
+ CLEAR_FLAG(F_AF);
+ }
+ res = (u16)(d & 0xFF0F);
+ CLEAR_FLAG(F_SF);
+ CONDITIONAL_SET_FLAG(res == 0, F_ZF);
+ CONDITIONAL_SET_FLAG(PARITY(res & 0xff), F_PF);
+ return res;
+}
+
+/****************************************************************************
+REMARKS:
+Implements the AAD instruction and side effects.
+****************************************************************************/
+u16 aad_word(u16 d)
+{
+ u16 l;
+ u8 hb, lb;
+
+ hb = (u8)((d >> 8) & 0xff);
+ lb = (u8)((d & 0xff));
+ l = (u16)((lb + 10 * hb) & 0xFF);
+
+ CLEAR_FLAG(F_CF);
+ CLEAR_FLAG(F_AF);
+ CLEAR_FLAG(F_OF);
+ CONDITIONAL_SET_FLAG(l & 0x80, F_SF);
+ CONDITIONAL_SET_FLAG(l == 0, F_ZF);
+ CONDITIONAL_SET_FLAG(PARITY(l & 0xff), F_PF);
+ return l;
+}
+
+/****************************************************************************
+REMARKS:
+Implements the AAM instruction and side effects.
+****************************************************************************/
+u16 aam_word(u8 d)
+{
+ u16 h, l;
+
+ h = (u16)(d / 10);
+ l = (u16)(d % 10);
+ l |= (u16)(h << 8);
+
+ CLEAR_FLAG(F_CF);
+ CLEAR_FLAG(F_AF);
+ CLEAR_FLAG(F_OF);
+ CONDITIONAL_SET_FLAG(l & 0x80, F_SF);
+ CONDITIONAL_SET_FLAG(l == 0, F_ZF);
+ CONDITIONAL_SET_FLAG(PARITY(l & 0xff), F_PF);
+ return l;
+}
+
+/****************************************************************************
+REMARKS:
+Implements the ADC instruction and side effects.
+****************************************************************************/
+u8 adc_byte(u8 d, u8 s)
+{
+ register u32 res; /* all operands in native machine order */
+ register u32 cc;
+
+ if (ACCESS_FLAG(F_CF))
+ res = 1 + d + s;
+ else
+ res = d + s;
+
+ CONDITIONAL_SET_FLAG(res & 0x100, F_CF);
+ CONDITIONAL_SET_FLAG((res & 0xff) == 0, F_ZF);
+ CONDITIONAL_SET_FLAG(res & 0x80, F_SF);
+ CONDITIONAL_SET_FLAG(PARITY(res & 0xff), F_PF);
+
+ /* calculate the carry chain SEE NOTE AT TOP. */
+ cc = (s & d) | ((~res) & (s | d));
+ CONDITIONAL_SET_FLAG(XOR2(cc >> 6), F_OF);
+ CONDITIONAL_SET_FLAG(cc & 0x8, F_AF);
+ return (u8)res;
+}
+
+/****************************************************************************
+REMARKS:
+Implements the ADC instruction and side effects.
+****************************************************************************/
+u16 adc_word(u16 d, u16 s)
+{
+ register u32 res; /* all operands in native machine order */
+ register u32 cc;
+
+ if (ACCESS_FLAG(F_CF))
+ res = 1 + d + s;
+ else
+ res = d + s;
+
+ CONDITIONAL_SET_FLAG(res & 0x10000, F_CF);
+ CONDITIONAL_SET_FLAG((res & 0xffff) == 0, F_ZF);
+ CONDITIONAL_SET_FLAG(res & 0x8000, F_SF);
+ CONDITIONAL_SET_FLAG(PARITY(res & 0xff), F_PF);
+
+ /* calculate the carry chain SEE NOTE AT TOP. */
+ cc = (s & d) | ((~res) & (s | d));
+ CONDITIONAL_SET_FLAG(XOR2(cc >> 14), F_OF);
+ CONDITIONAL_SET_FLAG(cc & 0x8, F_AF);
+ return (u16)res;
+}
+
+/****************************************************************************
+REMARKS:
+Implements the ADC instruction and side effects.
+****************************************************************************/
+u32 adc_long(u32 d, u32 s)
+{
+ register u32 lo; /* all operands in native machine order */
+ register u32 hi;
+ register u32 res;
+ register u32 cc;
+
+ if (ACCESS_FLAG(F_CF)) {
+ lo = 1 + (d & 0xFFFF) + (s & 0xFFFF);
+ res = 1 + d + s;
+ }
+ else {
+ lo = (d & 0xFFFF) + (s & 0xFFFF);
+ res = d + s;
+ }
+ hi = (lo >> 16) + (d >> 16) + (s >> 16);
+
+ CONDITIONAL_SET_FLAG(hi & 0x10000, F_CF);
+ CONDITIONAL_SET_FLAG((res & 0xffffffff) == 0, F_ZF);
+ CONDITIONAL_SET_FLAG(res & 0x80000000, F_SF);
+ CONDITIONAL_SET_FLAG(PARITY(res & 0xff), F_PF);
+
+ /* calculate the carry chain SEE NOTE AT TOP. */
+ cc = (s & d) | ((~res) & (s | d));
+ CONDITIONAL_SET_FLAG(XOR2(cc >> 30), F_OF);
+ CONDITIONAL_SET_FLAG(cc & 0x8, F_AF);
+ return res;
+}
+
+/****************************************************************************
+REMARKS:
+Implements the ADD instruction and side effects.
+****************************************************************************/
+u8 add_byte(u8 d, u8 s)
+{
+ register u32 res; /* all operands in native machine order */
+ register u32 cc;
+
+ res = d + s;
+ CONDITIONAL_SET_FLAG(res & 0x100, F_CF);
+ CONDITIONAL_SET_FLAG((res & 0xff) == 0, F_ZF);
+ CONDITIONAL_SET_FLAG(res & 0x80, F_SF);
+ CONDITIONAL_SET_FLAG(PARITY(res & 0xff), F_PF);
+
+ /* calculate the carry chain SEE NOTE AT TOP. */
+ cc = (s & d) | ((~res) & (s | d));
+ CONDITIONAL_SET_FLAG(XOR2(cc >> 6), F_OF);
+ CONDITIONAL_SET_FLAG(cc & 0x8, F_AF);
+ return (u8)res;
+}
+
+/****************************************************************************
+REMARKS:
+Implements the ADD instruction and side effects.
+****************************************************************************/
+u16 add_word(u16 d, u16 s)
+{
+ register u32 res; /* all operands in native machine order */
+ register u32 cc;
+
+ res = d + s;
+ CONDITIONAL_SET_FLAG(res & 0x10000, F_CF);
+ CONDITIONAL_SET_FLAG((res & 0xffff) == 0, F_ZF);
+ CONDITIONAL_SET_FLAG(res & 0x8000, F_SF);
+ CONDITIONAL_SET_FLAG(PARITY(res & 0xff), F_PF);
+
+ /* calculate the carry chain SEE NOTE AT TOP. */
+ cc = (s & d) | ((~res) & (s | d));
+ CONDITIONAL_SET_FLAG(XOR2(cc >> 14), F_OF);
+ CONDITIONAL_SET_FLAG(cc & 0x8, F_AF);
+ return (u16)res;
+}
+
+/****************************************************************************
+REMARKS:
+Implements the ADD instruction and side effects.
+****************************************************************************/
+u32 add_long(u32 d, u32 s)
+{
+ register u32 lo; /* all operands in native machine order */
+ register u32 hi;
+ register u32 res;
+ register u32 cc;
+
+ lo = (d & 0xFFFF) + (s & 0xFFFF);
+ res = d + s;
+ hi = (lo >> 16) + (d >> 16) + (s >> 16);
+
+ CONDITIONAL_SET_FLAG(hi & 0x10000, F_CF);
+ CONDITIONAL_SET_FLAG((res & 0xffffffff) == 0, F_ZF);
+ CONDITIONAL_SET_FLAG(res & 0x80000000, F_SF);
+ CONDITIONAL_SET_FLAG(PARITY(res & 0xff), F_PF);
+
+ /* calculate the carry chain SEE NOTE AT TOP. */
+ cc = (s & d) | ((~res) & (s | d));
+ CONDITIONAL_SET_FLAG(XOR2(cc >> 30), F_OF);
+ CONDITIONAL_SET_FLAG(cc & 0x8, F_AF);
+
+ return res;
+}
+
+/****************************************************************************
+REMARKS:
+Implements the AND instruction and side effects.
+****************************************************************************/
+u8 and_byte(u8 d, u8 s)
+{
+ register u8 res; /* all operands in native machine order */
+
+ res = d & s;
+
+ /* set the flags */
+ CLEAR_FLAG(F_OF);
+ CLEAR_FLAG(F_CF);
+ CLEAR_FLAG(F_AF);
+ CONDITIONAL_SET_FLAG(res & 0x80, F_SF);
+ CONDITIONAL_SET_FLAG(res == 0, F_ZF);
+ CONDITIONAL_SET_FLAG(PARITY(res), F_PF);
+ return res;
+}
+
+/****************************************************************************
+REMARKS:
+Implements the AND instruction and side effects.
+****************************************************************************/
+u16 and_word(u16 d, u16 s)
+{
+ register u16 res; /* all operands in native machine order */
+
+ res = d & s;
+
+ /* set the flags */
+ CLEAR_FLAG(F_OF);
+ CLEAR_FLAG(F_CF);
+ CLEAR_FLAG(F_AF);
+ CONDITIONAL_SET_FLAG(res & 0x8000, F_SF);
+ CONDITIONAL_SET_FLAG(res == 0, F_ZF);
+ CONDITIONAL_SET_FLAG(PARITY(res & 0xff), F_PF);
+ return res;
+}
+
+/****************************************************************************
+REMARKS:
+Implements the AND instruction and side effects.
+****************************************************************************/
+u32 and_long(u32 d, u32 s)
+{
+ register u32 res; /* all operands in native machine order */
+
+ res = d & s;
+
+ /* set the flags */
+ CLEAR_FLAG(F_OF);
+ CLEAR_FLAG(F_CF);
+ CLEAR_FLAG(F_AF);
+ CONDITIONAL_SET_FLAG(res & 0x80000000, F_SF);
+ CONDITIONAL_SET_FLAG(res == 0, F_ZF);
+ CONDITIONAL_SET_FLAG(PARITY(res & 0xff), F_PF);
+ return res;
+}
+
+/****************************************************************************
+REMARKS:
+Implements the CMP instruction and side effects.
+****************************************************************************/
+u8 cmp_byte(u8 d, u8 s)
+{
+ register u32 res; /* all operands in native machine order */
+ register u32 bc;
+
+ res = d - s;
+ CLEAR_FLAG(F_CF);
+ CONDITIONAL_SET_FLAG(res & 0x80, F_SF);
+ CONDITIONAL_SET_FLAG((res & 0xff) == 0, F_ZF);
+ CONDITIONAL_SET_FLAG(PARITY(res & 0xff), F_PF);
+
+ /* calculate the borrow chain. See note at top */
+ bc = (res & (~d | s)) | (~d & s);
+ CONDITIONAL_SET_FLAG(bc & 0x80, F_CF);
+ CONDITIONAL_SET_FLAG(XOR2(bc >> 6), F_OF);
+ CONDITIONAL_SET_FLAG(bc & 0x8, F_AF);
+ return d;
+}
+
+/****************************************************************************
+REMARKS:
+Implements the CMP instruction and side effects.
+****************************************************************************/
+u16 cmp_word(u16 d, u16 s)
+{
+ register u32 res; /* all operands in native machine order */
+ register u32 bc;
+
+ res = d - s;
+ CONDITIONAL_SET_FLAG(res & 0x8000, F_SF);
+ CONDITIONAL_SET_FLAG((res & 0xffff) == 0, F_ZF);
+ CONDITIONAL_SET_FLAG(PARITY(res & 0xff), F_PF);
+
+ /* calculate the borrow chain. See note at top */
+ bc = (res & (~d | s)) | (~d & s);
+ CONDITIONAL_SET_FLAG(bc & 0x8000, F_CF);
+ CONDITIONAL_SET_FLAG(XOR2(bc >> 14), F_OF);
+ CONDITIONAL_SET_FLAG(bc & 0x8, F_AF);
+ return d;
+}
+
+/****************************************************************************
+REMARKS:
+Implements the CMP instruction and side effects.
+****************************************************************************/
+u32 cmp_long(u32 d, u32 s)
+{
+ register u32 res; /* all operands in native machine order */
+ register u32 bc;
+
+ res = d - s;
+ CONDITIONAL_SET_FLAG(res & 0x80000000, F_SF);
+ CONDITIONAL_SET_FLAG((res & 0xffffffff) == 0, F_ZF);
+ CONDITIONAL_SET_FLAG(PARITY(res & 0xff), F_PF);
+
+ /* calculate the borrow chain. See note at top */
+ bc = (res & (~d | s)) | (~d & s);
+ CONDITIONAL_SET_FLAG(bc & 0x80000000, F_CF);
+ CONDITIONAL_SET_FLAG(XOR2(bc >> 30), F_OF);
+ CONDITIONAL_SET_FLAG(bc & 0x8, F_AF);
+ return d;
+}
+
+/****************************************************************************
+REMARKS:
+Implements the DAA instruction and side effects.
+****************************************************************************/
+u8 daa_byte(u8 d)
+{
+ u32 res = d;
+ if ((d & 0xf) > 9 || ACCESS_FLAG(F_AF)) {
+ res += 6;
+ SET_FLAG(F_AF);
+ }
+ if (res > 0x9F || ACCESS_FLAG(F_CF)) {
+ res += 0x60;
+ SET_FLAG(F_CF);
+ }
+ CONDITIONAL_SET_FLAG(res & 0x80, F_SF);
+ CONDITIONAL_SET_FLAG((res & 0xFF) == 0, F_ZF);
+ CONDITIONAL_SET_FLAG(PARITY(res & 0xff), F_PF);
+ return (u8)res;
+}
+
+/****************************************************************************
+REMARKS:
+Implements the DAS instruction and side effects.
+****************************************************************************/
+u8 das_byte(u8 d)
+{
+ if ((d & 0xf) > 9 || ACCESS_FLAG(F_AF)) {
+ d -= 6;
+ SET_FLAG(F_AF);
+ }
+ if (d > 0x9F || ACCESS_FLAG(F_CF)) {
+ d -= 0x60;
+ SET_FLAG(F_CF);
+ }
+ CONDITIONAL_SET_FLAG(d & 0x80, F_SF);
+ CONDITIONAL_SET_FLAG(d == 0, F_ZF);
+ CONDITIONAL_SET_FLAG(PARITY(d & 0xff), F_PF);
+ return d;
+}
+
+/****************************************************************************
+REMARKS:
+Implements the DEC instruction and side effects.
+****************************************************************************/
+u8 dec_byte(u8 d)
+{
+ register u32 res; /* all operands in native machine order */
+ register u32 bc;
+
+ res = d - 1;
+ CONDITIONAL_SET_FLAG(res & 0x80, F_SF);
+ CONDITIONAL_SET_FLAG((res & 0xff) == 0, F_ZF);
+ CONDITIONAL_SET_FLAG(PARITY(res & 0xff), F_PF);
+
+ /* calculate the borrow chain. See note at top */
+ /* based on sub_byte, uses s==1. */
+ bc = (res & (~d | 1)) | (~d & 1);
+ /* carry flag unchanged */
+ CONDITIONAL_SET_FLAG(XOR2(bc >> 6), F_OF);
+ CONDITIONAL_SET_FLAG(bc & 0x8, F_AF);
+ return (u8)res;
+}
+
+/****************************************************************************
+REMARKS:
+Implements the DEC instruction and side effects.
+****************************************************************************/
+u16 dec_word(u16 d)
+{
+ register u32 res; /* all operands in native machine order */
+ register u32 bc;
+
+ res = d - 1;
+ CONDITIONAL_SET_FLAG(res & 0x8000, F_SF);
+ CONDITIONAL_SET_FLAG((res & 0xffff) == 0, F_ZF);
+ CONDITIONAL_SET_FLAG(PARITY(res & 0xff), F_PF);
+
+ /* calculate the borrow chain. See note at top */
+ /* based on the sub_byte routine, with s==1 */
+ bc = (res & (~d | 1)) | (~d & 1);
+ /* carry flag unchanged */
+ CONDITIONAL_SET_FLAG(XOR2(bc >> 14), F_OF);
+ CONDITIONAL_SET_FLAG(bc & 0x8, F_AF);
+ return (u16)res;
+}
+
+/****************************************************************************
+REMARKS:
+Implements the DEC instruction and side effects.
+****************************************************************************/
+u32 dec_long(u32 d)
+{
+ register u32 res; /* all operands in native machine order */
+ register u32 bc;
+
+ res = d - 1;
+
+ CONDITIONAL_SET_FLAG(res & 0x80000000, F_SF);
+ CONDITIONAL_SET_FLAG((res & 0xffffffff) == 0, F_ZF);
+ CONDITIONAL_SET_FLAG(PARITY(res & 0xff), F_PF);
+
+ /* calculate the borrow chain. See note at top */
+ bc = (res & (~d | 1)) | (~d & 1);
+ /* carry flag unchanged */
+ CONDITIONAL_SET_FLAG(XOR2(bc >> 30), F_OF);
+ CONDITIONAL_SET_FLAG(bc & 0x8, F_AF);
+ return res;
+}
+
+/****************************************************************************
+REMARKS:
+Implements the INC instruction and side effects.
+****************************************************************************/
+u8 inc_byte(u8 d)
+{
+ register u32 res; /* all operands in native machine order */
+ register u32 cc;
+
+ res = d + 1;
+ CONDITIONAL_SET_FLAG((res & 0xff) == 0, F_ZF);
+ CONDITIONAL_SET_FLAG(res & 0x80, F_SF);
+ CONDITIONAL_SET_FLAG(PARITY(res & 0xff), F_PF);
+
+ /* calculate the carry chain SEE NOTE AT TOP. */
+ cc = ((1 & d) | (~res)) & (1 | d);
+ CONDITIONAL_SET_FLAG(XOR2(cc >> 6), F_OF);
+ CONDITIONAL_SET_FLAG(cc & 0x8, F_AF);
+ return (u8)res;
+}
+
+/****************************************************************************
+REMARKS:
+Implements the INC instruction and side effects.
+****************************************************************************/
+u16 inc_word(u16 d)
+{
+ register u32 res; /* all operands in native machine order */
+ register u32 cc;
+
+ res = d + 1;
+ CONDITIONAL_SET_FLAG((res & 0xffff) == 0, F_ZF);
+ CONDITIONAL_SET_FLAG(res & 0x8000, F_SF);
+ CONDITIONAL_SET_FLAG(PARITY(res & 0xff), F_PF);
+
+ /* calculate the carry chain SEE NOTE AT TOP. */
+ cc = (1 & d) | ((~res) & (1 | d));
+ CONDITIONAL_SET_FLAG(XOR2(cc >> 14), F_OF);
+ CONDITIONAL_SET_FLAG(cc & 0x8, F_AF);
+ return (u16)res;
+}
+
+/****************************************************************************
+REMARKS:
+Implements the INC instruction and side effects.
+****************************************************************************/
+u32 inc_long(u32 d)
+{
+ register u32 res; /* all operands in native machine order */
+ register u32 cc;
+
+ res = d + 1;
+ CONDITIONAL_SET_FLAG((res & 0xffffffff) == 0, F_ZF);
+ CONDITIONAL_SET_FLAG(res & 0x80000000, F_SF);
+ CONDITIONAL_SET_FLAG(PARITY(res & 0xff), F_PF);
+
+ /* calculate the carry chain SEE NOTE AT TOP. */
+ cc = (1 & d) | ((~res) & (1 | d));
+ CONDITIONAL_SET_FLAG(XOR2(cc >> 30), F_OF);
+ CONDITIONAL_SET_FLAG(cc & 0x8, F_AF);
+ return res;
+}
+
+/****************************************************************************
+REMARKS:
+Implements the OR instruction and side effects.
+****************************************************************************/
+u8 or_byte(u8 d, u8 s)
+{
+ register u8 res; /* all operands in native machine order */
+
+ res = d | s;
+ CLEAR_FLAG(F_OF);
+ CLEAR_FLAG(F_CF);
+ CLEAR_FLAG(F_AF);
+ CONDITIONAL_SET_FLAG(res & 0x80, F_SF);
+ CONDITIONAL_SET_FLAG(res == 0, F_ZF);
+ CONDITIONAL_SET_FLAG(PARITY(res), F_PF);
+ return res;
+}
+
+/****************************************************************************
+REMARKS:
+Implements the OR instruction and side effects.
+****************************************************************************/
+u16 or_word(u16 d, u16 s)
+{
+ register u16 res; /* all operands in native machine order */
+
+ res = d | s;
+ /* set the carry flag to be bit 8 */
+ CLEAR_FLAG(F_OF);
+ CLEAR_FLAG(F_CF);
+ CLEAR_FLAG(F_AF);
+ CONDITIONAL_SET_FLAG(res & 0x8000, F_SF);
+ CONDITIONAL_SET_FLAG(res == 0, F_ZF);
+ CONDITIONAL_SET_FLAG(PARITY(res & 0xff), F_PF);
+ return res;
+}
+
+/****************************************************************************
+REMARKS:
+Implements the OR instruction and side effects.
+****************************************************************************/
+u32 or_long(u32 d, u32 s)
+{
+ register u32 res; /* all operands in native machine order */
+
+ res = d | s;
+
+ /* set the carry flag to be bit 8 */
+ CLEAR_FLAG(F_OF);
+ CLEAR_FLAG(F_CF);
+ CLEAR_FLAG(F_AF);
+ CONDITIONAL_SET_FLAG(res & 0x80000000, F_SF);
+ CONDITIONAL_SET_FLAG(res == 0, F_ZF);
+ CONDITIONAL_SET_FLAG(PARITY(res & 0xff), F_PF);
+ return res;
+}
+
+/****************************************************************************
+REMARKS:
+Implements the OR instruction and side effects.
+****************************************************************************/
+u8 neg_byte(u8 s)
+{
+ register u8 res;
+ register u8 bc;
+
+ CONDITIONAL_SET_FLAG(s != 0, F_CF);
+ res = (u8)-s;
+ CONDITIONAL_SET_FLAG((res & 0xff) == 0, F_ZF);
+ CONDITIONAL_SET_FLAG(res & 0x80, F_SF);
+ CONDITIONAL_SET_FLAG(PARITY(res), F_PF);
+ /* calculate the borrow chain --- modified such that d=0.
+ substitutiing d=0 into bc= res&(~d|s)|(~d&s);
+ (the one used for sub) and simplifying, since ~d=0xff...,
+ ~d|s == 0xffff..., and res&0xfff... == res. Similarly
+ ~d&s == s. So the simplified result is: */
+ bc = res | s;
+ CONDITIONAL_SET_FLAG(XOR2(bc >> 6), F_OF);
+ CONDITIONAL_SET_FLAG(bc & 0x8, F_AF);
+ return res;
+}
+
+/****************************************************************************
+REMARKS:
+Implements the OR instruction and side effects.
+****************************************************************************/
+u16 neg_word(u16 s)
+{
+ register u16 res;
+ register u16 bc;
+
+ CONDITIONAL_SET_FLAG(s != 0, F_CF);
+ res = (u16)-s;
+ CONDITIONAL_SET_FLAG((res & 0xffff) == 0, F_ZF);
+ CONDITIONAL_SET_FLAG(res & 0x8000, F_SF);
+ CONDITIONAL_SET_FLAG(PARITY(res & 0xff), F_PF);
+
+ /* calculate the borrow chain --- modified such that d=0.
+ substitutiing d=0 into bc= res&(~d|s)|(~d&s);
+ (the one used for sub) and simplifying, since ~d=0xff...,
+ ~d|s == 0xffff..., and res&0xfff... == res. Similarly
+ ~d&s == s. So the simplified result is: */
+ bc = res | s;
+ CONDITIONAL_SET_FLAG(XOR2(bc >> 14), F_OF);
+ CONDITIONAL_SET_FLAG(bc & 0x8, F_AF);
+ return res;
+}
+
+/****************************************************************************
+REMARKS:
+Implements the OR instruction and side effects.
+****************************************************************************/
+u32 neg_long(u32 s)
+{
+ register u32 res;
+ register u32 bc;
+
+ CONDITIONAL_SET_FLAG(s != 0, F_CF);
+ res = (u32)-s;
+ CONDITIONAL_SET_FLAG((res & 0xffffffff) == 0, F_ZF);
+ CONDITIONAL_SET_FLAG(res & 0x80000000, F_SF);
+ CONDITIONAL_SET_FLAG(PARITY(res & 0xff), F_PF);
+
+ /* calculate the borrow chain --- modified such that d=0.
+ substitutiing d=0 into bc= res&(~d|s)|(~d&s);
+ (the one used for sub) and simplifying, since ~d=0xff...,
+ ~d|s == 0xffff..., and res&0xfff... == res. Similarly
+ ~d&s == s. So the simplified result is: */
+ bc = res | s;
+ CONDITIONAL_SET_FLAG(XOR2(bc >> 30), F_OF);
+ CONDITIONAL_SET_FLAG(bc & 0x8, F_AF);
+ return res;
+}
+
+/****************************************************************************
+REMARKS:
+Implements the NOT instruction and side effects.
+****************************************************************************/
+u8 not_byte(u8 s)
+{
+ return ~s;
+}
+
+/****************************************************************************
+REMARKS:
+Implements the NOT instruction and side effects.
+****************************************************************************/
+u16 not_word(u16 s)
+{
+ return ~s;
+}
+
+/****************************************************************************
+REMARKS:
+Implements the NOT instruction and side effects.
+****************************************************************************/
+u32 not_long(u32 s)
+{
+ return ~s;
+}
+
+/****************************************************************************
+REMARKS:
+Implements the RCL instruction and side effects.
+****************************************************************************/
+u8 rcl_byte(u8 d, u8 s)
+{
+ register unsigned int res, cnt, mask, cf;
+
+ /* s is the rotate distance. It varies from 0 - 8. */
+ /* have
+
+ CF B_7 B_6 B_5 B_4 B_3 B_2 B_1 B_0
+
+ want to rotate through the carry by "s" bits. We could
+ loop, but that's inefficient. So the width is 9,
+ and we split into three parts:
+
+ The new carry flag (was B_n)
+ the stuff in B_n-1 .. B_0
+ the stuff in B_7 .. B_n+1
+
+ The new rotate is done mod 9, and given this,
+ for a rotation of n bits (mod 9) the new carry flag is
+ then located n bits from the MSB. The low part is
+ then shifted up cnt bits, and the high part is or'd
+ in. Using CAPS for new values, and lowercase for the
+ original values, this can be expressed as:
+
+ IF n > 0
+ 1) CF <- b_(8-n)
+ 2) B_(7) .. B_(n) <- b_(8-(n+1)) .. b_0
+ 3) B_(n-1) <- cf
+ 4) B_(n-2) .. B_0 <- b_7 .. b_(8-(n-1))
+ */
+ res = d;
+ if ((cnt = s % 9) != 0) {
+ /* extract the new CARRY FLAG. */
+ /* CF <- b_(8-n) */
+ cf = (d >> (8 - cnt)) & 0x1;
+
+ /* get the low stuff which rotated
+ into the range B_7 .. B_cnt */
+ /* B_(7) .. B_(n) <- b_(8-(n+1)) .. b_0 */
+ /* note that the right hand side done by the mask */
+ res = (d << cnt) & 0xff;
+
+ /* now the high stuff which rotated around
+ into the positions B_cnt-2 .. B_0 */
+ /* B_(n-2) .. B_0 <- b_7 .. b_(8-(n-1)) */
+ /* shift it downward, 7-(n-2) = 9-n positions.
+ and mask off the result before or'ing in.
+ */
+ mask = (1 << (cnt - 1)) - 1;
+ res |= (d >> (9 - cnt)) & mask;
+
+ /* if the carry flag was set, or it in. */
+ if (ACCESS_FLAG(F_CF)) { /* carry flag is set */
+ /* B_(n-1) <- cf */
+ res |= 1 << (cnt - 1);
+ }
+ /* set the new carry flag, based on the variable "cf" */
+ CONDITIONAL_SET_FLAG(cf, F_CF);
+ /* OVERFLOW is set *IFF* cnt==1, then it is the
+ xor of CF and the most significant bit. Blecck. */
+ /* parenthesized this expression since it appears to
+ be causing OF to be misset */
+ CONDITIONAL_SET_FLAG(cnt == 1 && XOR2(cf + ((res >> 6) & 0x2)),
+ F_OF);
+
+ }
+ return (u8)res;
+}
+
+/****************************************************************************
+REMARKS:
+Implements the RCL instruction and side effects.
+****************************************************************************/
+u16 rcl_word(u16 d, u8 s)
+{
+ register unsigned int res, cnt, mask, cf;
+
+ res = d;
+ if ((cnt = s % 17) != 0) {
+ cf = (d >> (16 - cnt)) & 0x1;
+ res = (d << cnt) & 0xffff;
+ mask = (1 << (cnt - 1)) - 1;
+ res |= (d >> (17 - cnt)) & mask;
+ if (ACCESS_FLAG(F_CF)) {
+ res |= 1 << (cnt - 1);
+ }
+ CONDITIONAL_SET_FLAG(cf, F_CF);
+ CONDITIONAL_SET_FLAG(cnt == 1 && XOR2(cf + ((res >> 14) & 0x2)),
+ F_OF);
+ }
+ return (u16)res;
+}
+
+/****************************************************************************
+REMARKS:
+Implements the RCL instruction and side effects.
+****************************************************************************/
+u32 rcl_long(u32 d, u8 s)
+{
+ register u32 res, cnt, mask, cf;
+
+ res = d;
+ if ((cnt = s % 33) != 0) {
+ cf = (d >> (32 - cnt)) & 0x1;
+ res = (d << cnt) & 0xffffffff;
+ mask = (1 << (cnt - 1)) - 1;
+ res |= (d >> (33 - cnt)) & mask;
+ if (ACCESS_FLAG(F_CF)) { /* carry flag is set */
+ res |= 1 << (cnt - 1);
+ }
+ CONDITIONAL_SET_FLAG(cf, F_CF);
+ CONDITIONAL_SET_FLAG(cnt == 1 && XOR2(cf + ((res >> 30) & 0x2)),
+ F_OF);
+ }
+ return res;
+}
+
+/****************************************************************************
+REMARKS:
+Implements the RCR instruction and side effects.
+****************************************************************************/
+u8 rcr_byte(u8 d, u8 s)
+{
+ u32 res, cnt;
+ u32 mask, cf, ocf = 0;
+
+ /* rotate right through carry */
+ /*
+ s is the rotate distance. It varies from 0 - 8.
+ d is the byte object rotated.
+
+ have
+
+ CF B_7 B_6 B_5 B_4 B_3 B_2 B_1 B_0
+
+ The new rotate is done mod 9, and given this,
+ for a rotation of n bits (mod 9) the new carry flag is
+ then located n bits from the LSB. The low part is
+ then shifted up cnt bits, and the high part is or'd
+ in. Using CAPS for new values, and lowercase for the
+ original values, this can be expressed as:
+
+ IF n > 0
+ 1) CF <- b_(n-1)
+ 2) B_(8-(n+1)) .. B_(0) <- b_(7) .. b_(n)
+ 3) B_(8-n) <- cf
+ 4) B_(7) .. B_(8-(n-1)) <- b_(n-2) .. b_(0)
+ */
+ res = d;
+ if ((cnt = s % 9) != 0) {
+ /* extract the new CARRY FLAG. */
+ /* CF <- b_(n-1) */
+ if (cnt == 1) {
+ cf = d & 0x1;
+ /* note hackery here. Access_flag(..) evaluates to either
+ 0 if flag not set
+ non-zero if flag is set.
+ doing access_flag(..) != 0 casts that into either
+ 0..1 in any representation of the flags register
+ (i.e. packed bit array or unpacked.)
+ */
+ ocf = ACCESS_FLAG(F_CF) != 0;
+ } else
+ cf = (d >> (cnt - 1)) & 0x1;
+
+ /* B_(8-(n+1)) .. B_(0) <- b_(7) .. b_n */
+ /* note that the right hand side done by the mask
+ This is effectively done by shifting the
+ object to the right. The result must be masked,
+ in case the object came in and was treated
+ as a negative number. Needed??? */
+
+ mask = (1 << (8 - cnt)) - 1;
+ res = (d >> cnt) & mask;
+
+ /* now the high stuff which rotated around
+ into the positions B_cnt-2 .. B_0 */
+ /* B_(7) .. B_(8-(n-1)) <- b_(n-2) .. b_(0) */
+ /* shift it downward, 7-(n-2) = 9-n positions.
+ and mask off the result before or'ing in.
+ */
+ res |= (d << (9 - cnt));
+
+ /* if the carry flag was set, or it in. */
+ if (ACCESS_FLAG(F_CF)) { /* carry flag is set */
+ /* B_(8-n) <- cf */
+ res |= 1 << (8 - cnt);
+ }
+ /* set the new carry flag, based on the variable "cf" */
+ CONDITIONAL_SET_FLAG(cf, F_CF);
+ /* OVERFLOW is set *IFF* cnt==1, then it is the
+ xor of CF and the most significant bit. Blecck. */
+ /* parenthesized... */
+ if (cnt == 1) {
+ CONDITIONAL_SET_FLAG(XOR2(ocf + ((d >> 6) & 0x2)),
+ F_OF);
+ }
+ }
+ return (u8)res;
+}
+
+/****************************************************************************
+REMARKS:
+Implements the RCR instruction and side effects.
+****************************************************************************/
+u16 rcr_word(u16 d, u8 s)
+{
+ u32 res, cnt;
+ u32 mask, cf, ocf = 0;
+
+ /* rotate right through carry */
+ res = d;
+ if ((cnt = s % 17) != 0) {
+ if (cnt == 1) {
+ cf = d & 0x1;
+ ocf = ACCESS_FLAG(F_CF) != 0;
+ } else
+ cf = (d >> (cnt - 1)) & 0x1;
+ mask = (1 << (16 - cnt)) - 1;
+ res = (d >> cnt) & mask;
+ res |= (d << (17 - cnt));
+ if (ACCESS_FLAG(F_CF)) {
+ res |= 1 << (16 - cnt);
+ }
+ CONDITIONAL_SET_FLAG(cf, F_CF);
+ if (cnt == 1) {
+ CONDITIONAL_SET_FLAG(XOR2(ocf + ((d >> 14) & 0x2)),
+ F_OF);
+ }
+ }
+ return (u16)res;
+}
+
+/****************************************************************************
+REMARKS:
+Implements the RCR instruction and side effects.
+****************************************************************************/
+u32 rcr_long(u32 d, u8 s)
+{
+ u32 res, cnt;
+ u32 mask, cf, ocf = 0;
+
+ /* rotate right through carry */
+ res = d;
+ if ((cnt = s % 33) != 0) {
+ if (cnt == 1) {
+ cf = d & 0x1;
+ ocf = ACCESS_FLAG(F_CF) != 0;
+ } else
+ cf = (d >> (cnt - 1)) & 0x1;
+ mask = (1 << (32 - cnt)) - 1;
+ res = (d >> cnt) & mask;
+ if (cnt != 1)
+ res |= (d << (33 - cnt));
+ if (ACCESS_FLAG(F_CF)) { /* carry flag is set */
+ res |= 1 << (32 - cnt);
+ }
+ CONDITIONAL_SET_FLAG(cf, F_CF);
+ if (cnt == 1) {
+ CONDITIONAL_SET_FLAG(XOR2(ocf + ((d >> 30) & 0x2)),
+ F_OF);
+ }
+ }
+ return res;
+}
+
+/****************************************************************************
+REMARKS:
+Implements the ROL instruction and side effects.
+****************************************************************************/
+u8 rol_byte(u8 d, u8 s)
+{
+ register unsigned int res, cnt, mask;
+
+ /* rotate left */
+ /*
+ s is the rotate distance. It varies from 0 - 8.
+ d is the byte object rotated.
+
+ have
+
+ CF B_7 ... B_0
+
+ The new rotate is done mod 8.
+ Much simpler than the "rcl" or "rcr" operations.
+
+ IF n > 0
+ 1) B_(7) .. B_(n) <- b_(8-(n+1)) .. b_(0)
+ 2) B_(n-1) .. B_(0) <- b_(7) .. b_(8-n)
+ */
+ res = d;
+ if ((cnt = s % 8) != 0) {
+ /* B_(7) .. B_(n) <- b_(8-(n+1)) .. b_(0) */
+ res = (d << cnt);
+
+ /* B_(n-1) .. B_(0) <- b_(7) .. b_(8-n) */
+ mask = (1 << cnt) - 1;
+ res |= (d >> (8 - cnt)) & mask;
+
+ /* set the new carry flag, Note that it is the low order
+ bit of the result!!! */
+ CONDITIONAL_SET_FLAG(res & 0x1, F_CF);
+ /* OVERFLOW is set *IFF* s==1, then it is the
+ xor of CF and the most significant bit. Blecck. */
+ CONDITIONAL_SET_FLAG(s == 1 &&
+ XOR2((res & 0x1) + ((res >> 6) & 0x2)),
+ F_OF);
+ } if (s != 0) {
+ /* set the new carry flag, Note that it is the low order
+ bit of the result!!! */
+ CONDITIONAL_SET_FLAG(res & 0x1, F_CF);
+ }
+ return (u8)res;
+}
+
+/****************************************************************************
+REMARKS:
+Implements the ROL instruction and side effects.
+****************************************************************************/
+u16 rol_word(u16 d, u8 s)
+{
+ register unsigned int res, cnt, mask;
+
+ res = d;
+ if ((cnt = s % 16) != 0) {
+ res = (d << cnt);
+ mask = (1 << cnt) - 1;
+ res |= (d >> (16 - cnt)) & mask;
+ CONDITIONAL_SET_FLAG(res & 0x1, F_CF);
+ CONDITIONAL_SET_FLAG(s == 1 &&
+ XOR2((res & 0x1) + ((res >> 14) & 0x2)),
+ F_OF);
+ } if (s != 0) {
+ /* set the new carry flag, Note that it is the low order
+ bit of the result!!! */
+ CONDITIONAL_SET_FLAG(res & 0x1, F_CF);
+ }
+ return (u16)res;
+}
+
+/****************************************************************************
+REMARKS:
+Implements the ROL instruction and side effects.
+****************************************************************************/
+u32 rol_long(u32 d, u8 s)
+{
+ register u32 res, cnt, mask;
+
+ res = d;
+ if ((cnt = s % 32) != 0) {
+ res = (d << cnt);
+ mask = (1 << cnt) - 1;
+ res |= (d >> (32 - cnt)) & mask;
+ CONDITIONAL_SET_FLAG(res & 0x1, F_CF);
+ CONDITIONAL_SET_FLAG(s == 1 &&
+ XOR2((res & 0x1) + ((res >> 30) & 0x2)),
+ F_OF);
+ } if (s != 0) {
+ /* set the new carry flag, Note that it is the low order
+ bit of the result!!! */
+ CONDITIONAL_SET_FLAG(res & 0x1, F_CF);
+ }
+ return res;
+}
+
+/****************************************************************************
+REMARKS:
+Implements the ROR instruction and side effects.
+****************************************************************************/
+u8 ror_byte(u8 d, u8 s)
+{
+ register unsigned int res, cnt, mask;
+
+ /* rotate right */
+ /*
+ s is the rotate distance. It varies from 0 - 8.
+ d is the byte object rotated.
+
+ have
+
+ B_7 ... B_0
+
+ The rotate is done mod 8.
+
+ IF n > 0
+ 1) B_(8-(n+1)) .. B_(0) <- b_(7) .. b_(n)
+ 2) B_(7) .. B_(8-n) <- b_(n-1) .. b_(0)
+ */
+ res = d;
+ if ((cnt = s % 8) != 0) { /* not a typo, do nada if cnt==0 */
+ /* B_(7) .. B_(8-n) <- b_(n-1) .. b_(0) */
+ res = (d << (8 - cnt));
+
+ /* B_(8-(n+1)) .. B_(0) <- b_(7) .. b_(n) */
+ mask = (1 << (8 - cnt)) - 1;
+ res |= (d >> (cnt)) & mask;
+
+ /* set the new carry flag, Note that it is the low order
+ bit of the result!!! */
+ CONDITIONAL_SET_FLAG(res & 0x80, F_CF);
+ /* OVERFLOW is set *IFF* s==1, then it is the
+ xor of the two most significant bits. Blecck. */
+ CONDITIONAL_SET_FLAG(s == 1 && XOR2(res >> 6), F_OF);
+ } else if (s != 0) {
+ /* set the new carry flag, Note that it is the low order
+ bit of the result!!! */
+ CONDITIONAL_SET_FLAG(res & 0x80, F_CF);
+ }
+ return (u8)res;
+}
+
+/****************************************************************************
+REMARKS:
+Implements the ROR instruction and side effects.
+****************************************************************************/
+u16 ror_word(u16 d, u8 s)
+{
+ register unsigned int res, cnt, mask;
+
+ res = d;
+ if ((cnt = s % 16) != 0) {
+ res = (d << (16 - cnt));
+ mask = (1 << (16 - cnt)) - 1;
+ res |= (d >> (cnt)) & mask;
+ CONDITIONAL_SET_FLAG(res & 0x8000, F_CF);
+ CONDITIONAL_SET_FLAG(s == 1 && XOR2(res >> 14), F_OF);
+ } else if (s != 0) {
+ /* set the new carry flag, Note that it is the low order
+ bit of the result!!! */
+ CONDITIONAL_SET_FLAG(res & 0x8000, F_CF);
+ }
+ return (u16)res;
+}
+
+/****************************************************************************
+REMARKS:
+Implements the ROR instruction and side effects.
+****************************************************************************/
+u32 ror_long(u32 d, u8 s)
+{
+ register u32 res, cnt, mask;
+
+ res = d;
+ if ((cnt = s % 32) != 0) {
+ res = (d << (32 - cnt));
+ mask = (1 << (32 - cnt)) - 1;
+ res |= (d >> (cnt)) & mask;
+ CONDITIONAL_SET_FLAG(res & 0x80000000, F_CF);
+ CONDITIONAL_SET_FLAG(s == 1 && XOR2(res >> 30), F_OF);
+ } else if (s != 0) {
+ /* set the new carry flag, Note that it is the low order
+ bit of the result!!! */
+ CONDITIONAL_SET_FLAG(res & 0x80000000, F_CF);
+ }
+ return res;
+}
+
+/****************************************************************************
+REMARKS:
+Implements the SHL instruction and side effects.
+****************************************************************************/
+u8 shl_byte(u8 d, u8 s)
+{
+ unsigned int cnt, res, cf;
+
+ if (s < 8) {
+ cnt = s % 8;
+
+ /* last bit shifted out goes into carry flag */
+ if (cnt > 0) {
+ res = d << cnt;
+ cf = d & (1 << (8 - cnt));
+ CONDITIONAL_SET_FLAG(cf, F_CF);
+ CONDITIONAL_SET_FLAG((res & 0xff) == 0, F_ZF);
+ CONDITIONAL_SET_FLAG(res & 0x80, F_SF);
+ CONDITIONAL_SET_FLAG(PARITY(res & 0xff), F_PF);
+ } else {
+ res = (u8) d;
+ }
+
+ if (cnt == 1) {
+ /* Needs simplification. */
+ CONDITIONAL_SET_FLAG(
+ (((res & 0x80) == 0x80) ^
+ (ACCESS_FLAG(F_CF) != 0)),
+ /* was (M.x86.R_FLG&F_CF)==F_CF)), */
+ F_OF);
+ } else {
+ CLEAR_FLAG(F_OF);
+ }
+ } else {
+ res = 0;
+ CONDITIONAL_SET_FLAG((d << (s-1)) & 0x80, F_CF);
+ CLEAR_FLAG(F_OF);
+ CLEAR_FLAG(F_SF);
+ SET_FLAG(F_PF);
+ SET_FLAG(F_ZF);
+ }
+ return (u8)res;
+}
+
+/****************************************************************************
+REMARKS:
+Implements the SHL instruction and side effects.
+****************************************************************************/
+u16 shl_word(u16 d, u8 s)
+{
+ unsigned int cnt, res, cf;
+
+ if (s < 16) {
+ cnt = s % 16;
+ if (cnt > 0) {
+ res = d << cnt;
+ cf = d & (1 << (16 - cnt));
+ CONDITIONAL_SET_FLAG(cf, F_CF);
+ CONDITIONAL_SET_FLAG((res & 0xffff) == 0, F_ZF);
+ CONDITIONAL_SET_FLAG(res & 0x8000, F_SF);
+ CONDITIONAL_SET_FLAG(PARITY(res & 0xff), F_PF);
+ } else {
+ res = (u16) d;
+ }
+
+ if (cnt == 1) {
+ CONDITIONAL_SET_FLAG(
+ (((res & 0x8000) == 0x8000) ^
+ (ACCESS_FLAG(F_CF) != 0)),
+ F_OF);
+ } else {
+ CLEAR_FLAG(F_OF);
+ }
+ } else {
+ res = 0;
+ CONDITIONAL_SET_FLAG((d << (s-1)) & 0x8000, F_CF);
+ CLEAR_FLAG(F_OF);
+ CLEAR_FLAG(F_SF);
+ SET_FLAG(F_PF);
+ SET_FLAG(F_ZF);
+ }
+ return (u16)res;
+}
+
+/****************************************************************************
+REMARKS:
+Implements the SHL instruction and side effects.
+****************************************************************************/
+u32 shl_long(u32 d, u8 s)
+{
+ unsigned int cnt, res, cf;
+
+ if (s < 32) {
+ cnt = s % 32;
+ if (cnt > 0) {
+ res = d << cnt;
+ cf = d & (1 << (32 - cnt));
+ CONDITIONAL_SET_FLAG(cf, F_CF);
+ CONDITIONAL_SET_FLAG((res & 0xffffffff) == 0, F_ZF);
+ CONDITIONAL_SET_FLAG(res & 0x80000000, F_SF);
+ CONDITIONAL_SET_FLAG(PARITY(res & 0xff), F_PF);
+ } else {
+ res = d;
+ }
+ if (cnt == 1) {
+ CONDITIONAL_SET_FLAG((((res & 0x80000000) == 0x80000000) ^
+ (ACCESS_FLAG(F_CF) != 0)), F_OF);
+ } else {
+ CLEAR_FLAG(F_OF);
+ }
+ } else {
+ res = 0;
+ CONDITIONAL_SET_FLAG((d << (s-1)) & 0x80000000, F_CF);
+ CLEAR_FLAG(F_OF);
+ CLEAR_FLAG(F_SF);
+ SET_FLAG(F_PF);
+ SET_FLAG(F_ZF);
+ }
+ return res;
+}
+
+/****************************************************************************
+REMARKS:
+Implements the SHR instruction and side effects.
+****************************************************************************/
+u8 shr_byte(u8 d, u8 s)
+{
+ unsigned int cnt, res, cf;
+
+ if (s < 8) {
+ cnt = s % 8;
+ if (cnt > 0) {
+ cf = d & (1 << (cnt - 1));
+ res = d >> cnt;
+ CONDITIONAL_SET_FLAG(cf, F_CF);
+ CONDITIONAL_SET_FLAG((res & 0xff) == 0, F_ZF);
+ CONDITIONAL_SET_FLAG(res & 0x80, F_SF);
+ CONDITIONAL_SET_FLAG(PARITY(res & 0xff), F_PF);
+ } else {
+ res = (u8) d;
+ }
+
+ if (cnt == 1) {
+ CONDITIONAL_SET_FLAG(XOR2(res >> 6), F_OF);
+ } else {
+ CLEAR_FLAG(F_OF);
+ }
+ } else {
+ res = 0;
+ CONDITIONAL_SET_FLAG((d >> (s-1)) & 0x1, F_CF);
+ CLEAR_FLAG(F_OF);
+ CLEAR_FLAG(F_SF);
+ SET_FLAG(F_PF);
+ SET_FLAG(F_ZF);
+ }
+ return (u8)res;
+}
+
+/****************************************************************************
+REMARKS:
+Implements the SHR instruction and side effects.
+****************************************************************************/
+u16 shr_word(u16 d, u8 s)
+{
+ unsigned int cnt, res, cf;
+
+ if (s < 16) {
+ cnt = s % 16;
+ if (cnt > 0) {
+ cf = d & (1 << (cnt - 1));
+ res = d >> cnt;
+ CONDITIONAL_SET_FLAG(cf, F_CF);
+ CONDITIONAL_SET_FLAG((res & 0xffff) == 0, F_ZF);
+ CONDITIONAL_SET_FLAG(res & 0x8000, F_SF);
+ CONDITIONAL_SET_FLAG(PARITY(res & 0xff), F_PF);
+ } else {
+ res = d;
+ }
+
+ if (cnt == 1) {
+ CONDITIONAL_SET_FLAG(XOR2(res >> 14), F_OF);
+ } else {
+ CLEAR_FLAG(F_OF);
+ }
+ } else {
+ res = 0;
+ CLEAR_FLAG(F_CF);
+ CLEAR_FLAG(F_OF);
+ SET_FLAG(F_ZF);
+ CLEAR_FLAG(F_SF);
+ CLEAR_FLAG(F_PF);
+ }
+ return (u16)res;
+}
+
+/****************************************************************************
+REMARKS:
+Implements the SHR instruction and side effects.
+****************************************************************************/
+u32 shr_long(u32 d, u8 s)
+{
+ unsigned int cnt, res, cf;
+
+ if (s < 32) {
+ cnt = s % 32;
+ if (cnt > 0) {
+ cf = d & (1 << (cnt - 1));
+ res = d >> cnt;
+ CONDITIONAL_SET_FLAG(cf, F_CF);
+ CONDITIONAL_SET_FLAG((res & 0xffffffff) == 0, F_ZF);
+ CONDITIONAL_SET_FLAG(res & 0x80000000, F_SF);
+ CONDITIONAL_SET_FLAG(PARITY(res & 0xff), F_PF);
+ } else {
+ res = d;
+ }
+ if (cnt == 1) {
+ CONDITIONAL_SET_FLAG(XOR2(res >> 30), F_OF);
+ } else {
+ CLEAR_FLAG(F_OF);
+ }
+ } else {
+ res = 0;
+ CLEAR_FLAG(F_CF);
+ CLEAR_FLAG(F_OF);
+ SET_FLAG(F_ZF);
+ CLEAR_FLAG(F_SF);
+ CLEAR_FLAG(F_PF);
+ }
+ return res;
+}
+
+/****************************************************************************
+REMARKS:
+Implements the SAR instruction and side effects.
+****************************************************************************/
+u8 sar_byte(u8 d, u8 s)
+{
+ unsigned int cnt, res, cf, mask, sf;
+
+ res = d;
+ sf = d & 0x80;
+ cnt = s % 8;
+ if (cnt > 0 && cnt < 8) {
+ mask = (1 << (8 - cnt)) - 1;
+ cf = d & (1 << (cnt - 1));
+ res = (d >> cnt) & mask;
+ CONDITIONAL_SET_FLAG(cf, F_CF);
+ if (sf) {
+ res |= ~mask;
+ }
+ CONDITIONAL_SET_FLAG((res & 0xff) == 0, F_ZF);
+ CONDITIONAL_SET_FLAG(PARITY(res & 0xff), F_PF);
+ CONDITIONAL_SET_FLAG(res & 0x80, F_SF);
+ } else if (cnt >= 8) {
+ if (sf) {
+ res = 0xff;
+ SET_FLAG(F_CF);
+ CLEAR_FLAG(F_ZF);
+ SET_FLAG(F_SF);
+ SET_FLAG(F_PF);
+ } else {
+ res = 0;
+ CLEAR_FLAG(F_CF);
+ SET_FLAG(F_ZF);
+ CLEAR_FLAG(F_SF);
+ CLEAR_FLAG(F_PF);
+ }
+ }
+ return (u8)res;
+}
+
+/****************************************************************************
+REMARKS:
+Implements the SAR instruction and side effects.
+****************************************************************************/
+u16 sar_word(u16 d, u8 s)
+{
+ unsigned int cnt, res, cf, mask, sf;
+
+ sf = d & 0x8000;
+ cnt = s % 16;
+ res = d;
+ if (cnt > 0 && cnt < 16) {
+ mask = (1 << (16 - cnt)) - 1;
+ cf = d & (1 << (cnt - 1));
+ res = (d >> cnt) & mask;
+ CONDITIONAL_SET_FLAG(cf, F_CF);
+ if (sf) {
+ res |= ~mask;
+ }
+ CONDITIONAL_SET_FLAG((res & 0xffff) == 0, F_ZF);
+ CONDITIONAL_SET_FLAG(res & 0x8000, F_SF);
+ CONDITIONAL_SET_FLAG(PARITY(res & 0xff), F_PF);
+ } else if (cnt >= 16) {
+ if (sf) {
+ res = 0xffff;
+ SET_FLAG(F_CF);
+ CLEAR_FLAG(F_ZF);
+ SET_FLAG(F_SF);
+ SET_FLAG(F_PF);
+ } else {
+ res = 0;
+ CLEAR_FLAG(F_CF);
+ SET_FLAG(F_ZF);
+ CLEAR_FLAG(F_SF);
+ CLEAR_FLAG(F_PF);
+ }
+ }
+ return (u16)res;
+}
+
+/****************************************************************************
+REMARKS:
+Implements the SAR instruction and side effects.
+****************************************************************************/
+u32 sar_long(u32 d, u8 s)
+{
+ u32 cnt, res, cf, mask, sf;
+
+ sf = d & 0x80000000;
+ cnt = s % 32;
+ res = d;
+ if (cnt > 0 && cnt < 32) {
+ mask = (1 << (32 - cnt)) - 1;
+ cf = d & (1 << (cnt - 1));
+ res = (d >> cnt) & mask;
+ CONDITIONAL_SET_FLAG(cf, F_CF);
+ if (sf) {
+ res |= ~mask;
+ }
+ CONDITIONAL_SET_FLAG((res & 0xffffffff) == 0, F_ZF);
+ CONDITIONAL_SET_FLAG(res & 0x80000000, F_SF);
+ CONDITIONAL_SET_FLAG(PARITY(res & 0xff), F_PF);
+ } else if (cnt >= 32) {
+ if (sf) {
+ res = 0xffffffff;
+ SET_FLAG(F_CF);
+ CLEAR_FLAG(F_ZF);
+ SET_FLAG(F_SF);
+ SET_FLAG(F_PF);
+ } else {
+ res = 0;
+ CLEAR_FLAG(F_CF);
+ SET_FLAG(F_ZF);
+ CLEAR_FLAG(F_SF);
+ CLEAR_FLAG(F_PF);
+ }
+ }
+ return res;
+}
+
+/****************************************************************************
+REMARKS:
+Implements the SHLD instruction and side effects.
+****************************************************************************/
+u16 shld_word (u16 d, u16 fill, u8 s)
+{
+ unsigned int cnt, res, cf;
+
+ if (s < 16) {
+ cnt = s % 16;
+ if (cnt > 0) {
+ res = (d << cnt) | (fill >> (16-cnt));
+ cf = d & (1 << (16 - cnt));
+ CONDITIONAL_SET_FLAG(cf, F_CF);
+ CONDITIONAL_SET_FLAG((res & 0xffff) == 0, F_ZF);
+ CONDITIONAL_SET_FLAG(res & 0x8000, F_SF);
+ CONDITIONAL_SET_FLAG(PARITY(res & 0xff), F_PF);
+ } else {
+ res = d;
+ }
+ if (cnt == 1) {
+ CONDITIONAL_SET_FLAG((((res & 0x8000) == 0x8000) ^
+ (ACCESS_FLAG(F_CF) != 0)), F_OF);
+ } else {
+ CLEAR_FLAG(F_OF);
+ }
+ } else {
+ res = 0;
+ CONDITIONAL_SET_FLAG((d << (s-1)) & 0x8000, F_CF);
+ CLEAR_FLAG(F_OF);
+ CLEAR_FLAG(F_SF);
+ SET_FLAG(F_PF);
+ SET_FLAG(F_ZF);
+ }
+ return (u16)res;
+}
+
+/****************************************************************************
+REMARKS:
+Implements the SHLD instruction and side effects.
+****************************************************************************/
+u32 shld_long (u32 d, u32 fill, u8 s)
+{
+ unsigned int cnt, res, cf;
+
+ if (s < 32) {
+ cnt = s % 32;
+ if (cnt > 0) {
+ res = (d << cnt) | (fill >> (32-cnt));
+ cf = d & (1 << (32 - cnt));
+ CONDITIONAL_SET_FLAG(cf, F_CF);
+ CONDITIONAL_SET_FLAG((res & 0xffffffff) == 0, F_ZF);
+ CONDITIONAL_SET_FLAG(res & 0x80000000, F_SF);
+ CONDITIONAL_SET_FLAG(PARITY(res & 0xff), F_PF);
+ } else {
+ res = d;
+ }
+ if (cnt == 1) {
+ CONDITIONAL_SET_FLAG((((res & 0x80000000) == 0x80000000) ^
+ (ACCESS_FLAG(F_CF) != 0)), F_OF);
+ } else {
+ CLEAR_FLAG(F_OF);
+ }
+ } else {
+ res = 0;
+ CONDITIONAL_SET_FLAG((d << (s-1)) & 0x80000000, F_CF);
+ CLEAR_FLAG(F_OF);
+ CLEAR_FLAG(F_SF);
+ SET_FLAG(F_PF);
+ SET_FLAG(F_ZF);
+ }
+ return res;
+}
+
+/****************************************************************************
+REMARKS:
+Implements the SHRD instruction and side effects.
+****************************************************************************/
+u16 shrd_word (u16 d, u16 fill, u8 s)
+{
+ unsigned int cnt, res, cf;
+
+ if (s < 16) {
+ cnt = s % 16;
+ if (cnt > 0) {
+ cf = d & (1 << (cnt - 1));
+ res = (d >> cnt) | (fill << (16 - cnt));
+ CONDITIONAL_SET_FLAG(cf, F_CF);
+ CONDITIONAL_SET_FLAG((res & 0xffff) == 0, F_ZF);
+ CONDITIONAL_SET_FLAG(res & 0x8000, F_SF);
+ CONDITIONAL_SET_FLAG(PARITY(res & 0xff), F_PF);
+ } else {
+ res = d;
+ }
+
+ if (cnt == 1) {
+ CONDITIONAL_SET_FLAG(XOR2(res >> 14), F_OF);
+ } else {
+ CLEAR_FLAG(F_OF);
+ }
+ } else {
+ res = 0;
+ CLEAR_FLAG(F_CF);
+ CLEAR_FLAG(F_OF);
+ SET_FLAG(F_ZF);
+ CLEAR_FLAG(F_SF);
+ CLEAR_FLAG(F_PF);
+ }
+ return (u16)res;
+}
+
+/****************************************************************************
+REMARKS:
+Implements the SHRD instruction and side effects.
+****************************************************************************/
+u32 shrd_long (u32 d, u32 fill, u8 s)
+{
+ unsigned int cnt, res, cf;
+
+ if (s < 32) {
+ cnt = s % 32;
+ if (cnt > 0) {
+ cf = d & (1 << (cnt - 1));
+ res = (d >> cnt) | (fill << (32 - cnt));
+ CONDITIONAL_SET_FLAG(cf, F_CF);
+ CONDITIONAL_SET_FLAG((res & 0xffffffff) == 0, F_ZF);
+ CONDITIONAL_SET_FLAG(res & 0x80000000, F_SF);
+ CONDITIONAL_SET_FLAG(PARITY(res & 0xff), F_PF);
+ } else {
+ res = d;
+ }
+ if (cnt == 1) {
+ CONDITIONAL_SET_FLAG(XOR2(res >> 30), F_OF);
+ } else {
+ CLEAR_FLAG(F_OF);
+ }
+ } else {
+ res = 0;
+ CLEAR_FLAG(F_CF);
+ CLEAR_FLAG(F_OF);
+ SET_FLAG(F_ZF);
+ CLEAR_FLAG(F_SF);
+ CLEAR_FLAG(F_PF);
+ }
+ return res;
+}
+
+/****************************************************************************
+REMARKS:
+Implements the SBB instruction and side effects.
+****************************************************************************/
+u8 sbb_byte(u8 d, u8 s)
+{
+ register u32 res; /* all operands in native machine order */
+ register u32 bc;
+
+ if (ACCESS_FLAG(F_CF))
+ res = d - s - 1;
+ else
+ res = d - s;
+ CONDITIONAL_SET_FLAG(res & 0x80, F_SF);
+ CONDITIONAL_SET_FLAG((res & 0xff) == 0, F_ZF);
+ CONDITIONAL_SET_FLAG(PARITY(res & 0xff), F_PF);
+
+ /* calculate the borrow chain. See note at top */
+ bc = (res & (~d | s)) | (~d & s);
+ CONDITIONAL_SET_FLAG(bc & 0x80, F_CF);
+ CONDITIONAL_SET_FLAG(XOR2(bc >> 6), F_OF);
+ CONDITIONAL_SET_FLAG(bc & 0x8, F_AF);
+ return (u8)res;
+}
+
+/****************************************************************************
+REMARKS:
+Implements the SBB instruction and side effects.
+****************************************************************************/
+u16 sbb_word(u16 d, u16 s)
+{
+ register u32 res; /* all operands in native machine order */
+ register u32 bc;
+
+ if (ACCESS_FLAG(F_CF))
+ res = d - s - 1;
+ else
+ res = d - s;
+ CONDITIONAL_SET_FLAG(res & 0x8000, F_SF);
+ CONDITIONAL_SET_FLAG((res & 0xffff) == 0, F_ZF);
+ CONDITIONAL_SET_FLAG(PARITY(res & 0xff), F_PF);
+
+ /* calculate the borrow chain. See note at top */
+ bc = (res & (~d | s)) | (~d & s);
+ CONDITIONAL_SET_FLAG(bc & 0x8000, F_CF);
+ CONDITIONAL_SET_FLAG(XOR2(bc >> 14), F_OF);
+ CONDITIONAL_SET_FLAG(bc & 0x8, F_AF);
+ return (u16)res;
+}
+
+/****************************************************************************
+REMARKS:
+Implements the SBB instruction and side effects.
+****************************************************************************/
+u32 sbb_long(u32 d, u32 s)
+{
+ register u32 res; /* all operands in native machine order */
+ register u32 bc;
+
+ if (ACCESS_FLAG(F_CF))
+ res = d - s - 1;
+ else
+ res = d - s;
+ CONDITIONAL_SET_FLAG(res & 0x80000000, F_SF);
+ CONDITIONAL_SET_FLAG((res & 0xffffffff) == 0, F_ZF);
+ CONDITIONAL_SET_FLAG(PARITY(res & 0xff), F_PF);
+
+ /* calculate the borrow chain. See note at top */
+ bc = (res & (~d | s)) | (~d & s);
+ CONDITIONAL_SET_FLAG(bc & 0x80000000, F_CF);
+ CONDITIONAL_SET_FLAG(XOR2(bc >> 30), F_OF);
+ CONDITIONAL_SET_FLAG(bc & 0x8, F_AF);
+ return res;
+}
+
+/****************************************************************************
+REMARKS:
+Implements the SUB instruction and side effects.
+****************************************************************************/
+u8 sub_byte(u8 d, u8 s)
+{
+ register u32 res; /* all operands in native machine order */
+ register u32 bc;
+
+ res = d - s;
+ CONDITIONAL_SET_FLAG(res & 0x80, F_SF);
+ CONDITIONAL_SET_FLAG((res & 0xff) == 0, F_ZF);
+ CONDITIONAL_SET_FLAG(PARITY(res & 0xff), F_PF);
+
+ /* calculate the borrow chain. See note at top */
+ bc = (res & (~d | s)) | (~d & s);
+ CONDITIONAL_SET_FLAG(bc & 0x80, F_CF);
+ CONDITIONAL_SET_FLAG(XOR2(bc >> 6), F_OF);
+ CONDITIONAL_SET_FLAG(bc & 0x8, F_AF);
+ return (u8)res;
+}
+
+/****************************************************************************
+REMARKS:
+Implements the SUB instruction and side effects.
+****************************************************************************/
+u16 sub_word(u16 d, u16 s)
+{
+ register u32 res; /* all operands in native machine order */
+ register u32 bc;
+
+ res = d - s;
+ CONDITIONAL_SET_FLAG(res & 0x8000, F_SF);
+ CONDITIONAL_SET_FLAG((res & 0xffff) == 0, F_ZF);
+ CONDITIONAL_SET_FLAG(PARITY(res & 0xff), F_PF);
+
+ /* calculate the borrow chain. See note at top */
+ bc = (res & (~d | s)) | (~d & s);
+ CONDITIONAL_SET_FLAG(bc & 0x8000, F_CF);
+ CONDITIONAL_SET_FLAG(XOR2(bc >> 14), F_OF);
+ CONDITIONAL_SET_FLAG(bc & 0x8, F_AF);
+ return (u16)res;
+}
+
+/****************************************************************************
+REMARKS:
+Implements the SUB instruction and side effects.
+****************************************************************************/
+u32 sub_long(u32 d, u32 s)
+{
+ register u32 res; /* all operands in native machine order */
+ register u32 bc;
+
+ res = d - s;
+ CONDITIONAL_SET_FLAG(res & 0x80000000, F_SF);
+ CONDITIONAL_SET_FLAG((res & 0xffffffff) == 0, F_ZF);
+ CONDITIONAL_SET_FLAG(PARITY(res & 0xff), F_PF);
+
+ /* calculate the borrow chain. See note at top */
+ bc = (res & (~d | s)) | (~d & s);
+ CONDITIONAL_SET_FLAG(bc & 0x80000000, F_CF);
+ CONDITIONAL_SET_FLAG(XOR2(bc >> 30), F_OF);
+ CONDITIONAL_SET_FLAG(bc & 0x8, F_AF);
+ return res;
+}
+
+/****************************************************************************
+REMARKS:
+Implements the TEST instruction and side effects.
+****************************************************************************/
+void test_byte(u8 d, u8 s)
+{
+ register u32 res; /* all operands in native machine order */
+
+ res = d & s;
+
+ CLEAR_FLAG(F_OF);
+ CONDITIONAL_SET_FLAG(res & 0x80, F_SF);
+ CONDITIONAL_SET_FLAG(res == 0, F_ZF);
+ CONDITIONAL_SET_FLAG(PARITY(res & 0xff), F_PF);
+ /* AF == dont care */
+ CLEAR_FLAG(F_CF);
+}
+
+/****************************************************************************
+REMARKS:
+Implements the TEST instruction and side effects.
+****************************************************************************/
+void test_word(u16 d, u16 s)
+{
+ register u32 res; /* all operands in native machine order */
+
+ res = d & s;
+
+ CLEAR_FLAG(F_OF);
+ CONDITIONAL_SET_FLAG(res & 0x8000, F_SF);
+ CONDITIONAL_SET_FLAG(res == 0, F_ZF);
+ CONDITIONAL_SET_FLAG(PARITY(res & 0xff), F_PF);
+ /* AF == dont care */
+ CLEAR_FLAG(F_CF);
+}
+
+/****************************************************************************
+REMARKS:
+Implements the TEST instruction and side effects.
+****************************************************************************/
+void test_long(u32 d, u32 s)
+{
+ register u32 res; /* all operands in native machine order */
+
+ res = d & s;
+
+ CLEAR_FLAG(F_OF);
+ CONDITIONAL_SET_FLAG(res & 0x80000000, F_SF);
+ CONDITIONAL_SET_FLAG(res == 0, F_ZF);
+ CONDITIONAL_SET_FLAG(PARITY(res & 0xff), F_PF);
+ /* AF == dont care */
+ CLEAR_FLAG(F_CF);
+}
+
+/****************************************************************************
+REMARKS:
+Implements the XOR instruction and side effects.
+****************************************************************************/
+u8 xor_byte(u8 d, u8 s)
+{
+ register u8 res; /* all operands in native machine order */
+
+ res = d ^ s;
+ CLEAR_FLAG(F_OF);
+ CONDITIONAL_SET_FLAG(res & 0x80, F_SF);
+ CONDITIONAL_SET_FLAG(res == 0, F_ZF);
+ CONDITIONAL_SET_FLAG(PARITY(res), F_PF);
+ CLEAR_FLAG(F_CF);
+ CLEAR_FLAG(F_AF);
+ return res;
+}
+
+/****************************************************************************
+REMARKS:
+Implements the XOR instruction and side effects.
+****************************************************************************/
+u16 xor_word(u16 d, u16 s)
+{
+ register u16 res; /* all operands in native machine order */
+
+ res = d ^ s;
+ CLEAR_FLAG(F_OF);
+ CONDITIONAL_SET_FLAG(res & 0x8000, F_SF);
+ CONDITIONAL_SET_FLAG(res == 0, F_ZF);
+ CONDITIONAL_SET_FLAG(PARITY(res & 0xff), F_PF);
+ CLEAR_FLAG(F_CF);
+ CLEAR_FLAG(F_AF);
+ return res;
+}
+
+/****************************************************************************
+REMARKS:
+Implements the XOR instruction and side effects.
+****************************************************************************/
+u32 xor_long(u32 d, u32 s)
+{
+ register u32 res; /* all operands in native machine order */
+
+ res = d ^ s;
+ CLEAR_FLAG(F_OF);
+ CONDITIONAL_SET_FLAG(res & 0x80000000, F_SF);
+ CONDITIONAL_SET_FLAG(res == 0, F_ZF);
+ CONDITIONAL_SET_FLAG(PARITY(res & 0xff), F_PF);
+ CLEAR_FLAG(F_CF);
+ CLEAR_FLAG(F_AF);
+ return res;
+}
+
+/****************************************************************************
+REMARKS:
+Implements the IMUL instruction and side effects.
+****************************************************************************/
+void imul_byte(u8 s)
+{
+ s16 res = (s16)((s8)M.x86.R_AL * (s8)s);
+
+ M.x86.R_AX = res;
+ if (((M.x86.R_AL & 0x80) == 0 && M.x86.R_AH == 0x00) ||
+ ((M.x86.R_AL & 0x80) != 0 && M.x86.R_AH == 0xFF)) {
+ CLEAR_FLAG(F_CF);
+ CLEAR_FLAG(F_OF);
+ } else {
+ SET_FLAG(F_CF);
+ SET_FLAG(F_OF);
+ }
+}
+
+/****************************************************************************
+REMARKS:
+Implements the IMUL instruction and side effects.
+****************************************************************************/
+void imul_word(u16 s)
+{
+ s32 res = (s16)M.x86.R_AX * (s16)s;
+
+ M.x86.R_AX = (u16)res;
+ M.x86.R_DX = (u16)(res >> 16);
+ if (((M.x86.R_AX & 0x8000) == 0 && M.x86.R_DX == 0x00) ||
+ ((M.x86.R_AX & 0x8000) != 0 && M.x86.R_DX == 0xFF)) {
+ CLEAR_FLAG(F_CF);
+ CLEAR_FLAG(F_OF);
+ } else {
+ SET_FLAG(F_CF);
+ SET_FLAG(F_OF);
+ }
+}
+
+/****************************************************************************
+REMARKS:
+Implements the IMUL instruction and side effects.
+****************************************************************************/
+void imul_long_direct(u32 *res_lo, u32* res_hi,u32 d, u32 s)
+{
+#ifdef __HAS_LONG_LONG__
+ s64 res = (s32)d * (s32)s;
+
+ *res_lo = (u32)res;
+ *res_hi = (u32)(res >> 32);
+#else
+ u32 d_lo,d_hi,d_sign;
+ u32 s_lo,s_hi,s_sign;
+ u32 rlo_lo,rlo_hi,rhi_lo;
+
+ if ((d_sign = d & 0x80000000) != 0)
+ d = -d;
+ d_lo = d & 0xFFFF;
+ d_hi = d >> 16;
+ if ((s_sign = s & 0x80000000) != 0)
+ s = -s;
+ s_lo = s & 0xFFFF;
+ s_hi = s >> 16;
+ rlo_lo = d_lo * s_lo;
+ rlo_hi = (d_hi * s_lo + d_lo * s_hi) + (rlo_lo >> 16);
+ rhi_lo = d_hi * s_hi + (rlo_hi >> 16);
+ *res_lo = (rlo_hi << 16) | (rlo_lo & 0xFFFF);
+ *res_hi = rhi_lo;
+ if (d_sign != s_sign) {
+ d = ~*res_lo;
+ s = (((d & 0xFFFF) + 1) >> 16) + (d >> 16);
+ *res_lo = ~*res_lo+1;
+ *res_hi = ~*res_hi+(s >> 16);
+ }
+#endif
+}
+
+/****************************************************************************
+REMARKS:
+Implements the IMUL instruction and side effects.
+****************************************************************************/
+void imul_long(u32 s)
+{
+ imul_long_direct(&M.x86.R_EAX,&M.x86.R_EDX,M.x86.R_EAX,s);
+ if (((M.x86.R_EAX & 0x80000000) == 0 && M.x86.R_EDX == 0x00) ||
+ ((M.x86.R_EAX & 0x80000000) != 0 && M.x86.R_EDX == 0xFF)) {
+ CLEAR_FLAG(F_CF);
+ CLEAR_FLAG(F_OF);
+ } else {
+ SET_FLAG(F_CF);
+ SET_FLAG(F_OF);
+ }
+}
+
+/****************************************************************************
+REMARKS:
+Implements the MUL instruction and side effects.
+****************************************************************************/
+void mul_byte(u8 s)
+{
+ u16 res = (u16)(M.x86.R_AL * s);
+
+ M.x86.R_AX = res;
+ if (M.x86.R_AH == 0) {
+ CLEAR_FLAG(F_CF);
+ CLEAR_FLAG(F_OF);
+ } else {
+ SET_FLAG(F_CF);
+ SET_FLAG(F_OF);
+ }
+}
+
+/****************************************************************************
+REMARKS:
+Implements the MUL instruction and side effects.
+****************************************************************************/
+void mul_word(u16 s)
+{
+ u32 res = M.x86.R_AX * s;
+
+ M.x86.R_AX = (u16)res;
+ M.x86.R_DX = (u16)(res >> 16);
+ if (M.x86.R_DX == 0) {
+ CLEAR_FLAG(F_CF);
+ CLEAR_FLAG(F_OF);
+ } else {
+ SET_FLAG(F_CF);
+ SET_FLAG(F_OF);
+ }
+}
+
+/****************************************************************************
+REMARKS:
+Implements the MUL instruction and side effects.
+****************************************************************************/
+void mul_long(u32 s)
+{
+#ifdef __HAS_LONG_LONG__
+ u64 res = (u32)M.x86.R_EAX * (u32)s;
+
+ M.x86.R_EAX = (u32)res;
+ M.x86.R_EDX = (u32)(res >> 32);
+#else
+ u32 a,a_lo,a_hi;
+ u32 s_lo,s_hi;
+ u32 rlo_lo,rlo_hi,rhi_lo;
+
+ a = M.x86.R_EAX;
+ a_lo = a & 0xFFFF;
+ a_hi = a >> 16;
+ s_lo = s & 0xFFFF;
+ s_hi = s >> 16;
+ rlo_lo = a_lo * s_lo;
+ rlo_hi = (a_hi * s_lo + a_lo * s_hi) + (rlo_lo >> 16);
+ rhi_lo = a_hi * s_hi + (rlo_hi >> 16);
+ M.x86.R_EAX = (rlo_hi << 16) | (rlo_lo & 0xFFFF);
+ M.x86.R_EDX = rhi_lo;
+#endif
+
+ if (M.x86.R_EDX == 0) {
+ CLEAR_FLAG(F_CF);
+ CLEAR_FLAG(F_OF);
+ } else {
+ SET_FLAG(F_CF);
+ SET_FLAG(F_OF);
+ }
+}
+
+/****************************************************************************
+REMARKS:
+Implements the IDIV instruction and side effects.
+****************************************************************************/
+void idiv_byte(u8 s)
+{
+ s32 dvd, div, mod;
+
+ dvd = (s16)M.x86.R_AX;
+ if (s == 0) {
+ x86emu_intr_raise(0);
+ return;
+ }
+ div = dvd / (s8)s;
+ mod = dvd % (s8)s;
+ if (abs(div) > 0x7f) {
+ x86emu_intr_raise(0);
+ return;
+ }
+ M.x86.R_AL = (s8) div;
+ M.x86.R_AH = (s8) mod;
+}
+
+/****************************************************************************
+REMARKS:
+Implements the IDIV instruction and side effects.
+****************************************************************************/
+void idiv_word(u16 s)
+{
+ s32 dvd, div, mod;
+
+ dvd = (((s32)M.x86.R_DX) << 16) | M.x86.R_AX;
+ if (s == 0) {
+ x86emu_intr_raise(0);
+ return;
+ }
+ div = dvd / (s16)s;
+ mod = dvd % (s16)s;
+ if (abs(div) > 0x7fff) {
+ x86emu_intr_raise(0);
+ return;
+ }
+ CLEAR_FLAG(F_CF);
+ CLEAR_FLAG(F_SF);
+ CONDITIONAL_SET_FLAG(div == 0, F_ZF);
+ CONDITIONAL_SET_FLAG(PARITY(mod & 0xff), F_PF);
+
+ M.x86.R_AX = (u16)div;
+ M.x86.R_DX = (u16)mod;
+}
+
+/****************************************************************************
+REMARKS:
+Implements the IDIV instruction and side effects.
+****************************************************************************/
+void idiv_long(u32 s)
+{
+#ifdef __HAS_LONG_LONG__
+ s64 dvd, div, mod;
+
+ dvd = (((s64)M.x86.R_EDX) << 32) | M.x86.R_EAX;
+ if (s == 0) {
+ x86emu_intr_raise(0);
+ return;
+ }
+ div = dvd / (s32)s;
+ mod = dvd % (s32)s;
+ if (abs(div) > 0x7fffffff) {
+ x86emu_intr_raise(0);
+ return;
+ }
+#else
+ s32 div = 0, mod;
+ s32 h_dvd = M.x86.R_EDX;
+ u32 l_dvd = M.x86.R_EAX;
+ u32 abs_s = s & 0x7FFFFFFF;
+ u32 abs_h_dvd = h_dvd & 0x7FFFFFFF;
+ u32 h_s = abs_s >> 1;
+ u32 l_s = abs_s << 31;
+ int counter = 31;
+ int carry;
+
+ if (s == 0) {
+ x86emu_intr_raise(0);
+ return;
+ }
+ do {
+ div <<= 1;
+ carry = (l_dvd >= l_s) ? 0 : 1;
+
+ if (abs_h_dvd < (h_s + carry)) {
+ h_s >>= 1;
+ l_s = abs_s << (--counter);
+ continue;
+ } else {
+ abs_h_dvd -= (h_s + carry);
+ l_dvd = carry ? ((0xFFFFFFFF - l_s) + l_dvd + 1)
+ : (l_dvd - l_s);
+ h_s >>= 1;
+ l_s = abs_s << (--counter);
+ div |= 1;
+ continue;
+ }
+
+ } while (counter > -1);
+ /* overflow */
+ if (abs_h_dvd || (l_dvd > abs_s)) {
+ x86emu_intr_raise(0);
+ return;
+ }
+ /* sign */
+ div |= ((h_dvd & 0x10000000) ^ (s & 0x10000000));
+ mod = l_dvd;
+
+#endif
+ CLEAR_FLAG(F_CF);
+ CLEAR_FLAG(F_AF);
+ CLEAR_FLAG(F_SF);
+ SET_FLAG(F_ZF);
+ CONDITIONAL_SET_FLAG(PARITY(mod & 0xff), F_PF);
+
+ M.x86.R_EAX = (u32)div;
+ M.x86.R_EDX = (u32)mod;
+}
+
+/****************************************************************************
+REMARKS:
+Implements the DIV instruction and side effects.
+****************************************************************************/
+void div_byte(u8 s)
+{
+ u32 dvd, div, mod;
+
+ dvd = M.x86.R_AX;
+ if (s == 0) {
+ x86emu_intr_raise(0);
+ return;
+ }
+ div = dvd / (u8)s;
+ mod = dvd % (u8)s;
+ if (abs(div) > 0xff) {
+ x86emu_intr_raise(0);
+ return;
+ }
+ M.x86.R_AL = (u8)div;
+ M.x86.R_AH = (u8)mod;
+}
+
+/****************************************************************************
+REMARKS:
+Implements the DIV instruction and side effects.
+****************************************************************************/
+void div_word(u16 s)
+{
+ u32 dvd, div, mod;
+
+ dvd = (((u32)M.x86.R_DX) << 16) | M.x86.R_AX;
+ if (s == 0) {
+ x86emu_intr_raise(0);
+ return;
+ }
+ div = dvd / (u16)s;
+ mod = dvd % (u16)s;
+ if (abs(div) > 0xffff) {
+ x86emu_intr_raise(0);
+ return;
+ }
+ CLEAR_FLAG(F_CF);
+ CLEAR_FLAG(F_SF);
+ CONDITIONAL_SET_FLAG(div == 0, F_ZF);
+ CONDITIONAL_SET_FLAG(PARITY(mod & 0xff), F_PF);
+
+ M.x86.R_AX = (u16)div;
+ M.x86.R_DX = (u16)mod;
+}
+
+/****************************************************************************
+REMARKS:
+Implements the DIV instruction and side effects.
+****************************************************************************/
+void div_long(u32 s)
+{
+#ifdef __HAS_LONG_LONG__
+ u64 dvd, div, mod;
+
+ dvd = (((u64)M.x86.R_EDX) << 32) | M.x86.R_EAX;
+ if (s == 0) {
+ x86emu_intr_raise(0);
+ return;
+ }
+ div = dvd / (u32)s;
+ mod = dvd % (u32)s;
+ if (abs(div) > 0xffffffff) {
+ x86emu_intr_raise(0);
+ return;
+ }
+#else
+ s32 div = 0, mod;
+ s32 h_dvd = M.x86.R_EDX;
+ u32 l_dvd = M.x86.R_EAX;
+
+ u32 h_s = s;
+ u32 l_s = 0;
+ int counter = 32;
+ int carry;
+
+ if (s == 0) {
+ x86emu_intr_raise(0);
+ return;
+ }
+ do {
+ div <<= 1;
+ carry = (l_dvd >= l_s) ? 0 : 1;
+
+ if (h_dvd < (h_s + carry)) {
+ h_s >>= 1;
+ l_s = s << (--counter);
+ continue;
+ } else {
+ h_dvd -= (h_s + carry);
+ l_dvd = carry ? ((0xFFFFFFFF - l_s) + l_dvd + 1)
+ : (l_dvd - l_s);
+ h_s >>= 1;
+ l_s = s << (--counter);
+ div |= 1;
+ continue;
+ }
+
+ } while (counter > -1);
+ /* overflow */
+ if (h_dvd || (l_dvd > s)) {
+ x86emu_intr_raise(0);
+ return;
+ }
+ mod = l_dvd;
+#endif
+ CLEAR_FLAG(F_CF);
+ CLEAR_FLAG(F_AF);
+ CLEAR_FLAG(F_SF);
+ SET_FLAG(F_ZF);
+ CONDITIONAL_SET_FLAG(PARITY(mod & 0xff), F_PF);
+
+ M.x86.R_EAX = (u32)div;
+ M.x86.R_EDX = (u32)mod;
+}
+
+/****************************************************************************
+REMARKS:
+Implements the IN string instruction and side effects.
+****************************************************************************/
+void ins(int size)
+{
+ int inc = size;
+
+ if (ACCESS_FLAG(F_DF)) {
+ inc = -size;
+ }
+ if (M.x86.mode & (SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE)) {
+ /* dont care whether REPE or REPNE */
+ /* in until CX is ZERO. */
+ u32 count = ((M.x86.mode & SYSMODE_PREFIX_DATA) ?
+ M.x86.R_ECX : M.x86.R_CX);
+ switch (size) {
+ case 1:
+ while (count--) {
+ store_data_byte_abs(M.x86.R_ES, M.x86.R_DI,
+ (*sys_inb)(M.x86.R_DX));
+ M.x86.R_DI += inc;
+ }
+ break;
+
+ case 2:
+ while (count--) {
+ store_data_word_abs(M.x86.R_ES, M.x86.R_DI,
+ (*sys_inw)(M.x86.R_DX));
+ M.x86.R_DI += inc;
+ }
+ break;
+ case 4:
+ while (count--) {
+ store_data_long_abs(M.x86.R_ES, M.x86.R_DI,
+ (*sys_inl)(M.x86.R_DX));
+ M.x86.R_DI += inc;
+ break;
+ }
+ }
+ M.x86.R_CX = 0;
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ M.x86.R_ECX = 0;
+ }
+ M.x86.mode &= ~(SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE);
+ } else {
+ switch (size) {
+ case 1:
+ store_data_byte_abs(M.x86.R_ES, M.x86.R_DI,
+ (*sys_inb)(M.x86.R_DX));
+ break;
+ case 2:
+ store_data_word_abs(M.x86.R_ES, M.x86.R_DI,
+ (*sys_inw)(M.x86.R_DX));
+ break;
+ case 4:
+ store_data_long_abs(M.x86.R_ES, M.x86.R_DI,
+ (*sys_inl)(M.x86.R_DX));
+ break;
+ }
+ M.x86.R_DI += inc;
+ }
+}
+
+/****************************************************************************
+REMARKS:
+Implements the OUT string instruction and side effects.
+****************************************************************************/
+void outs(int size)
+{
+ int inc = size;
+
+ if (ACCESS_FLAG(F_DF)) {
+ inc = -size;
+ }
+ if (M.x86.mode & (SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE)) {
+ /* dont care whether REPE or REPNE */
+ /* out until CX is ZERO. */
+ u32 count = ((M.x86.mode & SYSMODE_PREFIX_DATA) ?
+ M.x86.R_ECX : M.x86.R_CX);
+ switch (size) {
+ case 1:
+ while (count--) {
+ (*sys_outb)(M.x86.R_DX,
+ fetch_data_byte_abs(M.x86.R_ES, M.x86.R_SI));
+ M.x86.R_SI += inc;
+ }
+ break;
+
+ case 2:
+ while (count--) {
+ (*sys_outw)(M.x86.R_DX,
+ fetch_data_word_abs(M.x86.R_ES, M.x86.R_SI));
+ M.x86.R_SI += inc;
+ }
+ break;
+ case 4:
+ while (count--) {
+ (*sys_outl)(M.x86.R_DX,
+ fetch_data_long_abs(M.x86.R_ES, M.x86.R_SI));
+ M.x86.R_SI += inc;
+ break;
+ }
+ }
+ M.x86.R_CX = 0;
+ if (M.x86.mode & SYSMODE_PREFIX_DATA) {
+ M.x86.R_ECX = 0;
+ }
+ M.x86.mode &= ~(SYSMODE_PREFIX_REPE | SYSMODE_PREFIX_REPNE);
+ } else {
+ switch (size) {
+ case 1:
+ (*sys_outb)(M.x86.R_DX,
+ fetch_data_byte_abs(M.x86.R_ES, M.x86.R_SI));
+ break;
+ case 2:
+ (*sys_outw)(M.x86.R_DX,
+ fetch_data_word_abs(M.x86.R_ES, M.x86.R_SI));
+ break;
+ case 4:
+ (*sys_outl)(M.x86.R_DX,
+ fetch_data_long_abs(M.x86.R_ES, M.x86.R_SI));
+ break;
+ }
+ M.x86.R_SI += inc;
+ }
+}
+
+/****************************************************************************
+PARAMETERS:
+addr - Address to fetch word from
+
+REMARKS:
+Fetches a word from emulator memory using an absolute address.
+****************************************************************************/
+u16 mem_access_word(int addr)
+{
+DB( if (CHECK_MEM_ACCESS())
+ x86emu_check_mem_access(addr);)
+ return (*sys_rdw)(addr);
+}
+
+/****************************************************************************
+REMARKS:
+Pushes a word onto the stack.
+
+NOTE: Do not inline this, as (*sys_wrX) is already inline!
+****************************************************************************/
+void push_word(u16 w)
+{
+DB( if (CHECK_SP_ACCESS())
+ x86emu_check_sp_access();)
+ M.x86.R_SP -= 2;
+ (*sys_wrw)(((u32)M.x86.R_SS << 4) + M.x86.R_SP, w);
+}
+
+/****************************************************************************
+REMARKS:
+Pushes a long onto the stack.
+
+NOTE: Do not inline this, as (*sys_wrX) is already inline!
+****************************************************************************/
+void push_long(u32 w)
+{
+DB( if (CHECK_SP_ACCESS())
+ x86emu_check_sp_access();)
+ M.x86.R_SP -= 4;
+ (*sys_wrl)(((u32)M.x86.R_SS << 4) + M.x86.R_SP, w);
+}
+
+/****************************************************************************
+REMARKS:
+Pops a word from the stack.
+
+NOTE: Do not inline this, as (*sys_rdX) is already inline!
+****************************************************************************/
+u16 pop_word(void)
+{
+ register u16 res;
+
+DB( if (CHECK_SP_ACCESS())
+ x86emu_check_sp_access();)
+ res = (*sys_rdw)(((u32)M.x86.R_SS << 4) + M.x86.R_SP);
+ M.x86.R_SP += 2;
+ return res;
+}
+
+/****************************************************************************
+REMARKS:
+Pops a long from the stack.
+
+NOTE: Do not inline this, as (*sys_rdX) is already inline!
+****************************************************************************/
+u32 pop_long(void)
+{
+ register u32 res;
+
+DB( if (CHECK_SP_ACCESS())
+ x86emu_check_sp_access();)
+ res = (*sys_rdl)(((u32)M.x86.R_SS << 4) + M.x86.R_SP);
+ M.x86.R_SP += 4;
+ return res;
+}
+
--- /dev/null
+/****************************************************************************
+*
+* Realmode X86 Emulator Library
+*
+* Copyright (C) 1996-1999 SciTech Software, Inc.
+* Copyright (C) David Mosberger-Tang
+* Copyright (C) 1999 Egbert Eich
+*
+* ========================================================================
+*
+* Permission to use, copy, modify, distribute, and sell this software and
+* its documentation for any purpose is hereby granted without fee,
+* provided that the above copyright notice appear in all copies and that
+* both that copyright notice and this permission notice appear in
+* supporting documentation, and that the name of the authors not be used
+* in advertising or publicity pertaining to distribution of the software
+* without specific, written prior permission. The authors makes no
+* representations about the suitability of this software for any purpose.
+* It is provided "as is" without express or implied warranty.
+*
+* THE AUTHORS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+* EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
+* USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
+* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+* PERFORMANCE OF THIS SOFTWARE.
+*
+* ========================================================================
+*
+* Language: ANSI C
+* Environment: Any
+* Developer: Kendall Bennett
+*
+* Description: This file includes subroutines which are related to
+* programmed I/O and memory access. Included in this module
+* are default functions with limited usefulness. For real
+* uses these functions will most likely be overriden by the
+* user library.
+*
+****************************************************************************/
+/* $XFree86: xc/extras/x86emu/src/x86emu/sys.c,v 1.6 2002/09/16 18:05:18 eich Exp $ */
+
+#include "x86emu.h"
+#include "x86emu/x86emui.h"
+#include "x86emu/regs.h"
+#include "x86emu/debug.h"
+#include "x86emu/prim_ops.h"
+#ifdef IN_MODULE
+#include "xf86_ansic.h"
+#else
+#include <string.h>
+#endif
+/*------------------------- Global Variables ------------------------------*/
+
+X86EMU_sysEnv _X86EMU_env; /* Global emulator machine state */
+X86EMU_intrFuncs _X86EMU_intrTab[256];
+
+/*----------------------------- Implementation ----------------------------*/
+#if defined(__alpha__) || defined(__alpha)
+/* to cope with broken egcs-1.1.2 :-(((( */
+
+#define ALPHA_UALOADS
+/*
+ * inline functions to do unaligned accesses
+ * from linux/include/asm-alpha/unaligned.h
+ */
+
+/*
+ * EGCS 1.1 knows about arbitrary unaligned loads. Define some
+ * packed structures to talk about such things with.
+ */
+
+#if defined(__GNUC__) && ((__GNUC__ > 2) || (__GNUC_MINOR__ >= 91))
+struct __una_u64 { unsigned long x __attribute__((packed)); };
+struct __una_u32 { unsigned int x __attribute__((packed)); };
+struct __una_u16 { unsigned short x __attribute__((packed)); };
+#endif
+
+static __inline__ unsigned long ldq_u(unsigned long * r11)
+{
+#if defined(__GNUC__) && ((__GNUC__ > 2) || (__GNUC_MINOR__ >= 91))
+ const struct __una_u64 *ptr = (const struct __una_u64 *) r11;
+ return ptr->x;
+#else
+ unsigned long r1,r2;
+ __asm__("ldq_u %0,%3\n\t"
+ "ldq_u %1,%4\n\t"
+ "extql %0,%2,%0\n\t"
+ "extqh %1,%2,%1"
+ :"=&r" (r1), "=&r" (r2)
+ :"r" (r11),
+ "m" (*r11),
+ "m" (*(const unsigned long *)(7+(char *) r11)));
+ return r1 | r2;
+#endif
+}
+
+static __inline__ unsigned long ldl_u(unsigned int * r11)
+{
+#if defined(__GNUC__) && ((__GNUC__ > 2) || (__GNUC_MINOR__ >= 91))
+ const struct __una_u32 *ptr = (const struct __una_u32 *) r11;
+ return ptr->x;
+#else
+ unsigned long r1,r2;
+ __asm__("ldq_u %0,%3\n\t"
+ "ldq_u %1,%4\n\t"
+ "extll %0,%2,%0\n\t"
+ "extlh %1,%2,%1"
+ :"=&r" (r1), "=&r" (r2)
+ :"r" (r11),
+ "m" (*r11),
+ "m" (*(const unsigned long *)(3+(char *) r11)));
+ return r1 | r2;
+#endif
+}
+
+static __inline__ unsigned long ldw_u(unsigned short * r11)
+{
+#if defined(__GNUC__) && ((__GNUC__ > 2) || (__GNUC_MINOR__ >= 91))
+ const struct __una_u16 *ptr = (const struct __una_u16 *) r11;
+ return ptr->x;
+#else
+ unsigned long r1,r2;
+ __asm__("ldq_u %0,%3\n\t"
+ "ldq_u %1,%4\n\t"
+ "extwl %0,%2,%0\n\t"
+ "extwh %1,%2,%1"
+ :"=&r" (r1), "=&r" (r2)
+ :"r" (r11),
+ "m" (*r11),
+ "m" (*(const unsigned long *)(1+(char *) r11)));
+ return r1 | r2;
+#endif
+}
+
+/*
+ * Elemental unaligned stores
+ */
+
+static __inline__ void stq_u(unsigned long r5, unsigned long * r11)
+{
+#if defined(__GNUC__) && ((__GNUC__ > 2) || (__GNUC_MINOR__ >= 91))
+ struct __una_u64 *ptr = (struct __una_u64 *) r11;
+ ptr->x = r5;
+#else
+ unsigned long r1,r2,r3,r4;
+
+ __asm__("ldq_u %3,%1\n\t"
+ "ldq_u %2,%0\n\t"
+ "insqh %6,%7,%5\n\t"
+ "insql %6,%7,%4\n\t"
+ "mskqh %3,%7,%3\n\t"
+ "mskql %2,%7,%2\n\t"
+ "bis %3,%5,%3\n\t"
+ "bis %2,%4,%2\n\t"
+ "stq_u %3,%1\n\t"
+ "stq_u %2,%0"
+ :"=m" (*r11),
+ "=m" (*(unsigned long *)(7+(char *) r11)),
+ "=&r" (r1), "=&r" (r2), "=&r" (r3), "=&r" (r4)
+ :"r" (r5), "r" (r11));
+#endif
+}
+
+static __inline__ void stl_u(unsigned long r5, unsigned int * r11)
+{
+#if defined(__GNUC__) && ((__GNUC__ > 2) || (__GNUC_MINOR__ >= 91))
+ struct __una_u32 *ptr = (struct __una_u32 *) r11;
+ ptr->x = r5;
+#else
+ unsigned long r1,r2,r3,r4;
+
+ __asm__("ldq_u %3,%1\n\t"
+ "ldq_u %2,%0\n\t"
+ "inslh %6,%7,%5\n\t"
+ "insll %6,%7,%4\n\t"
+ "msklh %3,%7,%3\n\t"
+ "mskll %2,%7,%2\n\t"
+ "bis %3,%5,%3\n\t"
+ "bis %2,%4,%2\n\t"
+ "stq_u %3,%1\n\t"
+ "stq_u %2,%0"
+ :"=m" (*r11),
+ "=m" (*(unsigned long *)(3+(char *) r11)),
+ "=&r" (r1), "=&r" (r2), "=&r" (r3), "=&r" (r4)
+ :"r" (r5), "r" (r11));
+#endif
+}
+
+static __inline__ void stw_u(unsigned long r5, unsigned short * r11)
+{
+#if defined(__GNUC__) && ((__GNUC__ > 2) || (__GNUC_MINOR__ >= 91))
+ struct __una_u16 *ptr = (struct __una_u16 *) r11;
+ ptr->x = r5;
+#else
+ unsigned long r1,r2,r3,r4;
+
+ __asm__("ldq_u %3,%1\n\t"
+ "ldq_u %2,%0\n\t"
+ "inswh %6,%7,%5\n\t"
+ "inswl %6,%7,%4\n\t"
+ "mskwh %3,%7,%3\n\t"
+ "mskwl %2,%7,%2\n\t"
+ "bis %3,%5,%3\n\t"
+ "bis %2,%4,%2\n\t"
+ "stq_u %3,%1\n\t"
+ "stq_u %2,%0"
+ :"=m" (*r11),
+ "=m" (*(unsigned long *)(1+(char *) r11)),
+ "=&r" (r1), "=&r" (r2), "=&r" (r3), "=&r" (r4)
+ :"r" (r5), "r" (r11));
+#endif
+}
+
+#elif defined(__GNUC__) && ((__GNUC__ < 3)) && \
+ (defined (__ia64__) || defined (ia64__))
+#define IA64_UALOADS
+/*
+ * EGCS 1.1 knows about arbitrary unaligned loads. Define some
+ * packed structures to talk about such things with.
+ */
+struct __una_u64 { unsigned long x __attribute__((packed)); };
+struct __una_u32 { unsigned int x __attribute__((packed)); };
+struct __una_u16 { unsigned short x __attribute__((packed)); };
+
+static __inline__ unsigned long
+__uldq (const unsigned long * r11)
+{
+ const struct __una_u64 *ptr = (const struct __una_u64 *) r11;
+ return ptr->x;
+}
+
+static __inline__ unsigned long
+uldl (const unsigned int * r11)
+{
+ const struct __una_u32 *ptr = (const struct __una_u32 *) r11;
+ return ptr->x;
+}
+
+static __inline__ unsigned long
+uldw (const unsigned short * r11)
+{
+ const struct __una_u16 *ptr = (const struct __una_u16 *) r11;
+ return ptr->x;
+}
+
+static __inline__ void
+ustq (unsigned long r5, unsigned long * r11)
+{
+ struct __una_u64 *ptr = (struct __una_u64 *) r11;
+ ptr->x = r5;
+}
+
+static __inline__ void
+ustl (unsigned long r5, unsigned int * r11)
+{
+ struct __una_u32 *ptr = (struct __una_u32 *) r11;
+ ptr->x = r5;
+}
+
+static __inline__ void
+ustw (unsigned long r5, unsigned short * r11)
+{
+ struct __una_u16 *ptr = (struct __una_u16 *) r11;
+ ptr->x = r5;
+}
+
+#endif
+
+/****************************************************************************
+PARAMETERS:
+addr - Emulator memory address to read
+
+RETURNS:
+Byte value read from emulator memory.
+
+REMARKS:
+Reads a byte value from the emulator memory.
+****************************************************************************/
+u8 X86API rdb(
+ u32 addr)
+{
+ u8 val;
+
+ if (addr > M.mem_size - 1) {
+ DB(printk("mem_read: address %#lx out of range!\n", addr);)
+ HALT_SYS();
+ }
+ val = *(u8*)(M.mem_base + addr);
+DB( if (DEBUG_MEM_TRACE())
+ printk("%#08x 1 -> %#x\n", addr, val);)
+ return val;
+}
+
+/****************************************************************************
+PARAMETERS:
+addr - Emulator memory address to read
+
+RETURNS:
+Word value read from emulator memory.
+
+REMARKS:
+Reads a word value from the emulator memory.
+****************************************************************************/
+u16 X86API rdw(
+ u32 addr)
+{
+ u16 val = 0;
+
+ if (addr > M.mem_size - 2) {
+ DB(printk("mem_read: address %#lx out of range!\n", addr);)
+ HALT_SYS();
+ }
+#ifdef __BIG_ENDIAN__
+ if (addr & 0x1) {
+ val = (*(u8*)(M.mem_base + addr) |
+ (*(u8*)(M.mem_base + addr + 1) << 8));
+ }
+ else
+#endif
+#if defined(ALPHA_UALOADS)
+ val = ldw_u((u16*)(M.mem_base + addr));
+#elif defined(IA64_UALOADS)
+ val = uldw((u16*)(M.mem_base + addr));
+#else
+ val = *(u16*)(M.mem_base + addr);
+#endif
+ DB( if (DEBUG_MEM_TRACE())
+ printk("%#08x 2 -> %#x\n", addr, val);)
+ return val;
+}
+
+/****************************************************************************
+PARAMETERS:
+addr - Emulator memory address to read
+
+RETURNS:
+Long value read from emulator memory.
+REMARKS:
+Reads a long value from the emulator memory.
+****************************************************************************/
+u32 X86API rdl(
+ u32 addr)
+{
+ u32 val = 0;
+
+ if (addr > M.mem_size - 4) {
+ DB(printk("mem_read: address %#lx out of range!\n", addr);)
+ HALT_SYS();
+ }
+#ifdef __BIG_ENDIAN__
+ if (addr & 0x3) {
+ val = (*(u8*)(M.mem_base + addr + 0) |
+ (*(u8*)(M.mem_base + addr + 1) << 8) |
+ (*(u8*)(M.mem_base + addr + 2) << 16) |
+ (*(u8*)(M.mem_base + addr + 3) << 24));
+ }
+ else
+#endif
+#if defined(ALPHA_UALOADS)
+ val = ldl_u((u32*)(M.mem_base + addr));
+#elif defined(IA64_UALOADS)
+ val = uldl((u32*)(M.mem_base + addr));
+#else
+ val = *(u32*)(M.mem_base + addr);
+#endif
+DB( if (DEBUG_MEM_TRACE())
+ printk("%#08x 4 -> %#x\n", addr, val);)
+ return val;
+}
+
+/****************************************************************************
+PARAMETERS:
+addr - Emulator memory address to read
+val - Value to store
+
+REMARKS:
+Writes a byte value to emulator memory.
+****************************************************************************/
+void X86API wrb(
+ u32 addr,
+ u8 val)
+{
+DB( if (DEBUG_MEM_TRACE())
+ printk("%#08x 1 <- %#x\n", addr, val);)
+ if (addr > M.mem_size - 1) {
+ DB(printk("mem_write: address %#lx out of range!\n", addr);)
+ HALT_SYS();
+ }
+ *(u8*)(M.mem_base + addr) = val;
+}
+
+/****************************************************************************
+PARAMETERS:
+addr - Emulator memory address to read
+val - Value to store
+
+REMARKS:
+Writes a word value to emulator memory.
+****************************************************************************/
+void X86API wrw(
+ u32 addr,
+ u16 val)
+{
+DB( if (DEBUG_MEM_TRACE())
+ printk("%#08x 2 <- %#x\n", addr, val);)
+ if (addr > M.mem_size - 2) {
+ DB(printk("mem_write: address %#lx out of range!\n", addr);)
+ HALT_SYS();
+ }
+#ifdef __BIG_ENDIAN__
+ if (addr & 0x1) {
+ *(u8*)(M.mem_base + addr + 0) = (val >> 0) & 0xff;
+ *(u8*)(M.mem_base + addr + 1) = (val >> 8) & 0xff;
+ }
+ else
+#endif
+#if defined(ALPHA_UALOADS)
+ stw_u(val,(u16*)(M.mem_base + addr));
+#elif defined(IA64_UALOADS)
+ ustw(val,(u16*)(M.mem_base + addr));
+#else
+ *(u16*)(M.mem_base + addr) = val;
+#endif
+}
+
+/****************************************************************************
+PARAMETERS:
+addr - Emulator memory address to read
+val - Value to store
+
+REMARKS:
+Writes a long value to emulator memory.
+****************************************************************************/
+void X86API wrl(
+ u32 addr,
+ u32 val)
+{
+DB( if (DEBUG_MEM_TRACE())
+ printk("%#08x 4 <- %#x\n", addr, val);)
+ if (addr > M.mem_size - 4) {
+ DB(printk("mem_write: address %#lx out of range!\n", addr);)
+ HALT_SYS();
+ }
+#ifdef __BIG_ENDIAN__
+ if (addr & 0x1) {
+ *(u8*)(M.mem_base + addr + 0) = (val >> 0) & 0xff;
+ *(u8*)(M.mem_base + addr + 1) = (val >> 8) & 0xff;
+ *(u8*)(M.mem_base + addr + 2) = (val >> 16) & 0xff;
+ *(u8*)(M.mem_base + addr + 3) = (val >> 24) & 0xff;
+ }
+ else
+#endif
+#if defined(ALPHA_UALOADS)
+ stl_u(val,(u32*)(M.mem_base + addr));
+#elif defined(IA64_UALOADS)
+ ustl(val,(u32*)(M.mem_base + addr));
+#else
+ *(u32*)(M.mem_base + addr) = val;
+#endif
+}
+
+/****************************************************************************
+PARAMETERS:
+addr - PIO address to read
+RETURN:
+0
+REMARKS:
+Default PIO byte read function. Doesn't perform real inb.
+****************************************************************************/
+static u8 X86API p_inb(
+ X86EMU_pioAddr addr)
+{
+DB( if (DEBUG_IO_TRACE())
+ printk("inb %#04x \n", addr);)
+ return 0;
+}
+
+/****************************************************************************
+PARAMETERS:
+addr - PIO address to read
+RETURN:
+0
+REMARKS:
+Default PIO word read function. Doesn't perform real inw.
+****************************************************************************/
+static u16 X86API p_inw(
+ X86EMU_pioAddr addr)
+{
+DB( if (DEBUG_IO_TRACE())
+ printk("inw %#04x \n", addr);)
+ return 0;
+}
+
+/****************************************************************************
+PARAMETERS:
+addr - PIO address to read
+RETURN:
+0
+REMARKS:
+Default PIO long read function. Doesn't perform real inl.
+****************************************************************************/
+static u32 X86API p_inl(
+ X86EMU_pioAddr addr)
+{
+DB( if (DEBUG_IO_TRACE())
+ printk("inl %#04x \n", addr);)
+ return 0;
+}
+
+/****************************************************************************
+PARAMETERS:
+addr - PIO address to write
+val - Value to store
+REMARKS:
+Default PIO byte write function. Doesn't perform real outb.
+****************************************************************************/
+static void X86API p_outb(
+ X86EMU_pioAddr addr,
+ u8 val)
+{
+DB( if (DEBUG_IO_TRACE())
+ printk("outb %#02x -> %#04x \n", val, addr);)
+ return;
+}
+
+/****************************************************************************
+PARAMETERS:
+addr - PIO address to write
+val - Value to store
+REMARKS:
+Default PIO word write function. Doesn't perform real outw.
+****************************************************************************/
+static void X86API p_outw(
+ X86EMU_pioAddr addr,
+ u16 val)
+{
+DB( if (DEBUG_IO_TRACE())
+ printk("outw %#04x -> %#04x \n", val, addr);)
+ return;
+}
+
+/****************************************************************************
+PARAMETERS:
+addr - PIO address to write
+val - Value to store
+REMARKS:
+Default PIO ;ong write function. Doesn't perform real outl.
+****************************************************************************/
+static void X86API p_outl(
+ X86EMU_pioAddr addr,
+ u32 val)
+{
+DB( if (DEBUG_IO_TRACE())
+ printk("outl %#08x -> %#04x \n", val, addr);)
+ return;
+}
+
+/*------------------------- Global Variables ------------------------------*/
+
+u8 (X86APIP sys_rdb)(u32 addr) = rdb;
+u16 (X86APIP sys_rdw)(u32 addr) = rdw;
+u32 (X86APIP sys_rdl)(u32 addr) = rdl;
+void (X86APIP sys_wrb)(u32 addr,u8 val) = wrb;
+void (X86APIP sys_wrw)(u32 addr,u16 val) = wrw;
+void (X86APIP sys_wrl)(u32 addr,u32 val) = wrl;
+u8 (X86APIP sys_inb)(X86EMU_pioAddr addr) = p_inb;
+u16 (X86APIP sys_inw)(X86EMU_pioAddr addr) = p_inw;
+u32 (X86APIP sys_inl)(X86EMU_pioAddr addr) = p_inl;
+void (X86APIP sys_outb)(X86EMU_pioAddr addr, u8 val) = p_outb;
+void (X86APIP sys_outw)(X86EMU_pioAddr addr, u16 val) = p_outw;
+void (X86APIP sys_outl)(X86EMU_pioAddr addr, u32 val) = p_outl;
+
+/*----------------------------- Setup -------------------------------------*/
+
+/****************************************************************************
+PARAMETERS:
+funcs - New memory function pointers to make active
+
+REMARKS:
+This function is used to set the pointers to functions which access
+memory space, allowing the user application to override these functions
+and hook them out as necessary for their application.
+****************************************************************************/
+void X86EMU_setupMemFuncs(
+ X86EMU_memFuncs *funcs)
+{
+ sys_rdb = funcs->rdb;
+ sys_rdw = funcs->rdw;
+ sys_rdl = funcs->rdl;
+ sys_wrb = funcs->wrb;
+ sys_wrw = funcs->wrw;
+ sys_wrl = funcs->wrl;
+}
+
+/****************************************************************************
+PARAMETERS:
+funcs - New programmed I/O function pointers to make active
+
+REMARKS:
+This function is used to set the pointers to functions which access
+I/O space, allowing the user application to override these functions
+and hook them out as necessary for their application.
+****************************************************************************/
+void X86EMU_setupPioFuncs(
+ X86EMU_pioFuncs *funcs)
+{
+ sys_inb = funcs->inb;
+ sys_inw = funcs->inw;
+ sys_inl = funcs->inl;
+ sys_outb = funcs->outb;
+ sys_outw = funcs->outw;
+ sys_outl = funcs->outl;
+}
+
+/****************************************************************************
+PARAMETERS:
+funcs - New interrupt vector table to make active
+
+REMARKS:
+This function is used to set the pointers to functions which handle
+interrupt processing in the emulator, allowing the user application to
+hook interrupts as necessary for their application. Any interrupts that
+are not hooked by the user application, and reflected and handled internally
+in the emulator via the interrupt vector table. This allows the application
+to get control when the code being emulated executes specific software
+interrupts.
+****************************************************************************/
+void X86EMU_setupIntrFuncs(
+ X86EMU_intrFuncs funcs[])
+{
+ int i;
+
+ for (i=0; i < 256; i++)
+ _X86EMU_intrTab[i] = NULL;
+ if (funcs) {
+ for (i = 0; i < 256; i++)
+ _X86EMU_intrTab[i] = funcs[i];
+ }
+}
+
+/****************************************************************************
+PARAMETERS:
+int - New software interrupt to prepare for
+
+REMARKS:
+This function is used to set up the emulator state to exceute a software
+interrupt. This can be used by the user application code to allow an
+interrupt to be hooked, examined and then reflected back to the emulator
+so that the code in the emulator will continue processing the software
+interrupt as per normal. This essentially allows system code to actively
+hook and handle certain software interrupts as necessary.
+****************************************************************************/
+void X86EMU_prepareForInt(
+ int num)
+{
+ push_word((u16)M.x86.R_FLG);
+ CLEAR_FLAG(F_IF);
+ CLEAR_FLAG(F_TF);
+ push_word(M.x86.R_CS);
+ M.x86.R_CS = mem_access_word(num * 4 + 2);
+ push_word(M.x86.R_IP);
+ M.x86.R_IP = mem_access_word(num * 4);
+ M.x86.intr = 0;
+}
--- /dev/null
+/****************************************************************************
+*
+* Realmode X86 Emulator Library
+*
+* Copyright (C) 1996-1999 SciTech Software, Inc.
+* Copyright (C) David Mosberger-Tang
+* Copyright (C) 1999 Egbert Eich
+*
+* ========================================================================
+*
+* Permission to use, copy, modify, distribute, and sell this software and
+* its documentation for any purpose is hereby granted without fee,
+* provided that the above copyright notice appear in all copies and that
+* both that copyright notice and this permission notice appear in
+* supporting documentation, and that the name of the authors not be used
+* in advertising or publicity pertaining to distribution of the software
+* without specific, written prior permission. The authors makes no
+* representations about the suitability of this software for any purpose.
+* It is provided "as is" without express or implied warranty.
+*
+* THE AUTHORS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+* EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
+* USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
+* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+* PERFORMANCE OF THIS SOFTWARE.
+*
+* ========================================================================
+*
+* Language: Watcom C 10.6 or later
+* Environment: 32-bit DOS
+* Developer: Kendall Bennett
+*
+* Description: Program to validate the x86 emulator library for
+* correctness. We run the emulator primitive operations
+* functions against the real x86 CPU, and compare the result
+* and flags to ensure correctness.
+*
+* We use inline assembler to compile and build this program.
+*
+****************************************************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdarg.h>
+#include "x86emu.h"
+#include "x86emu/prim_asm.h"
+
+/*-------------------------- Implementation -------------------------------*/
+
+#define true 1
+#define false 0
+
+#define ALL_FLAGS (F_CF | F_PF | F_AF | F_ZF | F_SF | F_OF)
+
+#define VAL_START_BINARY(parm_type,res_type,dmax,smax,dincr,sincr) \
+{ \
+ parm_type d,s; \
+ res_type r,r_asm; \
+ ulong flags,inflags; \
+ int f,failed = false; \
+ char buf1[80],buf2[80]; \
+ for (d = 0; d < dmax; d += dincr) { \
+ for (s = 0; s < smax; s += sincr) { \
+ M.x86.R_EFLG = inflags = flags = def_flags; \
+ for (f = 0; f < 2; f++) {
+
+#define VAL_TEST_BINARY(name) \
+ r_asm = name##_asm(&flags,d,s); \
+ r = name(d,s); \
+ if (r != r_asm || M.x86.R_EFLG != flags) \
+ failed = true; \
+ if (failed || trace) {
+
+#define VAL_TEST_BINARY_VOID(name) \
+ name##_asm(&flags,d,s); \
+ name(d,s); \
+ r = r_asm = 0; \
+ if (M.x86.R_EFLG != flags) \
+ failed = true; \
+ if (failed || trace) {
+
+#define VAL_FAIL_BYTE_BYTE_BINARY(name) \
+ if (failed) \
+ printk("fail\n"); \
+ printk("0x%02X = %-15s(0x%02X,0x%02X), flags = %s -> %s\n", \
+ r, #name, d, s, print_flags(buf1,inflags), print_flags(buf2,M.x86.R_EFLG)); \
+ printk("0x%02X = %-15s(0x%02X,0x%02X), flags = %s -> %s\n", \
+ r_asm, #name"_asm", d, s, print_flags(buf1,inflags), print_flags(buf2,flags));
+
+#define VAL_FAIL_WORD_WORD_BINARY(name) \
+ if (failed) \
+ printk("fail\n"); \
+ printk("0x%04X = %-15s(0x%04X,0x%04X), flags = %s -> %s\n", \
+ r, #name, d, s, print_flags(buf1,inflags), print_flags(buf2,M.x86.R_EFLG)); \
+ printk("0x%04X = %-15s(0x%04X,0x%04X), flags = %s -> %s\n", \
+ r_asm, #name"_asm", d, s, print_flags(buf1,inflags), print_flags(buf2,flags));
+
+#define VAL_FAIL_LONG_LONG_BINARY(name) \
+ if (failed) \
+ printk("fail\n"); \
+ printk("0x%08X = %-15s(0x%08X,0x%08X), flags = %s -> %s\n", \
+ r, #name, d, s, print_flags(buf1,inflags), print_flags(buf2,M.x86.R_EFLG)); \
+ printk("0x%08X = %-15s(0x%08X,0x%08X), flags = %s -> %s\n", \
+ r_asm, #name"_asm", d, s, print_flags(buf1,inflags), print_flags(buf2,flags));
+
+#define VAL_END_BINARY() \
+ } \
+ M.x86.R_EFLG = inflags = flags = def_flags | (ALL_FLAGS & ~F_OF); \
+ if (failed) \
+ break; \
+ } \
+ if (failed) \
+ break; \
+ } \
+ if (failed) \
+ break; \
+ } \
+ if (!failed) \
+ printk("passed\n"); \
+}
+
+#define VAL_BYTE_BYTE_BINARY(name) \
+ printk("Validating %s ... ", #name); \
+ VAL_START_BINARY(u8,u8,0xFF,0xFF,1,1) \
+ VAL_TEST_BINARY(name) \
+ VAL_FAIL_BYTE_BYTE_BINARY(name) \
+ VAL_END_BINARY()
+
+#define VAL_WORD_WORD_BINARY(name) \
+ printk("Validating %s ... ", #name); \
+ VAL_START_BINARY(u16,u16,0xFF00,0xFF00,0x100,0x100) \
+ VAL_TEST_BINARY(name) \
+ VAL_FAIL_WORD_WORD_BINARY(name) \
+ VAL_END_BINARY()
+
+#define VAL_LONG_LONG_BINARY(name) \
+ printk("Validating %s ... ", #name); \
+ VAL_START_BINARY(u32,u32,0xFF000000,0xFF000000,0x1000000,0x1000000) \
+ VAL_TEST_BINARY(name) \
+ VAL_FAIL_LONG_LONG_BINARY(name) \
+ VAL_END_BINARY()
+
+#define VAL_VOID_BYTE_BINARY(name) \
+ printk("Validating %s ... ", #name); \
+ VAL_START_BINARY(u8,u8,0xFF,0xFF,1,1) \
+ VAL_TEST_BINARY_VOID(name) \
+ VAL_FAIL_BYTE_BYTE_BINARY(name) \
+ VAL_END_BINARY()
+
+#define VAL_VOID_WORD_BINARY(name) \
+ printk("Validating %s ... ", #name); \
+ VAL_START_BINARY(u16,u16,0xFF00,0xFF00,0x100,0x100) \
+ VAL_TEST_BINARY_VOID(name) \
+ VAL_FAIL_WORD_WORD_BINARY(name) \
+ VAL_END_BINARY()
+
+#define VAL_VOID_LONG_BINARY(name) \
+ printk("Validating %s ... ", #name); \
+ VAL_START_BINARY(u32,u32,0xFF000000,0xFF000000,0x1000000,0x1000000) \
+ VAL_TEST_BINARY_VOID(name) \
+ VAL_FAIL_LONG_LONG_BINARY(name) \
+ VAL_END_BINARY()
+
+#define VAL_BYTE_ROTATE(name) \
+ printk("Validating %s ... ", #name); \
+ VAL_START_BINARY(u8,u8,0xFF,8,1,1) \
+ VAL_TEST_BINARY(name) \
+ VAL_FAIL_BYTE_BYTE_BINARY(name) \
+ VAL_END_BINARY()
+
+#define VAL_WORD_ROTATE(name) \
+ printk("Validating %s ... ", #name); \
+ VAL_START_BINARY(u16,u16,0xFF00,16,0x100,1) \
+ VAL_TEST_BINARY(name) \
+ VAL_FAIL_WORD_WORD_BINARY(name) \
+ VAL_END_BINARY()
+
+#define VAL_LONG_ROTATE(name) \
+ printk("Validating %s ... ", #name); \
+ VAL_START_BINARY(u32,u32,0xFF000000,32,0x1000000,1) \
+ VAL_TEST_BINARY(name) \
+ VAL_FAIL_LONG_LONG_BINARY(name) \
+ VAL_END_BINARY()
+
+#define VAL_START_TERNARY(parm_type,res_type,dmax,smax,dincr,sincr,maxshift)\
+{ \
+ parm_type d,s; \
+ res_type r,r_asm; \
+ u8 shift; \
+ u32 flags,inflags; \
+ int f,failed = false; \
+ char buf1[80],buf2[80]; \
+ for (d = 0; d < dmax; d += dincr) { \
+ for (s = 0; s < smax; s += sincr) { \
+ for (shift = 0; shift < maxshift; shift += 1) { \
+ M.x86.R_EFLG = inflags = flags = def_flags; \
+ for (f = 0; f < 2; f++) {
+
+#define VAL_TEST_TERNARY(name) \
+ r_asm = name##_asm(&flags,d,s,shift); \
+ r = name(d,s,shift); \
+ if (r != r_asm || M.x86.R_EFLG != flags) \
+ failed = true; \
+ if (failed || trace) {
+
+#define VAL_FAIL_WORD_WORD_TERNARY(name) \
+ if (failed) \
+ printk("fail\n"); \
+ printk("0x%04X = %-15s(0x%04X,0x%04X,%d), flags = %s -> %s\n", \
+ r, #name, d, s, shift, print_flags(buf1,inflags), print_flags(buf2,M.x86.R_EFLG)); \
+ printk("0x%04X = %-15s(0x%04X,0x%04X,%d), flags = %s -> %s\n", \
+ r_asm, #name"_asm", d, s, shift, print_flags(buf1,inflags), print_flags(buf2,flags));
+
+#define VAL_FAIL_LONG_LONG_TERNARY(name) \
+ if (failed) \
+ printk("fail\n"); \
+ printk("0x%08X = %-15s(0x%08X,0x%08X,%d), flags = %s -> %s\n", \
+ r, #name, d, s, shift, print_flags(buf1,inflags), print_flags(buf2,M.x86.R_EFLG)); \
+ printk("0x%08X = %-15s(0x%08X,0x%08X,%d), flags = %s -> %s\n", \
+ r_asm, #name"_asm", d, s, shift, print_flags(buf1,inflags), print_flags(buf2,flags));
+
+#define VAL_END_TERNARY() \
+ } \
+ M.x86.R_EFLG = inflags = flags = def_flags | (ALL_FLAGS & ~F_OF); \
+ if (failed) \
+ break; \
+ } \
+ if (failed) \
+ break; \
+ } \
+ if (failed) \
+ break; \
+ } \
+ if (failed) \
+ break; \
+ } \
+ if (!failed) \
+ printk("passed\n"); \
+}
+
+#define VAL_WORD_ROTATE_DBL(name) \
+ printk("Validating %s ... ", #name); \
+ VAL_START_TERNARY(u16,u16,0xFF00,0xFF00,0x100,0x100,16) \
+ VAL_TEST_TERNARY(name) \
+ VAL_FAIL_WORD_WORD_TERNARY(name) \
+ VAL_END_TERNARY()
+
+#define VAL_LONG_ROTATE_DBL(name) \
+ printk("Validating %s ... ", #name); \
+ VAL_START_TERNARY(u32,u32,0xFF000000,0xFF000000,0x1000000,0x1000000,32) \
+ VAL_TEST_TERNARY(name) \
+ VAL_FAIL_LONG_LONG_TERNARY(name) \
+ VAL_END_TERNARY()
+
+#define VAL_START_UNARY(parm_type,max,incr) \
+{ \
+ parm_type d,r,r_asm; \
+ u32 flags,inflags; \
+ int f,failed = false; \
+ char buf1[80],buf2[80]; \
+ for (d = 0; d < max; d += incr) { \
+ M.x86.R_EFLG = inflags = flags = def_flags; \
+ for (f = 0; f < 2; f++) {
+
+#define VAL_TEST_UNARY(name) \
+ r_asm = name##_asm(&flags,d); \
+ r = name(d); \
+ if (r != r_asm || M.x86.R_EFLG != flags) { \
+ failed = true;
+
+#define VAL_FAIL_BYTE_UNARY(name) \
+ printk("fail\n"); \
+ printk("0x%02X = %-15s(0x%02X), flags = %s -> %s\n", \
+ r, #name, d, print_flags(buf1,inflags), print_flags(buf2,M.x86.R_EFLG)); \
+ printk("0x%02X = %-15s(0x%02X), flags = %s -> %s\n", \
+ r_asm, #name"_asm", d, print_flags(buf1,inflags), print_flags(buf2,flags));
+
+#define VAL_FAIL_WORD_UNARY(name) \
+ printk("fail\n"); \
+ printk("0x%04X = %-15s(0x%04X), flags = %s -> %s\n", \
+ r, #name, d, print_flags(buf1,inflags), print_flags(buf2,M.x86.R_EFLG)); \
+ printk("0x%04X = %-15s(0x%04X), flags = %s -> %s\n", \
+ r_asm, #name"_asm", d, print_flags(buf1,inflags), print_flags(buf2,flags));
+
+#define VAL_FAIL_LONG_UNARY(name) \
+ printk("fail\n"); \
+ printk("0x%08X = %-15s(0x%08X), flags = %s -> %s\n", \
+ r, #name, d, print_flags(buf1,inflags), print_flags(buf2,M.x86.R_EFLG)); \
+ printk("0x%08X = %-15s(0x%08X), flags = %s -> %s\n", \
+ r_asm, #name"_asm", d, print_flags(buf1,inflags), print_flags(buf2,flags));
+
+#define VAL_END_UNARY() \
+ } \
+ M.x86.R_EFLG = inflags = flags = def_flags | ALL_FLAGS; \
+ if (failed) \
+ break; \
+ } \
+ if (failed) \
+ break; \
+ } \
+ if (!failed) \
+ printk("passed\n"); \
+}
+
+#define VAL_BYTE_UNARY(name) \
+ printk("Validating %s ... ", #name); \
+ VAL_START_UNARY(u8,0xFF,0x1) \
+ VAL_TEST_UNARY(name) \
+ VAL_FAIL_BYTE_UNARY(name) \
+ VAL_END_UNARY()
+
+#define VAL_WORD_UNARY(name) \
+ printk("Validating %s ... ", #name); \
+ VAL_START_UNARY(u16,0xFF00,0x100) \
+ VAL_TEST_UNARY(name) \
+ VAL_FAIL_WORD_UNARY(name) \
+ VAL_END_UNARY()
+
+#define VAL_WORD_BYTE_UNARY(name) \
+ printk("Validating %s ... ", #name); \
+ VAL_START_UNARY(u16,0xFF,0x1) \
+ VAL_TEST_UNARY(name) \
+ VAL_FAIL_WORD_UNARY(name) \
+ VAL_END_UNARY()
+
+#define VAL_LONG_UNARY(name) \
+ printk("Validating %s ... ", #name); \
+ VAL_START_UNARY(u32,0xFF000000,0x1000000) \
+ VAL_TEST_UNARY(name) \
+ VAL_FAIL_LONG_UNARY(name) \
+ VAL_END_UNARY()
+
+#define VAL_BYTE_MUL(name) \
+ printk("Validating %s ... ", #name); \
+{ \
+ u8 d,s; \
+ u16 r,r_asm; \
+ u32 flags,inflags; \
+ int f,failed = false; \
+ char buf1[80],buf2[80]; \
+ for (d = 0; d < 0xFF; d += 1) { \
+ for (s = 0; s < 0xFF; s += 1) { \
+ M.x86.R_EFLG = inflags = flags = def_flags; \
+ for (f = 0; f < 2; f++) { \
+ name##_asm(&flags,&r_asm,d,s); \
+ M.x86.R_AL = d; \
+ name(s); \
+ r = M.x86.R_AX; \
+ if (r != r_asm || M.x86.R_EFLG != flags) \
+ failed = true; \
+ if (failed || trace) { \
+ if (failed) \
+ printk("fail\n"); \
+ printk("0x%04X = %-15s(0x%02X,0x%02X), flags = %s -> %s\n", \
+ r, #name, d, s, print_flags(buf1,inflags), print_flags(buf2,M.x86.R_EFLG)); \
+ printk("0x%04X = %-15s(0x%02X,0x%02X), flags = %s -> %s\n", \
+ r_asm, #name"_asm", d, s, print_flags(buf1,inflags), print_flags(buf2,flags)); \
+ } \
+ M.x86.R_EFLG = inflags = flags = def_flags | (ALL_FLAGS & ~F_OF); \
+ if (failed) \
+ break; \
+ } \
+ if (failed) \
+ break; \
+ } \
+ if (failed) \
+ break; \
+ } \
+ if (!failed) \
+ printk("passed\n"); \
+}
+
+#define VAL_WORD_MUL(name) \
+ printk("Validating %s ... ", #name); \
+{ \
+ u16 d,s; \
+ u16 r_lo,r_asm_lo; \
+ u16 r_hi,r_asm_hi; \
+ u32 flags,inflags; \
+ int f,failed = false; \
+ char buf1[80],buf2[80]; \
+ for (d = 0; d < 0xFF00; d += 0x100) { \
+ for (s = 0; s < 0xFF00; s += 0x100) { \
+ M.x86.R_EFLG = inflags = flags = def_flags; \
+ for (f = 0; f < 2; f++) { \
+ name##_asm(&flags,&r_asm_lo,&r_asm_hi,d,s); \
+ M.x86.R_AX = d; \
+ name(s); \
+ r_lo = M.x86.R_AX; \
+ r_hi = M.x86.R_DX; \
+ if (r_lo != r_asm_lo || r_hi != r_asm_hi || M.x86.R_EFLG != flags)\
+ failed = true; \
+ if (failed || trace) { \
+ if (failed) \
+ printk("fail\n"); \
+ printk("0x%04X:0x%04X = %-15s(0x%04X,0x%04X), flags = %s -> %s\n", \
+ r_hi,r_lo, #name, d, s, print_flags(buf1,inflags), print_flags(buf2,M.x86.R_EFLG)); \
+ printk("0x%04X:0x%04X = %-15s(0x%04X,0x%04X), flags = %s -> %s\n", \
+ r_asm_hi,r_asm_lo, #name"_asm", d, s, print_flags(buf1,inflags), print_flags(buf2,flags)); \
+ } \
+ M.x86.R_EFLG = inflags = flags = def_flags | (ALL_FLAGS & ~F_OF); \
+ if (failed) \
+ break; \
+ } \
+ if (failed) \
+ break; \
+ } \
+ if (failed) \
+ break; \
+ } \
+ if (!failed) \
+ printk("passed\n"); \
+}
+
+#define VAL_LONG_MUL(name) \
+ printk("Validating %s ... ", #name); \
+{ \
+ u32 d,s; \
+ u32 r_lo,r_asm_lo; \
+ u32 r_hi,r_asm_hi; \
+ u32 flags,inflags; \
+ int f,failed = false; \
+ char buf1[80],buf2[80]; \
+ for (d = 0; d < 0xFF000000; d += 0x1000000) { \
+ for (s = 0; s < 0xFF000000; s += 0x1000000) { \
+ M.x86.R_EFLG = inflags = flags = def_flags; \
+ for (f = 0; f < 2; f++) { \
+ name##_asm(&flags,&r_asm_lo,&r_asm_hi,d,s); \
+ M.x86.R_EAX = d; \
+ name(s); \
+ r_lo = M.x86.R_EAX; \
+ r_hi = M.x86.R_EDX; \
+ if (r_lo != r_asm_lo || r_hi != r_asm_hi || M.x86.R_EFLG != flags)\
+ failed = true; \
+ if (failed || trace) { \
+ if (failed) \
+ printk("fail\n"); \
+ printk("0x%08X:0x%08X = %-15s(0x%08X,0x%08X), flags = %s -> %s\n", \
+ r_hi,r_lo, #name, d, s, print_flags(buf1,inflags), print_flags(buf2,M.x86.R_EFLG)); \
+ printk("0x%08X:0x%08X = %-15s(0x%08X,0x%08X), flags = %s -> %s\n", \
+ r_asm_hi,r_asm_lo, #name"_asm", d, s, print_flags(buf1,inflags), print_flags(buf2,flags)); \
+ } \
+ M.x86.R_EFLG = inflags = flags = def_flags | (ALL_FLAGS & ~F_OF); \
+ if (failed) \
+ break; \
+ } \
+ if (failed) \
+ break; \
+ } \
+ if (failed) \
+ break; \
+ } \
+ if (!failed) \
+ printk("passed\n"); \
+}
+
+#define VAL_BYTE_DIV(name) \
+ printk("Validating %s ... ", #name); \
+{ \
+ u16 d,s; \
+ u8 r_quot,r_rem,r_asm_quot,r_asm_rem; \
+ u32 flags,inflags; \
+ int f,failed = false; \
+ char buf1[80],buf2[80]; \
+ for (d = 0; d < 0xFF00; d += 0x100) { \
+ for (s = 1; s < 0xFF; s += 1) { \
+ M.x86.R_EFLG = inflags = flags = def_flags; \
+ for (f = 0; f < 2; f++) { \
+ M.x86.intr = 0; \
+ M.x86.R_AX = d; \
+ name(s); \
+ r_quot = M.x86.R_AL; \
+ r_rem = M.x86.R_AH; \
+ if (M.x86.intr & INTR_SYNCH) \
+ continue; \
+ name##_asm(&flags,&r_asm_quot,&r_asm_rem,d,s); \
+ if (r_quot != r_asm_quot || r_rem != r_asm_rem || M.x86.R_EFLG != flags) \
+ failed = true; \
+ if (failed || trace) { \
+ if (failed) \
+ printk("fail\n"); \
+ printk("0x%02X:0x%02X = %-15s(0x%04X,0x%02X), flags = %s -> %s\n", \
+ r_quot, r_rem, #name, d, s, print_flags(buf1,inflags), print_flags(buf2,M.x86.R_EFLG)); \
+ printk("0x%02X:0x%02X = %-15s(0x%04X,0x%02X), flags = %s -> %s\n", \
+ r_asm_quot, r_asm_rem, #name"_asm", d, s, print_flags(buf1,inflags), print_flags(buf2,flags)); \
+ } \
+ M.x86.R_EFLG = inflags = flags = def_flags | (ALL_FLAGS & ~F_OF); \
+ if (failed) \
+ break; \
+ } \
+ if (failed) \
+ break; \
+ } \
+ if (failed) \
+ break; \
+ } \
+ if (!failed) \
+ printk("passed\n"); \
+}
+
+#define VAL_WORD_DIV(name) \
+ printk("Validating %s ... ", #name); \
+{ \
+ u32 d,s; \
+ u16 r_quot,r_rem,r_asm_quot,r_asm_rem; \
+ u32 flags,inflags; \
+ int f,failed = false; \
+ char buf1[80],buf2[80]; \
+ for (d = 0; d < 0xFF000000; d += 0x1000000) { \
+ for (s = 0x100; s < 0xFF00; s += 0x100) { \
+ M.x86.R_EFLG = inflags = flags = def_flags; \
+ for (f = 0; f < 2; f++) { \
+ M.x86.intr = 0; \
+ M.x86.R_AX = d & 0xFFFF; \
+ M.x86.R_DX = d >> 16; \
+ name(s); \
+ r_quot = M.x86.R_AX; \
+ r_rem = M.x86.R_DX; \
+ if (M.x86.intr & INTR_SYNCH) \
+ continue; \
+ name##_asm(&flags,&r_asm_quot,&r_asm_rem,d & 0xFFFF,d >> 16,s);\
+ if (r_quot != r_asm_quot || r_rem != r_asm_rem || M.x86.R_EFLG != flags) \
+ failed = true; \
+ if (failed || trace) { \
+ if (failed) \
+ printk("fail\n"); \
+ printk("0x%04X:0x%04X = %-15s(0x%08X,0x%04X), flags = %s -> %s\n", \
+ r_quot, r_rem, #name, d, s, print_flags(buf1,inflags), print_flags(buf2,M.x86.R_EFLG)); \
+ printk("0x%04X:0x%04X = %-15s(0x%08X,0x%04X), flags = %s -> %s\n", \
+ r_asm_quot, r_asm_rem, #name"_asm", d, s, print_flags(buf1,inflags), print_flags(buf2,flags)); \
+ } \
+ M.x86.R_EFLG = inflags = flags = def_flags | (ALL_FLAGS & ~F_OF); \
+ if (failed) \
+ break; \
+ } \
+ if (failed) \
+ break; \
+ } \
+ if (failed) \
+ break; \
+ } \
+ if (!failed) \
+ printk("passed\n"); \
+}
+
+#define VAL_LONG_DIV(name) \
+ printk("Validating %s ... ", #name); \
+{ \
+ u32 d,s; \
+ u32 r_quot,r_rem,r_asm_quot,r_asm_rem; \
+ u32 flags,inflags; \
+ int f,failed = false; \
+ char buf1[80],buf2[80]; \
+ for (d = 0; d < 0xFF000000; d += 0x1000000) { \
+ for (s = 0x100; s < 0xFF00; s += 0x100) { \
+ M.x86.R_EFLG = inflags = flags = def_flags; \
+ for (f = 0; f < 2; f++) { \
+ M.x86.intr = 0; \
+ M.x86.R_EAX = d; \
+ M.x86.R_EDX = 0; \
+ name(s); \
+ r_quot = M.x86.R_EAX; \
+ r_rem = M.x86.R_EDX; \
+ if (M.x86.intr & INTR_SYNCH) \
+ continue; \
+ name##_asm(&flags,&r_asm_quot,&r_asm_rem,d,0,s); \
+ if (r_quot != r_asm_quot || r_rem != r_asm_rem || M.x86.R_EFLG != flags) \
+ failed = true; \
+ if (failed || trace) { \
+ if (failed) \
+ printk("fail\n"); \
+ printk("0x%08X:0x%08X = %-15s(0x%08X:0x%08X,0x%08X), flags = %s -> %s\n", \
+ r_quot, r_rem, #name, 0, d, s, print_flags(buf1,inflags), print_flags(buf2,M.x86.R_EFLG)); \
+ printk("0x%08X:0x%08X = %-15s(0x%08X:0x%08X,0x%08X), flags = %s -> %s\n", \
+ r_asm_quot, r_asm_rem, #name"_asm", 0, d, s, print_flags(buf1,inflags), print_flags(buf2,flags)); \
+ } \
+ M.x86.R_EFLG = inflags = flags = def_flags | (ALL_FLAGS & ~F_OF); \
+ if (failed) \
+ break; \
+ } \
+ if (failed) \
+ break; \
+ } \
+ if (failed) \
+ break; \
+ } \
+ if (!failed) \
+ printk("passed\n"); \
+}
+
+void printk(const char *fmt, ...)
+{
+ va_list argptr;
+ va_start(argptr, fmt);
+ vfprintf(stdout, fmt, argptr);
+ fflush(stdout);
+ va_end(argptr);
+}
+
+char * print_flags(char *buf,ulong flags)
+{
+ char *separator = "";
+
+ buf[0] = 0;
+ if (flags & F_CF) {
+ strcat(buf,separator);
+ strcat(buf,"CF");
+ separator = ",";
+ }
+ if (flags & F_PF) {
+ strcat(buf,separator);
+ strcat(buf,"PF");
+ separator = ",";
+ }
+ if (flags & F_AF) {
+ strcat(buf,separator);
+ strcat(buf,"AF");
+ separator = ",";
+ }
+ if (flags & F_ZF) {
+ strcat(buf,separator);
+ strcat(buf,"ZF");
+ separator = ",";
+ }
+ if (flags & F_SF) {
+ strcat(buf,separator);
+ strcat(buf,"SF");
+ separator = ",";
+ }
+ if (flags & F_OF) {
+ strcat(buf,separator);
+ strcat(buf,"OF");
+ separator = ",";
+ }
+ if (separator[0] == 0)
+ strcpy(buf,"None");
+ return buf;
+}
+
+int main(int argc)
+{
+ ulong def_flags;
+ int trace = false;
+
+ if (argc > 1)
+ trace = true;
+ memset(&M, 0, sizeof(M));
+ def_flags = get_flags_asm() & ~ALL_FLAGS;
+
+ VAL_WORD_UNARY(aaa_word);
+ VAL_WORD_UNARY(aas_word);
+
+ VAL_WORD_UNARY(aad_word);
+ VAL_WORD_UNARY(aam_word);
+
+ VAL_BYTE_BYTE_BINARY(adc_byte);
+ VAL_WORD_WORD_BINARY(adc_word);
+ VAL_LONG_LONG_BINARY(adc_long);
+
+ VAL_BYTE_BYTE_BINARY(add_byte);
+ VAL_WORD_WORD_BINARY(add_word);
+ VAL_LONG_LONG_BINARY(add_long);
+
+ VAL_BYTE_BYTE_BINARY(and_byte);
+ VAL_WORD_WORD_BINARY(and_word);
+ VAL_LONG_LONG_BINARY(and_long);
+
+ VAL_BYTE_BYTE_BINARY(cmp_byte);
+ VAL_WORD_WORD_BINARY(cmp_word);
+ VAL_LONG_LONG_BINARY(cmp_long);
+
+ VAL_BYTE_UNARY(daa_byte);
+ VAL_BYTE_UNARY(das_byte); // Fails for 0x9A (out of range anyway)
+
+ VAL_BYTE_UNARY(dec_byte);
+ VAL_WORD_UNARY(dec_word);
+ VAL_LONG_UNARY(dec_long);
+
+ VAL_BYTE_UNARY(inc_byte);
+ VAL_WORD_UNARY(inc_word);
+ VAL_LONG_UNARY(inc_long);
+
+ VAL_BYTE_BYTE_BINARY(or_byte);
+ VAL_WORD_WORD_BINARY(or_word);
+ VAL_LONG_LONG_BINARY(or_long);
+
+ VAL_BYTE_UNARY(neg_byte);
+ VAL_WORD_UNARY(neg_word);
+ VAL_LONG_UNARY(neg_long);
+
+ VAL_BYTE_UNARY(not_byte);
+ VAL_WORD_UNARY(not_word);
+ VAL_LONG_UNARY(not_long);
+
+ VAL_BYTE_ROTATE(rcl_byte);
+ VAL_WORD_ROTATE(rcl_word);
+ VAL_LONG_ROTATE(rcl_long);
+
+ VAL_BYTE_ROTATE(rcr_byte);
+ VAL_WORD_ROTATE(rcr_word);
+ VAL_LONG_ROTATE(rcr_long);
+
+ VAL_BYTE_ROTATE(rol_byte);
+ VAL_WORD_ROTATE(rol_word);
+ VAL_LONG_ROTATE(rol_long);
+
+ VAL_BYTE_ROTATE(ror_byte);
+ VAL_WORD_ROTATE(ror_word);
+ VAL_LONG_ROTATE(ror_long);
+
+ VAL_BYTE_ROTATE(shl_byte);
+ VAL_WORD_ROTATE(shl_word);
+ VAL_LONG_ROTATE(shl_long);
+
+ VAL_BYTE_ROTATE(shr_byte);
+ VAL_WORD_ROTATE(shr_word);
+ VAL_LONG_ROTATE(shr_long);
+
+ VAL_BYTE_ROTATE(sar_byte);
+ VAL_WORD_ROTATE(sar_word);
+ VAL_LONG_ROTATE(sar_long);
+
+ VAL_WORD_ROTATE_DBL(shld_word);
+ VAL_LONG_ROTATE_DBL(shld_long);
+
+ VAL_WORD_ROTATE_DBL(shrd_word);
+ VAL_LONG_ROTATE_DBL(shrd_long);
+
+ VAL_BYTE_BYTE_BINARY(sbb_byte);
+ VAL_WORD_WORD_BINARY(sbb_word);
+ VAL_LONG_LONG_BINARY(sbb_long);
+
+ VAL_BYTE_BYTE_BINARY(sub_byte);
+ VAL_WORD_WORD_BINARY(sub_word);
+ VAL_LONG_LONG_BINARY(sub_long);
+
+ VAL_BYTE_BYTE_BINARY(xor_byte);
+ VAL_WORD_WORD_BINARY(xor_word);
+ VAL_LONG_LONG_BINARY(xor_long);
+
+ VAL_VOID_BYTE_BINARY(test_byte);
+ VAL_VOID_WORD_BINARY(test_word);
+ VAL_VOID_LONG_BINARY(test_long);
+
+ VAL_BYTE_MUL(imul_byte);
+ VAL_WORD_MUL(imul_word);
+ VAL_LONG_MUL(imul_long);
+
+ VAL_BYTE_MUL(mul_byte);
+ VAL_WORD_MUL(mul_word);
+ VAL_LONG_MUL(mul_long);
+
+ VAL_BYTE_DIV(idiv_byte);
+ VAL_WORD_DIV(idiv_word);
+ VAL_LONG_DIV(idiv_long);
+
+ VAL_BYTE_DIV(div_byte);
+ VAL_WORD_DIV(div_word);
+ VAL_LONG_DIV(div_long);
+
+ return 0;
+}
--- /dev/null
+/****************************************************************************
+*
+* Realmode X86 Emulator Library
+*
+* Copyright (C) 1996-1999 SciTech Software, Inc.
+* Copyright (C) David Mosberger-Tang
+* Copyright (C) 1999 Egbert Eich
+*
+* ========================================================================
+*
+* Permission to use, copy, modify, distribute, and sell this software and
+* its documentation for any purpose is hereby granted without fee,
+* provided that the above copyright notice appear in all copies and that
+* both that copyright notice and this permission notice appear in
+* supporting documentation, and that the name of the authors not be used
+* in advertising or publicity pertaining to distribution of the software
+* without specific, written prior permission. The authors makes no
+* representations about the suitability of this software for any purpose.
+* It is provided "as is" without express or implied warranty.
+*
+* THE AUTHORS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+* EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
+* USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
+* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+* PERFORMANCE OF THIS SOFTWARE.
+*
+* ========================================================================
+*
+* Language: ANSI C
+* Environment: Any
+* Developer: Kendall Bennett
+*
+* Description: Header file for debug definitions.
+*
+****************************************************************************/
+/* $XFree86: xc/extras/x86emu/src/x86emu/x86emu/debug.h,v 1.3 2000/04/19 15:48:15 tsi Exp $ */
+
+#ifndef __X86EMU_DEBUG_H
+#define __X86EMU_DEBUG_H
+
+/*---------------------- Macros and type definitions ----------------------*/
+
+/* checks to be enabled for "runtime" */
+
+#define CHECK_IP_FETCH_F 0x1
+#define CHECK_SP_ACCESS_F 0x2
+#define CHECK_MEM_ACCESS_F 0x4 /*using regular linear pointer */
+#define CHECK_DATA_ACCESS_F 0x8 /*using segment:offset*/
+
+#ifdef DEBUG
+# define CHECK_IP_FETCH() (M.x86.check & CHECK_IP_FETCH_F)
+# define CHECK_SP_ACCESS() (M.x86.check & CHECK_SP_ACCESS_F)
+# define CHECK_MEM_ACCESS() (M.x86.check & CHECK_MEM_ACCESS_F)
+# define CHECK_DATA_ACCESS() (M.x86.check & CHECK_DATA_ACCESS_F)
+#else
+# define CHECK_IP_FETCH()
+# define CHECK_SP_ACCESS()
+# define CHECK_MEM_ACCESS()
+# define CHECK_DATA_ACCESS()
+#endif
+
+#ifdef DEBUG
+# define DEBUG_INSTRUMENT() (M.x86.debug & DEBUG_INSTRUMENT_F)
+# define DEBUG_DECODE() (M.x86.debug & DEBUG_DECODE_F)
+# define DEBUG_TRACE() (M.x86.debug & DEBUG_TRACE_F)
+# define DEBUG_STEP() (M.x86.debug & DEBUG_STEP_F)
+# define DEBUG_DISASSEMBLE() (M.x86.debug & DEBUG_DISASSEMBLE_F)
+# define DEBUG_BREAK() (M.x86.debug & DEBUG_BREAK_F)
+# define DEBUG_SVC() (M.x86.debug & DEBUG_SVC_F)
+# define DEBUG_SAVE_IP_CS() (M.x86.debug & DEBUG_SAVE_IP_CS_F)
+
+# define DEBUG_FS() (M.x86.debug & DEBUG_FS_F)
+# define DEBUG_PROC() (M.x86.debug & DEBUG_PROC_F)
+# define DEBUG_SYSINT() (M.x86.debug & DEBUG_SYSINT_F)
+# define DEBUG_TRACECALL() (M.x86.debug & DEBUG_TRACECALL_F)
+# define DEBUG_TRACECALLREGS() (M.x86.debug & DEBUG_TRACECALL_REGS_F)
+# define DEBUG_SYS() (M.x86.debug & DEBUG_SYS_F)
+# define DEBUG_MEM_TRACE() (M.x86.debug & DEBUG_MEM_TRACE_F)
+# define DEBUG_IO_TRACE() (M.x86.debug & DEBUG_IO_TRACE_F)
+# define DEBUG_DECODE_NOPRINT() (M.x86.debug & DEBUG_DECODE_NOPRINT_F)
+#else
+# define DEBUG_INSTRUMENT() 0
+# define DEBUG_DECODE() 0
+# define DEBUG_TRACE() 0
+# define DEBUG_STEP() 0
+# define DEBUG_DISASSEMBLE() 0
+# define DEBUG_BREAK() 0
+# define DEBUG_SVC() 0
+# define DEBUG_SAVE_IP_CS() 0
+# define DEBUG_FS() 0
+# define DEBUG_PROC() 0
+# define DEBUG_SYSINT() 0
+# define DEBUG_TRACECALL() 0
+# define DEBUG_TRACECALLREGS() 0
+# define DEBUG_SYS() 0
+# define DEBUG_MEM_TRACE() 0
+# define DEBUG_IO_TRACE() 0
+# define DEBUG_DECODE_NOPRINT() 0
+#endif
+
+#ifdef DEBUG
+
+# define DECODE_PRINTF(x) if (DEBUG_DECODE()) \
+ x86emu_decode_printf(x)
+# define DECODE_PRINTF2(x,y) if (DEBUG_DECODE()) \
+ x86emu_decode_printf2(x,y)
+
+/*
+ * The following allow us to look at the bytes of an instruction. The
+ * first INCR_INSTRN_LEN, is called everytime bytes are consumed in
+ * the decoding process. The SAVE_IP_CS is called initially when the
+ * major opcode of the instruction is accessed.
+ */
+#define INC_DECODED_INST_LEN(x) \
+ if (DEBUG_DECODE()) \
+ x86emu_inc_decoded_inst_len(x)
+
+#define SAVE_IP_CS(x,y) \
+ if (DEBUG_DECODE() | DEBUG_TRACECALL() | DEBUG_BREAK() \
+ | DEBUG_IO_TRACE() | DEBUG_SAVE_IP_CS()) { \
+ M.x86.saved_cs = x; \
+ M.x86.saved_ip = y; \
+ }
+#else
+# define INC_DECODED_INST_LEN(x)
+# define DECODE_PRINTF(x)
+# define DECODE_PRINTF2(x,y)
+# define SAVE_IP_CS(x,y)
+#endif
+
+#ifdef DEBUG
+#define TRACE_REGS() \
+ if (DEBUG_DISASSEMBLE()) { \
+ x86emu_just_disassemble(); \
+ goto EndOfTheInstructionProcedure; \
+ } \
+ if (DEBUG_TRACE() || DEBUG_DECODE()) X86EMU_trace_regs()
+#else
+# define TRACE_REGS()
+#endif
+
+#ifdef DEBUG
+# define SINGLE_STEP() if (DEBUG_STEP()) x86emu_single_step()
+#else
+# define SINGLE_STEP()
+#endif
+
+#define TRACE_AND_STEP() \
+ TRACE_REGS(); \
+ SINGLE_STEP()
+
+#ifdef DEBUG
+# define START_OF_INSTR()
+# define END_OF_INSTR() EndOfTheInstructionProcedure: x86emu_end_instr();
+# define END_OF_INSTR_NO_TRACE() x86emu_end_instr();
+#else
+# define START_OF_INSTR()
+# define END_OF_INSTR()
+# define END_OF_INSTR_NO_TRACE()
+#endif
+
+#ifdef DEBUG
+# define CALL_TRACE(u,v,w,x,s) \
+ if (DEBUG_TRACECALLREGS()) \
+ x86emu_dump_regs(); \
+ if (DEBUG_TRACECALL()) \
+ printk("%04x:%04x: CALL %s%04x:%04x\n", u , v, s, w, x);
+# define RETURN_TRACE(n,u,v) \
+ if (DEBUG_TRACECALLREGS()) \
+ x86emu_dump_regs(); \
+ if (DEBUG_TRACECALL()) \
+ printk("%04x:%04x: %s\n",u,v,n);
+#else
+# define CALL_TRACE(u,v,w,x,s)
+# define RETURN_TRACE(n,u,v)
+#endif
+
+#ifdef DEBUG
+#define DB(x) x
+#else
+#define DB(x)
+#endif
+
+/*-------------------------- Function Prototypes --------------------------*/
+
+#ifdef __cplusplus
+extern "C" { /* Use "C" linkage when in C++ mode */
+#endif
+
+extern void x86emu_inc_decoded_inst_len (int x);
+extern void x86emu_decode_printf (char *x);
+extern void x86emu_decode_printf2 (char *x, int y);
+extern void x86emu_just_disassemble (void);
+extern void x86emu_single_step (void);
+extern void x86emu_end_instr (void);
+extern void x86emu_dump_regs (void);
+extern void x86emu_dump_xregs (void);
+extern void x86emu_print_int_vect (u16 iv);
+extern void x86emu_instrument_instruction (void);
+extern void x86emu_check_ip_access (void);
+extern void x86emu_check_sp_access (void);
+extern void x86emu_check_mem_access (u32 p);
+extern void x86emu_check_data_access (uint s, uint o);
+
+#ifdef __cplusplus
+} /* End of "C" linkage for C++ */
+#endif
+
+#endif /* __X86EMU_DEBUG_H */
--- /dev/null
+/****************************************************************************
+*
+* Realmode X86 Emulator Library
+*
+* Copyright (C) 1996-1999 SciTech Software, Inc.
+* Copyright (C) David Mosberger-Tang
+* Copyright (C) 1999 Egbert Eich
+*
+* ========================================================================
+*
+* Permission to use, copy, modify, distribute, and sell this software and
+* its documentation for any purpose is hereby granted without fee,
+* provided that the above copyright notice appear in all copies and that
+* both that copyright notice and this permission notice appear in
+* supporting documentation, and that the name of the authors not be used
+* in advertising or publicity pertaining to distribution of the software
+* without specific, written prior permission. The authors makes no
+* representations about the suitability of this software for any purpose.
+* It is provided "as is" without express or implied warranty.
+*
+* THE AUTHORS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+* EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
+* USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
+* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+* PERFORMANCE OF THIS SOFTWARE.
+*
+* ========================================================================
+*
+* Language: ANSI C
+* Environment: Any
+* Developer: Kendall Bennett
+*
+* Description: Header file for instruction decoding logic.
+*
+****************************************************************************/
+/* $XFree86$ */
+
+#ifndef __X86EMU_DECODE_H
+#define __X86EMU_DECODE_H
+
+/*---------------------- Macros and type definitions ----------------------*/
+
+/* Instruction Decoding Stuff */
+
+#define FETCH_DECODE_MODRM(mod,rh,rl) fetch_decode_modrm(&mod,&rh,&rl)
+#define DECODE_RM_BYTE_REGISTER(r) decode_rm_byte_register(r)
+#define DECODE_RM_WORD_REGISTER(r) decode_rm_word_register(r)
+#define DECODE_RM_LONG_REGISTER(r) decode_rm_long_register(r)
+#define DECODE_CLEAR_SEGOVR() M.x86.mode &= ~SYSMODE_CLRMASK
+
+/*-------------------------- Function Prototypes --------------------------*/
+
+#ifdef __cplusplus
+extern "C" { /* Use "C" linkage when in C++ mode */
+#endif
+
+void x86emu_intr_raise (u8 type);
+void fetch_decode_modrm (int *mod,int *regh,int *regl);
+u8 fetch_byte_imm (void);
+u16 fetch_word_imm (void);
+u32 fetch_long_imm (void);
+u8 fetch_data_byte (uint offset);
+u8 fetch_data_byte_abs (uint segment, uint offset);
+u16 fetch_data_word (uint offset);
+u16 fetch_data_word_abs (uint segment, uint offset);
+u32 fetch_data_long (uint offset);
+u32 fetch_data_long_abs (uint segment, uint offset);
+void store_data_byte (uint offset, u8 val);
+void store_data_byte_abs (uint segment, uint offset, u8 val);
+void store_data_word (uint offset, u16 val);
+void store_data_word_abs (uint segment, uint offset, u16 val);
+void store_data_long (uint offset, u32 val);
+void store_data_long_abs (uint segment, uint offset, u32 val);
+u8* decode_rm_byte_register(int reg);
+u16* decode_rm_word_register(int reg);
+u32* decode_rm_long_register(int reg);
+u16* decode_rm_seg_register(int reg);
+u32 decode_rm00_address(int rm);
+u32 decode_rm01_address(int rm);
+u32 decode_rm10_address(int rm);
+u32 decode_sib_address(int sib, int mod);
+
+#ifdef __cplusplus
+} /* End of "C" linkage for C++ */
+#endif
+
+#endif /* __X86EMU_DECODE_H */
--- /dev/null
+/****************************************************************************
+*
+* Realmode X86 Emulator Library
+*
+* Copyright (C) 1996-1999 SciTech Software, Inc.
+* Copyright (C) David Mosberger-Tang
+* Copyright (C) 1999 Egbert Eich
+*
+* ========================================================================
+*
+* Permission to use, copy, modify, distribute, and sell this software and
+* its documentation for any purpose is hereby granted without fee,
+* provided that the above copyright notice appear in all copies and that
+* both that copyright notice and this permission notice appear in
+* supporting documentation, and that the name of the authors not be used
+* in advertising or publicity pertaining to distribution of the software
+* without specific, written prior permission. The authors makes no
+* representations about the suitability of this software for any purpose.
+* It is provided "as is" without express or implied warranty.
+*
+* THE AUTHORS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+* EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
+* USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
+* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+* PERFORMANCE OF THIS SOFTWARE.
+*
+* ========================================================================
+*
+* Language: ANSI C
+* Environment: Any
+* Developer: Kendall Bennett
+*
+* Description: Header file for FPU instruction decoding.
+*
+****************************************************************************/
+
+#ifndef __X86EMU_FPU_H
+#define __X86EMU_FPU_H
+
+#ifdef __cplusplus
+extern "C" { /* Use "C" linkage when in C++ mode */
+#endif
+
+/* these have to be defined, whether 8087 support compiled in or not. */
+
+extern void x86emuOp_esc_coprocess_d8 (u8 op1);
+extern void x86emuOp_esc_coprocess_d9 (u8 op1);
+extern void x86emuOp_esc_coprocess_da (u8 op1);
+extern void x86emuOp_esc_coprocess_db (u8 op1);
+extern void x86emuOp_esc_coprocess_dc (u8 op1);
+extern void x86emuOp_esc_coprocess_dd (u8 op1);
+extern void x86emuOp_esc_coprocess_de (u8 op1);
+extern void x86emuOp_esc_coprocess_df (u8 op1);
+
+#ifdef __cplusplus
+} /* End of "C" linkage for C++ */
+#endif
+
+#endif /* __X86EMU_FPU_H */
--- /dev/null
+/****************************************************************************
+*
+* Realmode X86 Emulator Library
+*
+* Copyright (C) 1996-1999 SciTech Software, Inc.
+* Copyright (C) David Mosberger-Tang
+* Copyright (C) 1999 Egbert Eich
+*
+* ========================================================================
+*
+* Permission to use, copy, modify, distribute, and sell this software and
+* its documentation for any purpose is hereby granted without fee,
+* provided that the above copyright notice appear in all copies and that
+* both that copyright notice and this permission notice appear in
+* supporting documentation, and that the name of the authors not be used
+* in advertising or publicity pertaining to distribution of the software
+* without specific, written prior permission. The authors makes no
+* representations about the suitability of this software for any purpose.
+* It is provided "as is" without express or implied warranty.
+*
+* THE AUTHORS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+* EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
+* USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
+* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+* PERFORMANCE OF THIS SOFTWARE.
+*
+* ========================================================================
+*
+* Language: ANSI C
+* Environment: Any
+* Developer: Kendall Bennett
+*
+* Description: Header file for operand decoding functions.
+*
+****************************************************************************/
+
+#ifndef __X86EMU_OPS_H
+#define __X86EMU_OPS_H
+
+extern void (*x86emu_optab[0x100])(u8 op1);
+extern void (*x86emu_optab2[0x100])(u8 op2);
+
+#endif /* __X86EMU_OPS_H */
--- /dev/null
+/****************************************************************************
+*
+* Realmode X86 Emulator Library
+*
+* Copyright (C) 1996-1999 SciTech Software, Inc.
+* Copyright (C) David Mosberger-Tang
+* Copyright (C) 1999 Egbert Eich
+*
+* ========================================================================
+*
+* Permission to use, copy, modify, distribute, and sell this software and
+* its documentation for any purpose is hereby granted without fee,
+* provided that the above copyright notice appear in all copies and that
+* both that copyright notice and this permission notice appear in
+* supporting documentation, and that the name of the authors not be used
+* in advertising or publicity pertaining to distribution of the software
+* without specific, written prior permission. The authors makes no
+* representations about the suitability of this software for any purpose.
+* It is provided "as is" without express or implied warranty.
+*
+* THE AUTHORS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+* EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
+* USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
+* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+* PERFORMANCE OF THIS SOFTWARE.
+*
+* ========================================================================
+*
+* Language: Watcom C++ 10.6 or later
+* Environment: Any
+* Developer: Kendall Bennett
+*
+* Description: Inline assembler versions of the primitive operand
+* functions for faster performance. At the moment this is
+* x86 inline assembler, but these functions could be replaced
+* with native inline assembler for each supported processor
+* platform.
+*
+****************************************************************************/
+/* $XFree86$ */
+
+#ifndef __X86EMU_PRIM_ASM_H
+#define __X86EMU_PRIM_ASM_H
+
+#ifdef __WATCOMC__
+
+#ifndef VALIDATE
+#define __HAVE_INLINE_ASSEMBLER__
+#endif
+
+u32 get_flags_asm(void);
+#pragma aux get_flags_asm = \
+ "pushf" \
+ "pop eax" \
+ value [eax] \
+ modify exact [eax];
+
+u16 aaa_word_asm(u32 *flags,u16 d);
+#pragma aux aaa_word_asm = \
+ "push [edi]" \
+ "popf" \
+ "aaa" \
+ "pushf" \
+ "pop [edi]" \
+ parm [edi] [ax] \
+ value [ax] \
+ modify exact [ax];
+
+u16 aas_word_asm(u32 *flags,u16 d);
+#pragma aux aas_word_asm = \
+ "push [edi]" \
+ "popf" \
+ "aas" \
+ "pushf" \
+ "pop [edi]" \
+ parm [edi] [ax] \
+ value [ax] \
+ modify exact [ax];
+
+u16 aad_word_asm(u32 *flags,u16 d);
+#pragma aux aad_word_asm = \
+ "push [edi]" \
+ "popf" \
+ "aad" \
+ "pushf" \
+ "pop [edi]" \
+ parm [edi] [ax] \
+ value [ax] \
+ modify exact [ax];
+
+u16 aam_word_asm(u32 *flags,u8 d);
+#pragma aux aam_word_asm = \
+ "push [edi]" \
+ "popf" \
+ "aam" \
+ "pushf" \
+ "pop [edi]" \
+ parm [edi] [al] \
+ value [ax] \
+ modify exact [ax];
+
+u8 adc_byte_asm(u32 *flags,u8 d, u8 s);
+#pragma aux adc_byte_asm = \
+ "push [edi]" \
+ "popf" \
+ "adc al,bl" \
+ "pushf" \
+ "pop [edi]" \
+ parm [edi] [al] [bl] \
+ value [al] \
+ modify exact [al bl];
+
+u16 adc_word_asm(u32 *flags,u16 d, u16 s);
+#pragma aux adc_word_asm = \
+ "push [edi]" \
+ "popf" \
+ "adc ax,bx" \
+ "pushf" \
+ "pop [edi]" \
+ parm [edi] [ax] [bx] \
+ value [ax] \
+ modify exact [ax bx];
+
+u32 adc_long_asm(u32 *flags,u32 d, u32 s);
+#pragma aux adc_long_asm = \
+ "push [edi]" \
+ "popf" \
+ "adc eax,ebx" \
+ "pushf" \
+ "pop [edi]" \
+ parm [edi] [eax] [ebx] \
+ value [eax] \
+ modify exact [eax ebx];
+
+u8 add_byte_asm(u32 *flags,u8 d, u8 s);
+#pragma aux add_byte_asm = \
+ "push [edi]" \
+ "popf" \
+ "add al,bl" \
+ "pushf" \
+ "pop [edi]" \
+ parm [edi] [al] [bl] \
+ value [al] \
+ modify exact [al bl];
+
+u16 add_word_asm(u32 *flags,u16 d, u16 s);
+#pragma aux add_word_asm = \
+ "push [edi]" \
+ "popf" \
+ "add ax,bx" \
+ "pushf" \
+ "pop [edi]" \
+ parm [edi] [ax] [bx] \
+ value [ax] \
+ modify exact [ax bx];
+
+u32 add_long_asm(u32 *flags,u32 d, u32 s);
+#pragma aux add_long_asm = \
+ "push [edi]" \
+ "popf" \
+ "add eax,ebx" \
+ "pushf" \
+ "pop [edi]" \
+ parm [edi] [eax] [ebx] \
+ value [eax] \
+ modify exact [eax ebx];
+
+u8 and_byte_asm(u32 *flags,u8 d, u8 s);
+#pragma aux and_byte_asm = \
+ "push [edi]" \
+ "popf" \
+ "and al,bl" \
+ "pushf" \
+ "pop [edi]" \
+ parm [edi] [al] [bl] \
+ value [al] \
+ modify exact [al bl];
+
+u16 and_word_asm(u32 *flags,u16 d, u16 s);
+#pragma aux and_word_asm = \
+ "push [edi]" \
+ "popf" \
+ "and ax,bx" \
+ "pushf" \
+ "pop [edi]" \
+ parm [edi] [ax] [bx] \
+ value [ax] \
+ modify exact [ax bx];
+
+u32 and_long_asm(u32 *flags,u32 d, u32 s);
+#pragma aux and_long_asm = \
+ "push [edi]" \
+ "popf" \
+ "and eax,ebx" \
+ "pushf" \
+ "pop [edi]" \
+ parm [edi] [eax] [ebx] \
+ value [eax] \
+ modify exact [eax ebx];
+
+u8 cmp_byte_asm(u32 *flags,u8 d, u8 s);
+#pragma aux cmp_byte_asm = \
+ "push [edi]" \
+ "popf" \
+ "cmp al,bl" \
+ "pushf" \
+ "pop [edi]" \
+ parm [edi] [al] [bl] \
+ value [al] \
+ modify exact [al bl];
+
+u16 cmp_word_asm(u32 *flags,u16 d, u16 s);
+#pragma aux cmp_word_asm = \
+ "push [edi]" \
+ "popf" \
+ "cmp ax,bx" \
+ "pushf" \
+ "pop [edi]" \
+ parm [edi] [ax] [bx] \
+ value [ax] \
+ modify exact [ax bx];
+
+u32 cmp_long_asm(u32 *flags,u32 d, u32 s);
+#pragma aux cmp_long_asm = \
+ "push [edi]" \
+ "popf" \
+ "cmp eax,ebx" \
+ "pushf" \
+ "pop [edi]" \
+ parm [edi] [eax] [ebx] \
+ value [eax] \
+ modify exact [eax ebx];
+
+u8 daa_byte_asm(u32 *flags,u8 d);
+#pragma aux daa_byte_asm = \
+ "push [edi]" \
+ "popf" \
+ "daa" \
+ "pushf" \
+ "pop [edi]" \
+ parm [edi] [al] \
+ value [al] \
+ modify exact [al];
+
+u8 das_byte_asm(u32 *flags,u8 d);
+#pragma aux das_byte_asm = \
+ "push [edi]" \
+ "popf" \
+ "das" \
+ "pushf" \
+ "pop [edi]" \
+ parm [edi] [al] \
+ value [al] \
+ modify exact [al];
+
+u8 dec_byte_asm(u32 *flags,u8 d);
+#pragma aux dec_byte_asm = \
+ "push [edi]" \
+ "popf" \
+ "dec al" \
+ "pushf" \
+ "pop [edi]" \
+ parm [edi] [al] \
+ value [al] \
+ modify exact [al];
+
+u16 dec_word_asm(u32 *flags,u16 d);
+#pragma aux dec_word_asm = \
+ "push [edi]" \
+ "popf" \
+ "dec ax" \
+ "pushf" \
+ "pop [edi]" \
+ parm [edi] [ax] \
+ value [ax] \
+ modify exact [ax];
+
+u32 dec_long_asm(u32 *flags,u32 d);
+#pragma aux dec_long_asm = \
+ "push [edi]" \
+ "popf" \
+ "dec eax" \
+ "pushf" \
+ "pop [edi]" \
+ parm [edi] [eax] \
+ value [eax] \
+ modify exact [eax];
+
+u8 inc_byte_asm(u32 *flags,u8 d);
+#pragma aux inc_byte_asm = \
+ "push [edi]" \
+ "popf" \
+ "inc al" \
+ "pushf" \
+ "pop [edi]" \
+ parm [edi] [al] \
+ value [al] \
+ modify exact [al];
+
+u16 inc_word_asm(u32 *flags,u16 d);
+#pragma aux inc_word_asm = \
+ "push [edi]" \
+ "popf" \
+ "inc ax" \
+ "pushf" \
+ "pop [edi]" \
+ parm [edi] [ax] \
+ value [ax] \
+ modify exact [ax];
+
+u32 inc_long_asm(u32 *flags,u32 d);
+#pragma aux inc_long_asm = \
+ "push [edi]" \
+ "popf" \
+ "inc eax" \
+ "pushf" \
+ "pop [edi]" \
+ parm [edi] [eax] \
+ value [eax] \
+ modify exact [eax];
+
+u8 or_byte_asm(u32 *flags,u8 d, u8 s);
+#pragma aux or_byte_asm = \
+ "push [edi]" \
+ "popf" \
+ "or al,bl" \
+ "pushf" \
+ "pop [edi]" \
+ parm [edi] [al] [bl] \
+ value [al] \
+ modify exact [al bl];
+
+u16 or_word_asm(u32 *flags,u16 d, u16 s);
+#pragma aux or_word_asm = \
+ "push [edi]" \
+ "popf" \
+ "or ax,bx" \
+ "pushf" \
+ "pop [edi]" \
+ parm [edi] [ax] [bx] \
+ value [ax] \
+ modify exact [ax bx];
+
+u32 or_long_asm(u32 *flags,u32 d, u32 s);
+#pragma aux or_long_asm = \
+ "push [edi]" \
+ "popf" \
+ "or eax,ebx" \
+ "pushf" \
+ "pop [edi]" \
+ parm [edi] [eax] [ebx] \
+ value [eax] \
+ modify exact [eax ebx];
+
+u8 neg_byte_asm(u32 *flags,u8 d);
+#pragma aux neg_byte_asm = \
+ "push [edi]" \
+ "popf" \
+ "neg al" \
+ "pushf" \
+ "pop [edi]" \
+ parm [edi] [al] \
+ value [al] \
+ modify exact [al];
+
+u16 neg_word_asm(u32 *flags,u16 d);
+#pragma aux neg_word_asm = \
+ "push [edi]" \
+ "popf" \
+ "neg ax" \
+ "pushf" \
+ "pop [edi]" \
+ parm [edi] [ax] \
+ value [ax] \
+ modify exact [ax];
+
+u32 neg_long_asm(u32 *flags,u32 d);
+#pragma aux neg_long_asm = \
+ "push [edi]" \
+ "popf" \
+ "neg eax" \
+ "pushf" \
+ "pop [edi]" \
+ parm [edi] [eax] \
+ value [eax] \
+ modify exact [eax];
+
+u8 not_byte_asm(u32 *flags,u8 d);
+#pragma aux not_byte_asm = \
+ "push [edi]" \
+ "popf" \
+ "not al" \
+ "pushf" \
+ "pop [edi]" \
+ parm [edi] [al] \
+ value [al] \
+ modify exact [al];
+
+u16 not_word_asm(u32 *flags,u16 d);
+#pragma aux not_word_asm = \
+ "push [edi]" \
+ "popf" \
+ "not ax" \
+ "pushf" \
+ "pop [edi]" \
+ parm [edi] [ax] \
+ value [ax] \
+ modify exact [ax];
+
+u32 not_long_asm(u32 *flags,u32 d);
+#pragma aux not_long_asm = \
+ "push [edi]" \
+ "popf" \
+ "not eax" \
+ "pushf" \
+ "pop [edi]" \
+ parm [edi] [eax] \
+ value [eax] \
+ modify exact [eax];
+
+u8 rcl_byte_asm(u32 *flags,u8 d, u8 s);
+#pragma aux rcl_byte_asm = \
+ "push [edi]" \
+ "popf" \
+ "rcl al,cl" \
+ "pushf" \
+ "pop [edi]" \
+ parm [edi] [al] [cl] \
+ value [al] \
+ modify exact [al cl];
+
+u16 rcl_word_asm(u32 *flags,u16 d, u8 s);
+#pragma aux rcl_word_asm = \
+ "push [edi]" \
+ "popf" \
+ "rcl ax,cl" \
+ "pushf" \
+ "pop [edi]" \
+ parm [edi] [ax] [cl] \
+ value [ax] \
+ modify exact [ax cl];
+
+u32 rcl_long_asm(u32 *flags,u32 d, u8 s);
+#pragma aux rcl_long_asm = \
+ "push [edi]" \
+ "popf" \
+ "rcl eax,cl" \
+ "pushf" \
+ "pop [edi]" \
+ parm [edi] [eax] [cl] \
+ value [eax] \
+ modify exact [eax cl];
+
+u8 rcr_byte_asm(u32 *flags,u8 d, u8 s);
+#pragma aux rcr_byte_asm = \
+ "push [edi]" \
+ "popf" \
+ "rcr al,cl" \
+ "pushf" \
+ "pop [edi]" \
+ parm [edi] [al] [cl] \
+ value [al] \
+ modify exact [al cl];
+
+u16 rcr_word_asm(u32 *flags,u16 d, u8 s);
+#pragma aux rcr_word_asm = \
+ "push [edi]" \
+ "popf" \
+ "rcr ax,cl" \
+ "pushf" \
+ "pop [edi]" \
+ parm [edi] [ax] [cl] \
+ value [ax] \
+ modify exact [ax cl];
+
+u32 rcr_long_asm(u32 *flags,u32 d, u8 s);
+#pragma aux rcr_long_asm = \
+ "push [edi]" \
+ "popf" \
+ "rcr eax,cl" \
+ "pushf" \
+ "pop [edi]" \
+ parm [edi] [eax] [cl] \
+ value [eax] \
+ modify exact [eax cl];
+
+u8 rol_byte_asm(u32 *flags,u8 d, u8 s);
+#pragma aux rol_byte_asm = \
+ "push [edi]" \
+ "popf" \
+ "rol al,cl" \
+ "pushf" \
+ "pop [edi]" \
+ parm [edi] [al] [cl] \
+ value [al] \
+ modify exact [al cl];
+
+u16 rol_word_asm(u32 *flags,u16 d, u8 s);
+#pragma aux rol_word_asm = \
+ "push [edi]" \
+ "popf" \
+ "rol ax,cl" \
+ "pushf" \
+ "pop [edi]" \
+ parm [edi] [ax] [cl] \
+ value [ax] \
+ modify exact [ax cl];
+
+u32 rol_long_asm(u32 *flags,u32 d, u8 s);
+#pragma aux rol_long_asm = \
+ "push [edi]" \
+ "popf" \
+ "rol eax,cl" \
+ "pushf" \
+ "pop [edi]" \
+ parm [edi] [eax] [cl] \
+ value [eax] \
+ modify exact [eax cl];
+
+u8 ror_byte_asm(u32 *flags,u8 d, u8 s);
+#pragma aux ror_byte_asm = \
+ "push [edi]" \
+ "popf" \
+ "ror al,cl" \
+ "pushf" \
+ "pop [edi]" \
+ parm [edi] [al] [cl] \
+ value [al] \
+ modify exact [al cl];
+
+u16 ror_word_asm(u32 *flags,u16 d, u8 s);
+#pragma aux ror_word_asm = \
+ "push [edi]" \
+ "popf" \
+ "ror ax,cl" \
+ "pushf" \
+ "pop [edi]" \
+ parm [edi] [ax] [cl] \
+ value [ax] \
+ modify exact [ax cl];
+
+u32 ror_long_asm(u32 *flags,u32 d, u8 s);
+#pragma aux ror_long_asm = \
+ "push [edi]" \
+ "popf" \
+ "ror eax,cl" \
+ "pushf" \
+ "pop [edi]" \
+ parm [edi] [eax] [cl] \
+ value [eax] \
+ modify exact [eax cl];
+
+u8 shl_byte_asm(u32 *flags,u8 d, u8 s);
+#pragma aux shl_byte_asm = \
+ "push [edi]" \
+ "popf" \
+ "shl al,cl" \
+ "pushf" \
+ "pop [edi]" \
+ parm [edi] [al] [cl] \
+ value [al] \
+ modify exact [al cl];
+
+u16 shl_word_asm(u32 *flags,u16 d, u8 s);
+#pragma aux shl_word_asm = \
+ "push [edi]" \
+ "popf" \
+ "shl ax,cl" \
+ "pushf" \
+ "pop [edi]" \
+ parm [edi] [ax] [cl] \
+ value [ax] \
+ modify exact [ax cl];
+
+u32 shl_long_asm(u32 *flags,u32 d, u8 s);
+#pragma aux shl_long_asm = \
+ "push [edi]" \
+ "popf" \
+ "shl eax,cl" \
+ "pushf" \
+ "pop [edi]" \
+ parm [edi] [eax] [cl] \
+ value [eax] \
+ modify exact [eax cl];
+
+u8 shr_byte_asm(u32 *flags,u8 d, u8 s);
+#pragma aux shr_byte_asm = \
+ "push [edi]" \
+ "popf" \
+ "shr al,cl" \
+ "pushf" \
+ "pop [edi]" \
+ parm [edi] [al] [cl] \
+ value [al] \
+ modify exact [al cl];
+
+u16 shr_word_asm(u32 *flags,u16 d, u8 s);
+#pragma aux shr_word_asm = \
+ "push [edi]" \
+ "popf" \
+ "shr ax,cl" \
+ "pushf" \
+ "pop [edi]" \
+ parm [edi] [ax] [cl] \
+ value [ax] \
+ modify exact [ax cl];
+
+u32 shr_long_asm(u32 *flags,u32 d, u8 s);
+#pragma aux shr_long_asm = \
+ "push [edi]" \
+ "popf" \
+ "shr eax,cl" \
+ "pushf" \
+ "pop [edi]" \
+ parm [edi] [eax] [cl] \
+ value [eax] \
+ modify exact [eax cl];
+
+u8 sar_byte_asm(u32 *flags,u8 d, u8 s);
+#pragma aux sar_byte_asm = \
+ "push [edi]" \
+ "popf" \
+ "sar al,cl" \
+ "pushf" \
+ "pop [edi]" \
+ parm [edi] [al] [cl] \
+ value [al] \
+ modify exact [al cl];
+
+u16 sar_word_asm(u32 *flags,u16 d, u8 s);
+#pragma aux sar_word_asm = \
+ "push [edi]" \
+ "popf" \
+ "sar ax,cl" \
+ "pushf" \
+ "pop [edi]" \
+ parm [edi] [ax] [cl] \
+ value [ax] \
+ modify exact [ax cl];
+
+u32 sar_long_asm(u32 *flags,u32 d, u8 s);
+#pragma aux sar_long_asm = \
+ "push [edi]" \
+ "popf" \
+ "sar eax,cl" \
+ "pushf" \
+ "pop [edi]" \
+ parm [edi] [eax] [cl] \
+ value [eax] \
+ modify exact [eax cl];
+
+u16 shld_word_asm(u32 *flags,u16 d, u16 fill, u8 s);
+#pragma aux shld_word_asm = \
+ "push [edi]" \
+ "popf" \
+ "shld ax,dx,cl" \
+ "pushf" \
+ "pop [edi]" \
+ parm [edi] [ax] [dx] [cl] \
+ value [ax] \
+ modify exact [ax dx cl];
+
+u32 shld_long_asm(u32 *flags,u32 d, u32 fill, u8 s);
+#pragma aux shld_long_asm = \
+ "push [edi]" \
+ "popf" \
+ "shld eax,edx,cl" \
+ "pushf" \
+ "pop [edi]" \
+ parm [edi] [eax] [edx] [cl] \
+ value [eax] \
+ modify exact [eax edx cl];
+
+u16 shrd_word_asm(u32 *flags,u16 d, u16 fill, u8 s);
+#pragma aux shrd_word_asm = \
+ "push [edi]" \
+ "popf" \
+ "shrd ax,dx,cl" \
+ "pushf" \
+ "pop [edi]" \
+ parm [edi] [ax] [dx] [cl] \
+ value [ax] \
+ modify exact [ax dx cl];
+
+u32 shrd_long_asm(u32 *flags,u32 d, u32 fill, u8 s);
+#pragma aux shrd_long_asm = \
+ "push [edi]" \
+ "popf" \
+ "shrd eax,edx,cl" \
+ "pushf" \
+ "pop [edi]" \
+ parm [edi] [eax] [edx] [cl] \
+ value [eax] \
+ modify exact [eax edx cl];
+
+u8 sbb_byte_asm(u32 *flags,u8 d, u8 s);
+#pragma aux sbb_byte_asm = \
+ "push [edi]" \
+ "popf" \
+ "sbb al,bl" \
+ "pushf" \
+ "pop [edi]" \
+ parm [edi] [al] [bl] \
+ value [al] \
+ modify exact [al bl];
+
+u16 sbb_word_asm(u32 *flags,u16 d, u16 s);
+#pragma aux sbb_word_asm = \
+ "push [edi]" \
+ "popf" \
+ "sbb ax,bx" \
+ "pushf" \
+ "pop [edi]" \
+ parm [edi] [ax] [bx] \
+ value [ax] \
+ modify exact [ax bx];
+
+u32 sbb_long_asm(u32 *flags,u32 d, u32 s);
+#pragma aux sbb_long_asm = \
+ "push [edi]" \
+ "popf" \
+ "sbb eax,ebx" \
+ "pushf" \
+ "pop [edi]" \
+ parm [edi] [eax] [ebx] \
+ value [eax] \
+ modify exact [eax ebx];
+
+u8 sub_byte_asm(u32 *flags,u8 d, u8 s);
+#pragma aux sub_byte_asm = \
+ "push [edi]" \
+ "popf" \
+ "sub al,bl" \
+ "pushf" \
+ "pop [edi]" \
+ parm [edi] [al] [bl] \
+ value [al] \
+ modify exact [al bl];
+
+u16 sub_word_asm(u32 *flags,u16 d, u16 s);
+#pragma aux sub_word_asm = \
+ "push [edi]" \
+ "popf" \
+ "sub ax,bx" \
+ "pushf" \
+ "pop [edi]" \
+ parm [edi] [ax] [bx] \
+ value [ax] \
+ modify exact [ax bx];
+
+u32 sub_long_asm(u32 *flags,u32 d, u32 s);
+#pragma aux sub_long_asm = \
+ "push [edi]" \
+ "popf" \
+ "sub eax,ebx" \
+ "pushf" \
+ "pop [edi]" \
+ parm [edi] [eax] [ebx] \
+ value [eax] \
+ modify exact [eax ebx];
+
+void test_byte_asm(u32 *flags,u8 d, u8 s);
+#pragma aux test_byte_asm = \
+ "push [edi]" \
+ "popf" \
+ "test al,bl" \
+ "pushf" \
+ "pop [edi]" \
+ parm [edi] [al] [bl] \
+ modify exact [al bl];
+
+void test_word_asm(u32 *flags,u16 d, u16 s);
+#pragma aux test_word_asm = \
+ "push [edi]" \
+ "popf" \
+ "test ax,bx" \
+ "pushf" \
+ "pop [edi]" \
+ parm [edi] [ax] [bx] \
+ modify exact [ax bx];
+
+void test_long_asm(u32 *flags,u32 d, u32 s);
+#pragma aux test_long_asm = \
+ "push [edi]" \
+ "popf" \
+ "test eax,ebx" \
+ "pushf" \
+ "pop [edi]" \
+ parm [edi] [eax] [ebx] \
+ modify exact [eax ebx];
+
+u8 xor_byte_asm(u32 *flags,u8 d, u8 s);
+#pragma aux xor_byte_asm = \
+ "push [edi]" \
+ "popf" \
+ "xor al,bl" \
+ "pushf" \
+ "pop [edi]" \
+ parm [edi] [al] [bl] \
+ value [al] \
+ modify exact [al bl];
+
+u16 xor_word_asm(u32 *flags,u16 d, u16 s);
+#pragma aux xor_word_asm = \
+ "push [edi]" \
+ "popf" \
+ "xor ax,bx" \
+ "pushf" \
+ "pop [edi]" \
+ parm [edi] [ax] [bx] \
+ value [ax] \
+ modify exact [ax bx];
+
+u32 xor_long_asm(u32 *flags,u32 d, u32 s);
+#pragma aux xor_long_asm = \
+ "push [edi]" \
+ "popf" \
+ "xor eax,ebx" \
+ "pushf" \
+ "pop [edi]" \
+ parm [edi] [eax] [ebx] \
+ value [eax] \
+ modify exact [eax ebx];
+
+void imul_byte_asm(u32 *flags,u16 *ax,u8 d,u8 s);
+#pragma aux imul_byte_asm = \
+ "push [edi]" \
+ "popf" \
+ "imul bl" \
+ "pushf" \
+ "pop [edi]" \
+ "mov [esi],ax" \
+ parm [edi] [esi] [al] [bl] \
+ modify exact [esi ax bl];
+
+void imul_word_asm(u32 *flags,u16 *ax,u16 *dx,u16 d,u16 s);
+#pragma aux imul_word_asm = \
+ "push [edi]" \
+ "popf" \
+ "imul bx" \
+ "pushf" \
+ "pop [edi]" \
+ "mov [esi],ax" \
+ "mov [ecx],dx" \
+ parm [edi] [esi] [ecx] [ax] [bx]\
+ modify exact [esi edi ax bx dx];
+
+void imul_long_asm(u32 *flags,u32 *eax,u32 *edx,u32 d,u32 s);
+#pragma aux imul_long_asm = \
+ "push [edi]" \
+ "popf" \
+ "imul ebx" \
+ "pushf" \
+ "pop [edi]" \
+ "mov [esi],eax" \
+ "mov [ecx],edx" \
+ parm [edi] [esi] [ecx] [eax] [ebx] \
+ modify exact [esi edi eax ebx edx];
+
+void mul_byte_asm(u32 *flags,u16 *ax,u8 d,u8 s);
+#pragma aux mul_byte_asm = \
+ "push [edi]" \
+ "popf" \
+ "mul bl" \
+ "pushf" \
+ "pop [edi]" \
+ "mov [esi],ax" \
+ parm [edi] [esi] [al] [bl] \
+ modify exact [esi ax bl];
+
+void mul_word_asm(u32 *flags,u16 *ax,u16 *dx,u16 d,u16 s);
+#pragma aux mul_word_asm = \
+ "push [edi]" \
+ "popf" \
+ "mul bx" \
+ "pushf" \
+ "pop [edi]" \
+ "mov [esi],ax" \
+ "mov [ecx],dx" \
+ parm [edi] [esi] [ecx] [ax] [bx]\
+ modify exact [esi edi ax bx dx];
+
+void mul_long_asm(u32 *flags,u32 *eax,u32 *edx,u32 d,u32 s);
+#pragma aux mul_long_asm = \
+ "push [edi]" \
+ "popf" \
+ "mul ebx" \
+ "pushf" \
+ "pop [edi]" \
+ "mov [esi],eax" \
+ "mov [ecx],edx" \
+ parm [edi] [esi] [ecx] [eax] [ebx] \
+ modify exact [esi edi eax ebx edx];
+
+void idiv_byte_asm(u32 *flags,u8 *al,u8 *ah,u16 d,u8 s);
+#pragma aux idiv_byte_asm = \
+ "push [edi]" \
+ "popf" \
+ "idiv bl" \
+ "pushf" \
+ "pop [edi]" \
+ "mov [esi],al" \
+ "mov [ecx],ah" \
+ parm [edi] [esi] [ecx] [ax] [bl]\
+ modify exact [esi edi ax bl];
+
+void idiv_word_asm(u32 *flags,u16 *ax,u16 *dx,u16 dlo,u16 dhi,u16 s);
+#pragma aux idiv_word_asm = \
+ "push [edi]" \
+ "popf" \
+ "idiv bx" \
+ "pushf" \
+ "pop [edi]" \
+ "mov [esi],ax" \
+ "mov [ecx],dx" \
+ parm [edi] [esi] [ecx] [ax] [dx] [bx]\
+ modify exact [esi edi ax dx bx];
+
+void idiv_long_asm(u32 *flags,u32 *eax,u32 *edx,u32 dlo,u32 dhi,u32 s);
+#pragma aux idiv_long_asm = \
+ "push [edi]" \
+ "popf" \
+ "idiv ebx" \
+ "pushf" \
+ "pop [edi]" \
+ "mov [esi],eax" \
+ "mov [ecx],edx" \
+ parm [edi] [esi] [ecx] [eax] [edx] [ebx]\
+ modify exact [esi edi eax edx ebx];
+
+void div_byte_asm(u32 *flags,u8 *al,u8 *ah,u16 d,u8 s);
+#pragma aux div_byte_asm = \
+ "push [edi]" \
+ "popf" \
+ "div bl" \
+ "pushf" \
+ "pop [edi]" \
+ "mov [esi],al" \
+ "mov [ecx],ah" \
+ parm [edi] [esi] [ecx] [ax] [bl]\
+ modify exact [esi edi ax bl];
+
+void div_word_asm(u32 *flags,u16 *ax,u16 *dx,u16 dlo,u16 dhi,u16 s);
+#pragma aux div_word_asm = \
+ "push [edi]" \
+ "popf" \
+ "div bx" \
+ "pushf" \
+ "pop [edi]" \
+ "mov [esi],ax" \
+ "mov [ecx],dx" \
+ parm [edi] [esi] [ecx] [ax] [dx] [bx]\
+ modify exact [esi edi ax dx bx];
+
+void div_long_asm(u32 *flags,u32 *eax,u32 *edx,u32 dlo,u32 dhi,u32 s);
+#pragma aux div_long_asm = \
+ "push [edi]" \
+ "popf" \
+ "div ebx" \
+ "pushf" \
+ "pop [edi]" \
+ "mov [esi],eax" \
+ "mov [ecx],edx" \
+ parm [edi] [esi] [ecx] [eax] [edx] [ebx]\
+ modify exact [esi edi eax edx ebx];
+
+#endif
+
+#endif /* __X86EMU_PRIM_ASM_H */
--- /dev/null
+/****************************************************************************
+*
+* Realmode X86 Emulator Library
+*
+* Copyright (C) 1996-1999 SciTech Software, Inc.
+* Copyright (C) David Mosberger-Tang
+* Copyright (C) 1999 Egbert Eich
+*
+* ========================================================================
+*
+* Permission to use, copy, modify, distribute, and sell this software and
+* its documentation for any purpose is hereby granted without fee,
+* provided that the above copyright notice appear in all copies and that
+* both that copyright notice and this permission notice appear in
+* supporting documentation, and that the name of the authors not be used
+* in advertising or publicity pertaining to distribution of the software
+* without specific, written prior permission. The authors makes no
+* representations about the suitability of this software for any purpose.
+* It is provided "as is" without express or implied warranty.
+*
+* THE AUTHORS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+* EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
+* USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
+* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+* PERFORMANCE OF THIS SOFTWARE.
+*
+* ========================================================================
+*
+* Language: ANSI C
+* Environment: Any
+* Developer: Kendall Bennett
+*
+* Description: Header file for primitive operation functions.
+*
+****************************************************************************/
+
+#ifndef __X86EMU_PRIM_OPS_H
+#define __X86EMU_PRIM_OPS_H
+
+#include "x86emu/prim_asm.h"
+
+#ifdef __cplusplus
+extern "C" { /* Use "C" linkage when in C++ mode */
+#endif
+
+u16 aaa_word (u16 d);
+u16 aas_word (u16 d);
+u16 aad_word (u16 d);
+u16 aam_word (u8 d);
+u8 adc_byte (u8 d, u8 s);
+u16 adc_word (u16 d, u16 s);
+u32 adc_long (u32 d, u32 s);
+u8 add_byte (u8 d, u8 s);
+u16 add_word (u16 d, u16 s);
+u32 add_long (u32 d, u32 s);
+u8 and_byte (u8 d, u8 s);
+u16 and_word (u16 d, u16 s);
+u32 and_long (u32 d, u32 s);
+u8 cmp_byte (u8 d, u8 s);
+u16 cmp_word (u16 d, u16 s);
+u32 cmp_long (u32 d, u32 s);
+u8 daa_byte (u8 d);
+u8 das_byte (u8 d);
+u8 dec_byte (u8 d);
+u16 dec_word (u16 d);
+u32 dec_long (u32 d);
+u8 inc_byte (u8 d);
+u16 inc_word (u16 d);
+u32 inc_long (u32 d);
+u8 or_byte (u8 d, u8 s);
+u16 or_word (u16 d, u16 s);
+u32 or_long (u32 d, u32 s);
+u8 neg_byte (u8 s);
+u16 neg_word (u16 s);
+u32 neg_long (u32 s);
+u8 not_byte (u8 s);
+u16 not_word (u16 s);
+u32 not_long (u32 s);
+u8 rcl_byte (u8 d, u8 s);
+u16 rcl_word (u16 d, u8 s);
+u32 rcl_long (u32 d, u8 s);
+u8 rcr_byte (u8 d, u8 s);
+u16 rcr_word (u16 d, u8 s);
+u32 rcr_long (u32 d, u8 s);
+u8 rol_byte (u8 d, u8 s);
+u16 rol_word (u16 d, u8 s);
+u32 rol_long (u32 d, u8 s);
+u8 ror_byte (u8 d, u8 s);
+u16 ror_word (u16 d, u8 s);
+u32 ror_long (u32 d, u8 s);
+u8 shl_byte (u8 d, u8 s);
+u16 shl_word (u16 d, u8 s);
+u32 shl_long (u32 d, u8 s);
+u8 shr_byte (u8 d, u8 s);
+u16 shr_word (u16 d, u8 s);
+u32 shr_long (u32 d, u8 s);
+u8 sar_byte (u8 d, u8 s);
+u16 sar_word (u16 d, u8 s);
+u32 sar_long (u32 d, u8 s);
+u16 shld_word (u16 d, u16 fill, u8 s);
+u32 shld_long (u32 d, u32 fill, u8 s);
+u16 shrd_word (u16 d, u16 fill, u8 s);
+u32 shrd_long (u32 d, u32 fill, u8 s);
+u8 sbb_byte (u8 d, u8 s);
+u16 sbb_word (u16 d, u16 s);
+u32 sbb_long (u32 d, u32 s);
+u8 sub_byte (u8 d, u8 s);
+u16 sub_word (u16 d, u16 s);
+u32 sub_long (u32 d, u32 s);
+void test_byte (u8 d, u8 s);
+void test_word (u16 d, u16 s);
+void test_long (u32 d, u32 s);
+u8 xor_byte (u8 d, u8 s);
+u16 xor_word (u16 d, u16 s);
+u32 xor_long (u32 d, u32 s);
+void imul_byte (u8 s);
+void imul_word (u16 s);
+void imul_long (u32 s);
+void imul_long_direct(u32 *res_lo, u32* res_hi,u32 d, u32 s);
+void mul_byte (u8 s);
+void mul_word (u16 s);
+void mul_long (u32 s);
+void idiv_byte (u8 s);
+void idiv_word (u16 s);
+void idiv_long (u32 s);
+void div_byte (u8 s);
+void div_word (u16 s);
+void div_long (u32 s);
+void ins (int size);
+void outs (int size);
+u16 mem_access_word (int addr);
+void push_word (u16 w);
+void push_long (u32 w);
+u16 pop_word (void);
+u32 pop_long (void);
+
+#ifdef __cplusplus
+} /* End of "C" linkage for C++ */
+#endif
+
+#endif /* __X86EMU_PRIM_OPS_H */
--- /dev/null
+/****************************************************************************
+*
+* Realmode X86 Emulator Library
+*
+* Copyright (C) 1996-1999 SciTech Software, Inc.
+* Copyright (C) David Mosberger-Tang
+* Copyright (C) 1999 Egbert Eich
+*
+* ========================================================================
+*
+* Permission to use, copy, modify, distribute, and sell this software and
+* its documentation for any purpose is hereby granted without fee,
+* provided that the above copyright notice appear in all copies and that
+* both that copyright notice and this permission notice appear in
+* supporting documentation, and that the name of the authors not be used
+* in advertising or publicity pertaining to distribution of the software
+* without specific, written prior permission. The authors makes no
+* representations about the suitability of this software for any purpose.
+* It is provided "as is" without express or implied warranty.
+*
+* THE AUTHORS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+* EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
+* USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
+* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+* PERFORMANCE OF THIS SOFTWARE.
+*
+* ========================================================================
+*
+* Language: ANSI C
+* Environment: Any
+* Developer: Kendall Bennett
+*
+* Description: Header file for system specific functions. These functions
+* are always compiled and linked in the OS depedent libraries,
+* and never in a binary portable driver.
+*
+****************************************************************************/
+
+/* $XFree86: xc/extras/x86emu/src/x86emu/x86emu/x86emui.h,v 1.3 2000/04/17 16:29:47 eich Exp $ */
+
+#ifndef __X86EMU_X86EMUI_H
+#define __X86EMU_X86EMUI_H
+
+/* If we are compiling in C++ mode, we can compile some functions as
+ * inline to increase performance (however the code size increases quite
+ * dramatically in this case).
+ */
+
+#if defined(__cplusplus) && !defined(_NO_INLINE)
+#define _INLINE inline
+#else
+#define _INLINE static
+#endif
+
+/* Get rid of unused parameters in C++ compilation mode */
+
+#ifdef __cplusplus
+#define X86EMU_UNUSED(v)
+#else
+#define X86EMU_UNUSED(v) v
+#endif
+
+#include "x86emu.h"
+#include "x86emu/regs.h"
+#include "x86emu/debug.h"
+#include "x86emu/decode.h"
+#include "x86emu/ops.h"
+#include "x86emu/prim_ops.h"
+#include "x86emu/fpu.h"
+#include "x86emu/fpu_regs.h"
+
+#ifdef IN_MODULE
+#include <xf86_ansic.h>
+#else
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#endif
+/*--------------------------- Inline Functions ----------------------------*/
+
+#ifdef __cplusplus
+extern "C" { /* Use "C" linkage when in C++ mode */
+#endif
+
+extern u8 (X86APIP sys_rdb)(u32 addr);
+extern u16 (X86APIP sys_rdw)(u32 addr);
+extern u32 (X86APIP sys_rdl)(u32 addr);
+extern void (X86APIP sys_wrb)(u32 addr,u8 val);
+extern void (X86APIP sys_wrw)(u32 addr,u16 val);
+extern void (X86APIP sys_wrl)(u32 addr,u32 val);
+
+extern u8 (X86APIP sys_inb)(X86EMU_pioAddr addr);
+extern u16 (X86APIP sys_inw)(X86EMU_pioAddr addr);
+extern u32 (X86APIP sys_inl)(X86EMU_pioAddr addr);
+extern void (X86APIP sys_outb)(X86EMU_pioAddr addr,u8 val);
+extern void (X86APIP sys_outw)(X86EMU_pioAddr addr,u16 val);
+extern void (X86APIP sys_outl)(X86EMU_pioAddr addr,u32 val);
+
+#ifdef __cplusplus
+} /* End of "C" linkage for C++ */
+#endif
+
+#endif /* __X86EMU_X86EMUI_H */