]> git.ipfire.org Git - people/teissler/ipfire-2.x.git/commitdiff
HWInfo wieder eingefuegt, da mit kudzu zu viele Segmentation Faults liefert.
authorms <ms@ea5c0bd1-69bd-2848-81d8-4f18e57aeed8>
Wed, 7 Mar 2007 18:42:02 +0000 (18:42 +0000)
committerms <ms@ea5c0bd1-69bd-2848-81d8-4f18e57aeed8>
Wed, 7 Mar 2007 18:42:02 +0000 (18:42 +0000)
git-svn-id: http://svn.ipfire.org/svn/ipfire/trunk@443 ea5c0bd1-69bd-2848-81d8-4f18e57aeed8

212 files changed:
config/rootfiles/common/XML-Parser [new file with mode: 0644]
config/rootfiles/common/dbus [new file with mode: 0644]
config/rootfiles/common/hal [new file with mode: 0644]
config/rootfiles/common/kudzu
config/uClibc/busybox.config
doc/ChangeLog
doc/packages-list.txt
lfs/XML-Parser [new file with mode: 0644]
lfs/dbus [new file with mode: 0644]
lfs/hal [new file with mode: 0644]
lfs/hwdata [new file with mode: 0644]
lfs/hwinfo [new file with mode: 0644]
lfs/kudzu
lfs/sysfsutils
make.sh
src/hwinfo/COPYING [new file with mode: 0644]
src/hwinfo/ChangeLog [new file with mode: 0644]
src/hwinfo/Makefile [new file with mode: 0644]
src/hwinfo/Makefile.common [new file with mode: 0644]
src/hwinfo/README [new file with mode: 0644]
src/hwinfo/VERSION [new file with mode: 0644]
src/hwinfo/doc/example1.c [new file with mode: 0644]
src/hwinfo/doc/example2.c [new file with mode: 0644]
src/hwinfo/doc/footer.html [new file with mode: 0644]
src/hwinfo/doc/hwinfo.8 [new file with mode: 0644]
src/hwinfo/doc/libhd.doc [new file with mode: 0644]
src/hwinfo/doc/libhd.doxy [new file with mode: 0644]
src/hwinfo/gen-hwcfg-disk.sh [new file with mode: 0755]
src/hwinfo/getsysinfo [new file with mode: 0755]
src/hwinfo/hwbootscan [new file with mode: 0644]
src/hwinfo/hwbootscan.rc [new file with mode: 0644]
src/hwinfo/hwinfo.c [new file with mode: 0644]
src/hwinfo/hwscan.c [new file with mode: 0644]
src/hwinfo/hwscand.c [new file with mode: 0644]
src/hwinfo/hwscanqueue.c [new file with mode: 0644]
src/hwinfo/init_message.h [new file with mode: 0644]
src/hwinfo/scripts/mci [new file with mode: 0755]
src/hwinfo/src/Makefile [new file with mode: 0644]
src/hwinfo/src/hd/Makefile [new file with mode: 0644]
src/hwinfo/src/hd/adb.c [new file with mode: 0644]
src/hwinfo/src/hd/adb.h [new file with mode: 0644]
src/hwinfo/src/hd/bios.c [new file with mode: 0644]
src/hwinfo/src/hd/bios.h [new file with mode: 0644]
src/hwinfo/src/hd/block.c [new file with mode: 0644]
src/hwinfo/src/hd/block.h [new file with mode: 0644]
src/hwinfo/src/hd/braille.c [new file with mode: 0644]
src/hwinfo/src/hd/braille.h [new file with mode: 0644]
src/hwinfo/src/hd/cpu.c [new file with mode: 0644]
src/hwinfo/src/hd/cpu.h [new file with mode: 0644]
src/hwinfo/src/hd/edd.c [new file with mode: 0644]
src/hwinfo/src/hd/edd.h [new file with mode: 0644]
src/hwinfo/src/hd/fb.c [new file with mode: 0644]
src/hwinfo/src/hd/fb.h [new file with mode: 0644]
src/hwinfo/src/hd/floppy.c [new file with mode: 0644]
src/hwinfo/src/hd/floppy.h [new file with mode: 0644]
src/hwinfo/src/hd/hd.c [new file with mode: 0644]
src/hwinfo/src/hd/hd.h [new file with mode: 0644]
src/hwinfo/src/hd/hd_int.h [new file with mode: 0644]
src/hwinfo/src/hd/hddb.c [new file with mode: 0644]
src/hwinfo/src/hd/hddb.h [new file with mode: 0644]
src/hwinfo/src/hd/hddb_int.h [new file with mode: 0644]
src/hwinfo/src/hd/hdp.c [new file with mode: 0644]
src/hwinfo/src/hd/hdp.h [new file with mode: 0644]
src/hwinfo/src/hd/ibm-notebooks.h [new file with mode: 0644]
src/hwinfo/src/hd/input.c [new file with mode: 0644]
src/hwinfo/src/hd/input.h [new file with mode: 0644]
src/hwinfo/src/hd/int.c [new file with mode: 0644]
src/hwinfo/src/hd/int.h [new file with mode: 0644]
src/hwinfo/src/hd/isa.c [new file with mode: 0644]
src/hwinfo/src/hd/isa.h [new file with mode: 0644]
src/hwinfo/src/hd/isapnp.c [new file with mode: 0644]
src/hwinfo/src/hd/isapnp.h [new file with mode: 0644]
src/hwinfo/src/hd/isdn.c [new file with mode: 0644]
src/hwinfo/src/hd/isdn.h [new file with mode: 0644]
src/hwinfo/src/hd/kbd.c [new file with mode: 0644]
src/hwinfo/src/hd/kbd.h [new file with mode: 0644]
src/hwinfo/src/hd/klog.c [new file with mode: 0644]
src/hwinfo/src/hd/klog.h [new file with mode: 0644]
src/hwinfo/src/hd/manual.c [new file with mode: 0644]
src/hwinfo/src/hd/manual.h [new file with mode: 0644]
src/hwinfo/src/hd/memory.c [new file with mode: 0644]
src/hwinfo/src/hd/memory.h [new file with mode: 0644]
src/hwinfo/src/hd/misc.c [new file with mode: 0644]
src/hwinfo/src/hd/misc.h [new file with mode: 0644]
src/hwinfo/src/hd/modem.c [new file with mode: 0644]
src/hwinfo/src/hd/modem.h [new file with mode: 0644]
src/hwinfo/src/hd/monitor.c [new file with mode: 0644]
src/hwinfo/src/hd/monitor.h [new file with mode: 0644]
src/hwinfo/src/hd/mouse.c [new file with mode: 0644]
src/hwinfo/src/hd/mouse.h [new file with mode: 0644]
src/hwinfo/src/hd/net.c [new file with mode: 0644]
src/hwinfo/src/hd/net.h [new file with mode: 0644]
src/hwinfo/src/hd/parallel.c [new file with mode: 0644]
src/hwinfo/src/hd/parallel.h [new file with mode: 0644]
src/hwinfo/src/hd/pci.c [new file with mode: 0644]
src/hwinfo/src/hd/pci.h [new file with mode: 0644]
src/hwinfo/src/hd/pcmcia.c [new file with mode: 0644]
src/hwinfo/src/hd/pcmcia.h [new file with mode: 0644]
src/hwinfo/src/hd/pppoe.c [new file with mode: 0644]
src/hwinfo/src/hd/pppoe.h [new file with mode: 0644]
src/hwinfo/src/hd/prom.c [new file with mode: 0644]
src/hwinfo/src/hd/prom.h [new file with mode: 0644]
src/hwinfo/src/hd/s390.c [new file with mode: 0644]
src/hwinfo/src/hd/s390.h [new file with mode: 0644]
src/hwinfo/src/hd/sbus.c [new file with mode: 0644]
src/hwinfo/src/hd/sbus.h [new file with mode: 0644]
src/hwinfo/src/hd/serial.c [new file with mode: 0644]
src/hwinfo/src/hd/serial.h [new file with mode: 0644]
src/hwinfo/src/hd/smbios.c [new file with mode: 0644]
src/hwinfo/src/hd/smbios.h [new file with mode: 0644]
src/hwinfo/src/hd/sys.c [new file with mode: 0644]
src/hwinfo/src/hd/sys.h [new file with mode: 0644]
src/hwinfo/src/hd/usb.c [new file with mode: 0644]
src/hwinfo/src/hd/usb.h [new file with mode: 0644]
src/hwinfo/src/hd/version.h [new file with mode: 0644]
src/hwinfo/src/hd/veth.c [new file with mode: 0644]
src/hwinfo/src/hd/veth.h [new file with mode: 0644]
src/hwinfo/src/hd/wlan.c [new file with mode: 0644]
src/hwinfo/src/hd/wlan.h [new file with mode: 0644]
src/hwinfo/src/ids/Makefile [new file with mode: 0644]
src/hwinfo/src/ids/cdb_x11 [new file with mode: 0755]
src/hwinfo/src/ids/check_hd.c [new file with mode: 0644]
src/hwinfo/src/ids/convert_hd [new file with mode: 0755]
src/hwinfo/src/ids/get_adaptec [new file with mode: 0755]
src/hwinfo/src/ids/get_pcmcia [new file with mode: 0755]
src/hwinfo/src/ids/hd_ids.c [new file with mode: 0644]
src/hwinfo/src/ids/src/braille [new file with mode: 0644]
src/hwinfo/src/ids/src/bus [new file with mode: 0644]
src/hwinfo/src/ids/src/camera [new file with mode: 0644]
src/hwinfo/src/ids/src/chipcard [new file with mode: 0644]
src/hwinfo/src/ids/src/class [new file with mode: 0644]
src/hwinfo/src/ids/src/dvb [new file with mode: 0644]
src/hwinfo/src/ids/src/extra [new file with mode: 0644]
src/hwinfo/src/ids/src/isapnp [new file with mode: 0644]
src/hwinfo/src/ids/src/modem [new file with mode: 0644]
src/hwinfo/src/ids/src/modem.i386 [new file with mode: 0644]
src/hwinfo/src/ids/src/monitor [new file with mode: 0644]
src/hwinfo/src/ids/src/mouse [new file with mode: 0644]
src/hwinfo/src/ids/src/network [new file with mode: 0644]
src/hwinfo/src/ids/src/pci [new file with mode: 0644]
src/hwinfo/src/ids/src/pcmcia [new file with mode: 0644]
src/hwinfo/src/ids/src/ppc [new file with mode: 0644]
src/hwinfo/src/ids/src/s390 [new file with mode: 0644]
src/hwinfo/src/ids/src/scanner [new file with mode: 0644]
src/hwinfo/src/ids/src/sound [new file with mode: 0644]
src/hwinfo/src/ids/src/special [new file with mode: 0644]
src/hwinfo/src/ids/src/storage [new file with mode: 0644]
src/hwinfo/src/ids/src/tv [new file with mode: 0644]
src/hwinfo/src/ids/src/usb [new file with mode: 0644]
src/hwinfo/src/ids/src/usb2 [new file with mode: 0644]
src/hwinfo/src/ids/src/x11.amd64 [new file with mode: 0644]
src/hwinfo/src/ids/src/x11.axp [new file with mode: 0644]
src/hwinfo/src/ids/src/x11.i386 [new file with mode: 0644]
src/hwinfo/src/ids/src/x11.ia64 [new file with mode: 0644]
src/hwinfo/src/ids/src/x11.ppc [new file with mode: 0644]
src/hwinfo/src/ids/src/x11.ppc.special [new file with mode: 0644]
src/hwinfo/src/ids/src/x11.sparc [new file with mode: 0644]
src/hwinfo/src/ids/update_x11 [new file with mode: 0755]
src/hwinfo/src/int10/AsmMacros.h [new file with mode: 0644]
src/hwinfo/src/int10/Makefile [new file with mode: 0644]
src/hwinfo/src/int10/README [new file with mode: 0644]
src/hwinfo/src/int10/emu_vm86.c [new file with mode: 0644]
src/hwinfo/src/int10/i10_int.c [new file with mode: 0644]
src/hwinfo/src/int10/i10_io.c [new file with mode: 0644]
src/hwinfo/src/int10/i10_pci.c [new file with mode: 0644]
src/hwinfo/src/int10/i10_v86.c [new file with mode: 0644]
src/hwinfo/src/int10/i10_vbios.c [new file with mode: 0644]
src/hwinfo/src/int10/int10.c [new file with mode: 0644]
src/hwinfo/src/int10/pci.h [new file with mode: 0644]
src/hwinfo/src/int10/v86bios.h [new file with mode: 0644]
src/hwinfo/src/int10/vbios.h [new file with mode: 0644]
src/hwinfo/src/int10/vm86_struct.h [new file with mode: 0644]
src/hwinfo/src/isdn/Makefile [new file with mode: 0644]
src/hwinfo/src/isdn/cdb/ISDN.axp.txt [new file with mode: 0644]
src/hwinfo/src/isdn/cdb/ISDN.i386.txt [new file with mode: 0644]
src/hwinfo/src/isdn/cdb/ISDN.ppc.txt [new file with mode: 0644]
src/hwinfo/src/isdn/cdb/ISDN.x86_64.txt [new file with mode: 0644]
src/hwinfo/src/isdn/cdb/Makefile [new file with mode: 0644]
src/hwinfo/src/isdn/cdb/cdb_hwdb.h [new file with mode: 0644]
src/hwinfo/src/isdn/cdb/cdb_read.c [new file with mode: 0644]
src/hwinfo/src/isdn/cdb/cdb_read.h [new file with mode: 0644]
src/hwinfo/src/isdn/cdb/isdn_cdb.c [new file with mode: 0644]
src/hwinfo/src/isdn/cdb/isdn_cdb.lex [new file with mode: 0644]
src/hwinfo/src/isdn/cdb/isdn_cdb_def.h [new file with mode: 0644]
src/hwinfo/src/isdn/cdb/mk_isdnhwdb.c [new file with mode: 0644]
src/hwinfo/src/isdn/cdbisdn.c [new file with mode: 0644]
src/hwinfo/src/isdn/isa_probe.c [new file with mode: 0644]
src/hwinfo/src/isdn/libihw.txt [new file with mode: 0644]
src/hwinfo/src/smp/Makefile [new file with mode: 0644]
src/hwinfo/src/smp/README [new file with mode: 0644]
src/hwinfo/src/smp/smp.c [new file with mode: 0644]
src/hwinfo/src/x86emu/LICENSE [new file with mode: 0644]
src/hwinfo/src/x86emu/Makefile [new file with mode: 0644]
src/hwinfo/src/x86emu/debug.c [new file with mode: 0644]
src/hwinfo/src/x86emu/decode.c [new file with mode: 0644]
src/hwinfo/src/x86emu/fpu.c [new file with mode: 0644]
src/hwinfo/src/x86emu/include/x86emu.h [new file with mode: 0644]
src/hwinfo/src/x86emu/include/x86emu/fpu_regs.h [new file with mode: 0644]
src/hwinfo/src/x86emu/include/x86emu/regs.h [new file with mode: 0644]
src/hwinfo/src/x86emu/include/x86emu/types.h [new file with mode: 0644]
src/hwinfo/src/x86emu/ops.c [new file with mode: 0644]
src/hwinfo/src/x86emu/ops2.c [new file with mode: 0644]
src/hwinfo/src/x86emu/prim_ops.c [new file with mode: 0644]
src/hwinfo/src/x86emu/sys.c [new file with mode: 0644]
src/hwinfo/src/x86emu/validate.c [new file with mode: 0644]
src/hwinfo/src/x86emu/x86emu/debug.h [new file with mode: 0644]
src/hwinfo/src/x86emu/x86emu/decode.h [new file with mode: 0644]
src/hwinfo/src/x86emu/x86emu/fpu.h [new file with mode: 0644]
src/hwinfo/src/x86emu/x86emu/ops.h [new file with mode: 0644]
src/hwinfo/src/x86emu/x86emu/prim_asm.h [new file with mode: 0644]
src/hwinfo/src/x86emu/x86emu/prim_ops.h [new file with mode: 0644]
src/hwinfo/src/x86emu/x86emu/x86emui.h [new file with mode: 0644]

diff --git a/config/rootfiles/common/XML-Parser b/config/rootfiles/common/XML-Parser
new file mode 100644 (file)
index 0000000..3a41883
--- /dev/null
@@ -0,0 +1,44 @@
+#usr/lib/perl5/site_perl/5.8.8/i586-linux/XML
+#usr/lib/perl5/site_perl/5.8.8/i586-linux/XML/Parser
+#usr/lib/perl5/site_perl/5.8.8/i586-linux/XML/Parser.pm
+#usr/lib/perl5/site_perl/5.8.8/i586-linux/XML/Parser/Encodings
+#usr/lib/perl5/site_perl/5.8.8/i586-linux/XML/Parser/Encodings/Japanese_Encodings.msg
+#usr/lib/perl5/site_perl/5.8.8/i586-linux/XML/Parser/Encodings/README
+usr/lib/perl5/site_perl/5.8.8/i586-linux/XML/Parser/Encodings/big5.enc
+usr/lib/perl5/site_perl/5.8.8/i586-linux/XML/Parser/Encodings/euc-kr.enc
+usr/lib/perl5/site_perl/5.8.8/i586-linux/XML/Parser/Encodings/iso-8859-2.enc
+usr/lib/perl5/site_perl/5.8.8/i586-linux/XML/Parser/Encodings/iso-8859-3.enc
+usr/lib/perl5/site_perl/5.8.8/i586-linux/XML/Parser/Encodings/iso-8859-4.enc
+usr/lib/perl5/site_perl/5.8.8/i586-linux/XML/Parser/Encodings/iso-8859-5.enc
+usr/lib/perl5/site_perl/5.8.8/i586-linux/XML/Parser/Encodings/iso-8859-7.enc
+usr/lib/perl5/site_perl/5.8.8/i586-linux/XML/Parser/Encodings/iso-8859-8.enc
+usr/lib/perl5/site_perl/5.8.8/i586-linux/XML/Parser/Encodings/iso-8859-9.enc
+usr/lib/perl5/site_perl/5.8.8/i586-linux/XML/Parser/Encodings/windows-1250.enc
+usr/lib/perl5/site_perl/5.8.8/i586-linux/XML/Parser/Encodings/windows-1252.enc
+usr/lib/perl5/site_perl/5.8.8/i586-linux/XML/Parser/Encodings/x-euc-jp-jisx0221.enc
+usr/lib/perl5/site_perl/5.8.8/i586-linux/XML/Parser/Encodings/x-euc-jp-unicode.enc
+usr/lib/perl5/site_perl/5.8.8/i586-linux/XML/Parser/Encodings/x-sjis-cp932.enc
+usr/lib/perl5/site_perl/5.8.8/i586-linux/XML/Parser/Encodings/x-sjis-jdk117.enc
+usr/lib/perl5/site_perl/5.8.8/i586-linux/XML/Parser/Encodings/x-sjis-jisx0221.enc
+usr/lib/perl5/site_perl/5.8.8/i586-linux/XML/Parser/Encodings/x-sjis-unicode.enc
+usr/lib/perl5/site_perl/5.8.8/i586-linux/XML/Parser/Expat.pm
+usr/lib/perl5/site_perl/5.8.8/i586-linux/XML/Parser/LWPExternEnt.pl
+#usr/lib/perl5/site_perl/5.8.8/i586-linux/XML/Parser/Style
+usr/lib/perl5/site_perl/5.8.8/i586-linux/XML/Parser/Style/Debug.pm
+usr/lib/perl5/site_perl/5.8.8/i586-linux/XML/Parser/Style/Objects.pm
+usr/lib/perl5/site_perl/5.8.8/i586-linux/XML/Parser/Style/Stream.pm
+usr/lib/perl5/site_perl/5.8.8/i586-linux/XML/Parser/Style/Subs.pm
+usr/lib/perl5/site_perl/5.8.8/i586-linux/XML/Parser/Style/Tree.pm
+#usr/lib/perl5/site_perl/5.8.8/i586-linux/auto/XML
+#usr/lib/perl5/site_perl/5.8.8/i586-linux/auto/XML/Parser
+#usr/lib/perl5/site_perl/5.8.8/i586-linux/auto/XML/Parser/.packlist
+#usr/lib/perl5/site_perl/5.8.8/i586-linux/auto/XML/Parser/Expat
+usr/lib/perl5/site_perl/5.8.8/i586-linux/auto/XML/Parser/Expat/Expat.bs
+usr/lib/perl5/site_perl/5.8.8/i586-linux/auto/XML/Parser/Expat/Expat.so
+#usr/share/man/man3/XML::Parser.3
+#usr/share/man/man3/XML::Parser::Expat.3
+#usr/share/man/man3/XML::Parser::Style::Debug.3
+#usr/share/man/man3/XML::Parser::Style::Objects.3
+#usr/share/man/man3/XML::Parser::Style::Stream.3
+#usr/share/man/man3/XML::Parser::Style::Subs.3
+#usr/share/man/man3/XML::Parser::Style::Tree.3
diff --git a/config/rootfiles/common/dbus b/config/rootfiles/common/dbus
new file mode 100644 (file)
index 0000000..30250b7
--- /dev/null
@@ -0,0 +1,56 @@
+#etc/dbus-1
+#etc/dbus-1/session.conf
+#etc/dbus-1/system.conf
+#etc/dbus-1/system.d
+#usr/bin/dbus-binding-tool
+#usr/bin/dbus-cleanup-sockets
+#usr/bin/dbus-daemon
+#usr/bin/dbus-launch
+#usr/bin/dbus-monitor
+#usr/bin/dbus-send
+#usr/include/dbus-1.0
+#usr/include/dbus-1.0/dbus
+#usr/include/dbus-1.0/dbus/dbus-address.h
+#usr/include/dbus-1.0/dbus/dbus-bus.h
+#usr/include/dbus-1.0/dbus/dbus-connection.h
+#usr/include/dbus-1.0/dbus/dbus-errors.h
+#usr/include/dbus-1.0/dbus/dbus-glib-bindings.h
+#usr/include/dbus-1.0/dbus/dbus-glib-error-enum.h
+#usr/include/dbus-1.0/dbus/dbus-glib-lowlevel.h
+#usr/include/dbus-1.0/dbus/dbus-glib.h
+#usr/include/dbus-1.0/dbus/dbus-gtype-specialized.h
+#usr/include/dbus-1.0/dbus/dbus-macros.h
+#usr/include/dbus-1.0/dbus/dbus-memory.h
+#usr/include/dbus-1.0/dbus/dbus-message.h
+#usr/include/dbus-1.0/dbus/dbus-pending-call.h
+#usr/include/dbus-1.0/dbus/dbus-protocol.h
+#usr/include/dbus-1.0/dbus/dbus-server.h
+#usr/include/dbus-1.0/dbus/dbus-shared.h
+#usr/include/dbus-1.0/dbus/dbus-signature.h
+#usr/include/dbus-1.0/dbus/dbus-threads.h
+#usr/include/dbus-1.0/dbus/dbus-types.h
+#usr/include/dbus-1.0/dbus/dbus.h
+#usr/lib/dbus-1.0
+#usr/lib/dbus-1.0/include
+#usr/lib/dbus-1.0/include/dbus
+#usr/lib/dbus-1.0/include/dbus/dbus-arch-deps.h
+#usr/lib/libdbus-1.a
+#usr/lib/libdbus-1.la
+usr/lib/libdbus-1.so
+usr/lib/libdbus-1.so.2
+usr/lib/libdbus-1.so.2.0.0
+#usr/lib/libdbus-glib-1.a
+#usr/lib/libdbus-glib-1.la
+usr/lib/libdbus-glib-1.so
+usr/lib/libdbus-glib-1.so.2
+usr/lib/libdbus-glib-1.so.2.0.0
+#usr/lib/pkgconfig/dbus-1.pc
+#usr/lib/pkgconfig/dbus-glib-1.pc
+#usr/man/man1/dbus-cleanup-sockets.1
+#usr/man/man1/dbus-daemon.1
+#usr/man/man1/dbus-launch.1
+#usr/man/man1/dbus-monitor.1
+#usr/man/man1/dbus-send.1
+#usr/share/dbus-1
+#usr/share/dbus-1/services
+var/run/dbus
diff --git a/config/rootfiles/common/hal b/config/rootfiles/common/hal
new file mode 100644 (file)
index 0000000..f84519b
--- /dev/null
@@ -0,0 +1,162 @@
+#etc/dbus-1/system.d/hal.conf
+#etc/hal
+#etc/hal/fdi
+#etc/hal/fdi/information
+#etc/hal/fdi/policy
+#etc/hal/fdi/preprobe
+#etc/udev/rules.d/90-hal.rules
+#usr/bin/hal-device
+#usr/bin/hal-device-manager
+#usr/bin/hal-find-by-capability
+#usr/bin/hal-find-by-property
+#usr/bin/hal-get-property
+#usr/bin/hal-set-property
+#usr/bin/lshal
+#usr/include/hal
+#usr/include/hal/libhal-storage.h
+#usr/include/hal/libhal.h
+#usr/lib/hal
+#usr/lib/hal/hal-system-power-pmu
+#usr/lib/hal/hald-addon-acpi
+#usr/lib/hal/hald-addon-hid-ups
+#usr/lib/hal/hald-addon-keyboard
+#usr/lib/hal/hald-addon-pmu
+#usr/lib/hal/hald-addon-storage
+#usr/lib/hal/hald-addon-usb-csr
+#usr/lib/hal/hald-probe-hiddev
+#usr/lib/hal/hald-probe-input
+#usr/lib/hal/hald-probe-pc-floppy
+#usr/lib/hal/hald-probe-printer
+#usr/lib/hal/hald-probe-serial
+#usr/lib/hal/hald-probe-smbios
+#usr/lib/hal/hald-probe-storage
+#usr/lib/hal/hald-probe-volume
+#usr/lib/hal/hald-runner
+#usr/lib/libhal-storage.a
+#usr/lib/libhal-storage.la
+usr/lib/libhal-storage.so
+usr/lib/libhal-storage.so.1
+usr/lib/libhal-storage.so.1.0.0
+#usr/lib/libhal.a
+#usr/lib/libhal.la
+usr/lib/libhal.so
+usr/lib/libhal.so.1
+usr/lib/libhal.so.1.0.0
+#usr/lib/pkgconfig/hal-storage.pc
+#usr/lib/pkgconfig/hal.pc
+#usr/sbin/hald
+#usr/share/doc/hal-0.5.7.1
+#usr/share/doc/hal-0.5.7.1/conf
+#usr/share/doc/hal-0.5.7.1/conf/match-USB-camera.fdi
+#usr/share/doc/hal-0.5.7.1/conf/match-USB-mp3-player.fdi
+#usr/share/doc/hal-0.5.7.1/conf/match-cardreader.fdi
+#usr/share/doc/hal-0.5.7.1/conf/storage-non-fixed.fdi
+#usr/share/doc/hal-0.5.7.1/conf/storage-policy-examples.fdi
+#usr/share/doc/hal-0.5.7.1/conf/storage-skip-all.fdi
+#usr/share/hal
+#usr/share/hal/device-manager
+#usr/share/hal/device-manager/Const.py
+#usr/share/hal/device-manager/Const.pyc
+#usr/share/hal/device-manager/Const.pyo
+#usr/share/hal/device-manager/Device.py
+#usr/share/hal/device-manager/Device.pyc
+#usr/share/hal/device-manager/Device.pyo
+#usr/share/hal/device-manager/DeviceManager.py
+#usr/share/hal/device-manager/DeviceManager.pyc
+#usr/share/hal/device-manager/DeviceManager.pyo
+#usr/share/hal/device-manager/GtkAttributesFacade.py
+#usr/share/hal/device-manager/GtkAttributesFacade.pyc
+#usr/share/hal/device-manager/GtkAttributesFacade.pyo
+#usr/share/hal/device-manager/LibGladeApplication.py
+#usr/share/hal/device-manager/LibGladeApplication.pyc
+#usr/share/hal/device-manager/LibGladeApplication.pyo
+#usr/share/hal/device-manager/Representation.py
+#usr/share/hal/device-manager/Representation.pyc
+#usr/share/hal/device-manager/Representation.pyo
+#usr/share/hal/device-manager/fdo-logo.png
+#usr/share/hal/device-manager/hal-abstract.png
+#usr/share/hal/device-manager/hal-audio.png
+#usr/share/hal/device-manager/hal-bus-pci.png
+#usr/share/hal/device-manager/hal-bus-usb.png
+#usr/share/hal/device-manager/hal-camera.png
+#usr/share/hal/device-manager/hal-cat-cardbus.png
+#usr/share/hal/device-manager/hal-cat-keyboard.png
+#usr/share/hal/device-manager/hal-cat-mouse.png
+#usr/share/hal/device-manager/hal-cdrom.png
+#usr/share/hal/device-manager/hal-computer.png
+#usr/share/hal/device-manager/hal-device-manager.glade
+#usr/share/hal/device-manager/hal-flash.png
+#usr/share/hal/device-manager/hal-floppy.png
+#usr/share/hal/device-manager/hal-harddisk.png
+#usr/share/hal/device-manager/hal-network.png
+#usr/share/hal/device-manager/hal-serial-port.png
+#usr/share/hal/device-manager/hal-unknown.png
+#usr/share/hal/device-manager/hal-video.png
+#usr/share/hal/fdi
+#usr/share/hal/fdi/fdi.dtd
+#usr/share/hal/fdi/fdi.rng
+#usr/share/hal/fdi/information
+#usr/share/hal/fdi/information/10freedesktop
+#usr/share/hal/fdi/information/10freedesktop/10-camera-ptp.fdi
+#usr/share/hal/fdi/information/10freedesktop/10-cd-dvd-burner.fdi
+#usr/share/hal/fdi/information/10freedesktop/10-usb-card-readers.fdi
+#usr/share/hal/fdi/information/10freedesktop/10-usb-music-players.fdi
+#usr/share/hal/fdi/information/10freedesktop/10-usb-pda.fdi
+#usr/share/hal/fdi/information/10freedesktop/10-usb-zip-drives.fdi
+#usr/share/hal/fdi/information/10freedesktop/10-wireless-mice.fdi
+#usr/share/hal/fdi/information/20thirdparty
+#usr/share/hal/fdi/policy
+#usr/share/hal/fdi/policy/10osvendor
+#usr/share/hal/fdi/policy/10osvendor/10-keyboard-policy.fdi
+#usr/share/hal/fdi/policy/10osvendor/10-laptop-panel-mgmt-policy.fdi
+#usr/share/hal/fdi/policy/10osvendor/10-power-mgmt-policy.fdi
+#usr/share/hal/fdi/policy/10osvendor/15-storage-luks.fdi
+#usr/share/hal/fdi/policy/10osvendor/20-storage-methods.fdi
+#usr/share/hal/fdi/policy/20thirdparty
+#usr/share/hal/fdi/preprobe
+#usr/share/hal/fdi/preprobe/10osvendor
+#usr/share/hal/fdi/preprobe/10osvendor/10-ide-drives.fdi
+#usr/share/hal/fdi/preprobe/20thirdparty
+#usr/share/hal/scripts
+#usr/share/hal/scripts/hal-luks-remove
+#usr/share/hal/scripts/hal-luks-setup
+#usr/share/hal/scripts/hal-luks-teardown
+#usr/share/hal/scripts/hal-system-lcd-get-brightness
+#usr/share/hal/scripts/hal-system-lcd-set-brightness
+#usr/share/hal/scripts/hal-system-power-hibernate
+#usr/share/hal/scripts/hal-system-power-reboot
+#usr/share/hal/scripts/hal-system-power-set-power-save
+#usr/share/hal/scripts/hal-system-power-shutdown
+#usr/share/hal/scripts/hal-system-power-suspend
+#usr/share/hal/scripts/hal-system-storage-cleanup-mountpoint
+#usr/share/hal/scripts/hal-system-storage-cleanup-mountpoints
+#usr/share/hal/scripts/hal-system-storage-eject
+#usr/share/hal/scripts/hal-system-storage-mount
+#usr/share/hal/scripts/hal-system-storage-unmount
+#usr/share/locale/cs/LC_MESSAGES/hal.mo
+#usr/share/locale/da/LC_MESSAGES/hal.mo
+#usr/share/locale/de/LC_MESSAGES/hal.mo
+#usr/share/locale/el/LC_MESSAGES/hal.mo
+#usr/share/locale/es/LC_MESSAGES/hal.mo
+#usr/share/locale/eu/LC_MESSAGES/hal.mo
+#usr/share/locale/fi/LC_MESSAGES/hal.mo
+#usr/share/locale/fr/LC_MESSAGES/hal.mo
+#usr/share/locale/hu/LC_MESSAGES/hal.mo
+#usr/share/locale/it/LC_MESSAGES/hal.mo
+#usr/share/locale/ja/LC_MESSAGES/hal.mo
+#usr/share/locale/ko/LC_MESSAGES/hal.mo
+#usr/share/locale/lt/LC_MESSAGES/hal.mo
+#usr/share/locale/nb/LC_MESSAGES/hal.mo
+#usr/share/locale/nl/LC_MESSAGES/hal.mo
+#usr/share/locale/pa/LC_MESSAGES/hal.mo
+#usr/share/locale/pl/LC_MESSAGES/hal.mo
+#usr/share/locale/pt/LC_MESSAGES/hal.mo
+#usr/share/locale/pt_BR/LC_MESSAGES/hal.mo
+#usr/share/locale/ru/LC_MESSAGES/hal.mo
+#usr/share/locale/sl_SI
+#usr/share/locale/sl_SI/LC_MESSAGES
+#usr/share/locale/sl_SI/LC_MESSAGES/hal.mo
+#usr/share/locale/uk/LC_MESSAGES/hal.mo
+#usr/share/locale/zh_CN/LC_MESSAGES/hal.mo
+#usr/share/locale/zh_TW/LC_MESSAGES/hal.mo
+var/run/hald
index 7773620207017aac0a737c529e19449b23fc083c..b41dfc5c2d3e2287a744efc9e4e43c3767f33ea5 100644 (file)
@@ -1,6 +1,4 @@
-#etc/rc.d/init.d
 #etc/rc.d/init.d/kudzu
-#etc/sysconfig
 #etc/sysconfig/kudzu
 sbin/kudzu
 #usr/include/kudzu
@@ -33,19 +31,29 @@ usr/lib/libkudzu_loader.a
 #usr/lib/python2.4/site-packages/libxml2.pyc
 #usr/lib/python2.4/site-packages/snack.pyc
 usr/sbin/kudzu
+#usr/share/locale/ar
+#usr/share/locale/ar/LC_MESSAGES
 #usr/share/locale/ar/LC_MESSAGES/kudzu.mo
 #usr/share/locale/as
 #usr/share/locale/as/LC_MESSAGES
 #usr/share/locale/as/LC_MESSAGES/kudzu.mo
 #usr/share/locale/be/LC_MESSAGES/kudzu.mo
+#usr/share/locale/bg
+#usr/share/locale/bg/LC_MESSAGES
 #usr/share/locale/bg/LC_MESSAGES/kudzu.mo
+#usr/share/locale/bn
+#usr/share/locale/bn/LC_MESSAGES
 #usr/share/locale/bn/LC_MESSAGES/kudzu.mo
 #usr/share/locale/bn_IN
 #usr/share/locale/bn_IN/LC_MESSAGES
 #usr/share/locale/bn_IN/LC_MESSAGES/kudzu.mo
+#usr/share/locale/bs
+#usr/share/locale/bs/LC_MESSAGES
 #usr/share/locale/bs/LC_MESSAGES/kudzu.mo
 #usr/share/locale/ca/LC_MESSAGES/kudzu.mo
 #usr/share/locale/cs/LC_MESSAGES/kudzu.mo
+#usr/share/locale/cy
+#usr/share/locale/cy/LC_MESSAGES
 #usr/share/locale/cy/LC_MESSAGES/kudzu.mo
 #usr/share/locale/da/LC_MESSAGES/kudzu.mo
 #usr/share/locale/de/LC_MESSAGES/kudzu.mo
@@ -59,45 +67,82 @@ usr/sbin/kudzu
 #usr/share/locale/fi/LC_MESSAGES/kudzu.mo
 #usr/share/locale/fr/LC_MESSAGES/kudzu.mo
 #usr/share/locale/gl/LC_MESSAGES/kudzu.mo
+#usr/share/locale/gu
+#usr/share/locale/gu/LC_MESSAGES
 #usr/share/locale/gu/LC_MESSAGES/kudzu.mo
+#usr/share/locale/he
+#usr/share/locale/he/LC_MESSAGES
 #usr/share/locale/he/LC_MESSAGES/kudzu.mo
+#usr/share/locale/hi
+#usr/share/locale/hi/LC_MESSAGES
 #usr/share/locale/hi/LC_MESSAGES/kudzu.mo
 #usr/share/locale/hr/LC_MESSAGES/kudzu.mo
 #usr/share/locale/hu/LC_MESSAGES/kudzu.mo
 #usr/share/locale/hy
 #usr/share/locale/hy/LC_MESSAGES
 #usr/share/locale/hy/LC_MESSAGES/kudzu.mo
+#usr/share/locale/id
+#usr/share/locale/id/LC_MESSAGES
 #usr/share/locale/id/LC_MESSAGES/kudzu.mo
+#usr/share/locale/ilo
+#usr/share/locale/ilo/LC_MESSAGES
+#usr/share/locale/ilo/LC_MESSAGES/kudzu.mo
+#usr/share/locale/is
+#usr/share/locale/is/LC_MESSAGES
 #usr/share/locale/is/LC_MESSAGES/kudzu.mo
 #usr/share/locale/it/LC_MESSAGES/kudzu.mo
 #usr/share/locale/ja/LC_MESSAGES/kudzu.mo
+#usr/share/locale/ka
+#usr/share/locale/ka/LC_MESSAGES
 #usr/share/locale/ka/LC_MESSAGES/kudzu.mo
 #usr/share/locale/kn
 #usr/share/locale/kn/LC_MESSAGES
 #usr/share/locale/kn/LC_MESSAGES/kudzu.mo
 #usr/share/locale/ko/LC_MESSAGES/kudzu.mo
+#usr/share/locale/ku
+#usr/share/locale/ku/LC_MESSAGES
 #usr/share/locale/ku/LC_MESSAGES/kudzu.mo
 #usr/share/locale/lo
 #usr/share/locale/lo/LC_MESSAGES
 #usr/share/locale/lo/LC_MESSAGES/kudzu.mo
+#usr/share/locale/lt
+#usr/share/locale/lt/LC_MESSAGES
 #usr/share/locale/lt/LC_MESSAGES/kudzu.mo
+#usr/share/locale/lv
+#usr/share/locale/lv/LC_MESSAGES
 #usr/share/locale/lv/LC_MESSAGES/kudzu.mo
+#usr/share/locale/mk
+#usr/share/locale/mk/LC_MESSAGES
 #usr/share/locale/mk/LC_MESSAGES/kudzu.mo
+#usr/share/locale/ml
+#usr/share/locale/ml/LC_MESSAGES
 #usr/share/locale/ml/LC_MESSAGES/kudzu.mo
 #usr/share/locale/mr
 #usr/share/locale/mr/LC_MESSAGES
 #usr/share/locale/mr/LC_MESSAGES/kudzu.mo
+#usr/share/locale/ms
+#usr/share/locale/ms/LC_MESSAGES
 #usr/share/locale/ms/LC_MESSAGES/kudzu.mo
 #usr/share/locale/my
 #usr/share/locale/my/LC_MESSAGES
 #usr/share/locale/my/LC_MESSAGES/kudzu.mo
 #usr/share/locale/nb/LC_MESSAGES/kudzu.mo
 #usr/share/locale/nl/LC_MESSAGES/kudzu.mo
+#usr/share/locale/nn
+#usr/share/locale/nn/LC_MESSAGES
 #usr/share/locale/nn/LC_MESSAGES/kudzu.mo
+#usr/share/locale/no
+#usr/share/locale/no/LC_MESSAGES
 #usr/share/locale/no/LC_MESSAGES/kudzu.mo
+#usr/share/locale/or
+#usr/share/locale/or/LC_MESSAGES
 #usr/share/locale/or/LC_MESSAGES/kudzu.mo
+#usr/share/locale/pa
+#usr/share/locale/pa/LC_MESSAGES
 #usr/share/locale/pa/LC_MESSAGES/kudzu.mo
 #usr/share/locale/pl/LC_MESSAGES/kudzu.mo
+#usr/share/locale/pt
+#usr/share/locale/pt/LC_MESSAGES
 #usr/share/locale/pt/LC_MESSAGES/kudzu.mo
 #usr/share/locale/pt_BR/LC_MESSAGES/kudzu.mo
 #usr/share/locale/ro/LC_MESSAGES/kudzu.mo
@@ -107,18 +152,32 @@ usr/sbin/kudzu
 #usr/share/locale/si/LC_MESSAGES/kudzu.mo
 #usr/share/locale/sk/LC_MESSAGES/kudzu.mo
 #usr/share/locale/sl/LC_MESSAGES/kudzu.mo
+#usr/share/locale/sq
+#usr/share/locale/sq/LC_MESSAGES
 #usr/share/locale/sq/LC_MESSAGES/kudzu.mo
+#usr/share/locale/sr
+#usr/share/locale/sr/LC_MESSAGES
 #usr/share/locale/sr/LC_MESSAGES/kudzu.mo
+#usr/share/locale/sr@Latn
+#usr/share/locale/sr@Latn/LC_MESSAGES
 #usr/share/locale/sr@Latn/LC_MESSAGES/kudzu.mo
 #usr/share/locale/sv/LC_MESSAGES/kudzu.mo
+#usr/share/locale/ta
+#usr/share/locale/ta/LC_MESSAGES
 #usr/share/locale/ta/LC_MESSAGES/kudzu.mo
+#usr/share/locale/te
+#usr/share/locale/te/LC_MESSAGES
 #usr/share/locale/te/LC_MESSAGES/kudzu.mo
 #usr/share/locale/tr/LC_MESSAGES/kudzu.mo
 #usr/share/locale/uk/LC_MESSAGES/kudzu.mo
 #usr/share/locale/ur
 #usr/share/locale/ur/LC_MESSAGES
 #usr/share/locale/ur/LC_MESSAGES/kudzu.mo
+#usr/share/locale/vi
+#usr/share/locale/vi/LC_MESSAGES
 #usr/share/locale/vi/LC_MESSAGES/kudzu.mo
+#usr/share/locale/wa
+#usr/share/locale/wa/LC_MESSAGES
 #usr/share/locale/wa/LC_MESSAGES/kudzu.mo
 #usr/share/locale/zh_CN/LC_MESSAGES/kudzu.mo
 #usr/share/locale/zh_TW/LC_MESSAGES/kudzu.mo
index 473543b4b966e67ed084368839c076639072fe1a..ddad3075a6a296411c4b4b4971e594800846652d 100644 (file)
@@ -115,7 +115,7 @@ CONFIG_CAT=y
 # CONFIG_CATV is not set
 # CONFIG_CHGRP is not set
 CONFIG_CHMOD=y
-CONFIG_CHOWN=y
+# CONFIG_CHOWN is not set
 CONFIG_CHROOT=y
 # CONFIG_CKSUM is not set
 # CONFIG_CMP is not set
@@ -175,14 +175,14 @@ CONFIG_NICE=y
 # CONFIG_OD is not set
 # CONFIG_PRINTENV is not set
 # CONFIG_PRINTF is not set
-CONFIG_PWD=y
+# CONFIG_PWD is not set
 # CONFIG_REALPATH is not set
 CONFIG_RM=y
 # CONFIG_RMDIR is not set
 CONFIG_SEQ=y
 # CONFIG_SHA1SUM is not set
 CONFIG_SLEEP=y
-CONFIG_FEATURE_FANCY_SLEEP=y
+# CONFIG_FEATURE_FANCY_SLEEP is not set
 CONFIG_SORT=y
 CONFIG_FEATURE_SORT_BIG=y
 # CONFIG_STAT is not set
@@ -423,7 +423,7 @@ CONFIG_PIVOT_ROOT=y
 CONFIG_SWAPONOFF=y
 # CONFIG_SWITCH_ROOT is not set
 CONFIG_UMOUNT=y
-CONFIG_FEATURE_UMOUNT_ALL=y
+# CONFIG_FEATURE_UMOUNT_ALL is not set
 
 #
 # Common options for mount/umount
@@ -446,7 +446,7 @@ CONFIG_FEATURE_MOUNT_LOOP=y
 # CONFIG_DEVFSD_FG_NP is not set
 # CONFIG_DEVFSD_VERBOSE is not set
 # CONFIG_FEATURE_DEVFS is not set
-CONFIG_EJECT=y
+# CONFIG_EJECT is not set
 # CONFIG_LAST is not set
 CONFIG_LESS=y
 CONFIG_FEATURE_LESS_BRACKETS=y
@@ -522,10 +522,10 @@ CONFIG_FEATURE_IP_ADDRESS=y
 CONFIG_FEATURE_IP_LINK=y
 CONFIG_FEATURE_IP_ROUTE=y
 # CONFIG_FEATURE_IP_TUNNEL is not set
-CONFIG_FEATURE_IP_SHORT_FORMS=y
-CONFIG_IPADDR=y
-CONFIG_IPLINK=y
-CONFIG_IPROUTE=y
+# CONFIG_FEATURE_IP_SHORT_FORMS is not set
+# CONFIG_IPADDR is not set
+# CONFIG_IPLINK is not set
+# CONFIG_IPROUTE is not set
 # CONFIG_IPTUNNEL is not set
 # CONFIG_IPCALC is not set
 # CONFIG_FEATURE_IPCALC_FANCY is not set
@@ -568,7 +568,7 @@ CONFIG_WGET=y
 # CONFIG_FEATURE_WGET_STATUSBAR is not set
 CONFIG_FEATURE_WGET_AUTHENTICATION=y
 # CONFIG_FEATURE_WGET_IP6_LITERAL is not set
-CONFIG_FEATURE_WGET_LONG_OPTIONS=y
+# CONFIG_FEATURE_WGET_LONG_OPTIONS is not set
 # CONFIG_ZCIP is not set
 
 #
@@ -587,7 +587,7 @@ CONFIG_RENICE=y
 # CONFIG_BB_SYSCTL is not set
 CONFIG_TOP=y
 CONFIG_FEATURE_TOP_CPU_USAGE_PERCENTAGE=y
-CONFIG_UPTIME=y
+# CONFIG_UPTIME is not set
 
 #
 # Shells
@@ -624,7 +624,7 @@ CONFIG_ASH_EXPAND_PRMT=y
 # Bourne Shell Options
 #
 # CONFIG_FEATURE_SH_EXTRA_QUIET is not set
-CONFIG_FEATURE_SH_STANDALONE_SHELL=y
+# CONFIG_FEATURE_SH_STANDALONE_SHELL is not set
 CONFIG_FEATURE_COMMAND_EDITING=y
 # CONFIG_FEATURE_COMMAND_EDITING_VI is not set
 CONFIG_FEATURE_COMMAND_HISTORY=15
index 64d9e6678c236a1df8dc60240a9a6024f7eb33a3..eb1c19e476c365e55004f0c7a06efb144d0282e9 100644 (file)
@@ -1,3 +1,13 @@
+------------------------------------------------------------------------
+r442 | ms | 2007-03-05 14:15:21 +0100 (Mon, 05 Mar 2007) | 2 lines
+
+Neuer Kudzu...
+
+------------------------------------------------------------------------
+r441 | ms | 2007-03-05 13:56:05 +0100 (Mon, 05 Mar 2007) | 2 lines
+
+Build Fix...
+
 ------------------------------------------------------------------------
 r440 | ms | 2007-03-05 00:39:47 +0100 (Mon, 05 Mar 2007) | 2 lines
 
index 84cd5047d32893c29427e142e98cc3ffd6302acb..8f6e622c12d0ad49bb4c58f0a017bdbac46bd524 100644 (file)
@@ -28,6 +28,7 @@
 * Text-Tabs+Wrap-2005.0824
 * URI-1.35
 * Unix-Syslog-0.100
+* XML-Parser-2.34
 * amavisd-new-2.4.1
 * applejuice-0.30
 * arping-2.05
@@ -53,6 +54,7 @@
 * cyrus-imapd-2.2.12
 * cyrus-sasl-2.1.21
 * db-4.4.20
+* dbus-0.62
 * dhcp-3.0.4
 * dhcpcd-2.0.8
 * diffutils-2.8.1
 * groff-1.18.1.1
 * grub-0.97
 * gzip-1.3.5
+* hal-0.5.7.1
 * hddtemp-0.3-beta14
 * hdparm-6.6
 * htop-0.6.2
 * httpd-2.2.2
+* hwdata-0.191
 * iana-etc-2.10
 * ibod
 * iftop-0.17
 * java-1.5.0_06-for-ipfire
 * jpegsrc.v6b
 * kbd-1.12
-* kudzu-1.2.60
+* kudzu-1.2.64
 * l7-protocols-2006-09-10
 * lame-3.96.1
 * lcms-1.15
diff --git a/lfs/XML-Parser b/lfs/XML-Parser
new file mode 100644 (file)
index 0000000..fb98aca
--- /dev/null
@@ -0,0 +1,79 @@
+###############################################################################
+# This file is part of the IPCop Firewall.                                    #
+#                                                                             #
+# IPCop 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.                                         #
+#                                                                             #
+# IPCop 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 IPCop; if not, write to the Free Software                        #
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA    #
+#                                                                             #
+# Makefiles are based on LFSMake, which is                                    #
+# Copyright (C) 2002 Rod Roard <rod@sunsetsystems.com>                        #
+#                                                                             #
+###############################################################################
+
+###############################################################################
+# Definitions
+###############################################################################
+
+include Config
+
+VER        = 2.34
+
+THISAPP    = XML-Parser-$(VER)
+DL_FILE    = $(THISAPP).tar.gz
+DL_FROM    = $(URL_IPFIRE)
+DIR_APP    = $(DIR_SRC)/$(THISAPP)
+TARGET     = $(DIR_INFO)/$(THISAPP)
+
+###############################################################################
+# Top-level Rules
+###############################################################################
+
+objects = $(DL_FILE)
+
+$(DL_FILE) = $(DL_FROM)/$(DL_FILE)
+
+$(DL_FILE)_MD5 = 84d9e0001fe01c14867256c3fe115899
+
+install : $(TARGET)
+
+check : $(patsubst %,$(DIR_CHK)/%,$(objects))
+
+download :$(patsubst %,$(DIR_DL)/%,$(objects))
+
+md5 : $(subst %,%_MD5,$(objects))
+
+###############################################################################
+# Downloading, checking, md5sum
+###############################################################################
+
+$(patsubst %,$(DIR_CHK)/%,$(objects)) :
+       @$(CHECK)
+
+$(patsubst %,$(DIR_DL)/%,$(objects)) :
+       @$(LOAD)
+
+$(subst %,%_MD5,$(objects)) :
+       @$(MD5)
+
+###############################################################################
+# Installation Details
+###############################################################################
+
+$(TARGET) : $(patsubst %,$(DIR_DL)/%,$(objects))
+       @$(PREBUILD)
+       @rm -rf $(DIR_APP) && cd $(DIR_SRC) && tar zxf $(DIR_DL)/$(DL_FILE)
+       cd $(DIR_APP) && perl Makefile.PL
+       cd $(DIR_APP) && make
+       cd $(DIR_APP) && make install
+       @rm -rf $(DIR_APP)
+       @$(POSTBUILD)
diff --git a/lfs/dbus b/lfs/dbus
new file mode 100644 (file)
index 0000000..781febc
--- /dev/null
+++ b/lfs/dbus
@@ -0,0 +1,93 @@
+###############################################################################
+# This file is part of the IPCop Firewall.                                    #
+#                                                                             #
+# IPCop 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.                                         #
+#                                                                             #
+# IPCop 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 IPCop; if not, write to the Free Software                        #
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA    #
+#                                                                             #
+# Makefiles are based on LFSMake, which is                                    #
+# Copyright (C) 2002 Rod Roard <rod@sunsetsystems.com>                        #
+#                                                                             #
+###############################################################################
+
+###############################################################################
+# Definitions
+###############################################################################
+
+include Config
+
+VER        = 0.62
+
+THISAPP    = dbus-$(VER)
+DL_FILE    = dbus-$(VER).tar.gz
+DL_FROM    = $(URL_IPFIRE)
+DIR_APP    = $(DIR_SRC)/$(THISAPP)
+ifeq "$(LFS_PASS)" "install"
+  TARGET     = $(DIR_INFO)/$(THISAPP)-install
+else
+  TARGET     = $(DIR_INFO)/$(THISAPP)
+endif
+
+###############################################################################
+# Top-level Rules
+###############################################################################
+
+objects = $(DL_FILE)
+
+$(DL_FILE) = $(DL_FROM)/$(DL_FILE)
+
+$(DL_FILE)_MD5 = ba7692f63d0e9f1ef06703dff56cb650
+
+install : $(TARGET)
+
+check : $(patsubst %,$(DIR_CHK)/%,$(objects))
+
+download :$(patsubst %,$(DIR_DL)/%,$(objects))
+
+md5 : $(subst %,%_MD5,$(objects))
+
+###############################################################################
+# Downloading, checking, md5sum
+###############################################################################
+
+$(patsubst %,$(DIR_CHK)/%,$(objects)) :
+       @$(CHECK)
+
+$(patsubst %,$(DIR_DL)/%,$(objects)) :
+       @$(LOAD)
+
+$(subst %,%_MD5,$(objects)) :
+       @$(MD5)
+
+###############################################################################
+# Installation Details
+###############################################################################
+
+$(TARGET) : $(patsubst %,$(DIR_DL)/%,$(objects))
+       @$(PREBUILD)
+       @rm -rf $(DIR_APP) && cd $(DIR_SRC) && tar zxf $(DIR_DL)/$(DL_FILE)
+ifeq "$(LFS_PASS)" "install"
+       cd $(DIR_APP) && patch -N < $(DIR_SRC)/src/patches/kudzu-link-lintl.diff
+       cd $(DIR_APP) && make RPM_OPT_FLAGS="$CFLAGS -I/opt/$(MACHINE)-uClibc/include" \
+               ARCH=$(MACHINE)
+       cd $(DIR_APP) && install -m 0755 kudzu /install/initrd/bin/kudzu
+       cd $(DIR_APP) && install -m 0644 libkudzu.a /install/initrd/lib
+       cd $(DIR_APP) && install -m 0644 libkudzu_loader.a /install/initrd/lib
+else
+       cd $(DIR_APP) && ./configure --prefix=/usr --sysconfdir=/etc \
+            --localstatedir=/var --disable-python
+       cd $(DIR_APP) && make
+       cd $(DIR_APP) && make install
+endif
+       @rm -rf $(DIR_APP)
+       @$(POSTBUILD)
diff --git a/lfs/hal b/lfs/hal
new file mode 100644 (file)
index 0000000..2b4aef5
--- /dev/null
+++ b/lfs/hal
@@ -0,0 +1,94 @@
+###############################################################################
+# This file is part of the IPCop Firewall.                                    #
+#                                                                             #
+# IPCop 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.                                         #
+#                                                                             #
+# IPCop 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 IPCop; if not, write to the Free Software                        #
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA    #
+#                                                                             #
+# Makefiles are based on LFSMake, which is                                    #
+# Copyright (C) 2002 Rod Roard <rod@sunsetsystems.com>                        #
+#                                                                             #
+###############################################################################
+
+###############################################################################
+# Definitions
+###############################################################################
+
+include Config
+
+VER        = 0.5.7.1
+
+THISAPP    = hal-$(VER)
+DL_FILE    = hal-$(VER).tar.gz
+DL_FROM    = $(URL_IPFIRE)
+DIR_APP    = $(DIR_SRC)/$(THISAPP)
+ifeq "$(LFS_PASS)" "install"
+  TARGET     = $(DIR_INFO)/$(THISAPP)-install
+else
+  TARGET     = $(DIR_INFO)/$(THISAPP)
+endif
+
+###############################################################################
+# Top-level Rules
+###############################################################################
+
+objects = $(DL_FILE)
+
+$(DL_FILE) = $(DL_FROM)/$(DL_FILE)
+
+$(DL_FILE)_MD5 = d7a7741808ba130f8aff3f5d3b5689e4
+
+install : $(TARGET)
+
+check : $(patsubst %,$(DIR_CHK)/%,$(objects))
+
+download :$(patsubst %,$(DIR_DL)/%,$(objects))
+
+md5 : $(subst %,%_MD5,$(objects))
+
+###############################################################################
+# Downloading, checking, md5sum
+###############################################################################
+
+$(patsubst %,$(DIR_CHK)/%,$(objects)) :
+       @$(CHECK)
+
+$(patsubst %,$(DIR_DL)/%,$(objects)) :
+       @$(LOAD)
+
+$(subst %,%_MD5,$(objects)) :
+       @$(MD5)
+
+###############################################################################
+# Installation Details
+###############################################################################
+
+$(TARGET) : $(patsubst %,$(DIR_DL)/%,$(objects))
+       @$(PREBUILD)
+       @rm -rf $(DIR_APP) && cd $(DIR_SRC) && tar zxf $(DIR_DL)/$(DL_FILE)
+ifeq "$(LFS_PASS)" "install"
+       cd $(DIR_APP) && patch -N < $(DIR_SRC)/src/patches/kudzu-link-lintl.diff
+       cd $(DIR_APP) && make RPM_OPT_FLAGS="$CFLAGS -I/opt/$(MACHINE)-uClibc/include" \
+               ARCH=$(MACHINE)
+       cd $(DIR_APP) && install -m 0755 kudzu /install/initrd/bin/kudzu
+       cd $(DIR_APP) && install -m 0644 libkudzu.a /install/initrd/lib
+       cd $(DIR_APP) && install -m 0644 libkudzu_loader.a /install/initrd/lib
+else
+       cd $(DIR_APP) && ./configure --prefix=/usr --sysconfdir=/etc \
+                               --libexecdir=/usr/lib/hal --localstatedir=/var
+       cd $(DIR_APP) && make
+       cd $(DIR_APP) && make install
+       install -v -m755 -d /var/run/hald
+endif
+       @rm -rf $(DIR_APP)
+       @$(POSTBUILD)
diff --git a/lfs/hwdata b/lfs/hwdata
new file mode 100644 (file)
index 0000000..3d83e1f
--- /dev/null
@@ -0,0 +1,89 @@
+###############################################################################
+# This file is part of the IPCop Firewall.                                    #
+#                                                                             #
+# IPCop 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.                                         #
+#                                                                             #
+# IPCop 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 IPCop; if not, write to the Free Software                        #
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA    #
+#                                                                             #
+# Makefiles are based on LFSMake, which is                                    #
+# Copyright (C) 2002 Rod Roard <rod@sunsetsystems.com>                        #
+#                                                                             #
+###############################################################################
+
+###############################################################################
+# Definitions
+###############################################################################
+
+include Config
+
+VER        = 0.191
+
+THISAPP    = hwdata-$(VER)
+DL_FILE    = hwdata-$(VER).tar.gz
+DL_FROM    = $(URL_IPFIRE)
+DIR_APP    = $(DIR_SRC)/$(THISAPP)
+ifeq "$(LFS_PASS)" "install"
+  TARGET     = $(DIR_INFO)/$(THISAPP)-install
+else
+  TARGET     = $(DIR_INFO)/$(THISAPP)
+endif
+
+FILES = MonitorsDB pci.ids upgradelist usb.ids videodrivers
+
+###############################################################################
+# Top-level Rules
+###############################################################################
+
+objects = $(DL_FILE)
+
+$(DL_FILE) = $(DL_FROM)/$(DL_FILE)
+
+$(DL_FILE)_MD5 = 7a261b9eb813406f73b5eca2570f949a
+
+install : $(TARGET)
+
+check : $(patsubst %,$(DIR_CHK)/%,$(objects))
+
+download :$(patsubst %,$(DIR_DL)/%,$(objects))
+
+md5 : $(subst %,%_MD5,$(objects))
+
+###############################################################################
+# Downloading, checking, md5sum
+###############################################################################
+
+$(patsubst %,$(DIR_CHK)/%,$(objects)) :
+       @$(CHECK)
+
+$(patsubst %,$(DIR_DL)/%,$(objects)) :
+       @$(LOAD)
+
+$(subst %,%_MD5,$(objects)) :
+       @$(MD5)
+
+###############################################################################
+# Installation Details
+###############################################################################
+
+$(TARGET) : $(patsubst %,$(DIR_DL)/%,$(objects))
+       @$(PREBUILD)
+       @rm -rf $(DIR_APP) && cd $(DIR_SRC) && tar zxf $(DIR_DL)/$(DL_FILE)
+ifeq "$(LFS_PASS)" "install"
+       -mkdir -p -m 755 /install/initrd/usr/share/hwdata
+       cd $(DIR_APP) && for foo in $(FILES) ; do install -m 644 $$foo /install/initrd/usr/share/hwdata ; done
+else
+       -mkdir -p -m 755 /usr/share/hwdata
+       cd $(DIR_APP) && for foo in $(FILES) ; do install -m 644 $$foo /usr/share/hwdata ; done
+endif
+       @rm -rf $(DIR_APP)
+       @$(POSTBUILD)
diff --git a/lfs/hwinfo b/lfs/hwinfo
new file mode 100644 (file)
index 0000000..4f0f40f
--- /dev/null
@@ -0,0 +1,64 @@
+###############################################################################
+# This file is part of the IPCop Firewall.                                    #
+#                                                                             #
+# IPCop 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.                                         #
+#                                                                             #
+# IPCop 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 IPCop; if not, write to the Free Software                        #
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA    #
+#                                                                             #
+# Makefiles are based on LFSMake, which is                                    #
+# Copyright (C) 2002 Rod Roard <rod@sunsetsystems.com>                        #
+#                                                                             #
+###############################################################################
+
+###############################################################################
+# Definitions
+###############################################################################
+
+include Config
+
+VER        = 12.29
+
+THISAPP    = hwinfo-$(VER)
+DIR_APP    = $(DIR_SRC)/hwinfo
+ifeq "$(LFS_PASS)" "install"
+  TARGET     = $(DIR_INFO)/$(THISAPP)-install
+else
+  TARGET     = $(DIR_INFO)/$(THISAPP)
+endif
+
+###############################################################################
+# Top-level Rules
+###############################################################################
+
+install : $(TARGET)
+
+check :
+
+download :
+
+md5 :
+
+###############################################################################
+# Installation Details
+###############################################################################
+
+$(TARGET) :
+       @$(PREBUILD)
+       @rm -rf $(DIR_APP) && cp -av $(DIR_SRC)/src/hwinfo $(DIR_SRC)
+ifeq "$(LFS_PASS)" "install"
+else
+       cd $(DIR_APP) && make tinystatic
+       cd $(DIR_APP) && make tinystaticinstall
+endif
+       @rm -rf $(DIR_APP)
+       @$(POSTBUILD)
index cbe988d45834d7569bc11f5874c9b1496e4b7570..c57bac8d343ac9a58cd70c28dcb3597eb0edd212 100644 (file)
--- a/lfs/kudzu
+++ b/lfs/kudzu
@@ -29,7 +29,7 @@ include Config
 VER        = 1.2.64
 
 THISAPP    = kudzu-$(VER)
-DL_FILE    = kudzu-$(VER).tar.bz2
+DL_FILE    = kudzu-$(VER).tar.gz
 DL_FROM    = $(URL_IPFIRE)
 DIR_APP    = $(DIR_SRC)/$(THISAPP)
 ifeq "$(LFS_PASS)" "install"
@@ -75,10 +75,10 @@ $(subst %,%_MD5,$(objects)) :
 
 $(TARGET) : $(patsubst %,$(DIR_DL)/%,$(objects))
        @$(PREBUILD)
-       @rm -rf $(DIR_APP) && cd $(DIR_SRC) && tar jxf $(DIR_DL)/$(DL_FILE)
+       @rm -rf $(DIR_APP) && cd $(DIR_SRC) && tar zxf $(DIR_DL)/$(DL_FILE)
 ifeq "$(LFS_PASS)" "install"
        cd $(DIR_APP) && patch -N < $(DIR_SRC)/src/patches/kudzu-link-lintl.diff
-       cd $(DIR_APP) && make RPM_OPT_FLAGS="-Os -fomit-frame-pointer -I/opt/$(MACHINE)-uClibc/include" \
+       cd $(DIR_APP) && make RPM_OPT_FLAGS="$CFLAGS -I/opt/$(MACHINE)-uClibc/include" \
                ARCH=$(MACHINE)
        cd $(DIR_APP) && install -m 0755 kudzu /install/initrd/bin/kudzu
        cd $(DIR_APP) && install -m 0644 libkudzu.a /install/initrd/lib
index d833294ec6091e482497b982301c24a22b817c84..a8d418da7e20048691862c06886c37f9cfd3b23e 100644 (file)
@@ -32,13 +32,14 @@ THISAPP    = sysfsutils-$(VER)
 DL_FILE    = $(THISAPP).tar.gz
 DL_FROM    = $(URL_IPFIRE)
 DIR_APP    = $(DIR_SRC)/$(THISAPP)
-TARGET     = $(DIR_INFO)/$(THISAPP)
 
 ifeq "$(PASS)" "install"
+       TARGET = $(DIR_INFO)/$(THISAPP)-install
        EXTRA_CONFIG = --prefix="" --disable-shared
        EXTRA_MAKE =
        EXTRA_INSTALL = DESTDIR=/install
 else
+       TARGET = $(DIR_INFO)/$(THISAPP)
        EXTRA_CONFIG = --prefix=""
        EXTRA_MAKE =
        EXTRA_INSTALL =
diff --git a/make.sh b/make.sh
index 625cf425b8f23d0756b820dfbd1039baa0687943..a899f1a9d973fd60e559181ace1bca0bc719adcc 100644 (file)
--- a/make.sh
+++ b/make.sh
@@ -387,6 +387,7 @@ buildipfire() {
   ipfiremake dosfstools
   ipfiremake reiserfsprogs
   ipfiremake squashfstools
+  ipfiremake sysfsutils
   ipfiremake ntfs-3g
   ipfiremake ethtool
   ipfiremake ez-ipupdate
@@ -408,6 +409,8 @@ buildipfire() {
   ipfiremake l7-protocols
   ipfiremake isapnptools
 #  ipfiremake isdn4k-utils # What about mISDN???
+  ipfiremake hwdata
+  ipfiremake dbus
   ipfiremake kudzu
   ipfiremake logrotate
   ipfiremake logwatch
@@ -438,6 +441,9 @@ buildipfire() {
   ipfiremake Archive-Zip
   ipfiremake Text-Tabs+Wrap
   ipfiremake Locale-Country
+  ipfiremake XML-Parser
+  ipfiremake hal
+  ipfiremake hwinfo
   ipfiremake GeoIP
   ipfiremake fwhits
   ipfiremake noip_updater
@@ -555,6 +561,7 @@ buildinstaller() {
   installmake sysfsutils
   installmake util-linux
   installmake pciutils
+  installmake hwdata
   installmake kudzu
   installmake installer
   installmake initrd
diff --git a/src/hwinfo/COPYING b/src/hwinfo/COPYING
new file mode 100644 (file)
index 0000000..1609d96
--- /dev/null
@@ -0,0 +1,341 @@
+----------------------------------------------------------------------
+
+                   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.
diff --git a/src/hwinfo/ChangeLog b/src/hwinfo/ChangeLog
new file mode 100644 (file)
index 0000000..58c542d
--- /dev/null
@@ -0,0 +1,1956 @@
+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)
diff --git a/src/hwinfo/Makefile b/src/hwinfo/Makefile
new file mode 100644 (file)
index 0000000..72c7ffb
--- /dev/null
@@ -0,0 +1,95 @@
+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
+
diff --git a/src/hwinfo/Makefile.common b/src/hwinfo/Makefile.common
new file mode 100644 (file)
index 0000000..a4706e5
--- /dev/null
@@ -0,0 +1,66 @@
+# 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$(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
diff --git a/src/hwinfo/README b/src/hwinfo/README
new file mode 100644 (file)
index 0000000..2740fb5
--- /dev/null
@@ -0,0 +1,149 @@
+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.*"
+
diff --git a/src/hwinfo/VERSION b/src/hwinfo/VERSION
new file mode 100644 (file)
index 0000000..ea158a2
--- /dev/null
@@ -0,0 +1 @@
+10.16
diff --git a/src/hwinfo/doc/example1.c b/src/hwinfo/doc/example1.c
new file mode 100644 (file)
index 0000000..7de3e47
--- /dev/null
@@ -0,0 +1,26 @@
+#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;
+}
+
diff --git a/src/hwinfo/doc/example2.c b/src/hwinfo/doc/example2.c
new file mode 100644 (file)
index 0000000..cc2a9db
--- /dev/null
@@ -0,0 +1,26 @@
+#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;
+}
+
diff --git a/src/hwinfo/doc/footer.html b/src/hwinfo/doc/footer.html
new file mode 100644 (file)
index 0000000..62b274f
--- /dev/null
@@ -0,0 +1 @@
+</body></html>
diff --git a/src/hwinfo/doc/hwinfo.8 b/src/hwinfo/doc/hwinfo.8
new file mode 100644 (file)
index 0000000..03bca33
--- /dev/null
@@ -0,0 +1,92 @@
+.\" 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
diff --git a/src/hwinfo/doc/libhd.doc b/src/hwinfo/doc/libhd.doc
new file mode 100644 (file)
index 0000000..419a328
--- /dev/null
@@ -0,0 +1,109 @@
+/*! \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>
+
+*/
+
diff --git a/src/hwinfo/doc/libhd.doxy b/src/hwinfo/doc/libhd.doxy
new file mode 100644 (file)
index 0000000..30bc2fa
--- /dev/null
@@ -0,0 +1,898 @@
+# 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          = 
diff --git a/src/hwinfo/gen-hwcfg-disk.sh b/src/hwinfo/gen-hwcfg-disk.sh
new file mode 100755 (executable)
index 0000000..c13cda6
--- /dev/null
@@ -0,0 +1,50 @@
+#!/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
diff --git a/src/hwinfo/getsysinfo b/src/hwinfo/getsysinfo
new file mode 100755 (executable)
index 0000000..1081a6b
--- /dev/null
@@ -0,0 +1,77 @@
+#! /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"
+
diff --git a/src/hwinfo/hwbootscan b/src/hwinfo/hwbootscan
new file mode 100644 (file)
index 0000000..6bcfb25
--- /dev/null
@@ -0,0 +1,15 @@
+#!/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
diff --git a/src/hwinfo/hwbootscan.rc b/src/hwinfo/hwbootscan.rc
new file mode 100644 (file)
index 0000000..26484ea
--- /dev/null
@@ -0,0 +1,101 @@
+#! /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
+
diff --git a/src/hwinfo/hwinfo.c b/src/hwinfo/hwinfo.c
new file mode 100644 (file)
index 0000000..8b32957
--- /dev/null
@@ -0,0 +1,2103 @@
+#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");
+    }
+
+  }
+
+}
+
diff --git a/src/hwinfo/hwscan.c b/src/hwinfo/hwscan.c
new file mode 100644 (file)
index 0000000..75e9a79
--- /dev/null
@@ -0,0 +1,625 @@
+#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) */
diff --git a/src/hwinfo/hwscand.c b/src/hwinfo/hwscand.c
new file mode 100644 (file)
index 0000000..becc07d
--- /dev/null
@@ -0,0 +1,257 @@
+
+/* 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;
+}
diff --git a/src/hwinfo/hwscanqueue.c b/src/hwinfo/hwscanqueue.c
new file mode 100644 (file)
index 0000000..6af2fc5
--- /dev/null
@@ -0,0 +1,126 @@
+
+/* 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);
+}
+
diff --git a/src/hwinfo/init_message.h b/src/hwinfo/init_message.h
new file mode 100644 (file)
index 0000000..1e3243c
--- /dev/null
@@ -0,0 +1,17 @@
+#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
+
diff --git a/src/hwinfo/scripts/mci b/src/hwinfo/scripts/mci
new file mode 100755 (executable)
index 0000000..b6443ed
--- /dev/null
@@ -0,0 +1,113 @@
+#! /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;
+}
+
diff --git a/src/hwinfo/src/Makefile b/src/hwinfo/src/Makefile
new file mode 100644 (file)
index 0000000..b8e55a1
--- /dev/null
@@ -0,0 +1,38 @@
+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
diff --git a/src/hwinfo/src/hd/Makefile b/src/hwinfo/src/hd/Makefile
new file mode 100644 (file)
index 0000000..b4c62b0
--- /dev/null
@@ -0,0 +1,14 @@
+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) $?
diff --git a/src/hwinfo/src/hd/adb.c b/src/hwinfo/src/hd/adb.c
new file mode 100644 (file)
index 0000000..d71e45e
--- /dev/null
@@ -0,0 +1,78 @@
+#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__ */
diff --git a/src/hwinfo/src/hd/adb.h b/src/hwinfo/src/hd/adb.h
new file mode 100644 (file)
index 0000000..de68612
--- /dev/null
@@ -0,0 +1 @@
+void hd_scan_adb(hd_data_t *hd_data);
diff --git a/src/hwinfo/src/hd/bios.c b/src/hwinfo/src/hd/bios.c
new file mode 100644 (file)
index 0000000..fcdfabd
--- /dev/null
@@ -0,0 +1,1014 @@
+#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__) */
+
diff --git a/src/hwinfo/src/hd/bios.h b/src/hwinfo/src/hd/bios.h
new file mode 100644 (file)
index 0000000..cdb046f
--- /dev/null
@@ -0,0 +1,8 @@
+#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);
diff --git a/src/hwinfo/src/hd/block.c b/src/hwinfo/src/hd/block.c
new file mode 100644 (file)
index 0000000..2a8f400
--- /dev/null
@@ -0,0 +1,1578 @@
+#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, &sector, 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, &sector, 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, &sector, 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);
+}
+
+
diff --git a/src/hwinfo/src/hd/block.h b/src/hwinfo/src/hd/block.h
new file mode 100644 (file)
index 0000000..d3dad43
--- /dev/null
@@ -0,0 +1,2 @@
+void hd_scan_sysfs_block(hd_data_t *hd_data);
+void hd_scan_sysfs_scsi(hd_data_t *hd_data);
diff --git a/src/hwinfo/src/hd/braille.c b/src/hwinfo/src/hd/braille.c
new file mode 100644 (file)
index 0000000..5095c28
--- /dev/null
@@ -0,0 +1,455 @@
+#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__) */
+
diff --git a/src/hwinfo/src/hd/braille.h b/src/hwinfo/src/hd/braille.h
new file mode 100644 (file)
index 0000000..7c5496e
--- /dev/null
@@ -0,0 +1 @@
+void hd_scan_braille(hd_data_t *hd_data);
diff --git a/src/hwinfo/src/hd/cpu.c b/src/hwinfo/src/hd/cpu.c
new file mode 100644 (file)
index 0000000..e8f4fd8
--- /dev/null
@@ -0,0 +1,777 @@
+#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__ */
+
diff --git a/src/hwinfo/src/hd/cpu.h b/src/hwinfo/src/hd/cpu.h
new file mode 100644 (file)
index 0000000..1ff02fa
--- /dev/null
@@ -0,0 +1 @@
+void hd_scan_cpu(hd_data_t *hd_data);
diff --git a/src/hwinfo/src/hd/edd.c b/src/hwinfo/src/hd/edd.c
new file mode 100644 (file)
index 0000000..6a4c693
--- /dev/null
@@ -0,0 +1,242 @@
+#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;
+      }
+    }
+  }
+
+}
+
diff --git a/src/hwinfo/src/hd/edd.h b/src/hwinfo/src/hd/edd.h
new file mode 100644 (file)
index 0000000..c931ff8
--- /dev/null
@@ -0,0 +1 @@
+void hd_scan_sysfs_edd(hd_data_t *hd_data);
diff --git a/src/hwinfo/src/hd/fb.c b/src/hwinfo/src/hd/fb.c
new file mode 100644 (file)
index 0000000..62e3148
--- /dev/null
@@ -0,0 +1,136 @@
+#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;
+}
diff --git a/src/hwinfo/src/hd/fb.h b/src/hwinfo/src/hd/fb.h
new file mode 100644 (file)
index 0000000..08b77ab
--- /dev/null
@@ -0,0 +1 @@
+void hd_scan_fb(hd_data_t *hd_data);
diff --git a/src/hwinfo/src/hd/floppy.c b/src/hwinfo/src/hd/floppy.c
new file mode 100644 (file)
index 0000000..3c34feb
--- /dev/null
@@ -0,0 +1,162 @@
+#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");
+}
diff --git a/src/hwinfo/src/hd/floppy.h b/src/hwinfo/src/hd/floppy.h
new file mode 100644 (file)
index 0000000..c12815a
--- /dev/null
@@ -0,0 +1 @@
+void hd_scan_floppy(hd_data_t *hd_data);
diff --git a/src/hwinfo/src/hd/hd.c b/src/hwinfo/src/hd/hd.c
new file mode 100644 (file)
index 0000000..8db54e3
--- /dev/null
@@ -0,0 +1,5684 @@
+#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;
+}
+
+
diff --git a/src/hwinfo/src/hd/hd.h b/src/hwinfo/src/hd/hd.h
new file mode 100644 (file)
index 0000000..2e61cce
--- /dev/null
@@ -0,0 +1,2488 @@
+#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 */
diff --git a/src/hwinfo/src/hd/hd_int.h b/src/hwinfo/src/hd/hd_int.h
new file mode 100644 (file)
index 0000000..3695864
--- /dev/null
@@ -0,0 +1,236 @@
+#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
+
diff --git a/src/hwinfo/src/hd/hddb.c b/src/hwinfo/src/hd/hddb.c
new file mode 100644 (file)
index 0000000..691ecbe
--- /dev/null
@@ -0,0 +1,2748 @@
+#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] : "";
+}
+
diff --git a/src/hwinfo/src/hd/hddb.h b/src/hwinfo/src/hd/hddb.h
new file mode 100644 (file)
index 0000000..f8d8956
--- /dev/null
@@ -0,0 +1,7 @@
+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);
diff --git a/src/hwinfo/src/hd/hddb_int.h b/src/hwinfo/src/hd/hddb_int.h
new file mode 100644 (file)
index 0000000..2636b68
--- /dev/null
@@ -0,0 +1,55 @@
+/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ *
+ * 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"
+};
+
diff --git a/src/hwinfo/src/hd/hdp.c b/src/hwinfo/src/hd/hdp.c
new file mode 100644 (file)
index 0000000..65dffef
--- /dev/null
@@ -0,0 +1,1262 @@
+#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 */
+
diff --git a/src/hwinfo/src/hd/hdp.h b/src/hwinfo/src/hd/hdp.h
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/src/hwinfo/src/hd/ibm-notebooks.h b/src/hwinfo/src/hd/ibm-notebooks.h
new file mode 100644 (file)
index 0000000..b47d50c
--- /dev/null
@@ -0,0 +1,169 @@
+  { 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 },
diff --git a/src/hwinfo/src/hd/input.c b/src/hwinfo/src/hd/input.c
new file mode 100644 (file)
index 0000000..790d090
--- /dev/null
@@ -0,0 +1,267 @@
+#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;
+}
+
+
diff --git a/src/hwinfo/src/hd/input.h b/src/hwinfo/src/hd/input.h
new file mode 100644 (file)
index 0000000..1329c27
--- /dev/null
@@ -0,0 +1 @@
+void hd_scan_input(hd_data_t *hd_data);
diff --git a/src/hwinfo/src/hd/int.c b/src/hwinfo/src/hd/int.c
new file mode 100644 (file)
index 0000000..36d43cc
--- /dev/null
@@ -0,0 +1,1147 @@
+#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
+
+
diff --git a/src/hwinfo/src/hd/int.h b/src/hwinfo/src/hd/int.h
new file mode 100644 (file)
index 0000000..5ef4825
--- /dev/null
@@ -0,0 +1 @@
+void hd_scan_int(hd_data_t *hd_data);
diff --git a/src/hwinfo/src/hd/isa.c b/src/hwinfo/src/hd/isa.c
new file mode 100644 (file)
index 0000000..3b5d6d0
--- /dev/null
@@ -0,0 +1,114 @@
+#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__) */
+
diff --git a/src/hwinfo/src/hd/isa.h b/src/hwinfo/src/hd/isa.h
new file mode 100644 (file)
index 0000000..cda4c3c
--- /dev/null
@@ -0,0 +1,12 @@
+
+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);
diff --git a/src/hwinfo/src/hd/isapnp.c b/src/hwinfo/src/hd/isapnp.c
new file mode 100644 (file)
index 0000000..28fbdde
--- /dev/null
@@ -0,0 +1,438 @@
+#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__) */
+
diff --git a/src/hwinfo/src/hd/isapnp.h b/src/hwinfo/src/hd/isapnp.h
new file mode 100644 (file)
index 0000000..b593726
--- /dev/null
@@ -0,0 +1,57 @@
+/*
+ * 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);
+
diff --git a/src/hwinfo/src/hd/isdn.c b/src/hwinfo/src/hd/isdn.c
new file mode 100644 (file)
index 0000000..63ed839
--- /dev/null
@@ -0,0 +1,311 @@
+#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) */
+
diff --git a/src/hwinfo/src/hd/isdn.h b/src/hwinfo/src/hd/isdn.h
new file mode 100644 (file)
index 0000000..3e5cc42
--- /dev/null
@@ -0,0 +1,4 @@
+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);
diff --git a/src/hwinfo/src/hd/kbd.c b/src/hwinfo/src/hd/kbd.c
new file mode 100644 (file)
index 0000000..58384e7
--- /dev/null
@@ -0,0 +1,308 @@
+#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__ */
+
+
diff --git a/src/hwinfo/src/hd/kbd.h b/src/hwinfo/src/hd/kbd.h
new file mode 100644 (file)
index 0000000..8fe8447
--- /dev/null
@@ -0,0 +1 @@
+void hd_scan_kbd(hd_data_t *hd_data);
diff --git a/src/hwinfo/src/hd/klog.c b/src/hwinfo/src/hd/klog.c
new file mode 100644 (file)
index 0000000..4f7ec2f
--- /dev/null
@@ -0,0 +1,153 @@
+#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");
+}
diff --git a/src/hwinfo/src/hd/klog.h b/src/hwinfo/src/hd/klog.h
new file mode 100644 (file)
index 0000000..3119b10
--- /dev/null
@@ -0,0 +1,2 @@
+void read_klog(hd_data_t *hd_data);
+void dump_klog(hd_data_t *hd_data);
diff --git a/src/hwinfo/src/hd/manual.c b/src/hwinfo/src/hd/manual.c
new file mode 100644 (file)
index 0000000..c8b9afa
--- /dev/null
@@ -0,0 +1,1549 @@
+#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 */
+
diff --git a/src/hwinfo/src/hd/manual.h b/src/hwinfo/src/hd/manual.h
new file mode 100644 (file)
index 0000000..a08e642
--- /dev/null
@@ -0,0 +1,2 @@
+void hd_scan_manual(hd_data_t *hd_data);
+void hd_scan_manual2(hd_data_t *hd_data);
diff --git a/src/hwinfo/src/hd/memory.c b/src/hwinfo/src/hd/memory.c
new file mode 100644 (file)
index 0000000..d2f3948
--- /dev/null
@@ -0,0 +1,206 @@
+#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;
+}
+
+
diff --git a/src/hwinfo/src/hd/memory.h b/src/hwinfo/src/hd/memory.h
new file mode 100644 (file)
index 0000000..f76aa78
--- /dev/null
@@ -0,0 +1 @@
+void hd_scan_memory(hd_data_t *hd_data);
diff --git a/src/hwinfo/src/hd/misc.c b/src/hwinfo/src/hd/misc.c
new file mode 100644 (file)
index 0000000..1780ccd
--- /dev/null
@@ -0,0 +1,742 @@
+#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");
+}
diff --git a/src/hwinfo/src/hd/misc.h b/src/hwinfo/src/hd/misc.h
new file mode 100644 (file)
index 0000000..10b1ef0
--- /dev/null
@@ -0,0 +1,2 @@
+void hd_scan_misc(hd_data_t *hd_data);
+void hd_scan_misc2(hd_data_t *hd_data);
diff --git a/src/hwinfo/src/hd/modem.c b/src/hwinfo/src/hd/modem.c
new file mode 100644 (file)
index 0000000..e6f8aab
--- /dev/null
@@ -0,0 +1,1083 @@
+#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 */
diff --git a/src/hwinfo/src/hd/modem.h b/src/hwinfo/src/hd/modem.h
new file mode 100644 (file)
index 0000000..f19599d
--- /dev/null
@@ -0,0 +1 @@
+void hd_scan_modem(hd_data_t *hd_data);
diff --git a/src/hwinfo/src/hd/monitor.c b/src/hwinfo/src/hd/monitor.c
new file mode 100644 (file)
index 0000000..110d897
--- /dev/null
@@ -0,0 +1,600 @@
+#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;
+  }
+}
+
diff --git a/src/hwinfo/src/hd/monitor.h b/src/hwinfo/src/hd/monitor.h
new file mode 100644 (file)
index 0000000..a74a0bb
--- /dev/null
@@ -0,0 +1 @@
+void hd_scan_monitor(hd_data_t *hd_data);
diff --git a/src/hwinfo/src/hd/mouse.c b/src/hwinfo/src/hd/mouse.c
new file mode 100644 (file)
index 0000000..83a576b
--- /dev/null
@@ -0,0 +1,785 @@
+#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) */
diff --git a/src/hwinfo/src/hd/mouse.h b/src/hwinfo/src/hd/mouse.h
new file mode 100644 (file)
index 0000000..10a038a
--- /dev/null
@@ -0,0 +1 @@
+void hd_scan_mouse(hd_data_t *hd_data);
diff --git a/src/hwinfo/src/hd/net.c b/src/hwinfo/src/hd/net.c
new file mode 100644 (file)
index 0000000..955740f
--- /dev/null
@@ -0,0 +1,546 @@
+#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);
+      }
+    }
+  }
+}
+
+
diff --git a/src/hwinfo/src/hd/net.h b/src/hwinfo/src/hd/net.h
new file mode 100644 (file)
index 0000000..3e49379
--- /dev/null
@@ -0,0 +1 @@
+void hd_scan_net(hd_data_t *hd_data);
diff --git a/src/hwinfo/src/hd/parallel.c b/src/hwinfo/src/hd/parallel.c
new file mode 100644 (file)
index 0000000..d9b5b32
--- /dev/null
@@ -0,0 +1,295 @@
+#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 */
+
diff --git a/src/hwinfo/src/hd/parallel.h b/src/hwinfo/src/hd/parallel.h
new file mode 100644 (file)
index 0000000..7df1f51
--- /dev/null
@@ -0,0 +1 @@
+void hd_scan_parallel(hd_data_t *hd_data);
diff --git a/src/hwinfo/src/hd/pci.c b/src/hwinfo/src/hd/pci.c
new file mode 100644 (file)
index 0000000..0ee6a0b
--- /dev/null
@@ -0,0 +1,604 @@
+#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;
+}
+
+
diff --git a/src/hwinfo/src/hd/pci.h b/src/hwinfo/src/hd/pci.h
new file mode 100644 (file)
index 0000000..d1e475b
--- /dev/null
@@ -0,0 +1 @@
+void hd_scan_sysfs_pci(hd_data_t *hd_data);
diff --git a/src/hwinfo/src/hd/pcmcia.c b/src/hwinfo/src/hd/pcmcia.c
new file mode 100644 (file)
index 0000000..1bda468
--- /dev/null
@@ -0,0 +1,272 @@
+#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);
+}
+
diff --git a/src/hwinfo/src/hd/pcmcia.h b/src/hwinfo/src/hd/pcmcia.h
new file mode 100644 (file)
index 0000000..ddf7b57
--- /dev/null
@@ -0,0 +1 @@
+void hd_scan_pcmcia(hd_data_t *hd_data);
diff --git a/src/hwinfo/src/hd/pppoe.c b/src/hwinfo/src/hd/pppoe.c
new file mode 100644 (file)
index 0000000..da1864c
--- /dev/null
@@ -0,0 +1,611 @@
+
+/*
+ *  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]
+      );
+    }
+  }
+}
diff --git a/src/hwinfo/src/hd/pppoe.h b/src/hwinfo/src/hd/pppoe.h
new file mode 100644 (file)
index 0000000..859e99f
--- /dev/null
@@ -0,0 +1 @@
+void hd_scan_pppoe(hd_data_t *hd_data);
diff --git a/src/hwinfo/src/hd/prom.c b/src/hwinfo/src/hd/prom.c
new file mode 100644 (file)
index 0000000..0a2a28f
--- /dev/null
@@ -0,0 +1,694 @@
+#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__) */
+
diff --git a/src/hwinfo/src/hd/prom.h b/src/hwinfo/src/hd/prom.h
new file mode 100644 (file)
index 0000000..8f8505e
--- /dev/null
@@ -0,0 +1 @@
+void hd_scan_prom(hd_data_t *hd_data);
diff --git a/src/hwinfo/src/hd/s390.c b/src/hwinfo/src/hd/s390.c
new file mode 100644 (file)
index 0000000..942564b
--- /dev/null
@@ -0,0 +1,246 @@
+#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
+
diff --git a/src/hwinfo/src/hd/s390.h b/src/hwinfo/src/hd/s390.h
new file mode 100644 (file)
index 0000000..9ab4124
--- /dev/null
@@ -0,0 +1,5 @@
+/** 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);
+
diff --git a/src/hwinfo/src/hd/sbus.c b/src/hwinfo/src/hd/sbus.c
new file mode 100644 (file)
index 0000000..3122442
--- /dev/null
@@ -0,0 +1,691 @@
+#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
diff --git a/src/hwinfo/src/hd/sbus.h b/src/hwinfo/src/hd/sbus.h
new file mode 100644 (file)
index 0000000..de8564f
--- /dev/null
@@ -0,0 +1 @@
+void hd_scan_sbus (hd_data_t *hd_data);
diff --git a/src/hwinfo/src/hd/serial.c b/src/hwinfo/src/hd/serial.c
new file mode 100644 (file)
index 0000000..d43d9fa
--- /dev/null
@@ -0,0 +1,239 @@
+#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");
+}
+
diff --git a/src/hwinfo/src/hd/serial.h b/src/hwinfo/src/hd/serial.h
new file mode 100644 (file)
index 0000000..1b59242
--- /dev/null
@@ -0,0 +1 @@
+void hd_scan_serial(hd_data_t *hd_data);
diff --git a/src/hwinfo/src/hd/smbios.c b/src/hwinfo/src/hd/smbios.c
new file mode 100644 (file)
index 0000000..7271507
--- /dev/null
@@ -0,0 +1,1662 @@
+#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;
+    }
+  }
+}
+
diff --git a/src/hwinfo/src/hd/smbios.h b/src/hwinfo/src/hd/smbios.h
new file mode 100644 (file)
index 0000000..79d3392
--- /dev/null
@@ -0,0 +1,4 @@
+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);
diff --git a/src/hwinfo/src/hd/sys.c b/src/hwinfo/src/hd/sys.c
new file mode 100644 (file)
index 0000000..ad5f506
--- /dev/null
@@ -0,0 +1,260 @@
+#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__ */
+
diff --git a/src/hwinfo/src/hd/sys.h b/src/hwinfo/src/hd/sys.h
new file mode 100644 (file)
index 0000000..fca3f69
--- /dev/null
@@ -0,0 +1 @@
+void hd_scan_sys(hd_data_t *hd_data);
diff --git a/src/hwinfo/src/hd/usb.c b/src/hwinfo/src/hd/usb.c
new file mode 100644 (file)
index 0000000..11a48e9
--- /dev/null
@@ -0,0 +1,780 @@
+#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);
+}
+
+
diff --git a/src/hwinfo/src/hd/usb.h b/src/hwinfo/src/hd/usb.h
new file mode 100644 (file)
index 0000000..9d35423
--- /dev/null
@@ -0,0 +1 @@
+void hd_scan_sysfs_usb(hd_data_t *hd_data);
diff --git a/src/hwinfo/src/hd/version.h b/src/hwinfo/src/hd/version.h
new file mode 100644 (file)
index 0000000..99c9034
--- /dev/null
@@ -0,0 +1 @@
+#define HD_VERSION_STRING "10.16"
diff --git a/src/hwinfo/src/hd/veth.c b/src/hwinfo/src/hd/veth.c
new file mode 100644 (file)
index 0000000..facef77
--- /dev/null
@@ -0,0 +1,63 @@
+#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__ */
diff --git a/src/hwinfo/src/hd/veth.h b/src/hwinfo/src/hd/veth.h
new file mode 100644 (file)
index 0000000..8928941
--- /dev/null
@@ -0,0 +1 @@
+void hd_scan_veth(hd_data_t *hd_data);
diff --git a/src/hwinfo/src/hd/wlan.c b/src/hwinfo/src/hd/wlan.c
new file mode 100644 (file)
index 0000000..d327c8d
--- /dev/null
@@ -0,0 +1,1041 @@
+#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(&param, 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, &param, 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(&param, 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, &param, 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) */
+
diff --git a/src/hwinfo/src/hd/wlan.h b/src/hwinfo/src/hd/wlan.h
new file mode 100644 (file)
index 0000000..6608a30
--- /dev/null
@@ -0,0 +1 @@
+void hd_scan_wlan(hd_data_t *hd_data);
diff --git a/src/hwinfo/src/ids/Makefile b/src/hwinfo/src/ids/Makefile
new file mode 100644 (file)
index 0000000..53b8b37
--- /dev/null
@@ -0,0 +1,63 @@
+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
+
diff --git a/src/hwinfo/src/ids/cdb_x11 b/src/hwinfo/src/ids/cdb_x11
new file mode 100755 (executable)
index 0000000..9be446c
--- /dev/null
@@ -0,0 +1,349 @@
+#!/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;
+}
+
diff --git a/src/hwinfo/src/ids/check_hd.c b/src/hwinfo/src/ids/check_hd.c
new file mode 100644 (file)
index 0000000..eedbe4a
--- /dev/null
@@ -0,0 +1,2859 @@
+#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);
+}
+
+
diff --git a/src/hwinfo/src/ids/convert_hd b/src/hwinfo/src/ids/convert_hd
new file mode 100755 (executable)
index 0000000..a76f353
--- /dev/null
@@ -0,0 +1,2931 @@
+#! /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;
+}
+
diff --git a/src/hwinfo/src/ids/get_adaptec b/src/hwinfo/src/ids/get_adaptec
new file mode 100755 (executable)
index 0000000..3de5336
--- /dev/null
@@ -0,0 +1,142 @@
+#! /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;
+
+}
+
diff --git a/src/hwinfo/src/ids/get_pcmcia b/src/hwinfo/src/ids/get_pcmcia
new file mode 100755 (executable)
index 0000000..27a09bd
--- /dev/null
@@ -0,0 +1,62 @@
+#! /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";
+}
+
diff --git a/src/hwinfo/src/ids/hd_ids.c b/src/hwinfo/src/ids/hd_ids.c
new file mode 100644 (file)
index 0000000..345d5d6
--- /dev/null
@@ -0,0 +1,8 @@
+#include <stdio.h>
+#include "hd.h"
+
+#ifndef LIBHD_TINY
+#include "hd_ids.h"
+#else
+#include "hd_ids_tiny.h"
+#endif
diff --git a/src/hwinfo/src/ids/src/braille b/src/hwinfo/src/ids/src/braille
new file mode 100644 (file)
index 0000000..451b784
--- /dev/null
@@ -0,0 +1,141 @@
+# 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
+
diff --git a/src/hwinfo/src/ids/src/bus b/src/hwinfo/src/ids/src/bus
new file mode 100644 (file)
index 0000000..06b63bc
--- /dev/null
@@ -0,0 +1,77 @@
+# 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
diff --git a/src/hwinfo/src/ids/src/camera b/src/hwinfo/src/ids/src/camera
new file mode 100644 (file)
index 0000000..17b48e5
--- /dev/null
@@ -0,0 +1,846 @@
+# 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
+
diff --git a/src/hwinfo/src/ids/src/chipcard b/src/hwinfo/src/ids/src/chipcard
new file mode 100644 (file)
index 0000000..4e41455
--- /dev/null
@@ -0,0 +1,21 @@
+# 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
+
diff --git a/src/hwinfo/src/ids/src/class b/src/hwinfo/src/ids/src/class
new file mode 100644 (file)
index 0000000..8ac04f4
--- /dev/null
@@ -0,0 +1,960 @@
+# 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
+
diff --git a/src/hwinfo/src/ids/src/dvb b/src/hwinfo/src/ids/src/dvb
new file mode 100644 (file)
index 0000000..7a40f03
--- /dev/null
@@ -0,0 +1,192 @@
+# 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
+
+
diff --git a/src/hwinfo/src/ids/src/extra b/src/hwinfo/src/ids/src/extra
new file mode 100644 (file)
index 0000000..323beb7
--- /dev/null
@@ -0,0 +1,304 @@
+# 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
+
diff --git a/src/hwinfo/src/ids/src/isapnp b/src/hwinfo/src/ids/src/isapnp
new file mode 100644 (file)
index 0000000..87926f0
--- /dev/null
@@ -0,0 +1,545 @@
+ 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
+
diff --git a/src/hwinfo/src/ids/src/modem b/src/hwinfo/src/ids/src/modem
new file mode 100644 (file)
index 0000000..95df289
--- /dev/null
@@ -0,0 +1,17 @@
+ 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
+
diff --git a/src/hwinfo/src/ids/src/modem.i386 b/src/hwinfo/src/ids/src/modem.i386
new file mode 100644 (file)
index 0000000..f45fe14
--- /dev/null
@@ -0,0 +1,143 @@
+# 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
diff --git a/src/hwinfo/src/ids/src/monitor b/src/hwinfo/src/ids/src/monitor
new file mode 100644 (file)
index 0000000..5d443b2
--- /dev/null
@@ -0,0 +1,5378 @@
+# 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
+
diff --git a/src/hwinfo/src/ids/src/mouse b/src/hwinfo/src/ids/src/mouse
new file mode 100644 (file)
index 0000000..6e82a0e
--- /dev/null
@@ -0,0 +1,137 @@
+# 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
+
diff --git a/src/hwinfo/src/ids/src/network b/src/hwinfo/src/ids/src/network
new file mode 100644 (file)
index 0000000..71e644e
--- /dev/null
@@ -0,0 +1,1330 @@
+# 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
+
diff --git a/src/hwinfo/src/ids/src/pci b/src/hwinfo/src/ids/src/pci
new file mode 100644 (file)
index 0000000..4cd40d7
--- /dev/null
@@ -0,0 +1,43466 @@
+ 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
+
diff --git a/src/hwinfo/src/ids/src/pcmcia b/src/hwinfo/src/ids/src/pcmcia
new file mode 100644 (file)
index 0000000..4cc45b6
--- /dev/null
@@ -0,0 +1,346 @@
+ 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
+
diff --git a/src/hwinfo/src/ids/src/ppc b/src/hwinfo/src/ids/src/ppc
new file mode 100644 (file)
index 0000000..1499c58
--- /dev/null
@@ -0,0 +1,23 @@
+# 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
+
diff --git a/src/hwinfo/src/ids/src/s390 b/src/hwinfo/src/ids/src/s390
new file mode 100644 (file)
index 0000000..dc9cf1c
--- /dev/null
@@ -0,0 +1,274 @@
+# 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
diff --git a/src/hwinfo/src/ids/src/scanner b/src/hwinfo/src/ids/src/scanner
new file mode 100644 (file)
index 0000000..38fc5df
--- /dev/null
@@ -0,0 +1,775 @@
+# 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
+
diff --git a/src/hwinfo/src/ids/src/sound b/src/hwinfo/src/ids/src/sound
new file mode 100644 (file)
index 0000000..f28c396
--- /dev/null
@@ -0,0 +1,389 @@
+# 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
+
diff --git a/src/hwinfo/src/ids/src/special b/src/hwinfo/src/ids/src/special
new file mode 100644 (file)
index 0000000..3090c50
--- /dev/null
@@ -0,0 +1,683 @@
+# 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
+
diff --git a/src/hwinfo/src/ids/src/storage b/src/hwinfo/src/ids/src/storage
new file mode 100644 (file)
index 0000000..173c922
--- /dev/null
@@ -0,0 +1,696 @@
+# 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
diff --git a/src/hwinfo/src/ids/src/tv b/src/hwinfo/src/ids/src/tv
new file mode 100644 (file)
index 0000000..c0adb62
--- /dev/null
@@ -0,0 +1,435 @@
+# 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
+
diff --git a/src/hwinfo/src/ids/src/usb b/src/hwinfo/src/ids/src/usb
new file mode 100644 (file)
index 0000000..5b94262
--- /dev/null
@@ -0,0 +1,6824 @@
+# 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
+
diff --git a/src/hwinfo/src/ids/src/usb2 b/src/hwinfo/src/ids/src/usb2
new file mode 100644 (file)
index 0000000..adbcf0e
--- /dev/null
@@ -0,0 +1,1427 @@
+# 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
+
diff --git a/src/hwinfo/src/ids/src/x11.amd64 b/src/hwinfo/src/ids/src/x11.amd64
new file mode 100644 (file)
index 0000000..30bb3e8
--- /dev/null
@@ -0,0 +1,3355 @@
+ 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
+
diff --git a/src/hwinfo/src/ids/src/x11.axp b/src/hwinfo/src/ids/src/x11.axp
new file mode 100644 (file)
index 0000000..ef79c31
--- /dev/null
@@ -0,0 +1,841 @@
+ 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
+
diff --git a/src/hwinfo/src/ids/src/x11.i386 b/src/hwinfo/src/ids/src/x11.i386
new file mode 100644 (file)
index 0000000..30bb3e8
--- /dev/null
@@ -0,0 +1,3355 @@
+ 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
+
diff --git a/src/hwinfo/src/ids/src/x11.ia64 b/src/hwinfo/src/ids/src/x11.ia64
new file mode 100644 (file)
index 0000000..27c7861
--- /dev/null
@@ -0,0 +1,2514 @@
+ 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
+
diff --git a/src/hwinfo/src/ids/src/x11.ppc b/src/hwinfo/src/ids/src/x11.ppc
new file mode 100644 (file)
index 0000000..0dc17c4
--- /dev/null
@@ -0,0 +1,1464 @@
+ 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
+
diff --git a/src/hwinfo/src/ids/src/x11.ppc.special b/src/hwinfo/src/ids/src/x11.ppc.special
new file mode 100644 (file)
index 0000000..d9112c5
--- /dev/null
@@ -0,0 +1,14 @@
+# 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
+
diff --git a/src/hwinfo/src/ids/src/x11.sparc b/src/hwinfo/src/ids/src/x11.sparc
new file mode 100644 (file)
index 0000000..0ea811c
--- /dev/null
@@ -0,0 +1,323 @@
+ 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
+
diff --git a/src/hwinfo/src/ids/update_x11 b/src/hwinfo/src/ids/update_x11
new file mode 100755 (executable)
index 0000000..a3c4243
--- /dev/null
@@ -0,0 +1,23 @@
+#! /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";
diff --git a/src/hwinfo/src/int10/AsmMacros.h b/src/hwinfo/src/int10/AsmMacros.h
new file mode 100644 (file)
index 0000000..68f9558
--- /dev/null
@@ -0,0 +1,458 @@
+/* $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__ */
diff --git a/src/hwinfo/src/int10/Makefile b/src/hwinfo/src/int10/Makefile
new file mode 100644 (file)
index 0000000..bcba090
--- /dev/null
@@ -0,0 +1,7 @@
+TOPDIR = ../..
+TARGETS        = $(LIBHD_D)
+
+include $(TOPDIR)/Makefile.common
+
+$(LIBHD_D): $(OBJS)
+       ar r $(LIBHD) $?
diff --git a/src/hwinfo/src/int10/README b/src/hwinfo/src/int10/README
new file mode 100644 (file)
index 0000000..4b7d0fa
--- /dev/null
@@ -0,0 +1,35 @@
+
+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>
+
+
+
diff --git a/src/hwinfo/src/int10/emu_vm86.c b/src/hwinfo/src/int10/emu_vm86.c
new file mode 100644 (file)
index 0000000..654cff8
--- /dev/null
@@ -0,0 +1,214 @@
+#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);
+}
+
diff --git a/src/hwinfo/src/int10/i10_int.c b/src/hwinfo/src/int10/i10_int.c
new file mode 100644 (file)
index 0000000..99a009d
--- /dev/null
@@ -0,0 +1,195 @@
+/*
+ * 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;
+       }
+}
diff --git a/src/hwinfo/src/int10/i10_io.c b/src/hwinfo/src/int10/i10_io.c
new file mode 100644 (file)
index 0000000..717356f
--- /dev/null
@@ -0,0 +1,108 @@
+/*
+ * 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);
+}
diff --git a/src/hwinfo/src/int10/i10_pci.c b/src/hwinfo/src/int10/i10_pci.c
new file mode 100644 (file)
index 0000000..387cebb
--- /dev/null
@@ -0,0 +1,866 @@
+/*
+ * 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;
+}
diff --git a/src/hwinfo/src/int10/i10_v86.c b/src/hwinfo/src/int10/i10_v86.c
new file mode 100644 (file)
index 0000000..8fcdef1
--- /dev/null
@@ -0,0 +1,515 @@
+/*
+ * 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,&regs)))
+               if (!(val = run_bios_int(num,&regs)))
+                       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)
+  );
+}
+
diff --git a/src/hwinfo/src/int10/i10_vbios.c b/src/hwinfo/src/int10/i10_vbios.c
new file mode 100644 (file)
index 0000000..c952199
--- /dev/null
@@ -0,0 +1,511 @@
+/*
+ * 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;
+}
+
diff --git a/src/hwinfo/src/int10/int10.c b/src/hwinfo/src/int10/int10.c
new file mode 100644 (file)
index 0000000..04c1507
--- /dev/null
@@ -0,0 +1,299 @@
+#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);
+}
+
diff --git a/src/hwinfo/src/int10/pci.h b/src/hwinfo/src/int10/pci.h
new file mode 100644 (file)
index 0000000..840f9d4
--- /dev/null
@@ -0,0 +1,127 @@
+/*
+ * 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
diff --git a/src/hwinfo/src/int10/v86bios.h b/src/hwinfo/src/int10/v86bios.h
new file mode 100644 (file)
index 0000000..c0c8acc
--- /dev/null
@@ -0,0 +1,215 @@
+/*
+ * 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
+
diff --git a/src/hwinfo/src/int10/vbios.h b/src/hwinfo/src/int10/vbios.h
new file mode 100644 (file)
index 0000000..edcb715
--- /dev/null
@@ -0,0 +1,6 @@
+#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);
diff --git a/src/hwinfo/src/int10/vm86_struct.h b/src/hwinfo/src/int10/vm86_struct.h
new file mode 100644 (file)
index 0000000..772e6ca
--- /dev/null
@@ -0,0 +1,135 @@
+#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
diff --git a/src/hwinfo/src/isdn/Makefile b/src/hwinfo/src/isdn/Makefile
new file mode 100644 (file)
index 0000000..5e52e6b
--- /dev/null
@@ -0,0 +1,9 @@
+TOPDIR = ../..
+TARGETS        = $(LIBHD_D)
+SUBDIRS = cdb
+
+include $(TOPDIR)/Makefile.common
+
+$(LIBHD_D): $(OBJS)
+       ar r $(LIBHD) $?
+
diff --git a/src/hwinfo/src/isdn/cdb/ISDN.axp.txt b/src/hwinfo/src/isdn/cdb/ISDN.axp.txt
new file mode 100644 (file)
index 0000000..4a66c7f
--- /dev/null
@@ -0,0 +1,150 @@
+#
+# 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|
diff --git a/src/hwinfo/src/isdn/cdb/ISDN.i386.txt b/src/hwinfo/src/isdn/cdb/ISDN.i386.txt
new file mode 100644 (file)
index 0000000..bae7d09
--- /dev/null
@@ -0,0 +1,181 @@
+#
+# 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|
diff --git a/src/hwinfo/src/isdn/cdb/ISDN.ppc.txt b/src/hwinfo/src/isdn/cdb/ISDN.ppc.txt
new file mode 100644 (file)
index 0000000..d4acd85
--- /dev/null
@@ -0,0 +1,37 @@
+#
+# 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|
diff --git a/src/hwinfo/src/isdn/cdb/ISDN.x86_64.txt b/src/hwinfo/src/isdn/cdb/ISDN.x86_64.txt
new file mode 100644 (file)
index 0000000..71dab3d
--- /dev/null
@@ -0,0 +1,106 @@
+#
+# 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|
diff --git a/src/hwinfo/src/isdn/cdb/Makefile b/src/hwinfo/src/isdn/cdb/Makefile
new file mode 100644 (file)
index 0000000..43cba1f
--- /dev/null
@@ -0,0 +1,33 @@
+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
diff --git a/src/hwinfo/src/isdn/cdb/cdb_hwdb.h b/src/hwinfo/src/isdn/cdb/cdb_hwdb.h
new file mode 100644 (file)
index 0000000..935e243
--- /dev/null
@@ -0,0 +1,16 @@
+#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
+
diff --git a/src/hwinfo/src/isdn/cdb/cdb_read.c b/src/hwinfo/src/isdn/cdb/cdb_read.c
new file mode 100644 (file)
index 0000000..92147e1
--- /dev/null
@@ -0,0 +1,517 @@
+#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;
+       }
+}
+
diff --git a/src/hwinfo/src/isdn/cdb/cdb_read.h b/src/hwinfo/src/isdn/cdb/cdb_read.h
new file mode 100644 (file)
index 0000000..3eb01e6
--- /dev/null
@@ -0,0 +1,50 @@
+#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);
diff --git a/src/hwinfo/src/isdn/cdb/isdn_cdb.c b/src/hwinfo/src/isdn/cdb/isdn_cdb.c
new file mode 100644 (file)
index 0000000..3404075
--- /dev/null
@@ -0,0 +1,244 @@
+#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);
+}
diff --git a/src/hwinfo/src/isdn/cdb/isdn_cdb.lex b/src/hwinfo/src/isdn/cdb/isdn_cdb.lex
new file mode 100644 (file)
index 0000000..15f1653
--- /dev/null
@@ -0,0 +1,64 @@
+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);
+}
diff --git a/src/hwinfo/src/isdn/cdb/isdn_cdb_def.h b/src/hwinfo/src/isdn/cdb/isdn_cdb_def.h
new file mode 100644 (file)
index 0000000..10da231
--- /dev/null
@@ -0,0 +1,39 @@
+#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 */
diff --git a/src/hwinfo/src/isdn/cdb/mk_isdnhwdb.c b/src/hwinfo/src/isdn/cdb/mk_isdnhwdb.c
new file mode 100644 (file)
index 0000000..d5dc95e
--- /dev/null
@@ -0,0 +1,293 @@
+#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);
+}
diff --git a/src/hwinfo/src/isdn/cdbisdn.c b/src/hwinfo/src/isdn/cdbisdn.c
new file mode 100644 (file)
index 0000000..f793eb4
--- /dev/null
@@ -0,0 +1,400 @@
+#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);
+}
diff --git a/src/hwinfo/src/isdn/isa_probe.c b/src/hwinfo/src/isdn/isa_probe.c
new file mode 100644 (file)
index 0000000..14f7575
--- /dev/null
@@ -0,0 +1,238 @@
+#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 */
diff --git a/src/hwinfo/src/isdn/libihw.txt b/src/hwinfo/src/isdn/libihw.txt
new file mode 100644 (file)
index 0000000..a384036
--- /dev/null
@@ -0,0 +1,61 @@
+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
diff --git a/src/hwinfo/src/smp/Makefile b/src/hwinfo/src/smp/Makefile
new file mode 100644 (file)
index 0000000..bcba090
--- /dev/null
@@ -0,0 +1,7 @@
+TOPDIR = ../..
+TARGETS        = $(LIBHD_D)
+
+include $(TOPDIR)/Makefile.common
+
+$(LIBHD_D): $(OBJS)
+       ar r $(LIBHD) $?
diff --git a/src/hwinfo/src/smp/README b/src/hwinfo/src/smp/README
new file mode 100644 (file)
index 0000000..7ccf29e
--- /dev/null
@@ -0,0 +1,14 @@
+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
diff --git a/src/hwinfo/src/smp/smp.c b/src/hwinfo/src/smp/smp.c
new file mode 100644 (file)
index 0000000..4ccfc76
--- /dev/null
@@ -0,0 +1,286 @@
+/*
+[_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__ */
diff --git a/src/hwinfo/src/x86emu/LICENSE b/src/hwinfo/src/x86emu/LICENSE
new file mode 100644 (file)
index 0000000..a3ede4a
--- /dev/null
@@ -0,0 +1,17 @@
+                         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.
+
diff --git a/src/hwinfo/src/x86emu/Makefile b/src/hwinfo/src/x86emu/Makefile
new file mode 100644 (file)
index 0000000..362c414
--- /dev/null
@@ -0,0 +1,86 @@
+#############################################################################
+#
+#                                              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..
diff --git a/src/hwinfo/src/x86emu/debug.c b/src/hwinfo/src/x86emu/debug.c
new file mode 100644 (file)
index 0000000..ed8f2f0
--- /dev/null
@@ -0,0 +1,431 @@
+/****************************************************************************
+*
+*                                              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");
+}
diff --git a/src/hwinfo/src/x86emu/decode.c b/src/hwinfo/src/x86emu/decode.c
new file mode 100644 (file)
index 0000000..5edaf15
--- /dev/null
@@ -0,0 +1,1108 @@
+/****************************************************************************
+*
+*                                              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 */
+}
diff --git a/src/hwinfo/src/x86emu/fpu.c b/src/hwinfo/src/x86emu/fpu.c
new file mode 100644 (file)
index 0000000..4b801dc
--- /dev/null
@@ -0,0 +1,966 @@
+/****************************************************************************
+*
+*                                              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();
+}
diff --git a/src/hwinfo/src/x86emu/include/x86emu.h b/src/hwinfo/src/x86emu/include/x86emu.h
new file mode 100644 (file)
index 0000000..fd8ecff
--- /dev/null
@@ -0,0 +1,199 @@
+/****************************************************************************
+*
+*                                              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 */
diff --git a/src/hwinfo/src/x86emu/include/x86emu/fpu_regs.h b/src/hwinfo/src/x86emu/include/x86emu/fpu_regs.h
new file mode 100644 (file)
index 0000000..a62b493
--- /dev/null
@@ -0,0 +1,120 @@
+/****************************************************************************
+*
+*                                              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 */
diff --git a/src/hwinfo/src/x86emu/include/x86emu/regs.h b/src/hwinfo/src/x86emu/include/x86emu/regs.h
new file mode 100644 (file)
index 0000000..5d224ce
--- /dev/null
@@ -0,0 +1,338 @@
+/****************************************************************************
+*
+*                                              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 */
diff --git a/src/hwinfo/src/x86emu/include/x86emu/types.h b/src/hwinfo/src/x86emu/include/x86emu/types.h
new file mode 100644 (file)
index 0000000..f31d77f
--- /dev/null
@@ -0,0 +1,107 @@
+/****************************************************************************
+*
+*                                              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 */
diff --git a/src/hwinfo/src/x86emu/ops.c b/src/hwinfo/src/x86emu/ops.c
new file mode 100644 (file)
index 0000000..6fc936b
--- /dev/null
@@ -0,0 +1,11699 @@
+/****************************************************************************
+*
+*                                              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,
+};
diff --git a/src/hwinfo/src/x86emu/ops2.c b/src/hwinfo/src/x86emu/ops2.c
new file mode 100644 (file)
index 0000000..7cb585b
--- /dev/null
@@ -0,0 +1,2805 @@
+/****************************************************************************
+*
+*                                              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,
+};
diff --git a/src/hwinfo/src/x86emu/prim_ops.c b/src/hwinfo/src/x86emu/prim_ops.c
new file mode 100644 (file)
index 0000000..56ab8cc
--- /dev/null
@@ -0,0 +1,2654 @@
+/****************************************************************************
+*
+*                                              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;
+}
+
diff --git a/src/hwinfo/src/x86emu/sys.c b/src/hwinfo/src/x86emu/sys.c
new file mode 100644 (file)
index 0000000..cf13517
--- /dev/null
@@ -0,0 +1,666 @@
+/****************************************************************************
+*
+*                                              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;
+}
diff --git a/src/hwinfo/src/x86emu/validate.c b/src/hwinfo/src/x86emu/validate.c
new file mode 100644 (file)
index 0000000..239f6c1
--- /dev/null
@@ -0,0 +1,765 @@
+/****************************************************************************
+*
+*                                              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;
+}
diff --git a/src/hwinfo/src/x86emu/x86emu/debug.h b/src/hwinfo/src/x86emu/x86emu/debug.h
new file mode 100644 (file)
index 0000000..8abedf6
--- /dev/null
@@ -0,0 +1,211 @@
+/****************************************************************************
+*
+*                                              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 */
diff --git a/src/hwinfo/src/x86emu/x86emu/decode.h b/src/hwinfo/src/x86emu/x86emu/decode.h
new file mode 100644 (file)
index 0000000..bb2bc0b
--- /dev/null
@@ -0,0 +1,89 @@
+/****************************************************************************
+*
+*                                              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 */
diff --git a/src/hwinfo/src/x86emu/x86emu/fpu.h b/src/hwinfo/src/x86emu/x86emu/fpu.h
new file mode 100644 (file)
index 0000000..5fb2714
--- /dev/null
@@ -0,0 +1,61 @@
+/****************************************************************************
+*
+*                                              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 */
diff --git a/src/hwinfo/src/x86emu/x86emu/ops.h b/src/hwinfo/src/x86emu/x86emu/ops.h
new file mode 100644 (file)
index 0000000..65ea676
--- /dev/null
@@ -0,0 +1,45 @@
+/****************************************************************************
+*
+*                                              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 */
diff --git a/src/hwinfo/src/x86emu/x86emu/prim_asm.h b/src/hwinfo/src/x86emu/x86emu/prim_asm.h
new file mode 100644 (file)
index 0000000..041255f
--- /dev/null
@@ -0,0 +1,971 @@
+/****************************************************************************
+*
+*                                              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 */
diff --git a/src/hwinfo/src/x86emu/x86emu/prim_ops.h b/src/hwinfo/src/x86emu/x86emu/prim_ops.h
new file mode 100644 (file)
index 0000000..21ab145
--- /dev/null
@@ -0,0 +1,143 @@
+/****************************************************************************
+*
+*                                              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 */
diff --git a/src/hwinfo/src/x86emu/x86emu/x86emui.h b/src/hwinfo/src/x86emu/x86emu/x86emui.h
new file mode 100644 (file)
index 0000000..3adf61e
--- /dev/null
@@ -0,0 +1,105 @@
+/****************************************************************************
+*
+*                                              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 */