From a6316ce423a6d559ea026061b689591e8f5872ed Mon Sep 17 00:00:00 2001 From: ms Date: Mon, 30 Oct 2006 20:23:28 +0000 Subject: [PATCH] Zwischencommit Installer... git-svn-id: http://svn.ipfire.org/svn/ipfire/trunk@333 ea5c0bd1-69bd-2848-81d8-4f18e57aeed8 --- lfs/boot.img | 4 +- lfs/driver.img | 26 +- lfs/initrd | 39 +- lfs/installer | 8 +- lfs/newt | 8 +- lfs/pciutils | 2 +- lfs/pcmciautils | 23 +- lfs/scsi.img | 24 +- lfs/slang | 15 +- lfs/util-linux | 15 + make.sh | 14 +- src/hwinfo/COPYING | 341 + src/hwinfo/ChangeLog | 1956 + src/hwinfo/Makefile | 95 + src/hwinfo/Makefile.common | 66 + src/hwinfo/README | 149 + src/hwinfo/VERSION | 1 + src/hwinfo/doc/example1.c | 26 + src/hwinfo/doc/example2.c | 26 + src/hwinfo/doc/footer.html | 1 + src/hwinfo/doc/hwinfo.8 | 92 + src/hwinfo/doc/libhd.doc | 109 + src/hwinfo/doc/libhd.doxy | 898 + src/hwinfo/gen-hwcfg-disk.sh | 50 + src/hwinfo/getsysinfo | 77 + src/hwinfo/hwbootscan | 15 + src/hwinfo/hwbootscan.rc | 101 + src/hwinfo/hwinfo.c | 2103 + src/hwinfo/hwscan.c | 625 + src/hwinfo/hwscand.c | 257 + src/hwinfo/hwscanqueue.c | 126 + src/hwinfo/init_message.h | 17 + src/hwinfo/scripts/mci | 113 + src/hwinfo/src/Makefile | 38 + src/hwinfo/src/hd/Makefile | 14 + src/hwinfo/src/hd/adb.c | 78 + src/hwinfo/src/hd/adb.h | 1 + src/hwinfo/src/hd/bios.c | 1014 + src/hwinfo/src/hd/bios.h | 8 + src/hwinfo/src/hd/block.c | 1578 + src/hwinfo/src/hd/block.h | 2 + src/hwinfo/src/hd/braille.c | 455 + src/hwinfo/src/hd/braille.h | 1 + src/hwinfo/src/hd/cpu.c | 777 + src/hwinfo/src/hd/cpu.h | 1 + src/hwinfo/src/hd/edd.c | 242 + src/hwinfo/src/hd/edd.h | 1 + src/hwinfo/src/hd/fb.c | 136 + src/hwinfo/src/hd/fb.h | 1 + src/hwinfo/src/hd/floppy.c | 162 + src/hwinfo/src/hd/floppy.h | 1 + src/hwinfo/src/hd/hd.c | 5684 ++ src/hwinfo/src/hd/hd.h | 2488 + src/hwinfo/src/hd/hd_int.h | 236 + src/hwinfo/src/hd/hddb.c | 2748 + src/hwinfo/src/hd/hddb.h | 7 + src/hwinfo/src/hd/hddb_int.h | 55 + src/hwinfo/src/hd/hdp.c | 1262 + src/hwinfo/src/hd/hdp.h | 0 src/hwinfo/src/hd/ibm-notebooks.h | 169 + src/hwinfo/src/hd/input.c | 267 + src/hwinfo/src/hd/input.h | 1 + src/hwinfo/src/hd/int.c | 1147 + src/hwinfo/src/hd/int.h | 1 + src/hwinfo/src/hd/isa.c | 114 + src/hwinfo/src/hd/isa.h | 12 + src/hwinfo/src/hd/isapnp.c | 438 + src/hwinfo/src/hd/isapnp.h | 57 + src/hwinfo/src/hd/isdn.c | 311 + src/hwinfo/src/hd/isdn.h | 4 + src/hwinfo/src/hd/kbd.c | 308 + src/hwinfo/src/hd/kbd.h | 1 + src/hwinfo/src/hd/klog.c | 153 + src/hwinfo/src/hd/klog.h | 2 + src/hwinfo/src/hd/manual.c | 1549 + src/hwinfo/src/hd/manual.h | 2 + src/hwinfo/src/hd/memory.c | 206 + src/hwinfo/src/hd/memory.h | 1 + src/hwinfo/src/hd/misc.c | 742 + src/hwinfo/src/hd/misc.h | 2 + src/hwinfo/src/hd/modem.c | 1083 + src/hwinfo/src/hd/modem.h | 1 + src/hwinfo/src/hd/monitor.c | 600 + src/hwinfo/src/hd/monitor.h | 1 + src/hwinfo/src/hd/mouse.c | 785 + src/hwinfo/src/hd/mouse.h | 1 + src/hwinfo/src/hd/net.c | 546 + src/hwinfo/src/hd/net.h | 1 + src/hwinfo/src/hd/parallel.c | 295 + src/hwinfo/src/hd/parallel.h | 1 + src/hwinfo/src/hd/pci.c | 604 + src/hwinfo/src/hd/pci.h | 1 + src/hwinfo/src/hd/pcmcia.c | 272 + src/hwinfo/src/hd/pcmcia.h | 1 + src/hwinfo/src/hd/pppoe.c | 611 + src/hwinfo/src/hd/pppoe.h | 1 + src/hwinfo/src/hd/prom.c | 694 + src/hwinfo/src/hd/prom.h | 1 + src/hwinfo/src/hd/s390.c | 246 + src/hwinfo/src/hd/s390.h | 5 + src/hwinfo/src/hd/sbus.c | 691 + src/hwinfo/src/hd/sbus.h | 1 + src/hwinfo/src/hd/serial.c | 239 + src/hwinfo/src/hd/serial.h | 1 + src/hwinfo/src/hd/smbios.c | 1662 + src/hwinfo/src/hd/smbios.h | 4 + src/hwinfo/src/hd/sys.c | 260 + src/hwinfo/src/hd/sys.h | 1 + src/hwinfo/src/hd/usb.c | 780 + src/hwinfo/src/hd/usb.h | 1 + src/hwinfo/src/hd/version.h | 1 + src/hwinfo/src/hd/veth.c | 63 + src/hwinfo/src/hd/veth.h | 1 + src/hwinfo/src/hd/wlan.c | 1041 + src/hwinfo/src/hd/wlan.h | 1 + src/hwinfo/src/ids/Makefile | 63 + src/hwinfo/src/ids/cdb_x11 | 349 + src/hwinfo/src/ids/check_hd.c | 2859 + src/hwinfo/src/ids/convert_hd | 2931 ++ src/hwinfo/src/ids/get_adaptec | 142 + src/hwinfo/src/ids/get_pcmcia | 62 + src/hwinfo/src/ids/hd_ids.c | 8 + src/hwinfo/src/ids/src/braille | 141 + src/hwinfo/src/ids/src/bus | 77 + src/hwinfo/src/ids/src/camera | 846 + src/hwinfo/src/ids/src/chipcard | 21 + src/hwinfo/src/ids/src/class | 960 + src/hwinfo/src/ids/src/dvb | 192 + src/hwinfo/src/ids/src/extra | 304 + src/hwinfo/src/ids/src/isapnp | 545 + src/hwinfo/src/ids/src/modem | 17 + src/hwinfo/src/ids/src/modem.i386 | 143 + src/hwinfo/src/ids/src/monitor | 5378 ++ src/hwinfo/src/ids/src/mouse | 137 + src/hwinfo/src/ids/src/network | 1330 + src/hwinfo/src/ids/src/pci | 43466 ++++++++++++++++ src/hwinfo/src/ids/src/pcmcia | 346 + src/hwinfo/src/ids/src/ppc | 23 + src/hwinfo/src/ids/src/s390 | 274 + src/hwinfo/src/ids/src/scanner | 775 + src/hwinfo/src/ids/src/sound | 389 + src/hwinfo/src/ids/src/special | 683 + src/hwinfo/src/ids/src/storage | 696 + src/hwinfo/src/ids/src/tv | 435 + src/hwinfo/src/ids/src/usb | 6824 +++ src/hwinfo/src/ids/src/usb2 | 1427 + src/hwinfo/src/ids/src/x11.amd64 | 3355 ++ src/hwinfo/src/ids/src/x11.axp | 841 + src/hwinfo/src/ids/src/x11.i386 | 3355 ++ src/hwinfo/src/ids/src/x11.ia64 | 2514 + src/hwinfo/src/ids/src/x11.ppc | 1464 + src/hwinfo/src/ids/src/x11.ppc.special | 14 + src/hwinfo/src/ids/src/x11.sparc | 323 + src/hwinfo/src/ids/update_x11 | 23 + src/hwinfo/src/int10/AsmMacros.h | 458 + src/hwinfo/src/int10/Makefile | 7 + src/hwinfo/src/int10/README | 35 + src/hwinfo/src/int10/emu_vm86.c | 214 + src/hwinfo/src/int10/i10_int.c | 195 + src/hwinfo/src/int10/i10_io.c | 108 + src/hwinfo/src/int10/i10_pci.c | 866 + src/hwinfo/src/int10/i10_v86.c | 515 + src/hwinfo/src/int10/i10_vbios.c | 511 + src/hwinfo/src/int10/int10.c | 299 + src/hwinfo/src/int10/pci.h | 127 + src/hwinfo/src/int10/v86bios.h | 215 + src/hwinfo/src/int10/vbios.h | 6 + src/hwinfo/src/int10/vm86_struct.h | 135 + src/hwinfo/src/isdn/Makefile | 9 + src/hwinfo/src/isdn/cdb/ISDN.axp.txt | 150 + src/hwinfo/src/isdn/cdb/ISDN.i386.txt | 181 + src/hwinfo/src/isdn/cdb/ISDN.ppc.txt | 37 + src/hwinfo/src/isdn/cdb/ISDN.x86_64.txt | 106 + src/hwinfo/src/isdn/cdb/Makefile | 33 + src/hwinfo/src/isdn/cdb/cdb_hwdb.h | 16 + src/hwinfo/src/isdn/cdb/cdb_read.c | 517 + src/hwinfo/src/isdn/cdb/cdb_read.h | 50 + src/hwinfo/src/isdn/cdb/isdn_cdb.c | 244 + src/hwinfo/src/isdn/cdb/isdn_cdb.lex | 64 + src/hwinfo/src/isdn/cdb/isdn_cdb_def.h | 39 + src/hwinfo/src/isdn/cdb/mk_isdnhwdb.c | 293 + src/hwinfo/src/isdn/cdbisdn.c | 400 + src/hwinfo/src/isdn/isa_probe.c | 238 + src/hwinfo/src/isdn/libihw.txt | 61 + src/hwinfo/src/smp/Makefile | 7 + src/hwinfo/src/smp/README | 14 + src/hwinfo/src/smp/smp.c | 286 + src/hwinfo/src/x86emu/LICENSE | 17 + src/hwinfo/src/x86emu/Makefile | 86 + src/hwinfo/src/x86emu/debug.c | 431 + src/hwinfo/src/x86emu/decode.c | 1108 + src/hwinfo/src/x86emu/fpu.c | 966 + src/hwinfo/src/x86emu/include/x86emu.h | 199 + .../src/x86emu/include/x86emu/fpu_regs.h | 120 + src/hwinfo/src/x86emu/include/x86emu/regs.h | 338 + src/hwinfo/src/x86emu/include/x86emu/types.h | 107 + src/hwinfo/src/x86emu/ops.c | 11699 +++++ src/hwinfo/src/x86emu/ops2.c | 2805 + src/hwinfo/src/x86emu/prim_ops.c | 2654 + src/hwinfo/src/x86emu/sys.c | 666 + src/hwinfo/src/x86emu/validate.c | 765 + src/hwinfo/src/x86emu/x86emu/debug.h | 211 + src/hwinfo/src/x86emu/x86emu/decode.h | 89 + src/hwinfo/src/x86emu/x86emu/fpu.h | 61 + src/hwinfo/src/x86emu/x86emu/ops.h | 45 + src/hwinfo/src/x86emu/x86emu/prim_asm.h | 971 + src/hwinfo/src/x86emu/x86emu/prim_ops.h | 143 + src/hwinfo/src/x86emu/x86emu/x86emui.h | 105 + 208 files changed, 154048 insertions(+), 102 deletions(-) create mode 100644 src/hwinfo/COPYING create mode 100644 src/hwinfo/ChangeLog create mode 100644 src/hwinfo/Makefile create mode 100644 src/hwinfo/Makefile.common create mode 100644 src/hwinfo/README create mode 100644 src/hwinfo/VERSION create mode 100644 src/hwinfo/doc/example1.c create mode 100644 src/hwinfo/doc/example2.c create mode 100644 src/hwinfo/doc/footer.html create mode 100644 src/hwinfo/doc/hwinfo.8 create mode 100644 src/hwinfo/doc/libhd.doc create mode 100644 src/hwinfo/doc/libhd.doxy create mode 100755 src/hwinfo/gen-hwcfg-disk.sh create mode 100755 src/hwinfo/getsysinfo create mode 100644 src/hwinfo/hwbootscan create mode 100644 src/hwinfo/hwbootscan.rc create mode 100644 src/hwinfo/hwinfo.c create mode 100644 src/hwinfo/hwscan.c create mode 100644 src/hwinfo/hwscand.c create mode 100644 src/hwinfo/hwscanqueue.c create mode 100644 src/hwinfo/init_message.h create mode 100755 src/hwinfo/scripts/mci create mode 100644 src/hwinfo/src/Makefile create mode 100644 src/hwinfo/src/hd/Makefile create mode 100644 src/hwinfo/src/hd/adb.c create mode 100644 src/hwinfo/src/hd/adb.h create mode 100644 src/hwinfo/src/hd/bios.c create mode 100644 src/hwinfo/src/hd/bios.h create mode 100644 src/hwinfo/src/hd/block.c create mode 100644 src/hwinfo/src/hd/block.h create mode 100644 src/hwinfo/src/hd/braille.c create mode 100644 src/hwinfo/src/hd/braille.h create mode 100644 src/hwinfo/src/hd/cpu.c create mode 100644 src/hwinfo/src/hd/cpu.h create mode 100644 src/hwinfo/src/hd/edd.c create mode 100644 src/hwinfo/src/hd/edd.h create mode 100644 src/hwinfo/src/hd/fb.c create mode 100644 src/hwinfo/src/hd/fb.h create mode 100644 src/hwinfo/src/hd/floppy.c create mode 100644 src/hwinfo/src/hd/floppy.h create mode 100644 src/hwinfo/src/hd/hd.c create mode 100644 src/hwinfo/src/hd/hd.h create mode 100644 src/hwinfo/src/hd/hd_int.h create mode 100644 src/hwinfo/src/hd/hddb.c create mode 100644 src/hwinfo/src/hd/hddb.h create mode 100644 src/hwinfo/src/hd/hddb_int.h create mode 100644 src/hwinfo/src/hd/hdp.c create mode 100644 src/hwinfo/src/hd/hdp.h create mode 100644 src/hwinfo/src/hd/ibm-notebooks.h create mode 100644 src/hwinfo/src/hd/input.c create mode 100644 src/hwinfo/src/hd/input.h create mode 100644 src/hwinfo/src/hd/int.c create mode 100644 src/hwinfo/src/hd/int.h create mode 100644 src/hwinfo/src/hd/isa.c create mode 100644 src/hwinfo/src/hd/isa.h create mode 100644 src/hwinfo/src/hd/isapnp.c create mode 100644 src/hwinfo/src/hd/isapnp.h create mode 100644 src/hwinfo/src/hd/isdn.c create mode 100644 src/hwinfo/src/hd/isdn.h create mode 100644 src/hwinfo/src/hd/kbd.c create mode 100644 src/hwinfo/src/hd/kbd.h create mode 100644 src/hwinfo/src/hd/klog.c create mode 100644 src/hwinfo/src/hd/klog.h create mode 100644 src/hwinfo/src/hd/manual.c create mode 100644 src/hwinfo/src/hd/manual.h create mode 100644 src/hwinfo/src/hd/memory.c create mode 100644 src/hwinfo/src/hd/memory.h create mode 100644 src/hwinfo/src/hd/misc.c create mode 100644 src/hwinfo/src/hd/misc.h create mode 100644 src/hwinfo/src/hd/modem.c create mode 100644 src/hwinfo/src/hd/modem.h create mode 100644 src/hwinfo/src/hd/monitor.c create mode 100644 src/hwinfo/src/hd/monitor.h create mode 100644 src/hwinfo/src/hd/mouse.c create mode 100644 src/hwinfo/src/hd/mouse.h create mode 100644 src/hwinfo/src/hd/net.c create mode 100644 src/hwinfo/src/hd/net.h create mode 100644 src/hwinfo/src/hd/parallel.c create mode 100644 src/hwinfo/src/hd/parallel.h create mode 100644 src/hwinfo/src/hd/pci.c create mode 100644 src/hwinfo/src/hd/pci.h create mode 100644 src/hwinfo/src/hd/pcmcia.c create mode 100644 src/hwinfo/src/hd/pcmcia.h create mode 100644 src/hwinfo/src/hd/pppoe.c create mode 100644 src/hwinfo/src/hd/pppoe.h create mode 100644 src/hwinfo/src/hd/prom.c create mode 100644 src/hwinfo/src/hd/prom.h create mode 100644 src/hwinfo/src/hd/s390.c create mode 100644 src/hwinfo/src/hd/s390.h create mode 100644 src/hwinfo/src/hd/sbus.c create mode 100644 src/hwinfo/src/hd/sbus.h create mode 100644 src/hwinfo/src/hd/serial.c create mode 100644 src/hwinfo/src/hd/serial.h create mode 100644 src/hwinfo/src/hd/smbios.c create mode 100644 src/hwinfo/src/hd/smbios.h create mode 100644 src/hwinfo/src/hd/sys.c create mode 100644 src/hwinfo/src/hd/sys.h create mode 100644 src/hwinfo/src/hd/usb.c create mode 100644 src/hwinfo/src/hd/usb.h create mode 100644 src/hwinfo/src/hd/version.h create mode 100644 src/hwinfo/src/hd/veth.c create mode 100644 src/hwinfo/src/hd/veth.h create mode 100644 src/hwinfo/src/hd/wlan.c create mode 100644 src/hwinfo/src/hd/wlan.h create mode 100644 src/hwinfo/src/ids/Makefile create mode 100755 src/hwinfo/src/ids/cdb_x11 create mode 100644 src/hwinfo/src/ids/check_hd.c create mode 100755 src/hwinfo/src/ids/convert_hd create mode 100755 src/hwinfo/src/ids/get_adaptec create mode 100755 src/hwinfo/src/ids/get_pcmcia create mode 100644 src/hwinfo/src/ids/hd_ids.c create mode 100644 src/hwinfo/src/ids/src/braille create mode 100644 src/hwinfo/src/ids/src/bus create mode 100644 src/hwinfo/src/ids/src/camera create mode 100644 src/hwinfo/src/ids/src/chipcard create mode 100644 src/hwinfo/src/ids/src/class create mode 100644 src/hwinfo/src/ids/src/dvb create mode 100644 src/hwinfo/src/ids/src/extra create mode 100644 src/hwinfo/src/ids/src/isapnp create mode 100644 src/hwinfo/src/ids/src/modem create mode 100644 src/hwinfo/src/ids/src/modem.i386 create mode 100644 src/hwinfo/src/ids/src/monitor create mode 100644 src/hwinfo/src/ids/src/mouse create mode 100644 src/hwinfo/src/ids/src/network create mode 100644 src/hwinfo/src/ids/src/pci create mode 100644 src/hwinfo/src/ids/src/pcmcia create mode 100644 src/hwinfo/src/ids/src/ppc create mode 100644 src/hwinfo/src/ids/src/s390 create mode 100644 src/hwinfo/src/ids/src/scanner create mode 100644 src/hwinfo/src/ids/src/sound create mode 100644 src/hwinfo/src/ids/src/special create mode 100644 src/hwinfo/src/ids/src/storage create mode 100644 src/hwinfo/src/ids/src/tv create mode 100644 src/hwinfo/src/ids/src/usb create mode 100644 src/hwinfo/src/ids/src/usb2 create mode 100644 src/hwinfo/src/ids/src/x11.amd64 create mode 100644 src/hwinfo/src/ids/src/x11.axp create mode 100644 src/hwinfo/src/ids/src/x11.i386 create mode 100644 src/hwinfo/src/ids/src/x11.ia64 create mode 100644 src/hwinfo/src/ids/src/x11.ppc create mode 100644 src/hwinfo/src/ids/src/x11.ppc.special create mode 100644 src/hwinfo/src/ids/src/x11.sparc create mode 100755 src/hwinfo/src/ids/update_x11 create mode 100644 src/hwinfo/src/int10/AsmMacros.h create mode 100644 src/hwinfo/src/int10/Makefile create mode 100644 src/hwinfo/src/int10/README create mode 100644 src/hwinfo/src/int10/emu_vm86.c create mode 100644 src/hwinfo/src/int10/i10_int.c create mode 100644 src/hwinfo/src/int10/i10_io.c create mode 100644 src/hwinfo/src/int10/i10_pci.c create mode 100644 src/hwinfo/src/int10/i10_v86.c create mode 100644 src/hwinfo/src/int10/i10_vbios.c create mode 100644 src/hwinfo/src/int10/int10.c create mode 100644 src/hwinfo/src/int10/pci.h create mode 100644 src/hwinfo/src/int10/v86bios.h create mode 100644 src/hwinfo/src/int10/vbios.h create mode 100644 src/hwinfo/src/int10/vm86_struct.h create mode 100644 src/hwinfo/src/isdn/Makefile create mode 100644 src/hwinfo/src/isdn/cdb/ISDN.axp.txt create mode 100644 src/hwinfo/src/isdn/cdb/ISDN.i386.txt create mode 100644 src/hwinfo/src/isdn/cdb/ISDN.ppc.txt create mode 100644 src/hwinfo/src/isdn/cdb/ISDN.x86_64.txt create mode 100644 src/hwinfo/src/isdn/cdb/Makefile create mode 100644 src/hwinfo/src/isdn/cdb/cdb_hwdb.h create mode 100644 src/hwinfo/src/isdn/cdb/cdb_read.c create mode 100644 src/hwinfo/src/isdn/cdb/cdb_read.h create mode 100644 src/hwinfo/src/isdn/cdb/isdn_cdb.c create mode 100644 src/hwinfo/src/isdn/cdb/isdn_cdb.lex create mode 100644 src/hwinfo/src/isdn/cdb/isdn_cdb_def.h create mode 100644 src/hwinfo/src/isdn/cdb/mk_isdnhwdb.c create mode 100644 src/hwinfo/src/isdn/cdbisdn.c create mode 100644 src/hwinfo/src/isdn/isa_probe.c create mode 100644 src/hwinfo/src/isdn/libihw.txt create mode 100644 src/hwinfo/src/smp/Makefile create mode 100644 src/hwinfo/src/smp/README create mode 100644 src/hwinfo/src/smp/smp.c create mode 100644 src/hwinfo/src/x86emu/LICENSE create mode 100644 src/hwinfo/src/x86emu/Makefile create mode 100644 src/hwinfo/src/x86emu/debug.c create mode 100644 src/hwinfo/src/x86emu/decode.c create mode 100644 src/hwinfo/src/x86emu/fpu.c create mode 100644 src/hwinfo/src/x86emu/include/x86emu.h create mode 100644 src/hwinfo/src/x86emu/include/x86emu/fpu_regs.h create mode 100644 src/hwinfo/src/x86emu/include/x86emu/regs.h create mode 100644 src/hwinfo/src/x86emu/include/x86emu/types.h create mode 100644 src/hwinfo/src/x86emu/ops.c create mode 100644 src/hwinfo/src/x86emu/ops2.c create mode 100644 src/hwinfo/src/x86emu/prim_ops.c create mode 100644 src/hwinfo/src/x86emu/sys.c create mode 100644 src/hwinfo/src/x86emu/validate.c create mode 100644 src/hwinfo/src/x86emu/x86emu/debug.h create mode 100644 src/hwinfo/src/x86emu/x86emu/decode.h create mode 100644 src/hwinfo/src/x86emu/x86emu/fpu.h create mode 100644 src/hwinfo/src/x86emu/x86emu/ops.h create mode 100644 src/hwinfo/src/x86emu/x86emu/prim_asm.h create mode 100644 src/hwinfo/src/x86emu/x86emu/prim_ops.h create mode 100644 src/hwinfo/src/x86emu/x86emu/x86emui.h diff --git a/lfs/boot.img b/lfs/boot.img index 5156c04230..2577a3395a 100644 --- a/lfs/boot.img +++ b/lfs/boot.img @@ -26,6 +26,8 @@ include Config +VER = ipfire + THISAPP = boot-$(VERSION).img TARGET = $(DIR_INFO)/$(THISAPP) @@ -62,7 +64,7 @@ $(TARGET) : sed -e 's/boot IPFire/boot IPFire $(VERSION)/' $(DIR_SRC)/config/kernel/install-message \ > /install/mnt/message; \ cp $(DIR_SRC)/config/kernel/syslinux.cfg /install/mnt/syslinux.cfg; \ - cp /boot/vmlinuz-installer /install/mnt/vmlinuz; \ + cp /boot/vmlinuz-$(KVER) /install/mnt/vmlinuz; \ cp /install/images/fdinitrd.gz /install/mnt/instroot.gz; \ umount /install/mnt; \ losetup -d $$LOOPDEV; \ diff --git a/lfs/driver.img b/lfs/driver.img index f197e896c3..d9d6b7d1b3 100644 --- a/lfs/driver.img +++ b/lfs/driver.img @@ -18,12 +18,6 @@ # Makefiles are based on LFSMake, which is # # Copyright (C) 2002 Rod Roard # # # -# Modifications by: # -# ??-12-2003 Mark Wormgoor < mark@wormgoor.com> # -# - Modified Makefile for IPCop build # -# # -# $Id: driver.img,v 1.24.2.7 2006/01/29 20:17:30 franck78 Exp $ -# # ############################################################################### ############################################################################### @@ -32,6 +26,8 @@ include Config +VER = ipfire + THISAPP = driver-$(VERSION).img TARGET = $(DIR_INFO)/$(THISAPP) @@ -57,9 +53,7 @@ $(TARGET) : # make new dependencies depmod -a -F /boot/System.map-$(KVER) $(KVER) - if [ "$(MACHINE)" = "i386" ]; then \ - depmod -a -F /boot/System.map-$(KVER)-smp $(KVER)-smp; \ - fi + depmod -a -F /boot/System.map-$(KVER)-smp $(KVER)-smp # Create drivers floppy cd /tmp && rm -rf drivers.tgz drivers.tar bin lib etc var @@ -100,19 +94,15 @@ $(TARGET) : cd /tmp && tar xf drivers.tar cd /tmp && mkdir -p {bin,etc/pcmcia,var/lib/pcmcia,var/run} cd /tmp && cp -aR /install/misc/bin/* bin - cd /tmp && cp -r /etc/pcmcia/{config*,net*} etc/pcmcia +# cd /tmp && cp -r /etc/pcmcia/{config*,net*} etc/pcmcia # cardmgr wants to execute these to bring up the card, we'll # create blank ones as we'll bring them up ourselves - cd /tmp/etc/pcmcia && rm -f network - cd /tmp/etc/pcmcia && touch network - cd /tmp/etc/pcmcia && chmod +x network +# cd /tmp/etc/pcmcia && rm -f network +# cd /tmp/etc/pcmcia && touch network +# cd /tmp/etc/pcmcia && chmod +x network cd /tmp && tar -cf - bin/ etc/pcmcia var lib/modules/$(KVER) | gzip -9 -c > drivers.tgz - if [ "$(MACHINE)" = "alpha" ]; then \ - cp /tmp/drivers.tgz /install/images/drivers-$(VERSION).img; \ - else \ - dd if=/tmp/drivers.tgz of=/install/images/drivers-$(VERSION).img bs=1440k count=1 conv=sync; \ - fi + dd if=/tmp/drivers.tgz of=/install/images/drivers-$(VERSION).img bs=2880k count=1 conv=sync rm -rf /tmp/drivers.tgz /tmp/drivers.tar /tmp/bin /tmp/lib ### If this fails, the disk is TOO FULL !!!! diff --git a/lfs/initrd b/lfs/initrd index 66c578e7ff..8449552fd2 100644 --- a/lfs/initrd +++ b/lfs/initrd @@ -18,12 +18,6 @@ # Makefiles are based on LFSMake, which is # # Copyright (C) 2002 Rod Roard # # # -# Modifications by: # -# ??-12-2003 Mark Wormgoor < mark@wormgoor.com> # -# - Modified Makefile for IPCop build # -# # -# $Id: initrd,v 1.26.2.8 2005/12/03 21:28:44 franck78 Exp $ -# # ############################################################################### ############################################################################### @@ -32,6 +26,8 @@ include Config +VER = ipfire + THISAPP = initrd DIR_APP = $(DIR_SRC)/$(THISAPP) TARGET = $(DIR_INFO)/$(THISAPP) @@ -62,41 +58,34 @@ $(TARGET) : # Finish up initrd directory -mkdir -p /install/initrd/{etc,lib/modules/$(KVER)/kernel/drivers,cdrom,dev,harddisk,proc,tmp,usr/share/terminfo/l,var/run} && \ ln -sf /bin /install/initrd/sbin - cd /install/initrd/dev && /dev/make_devices +# cd /install/initrd/dev && /dev/make_devices cp -aRf $(DIR_SRC)/config/install/* /install/initrd/etc/ rm -rf /install/initrd/etc/CVS/ cd /install/initrd/dev && ln -sf fd0 floppy chmod 755 /install/initrd/etc/halt /install/initrd/etc/rc cp -f /usr/share/terminfo/l/linux /install/initrd/usr/share/terminfo/l - if [ "$(MACHINE)" = "alpha" ]; then \ - tar cvzf /tmp/libc.tgz /usr/share/locale /lib/libc.* /lib/libc-* /lib/libdl* /lib/libnsl* /lib/libresolv* /lib/libutil* /lib/ld* /lib/libcrypt*; \ - tar xvzf /tmp/libc.tgz -C /install/initrd; \ - strip /install/initrd/lib/*; \ - rm -f /tmp/libc.tgz; \ - fi - # Extra modules -mkdir -p /install/initrd/lib/modules/$(KVER)/kernel/drivers/scsi - cp -f /lib/modules/$(KVER)/kernel/drivers/scsi/{scsi_mod.o.gz,sd_mod.o.gz,sr_mod.o.gz} \ + cp -f /lib/modules/$(KVER)/kernel/drivers/scsi/{scsi_mod.ko,sd_mod.ko,sr_mod.ko} \ /install/initrd/lib/modules/$(KVER)/kernel/drivers/scsi/ -mkdir -p /install/initrd/lib/modules/$(KVER)/kernel/drivers/usb/storage/ - cp -f /lib/modules/$(KVER)/kernel/drivers/usb/storage/*.o.gz \ + cp -f /lib/modules/$(KVER)/kernel/drivers/usb/storage/*.ko \ /install/initrd/lib/modules/$(KVER)/kernel/drivers/usb/storage/ -mkdir -p /install/initrd/lib/modules/$(KVER)/kernel/drivers/usb/host/ - cp -f /lib/modules/$(KVER)/kernel/drivers/usb/host/{usb-*,ehci*} \ - /lib/modules/$(KVER)/kernel/drivers/usb/hid.o.gz \ - /lib/modules/$(KVER)/kernel/drivers/usb/*core.o.gz \ + cp -f /lib/modules/$(KVER)/kernel/drivers/usb/host/ehci* \ + /lib/modules/$(KVER)/kernel/drivers/usb/input/usbhid.ko \ + /lib/modules/$(KVER)/kernel/drivers/usb/core/usbcore.ko \ /install/initrd/lib/modules/$(KVER)/kernel/drivers/usb/ - -mkdir -p /install/initrd/lib/modules/$(KVER)/kernel/drivers/input - cp -f /lib/modules/$(KVER)/kernel/drivers/input/{input.o.gz,keybdev.o.gz} \ - /install/initrd/lib/modules/$(KVER)/kernel/drivers/input/ +# -mkdir -p /install/initrd/lib/modules/$(KVER)/kernel/drivers/input +# cp -f /lib/modules/$(KVER)/kernel/drivers/input/{input.ko,keybdev.ko} \ +# /install/initrd/lib/modules/$(KVER)/kernel/drivers/input/ - -mkdir -p /install/initrd/lib/modules/$(KVER)/kernel/drivers/pnp - cp -f /lib/modules/$(KVER)/kernel/drivers/pnp/* \ - /install/initrd/lib/modules/$(KVER)/kernel/drivers/pnp/ +# -mkdir -p /install/initrd/lib/modules/$(KVER)/kernel/drivers/pnp +# cp -f /lib/modules/$(KVER)/kernel/drivers/pnp/* \ +# /install/initrd/lib/modules/$(KVER)/kernel/drivers/pnp/ cp -f /lib/modules/$(KVER)/modules.* /install/initrd/lib/modules/$(KVER)/ diff --git a/lfs/installer b/lfs/installer index 6b34f7f56b..ba34c89ce2 100644 --- a/lfs/installer +++ b/lfs/installer @@ -18,12 +18,6 @@ # Makefiles are based on LFSMake, which is # # Copyright (C) 2002 Rod Roard # # # -# Modifications by: # -# ??-12-2003 Mark Wormgoor < mark@wormgoor.com> # -# - Modified Makefile for IPCop build # -# # -# $Id: installer,v 1.6.2.3 2005/02/05 15:38:15 gespinasse Exp $ -# # ############################################################################### ############################################################################### @@ -32,6 +26,8 @@ include Config +VER = ipfire + THISAPP = installer DIR_APP = $(DIR_SRC)/$(THISAPP) TARGET = $(DIR_INFO)/$(THISAPP) diff --git a/lfs/newt b/lfs/newt index 5a215ac5e4..b8ee2db8d9 100644 --- a/lfs/newt +++ b/lfs/newt @@ -18,12 +18,6 @@ # Makefiles are based on LFSMake, which is # # Copyright (C) 2002 Rod Roard # # # -# Modifications by: # -# ??-12-2003 Mark Wormgoor < mark@wormgoor.com> # -# - Modified Makefile for IPCop build # -# # -# $Id: newt,v 1.8.2.3 2005/02/05 15:38:15 gespinasse Exp $ -# # ############################################################################### ############################################################################### @@ -36,7 +30,7 @@ VER = 0.50.17 THISAPP = newt-utf8_$(VER) DL_FILE = $(THISAPP).orig.tar.gz -DL_FROM = $(URL_DEBIAN)/n/newt-utf8 +DL_FROM = $(URL_IPFIRE) DIR_APP = $(DIR_SRC)/newt-0.50.17 ifeq "$(LFS_PASS)" "install" TARGET = $(DIR_INFO)/$(THISAPP)-install diff --git a/lfs/pciutils b/lfs/pciutils index 86d9737a52..a31b0fa70f 100644 --- a/lfs/pciutils +++ b/lfs/pciutils @@ -81,7 +81,7 @@ $(TARGET) : $(patsubst %,$(DIR_DL)/%,$(objects)) ifeq "$(LFS_PASS)" "install" cd $(DIR_APP)/lib && CFLAGS="-Os -fomit-frame-pointer" ./configure - cd $(DIR_APP)/lib && CFLAGS="-Os -fomit-frame-pointer" make + cd $(DIR_APP)/lib && CFLAGS="-Os -fomit-frame-pointer" make $(MAKETUNING) -mkdir -p /install/include/pci cd $(DIR_APP) && install -m 0644 lib/libpci.a /install/lib cd $(DIR_APP) && install -m 0644 lib/{config,header,pci}.h /install/include/pci diff --git a/lfs/pcmciautils b/lfs/pcmciautils index f1f1d190d4..a3c086204d 100644 --- a/lfs/pcmciautils +++ b/lfs/pcmciautils @@ -30,7 +30,7 @@ VER = 014 THISAPP = pcmciautils-$(VER) DL_FILE = $(THISAPP).tar.bz2 -DL_FROM = $(URL_SFNET)/pcmcia-cs +DL_FROM = $(URL_IPFIRE) DIR_APP = $(DIR_SRC)/$(THISAPP) ifeq "$(LFS_PASS)" "install" TARGET = $(DIR_INFO)/$(THISAPP)-install @@ -76,22 +76,17 @@ $(subst %,%_MD5,$(objects)) : $(TARGET) : $(patsubst %,$(DIR_DL)/%,$(objects)) @$(PREBUILD) @rm -rf $(DIR_APP) && cd $(DIR_SRC) && tar jxf $(DIR_DL)/$(DL_FILE) - cd $(DIR_APP) && make #$(MAKETUNING) - cd $(DIR_APP) && make install -## This is saved... -#ifeq "$(LFS_PASS)" "install" -# cd $(DIR_APP) && ./Configure -n --kernel=/usr/src/linux --notrust --cardbus --pnp --apm --nox11 --srctree --ucc=gcc --kcc="$(KGCC)" +ifeq "$(LFS_PASS)" "install" # cd $(DIR_APP) && make -C cardmgr # cd $(DIR_APP) && mkdir -p /install/misc/bin # cd $(DIR_APP) && install -s -m 0755 cardmgr/cardmgr /install/misc/bin # cd $(DIR_APP) && install -s -m 0755 cardmgr/cardctl /install/misc/bin -#else -# cd $(DIR_APP) && ./Configure -n --kernel=/usr/src/linux --notrust --cardbus --pnp --apm --nox11 --srctree --ucc=gcc --kcc="$(KGCC)" -# cd $(DIR_APP) && make all -# cd $(DIR_APP) && make install -# -# # Install our own extra pcmcia configs -# cp $(DIR_SRC)/src/pcmcia/*.conf /etc/pcmcia -#endif +else + cd $(DIR_APP) && make + cd $(DIR_APP) && make install + + # Install our own extra pcmcia configs + cp $(DIR_SRC)/src/pcmcia/*.conf /etc/pcmcia +endif @rm -rf $(DIR_APP) @$(POSTBUILD) diff --git a/lfs/scsi.img b/lfs/scsi.img index 1f9663ac4b..988ee5eabc 100644 --- a/lfs/scsi.img +++ b/lfs/scsi.img @@ -18,12 +18,6 @@ # Makefiles are based on LFSMake, which is # # Copyright (C) 2002 Rod Roard # # # -# Modifications by: # -# ??-12-2003 Mark Wormgoor < mark@wormgoor.com> # -# - Modified Makefile for IPCop build # -# # -# $Id: scsi.img,v 1.19.2.4 2005/02/05 15:38:15 gespinasse Exp $ -# # ############################################################################### ############################################################################### @@ -32,6 +26,8 @@ include Config +VER = ipfire + THISAPP = scsi-$(VERSION).img TARGET = $(DIR_INFO)/$(THISAPP) @@ -58,24 +54,20 @@ $(TARGET) : -mkdir -p /install/images cd /tmp && rm -rf scsi.tgz scsi.tar bin etc lib var - cd / && tar -cf /tmp/scsi.tar lib/modules/$(KVER)/kernel/drivers/{scsi,pcmcia,message/fusion} lib/modules/$(KVER)/kernel/drivers/block/{DAC960.o.gz,cpqarray.o.gz,cciss.o.gz} lib/modules/$(KVER)/kernel/drivers/ide + cd / && tar -cf /tmp/scsi.tar lib/modules/$(KVER)/kernel/drivers/{scsi,pcmcia,message/fusion} lib/modules/$(KVER)/kernel/drivers/block/{DAC960.ko,cpqarray.ko,cciss.ko} lib/modules/$(KVER)/kernel/drivers/ide cd /tmp && tar xf scsi.tar cd /tmp && rm -f lib/modules/$(KVER)/kernel/drivers/message/fusion/mptlan* cd /tmp && mkdir -p {bin,etc/pcmcia/scsi,var/lib/pcmcia,var/run} cd /tmp && cp -aR /install/misc/bin/* bin - cd /tmp && cp -r /etc/pcmcia/{config*,scsi*} etc/pcmcia/scsi +# cd /tmp && cp -r /etc/pcmcia/{config*,scsi*} etc/pcmcia/scsi # cardmgr wants to execute these to bring up the card, we'll # create blank ones as we'll bring them up ourselves - cd /tmp/etc/pcmcia/scsi && rm -f scsi - cd /tmp/etc/pcmcia/scsi && touch scsi - cd /tmp/etc/pcmcia/scsi && chmod +x scsi +# cd /tmp/etc/pcmcia/scsi && rm -f scsi +# cd /tmp/etc/pcmcia/scsi && touch scsi +# cd /tmp/etc/pcmcia/scsi && chmod +x scsi cd /tmp && tar -cf - bin/ etc/pcmcia var lib/modules/$(KVER) | gzip -9 -c > scsi.tgz - if [ "$(MACHINE)" = "alpha" ]; then \ - cp /tmp/scsi.tgz /install/images/scsidrv-$(VERSION).img; \ - else \ - dd if=/tmp/scsi.tgz of=/install/images/scsidrv-$(VERSION).img bs=2880k count=1 conv=sync; \ - fi + dd if=/tmp/scsi.tgz of=/install/images/scsidrv-$(VERSION).img bs=2880k count=1 conv=sync rm -f /tmp/scsi.tgz ### If this fails, the disk is TOO FULL !!!! diff --git a/lfs/slang b/lfs/slang index 036660a1cc..78d079435f 100644 --- a/lfs/slang +++ b/lfs/slang @@ -78,16 +78,15 @@ $(TARGET) : $(patsubst %,$(DIR_DL)/%,$(objects)) @rm -rf $(DIR_APP) && cd $(DIR_SRC) && tar jxf $(DIR_DL)/$(DL_FILE) ifeq "$(LFS_PASS)" "install" -mkdir -p /install/lib - cd $(DIR_APP) && sed -i -e 's/libslang.a:/libslang.a:\ $$(OBJS)/' Makefile - cd $(DIR_APP) && CFLAGS="-Os -fomit-frame-pointer -Wall -fPIC" make -e libslang.a - cd $(DIR_APP) && install -m 0644 libslang.a /install/lib - -mkdir -p /install/include/slang - cd $(DIR_APP) && install -m 0644 slang.h slcurses.h /install/include/slang + cd $(DIR_APP) && ./configure --prefix="" + cd $(DIR_APP) && make $(MAKETUNING) elf + cd $(DIR_APP)/src && make $(MAKETUNING) install-elf DESTDIR="/opt/$(MACHINE)-uClibc" + rm -vf /opt/$(MACHINE)-uClibc/lib/libslang.so* else cd $(DIR_APP) && ./configure --prefix=/usr --sysconfdir=/etc - cd $(DIR_APP) && make - cd $(DIR_APP) && make elf - cd $(DIR_APP) && make install-elf + cd $(DIR_APP) && make $(MAKETUNING) + cd $(DIR_APP) && make elf $(MAKETUNING) + cd $(DIR_APP) && make install-elf $(MAKETUNING) cd $(DIR_APP) && chmod -v 755 /usr/lib/libslang.so.2.0.6 endif @rm -rf $(DIR_APP) diff --git a/lfs/util-linux b/lfs/util-linux index 411316b667..9b0ad5dc5e 100644 --- a/lfs/util-linux +++ b/lfs/util-linux @@ -36,7 +36,11 @@ DIR_APP = $(DIR_SRC)/$(THISAPP) # Normal build or /tools build. # ifeq "$(ROOT)" "" +ifeq "$(LFS_PASS)" "install" + TARGET = $(DIR_INFO)/$(THISAPP)-install +else TARGET = $(DIR_INFO)/$(THISAPP) +endif else TARGET = $(DIR_INFO)/$(THISAPP)-tools endif @@ -80,6 +84,16 @@ $(TARGET) : $(patsubst %,$(DIR_DL)/%,$(objects)) @$(PREBUILD) @rm -rf $(DIR_APP) && cd $(DIR_SRC) && tar jxf $(DIR_DL)/$(DL_FILE) ifeq "$(ROOT)" "" +ifeq "$(LFS_PASS)" "install" + cd $(DIR_APP) && CFLAGS="-Os -fomit-frame-pointer" ./configure + cd $(DIR_APP) && echo "HAVE_SLANG=yes" >> make_include + cd $(DIR_APP) && echo "SLANGFLAGS=-I/opt/$(MACHINE)-uClibc/include/slang" >> make_include + cd $(DIR_APP)/fdisk && make cfdisk + cd $(DIR_APP)/fdisk && install -m 0755 cfdisk /install/initrd/bin + cd $(DIR_APP)/disk-utils && make LDFLAGS=-static mkfs.minix fsck.minix + cd $(DIR_APP)/disk-utils && install -m 0755 mkfs.minix /sbin/mkfs.minix.static + cd $(DIR_APP)/disk-utils && install -m 0755 fsck.minix /sbin/fsck.minix.static +else cd $(DIR_APP) && sed -i 's@etc/adjtime@var/lib/hwclock/adjtime@g' \ hwclock/hwclock.c -mkdir -p /var/lib/hwclock @@ -87,6 +101,7 @@ ifeq "$(ROOT)" "" cd $(DIR_APP) && ./configure cd $(DIR_APP) && make $(MAKETUNING) HAVE_KILL=yes HAVE_SLN=yes cd $(DIR_APP) && make HAVE_KILL=yes HAVE_SLN=yes install +endif else cd $(DIR_APP) && sed -i 's@/usr/include@/tools/include@g' configure cd $(DIR_APP) && ./configure diff --git a/make.sh b/make.sh index b5d65fec67..5eb8ba538c 100644 --- a/make.sh +++ b/make.sh @@ -551,21 +551,23 @@ buildinstaller() { installmake sysvinit installmake e2fsprogs installmake misc-progs -exiterror STOP HERE! - ipfiremake syslinux - ipfiremake as86 - ipfiremake mbr + installmake sysfsutils +# installmake hwinfo installmake slang installmake util-linux installmake newt installmake pciutils - installmake pcmcia-cs - installmake kbd + installmake pcmciautils installmake installer installmake scsi.img installmake driver.img installmake initrd installmake boot.img +exiterror STOP HERE! + ipfiremake syslinux + ipfiremake as86 + ipfiremake mbr + installmake kbd } buildpackages() { diff --git a/src/hwinfo/COPYING b/src/hwinfo/COPYING new file mode 100644 index 0000000000..1609d969a5 --- /dev/null +++ b/src/hwinfo/COPYING @@ -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. + + 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.) + +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. + + 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. + + 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 + + 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. + + + Copyright (C) 19yy + + 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. + + , 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 index 0000000000..58c542d64d --- /dev/null +++ b/src/hwinfo/ChangeLog @@ -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 (#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 index 0000000000..72c7ffb3dd --- /dev/null +++ b/src/hwinfo/Makefile @@ -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 index 0000000000..771fc3151a --- /dev/null +++ b/src/hwinfo/Makefile.common @@ -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/opt/i586-uClibc/include -I/opt/i586-uClibc/usr/include -I$(TOPDIR)/src/hd +SHARED_FLAGS = -fPIC + +LDFLAGS = -Lsrc + +CFILES = $(wildcard *.c) +OBJS = $(CFILES:.c=.o) +LIBHD_BASE = libhd +LIBHD = $(TOPDIR)/src/$(LIBHD_BASE).a +LIBHD_SONAME = $(LIBHD_BASE).so.$(LIBHD_MAJOR_VERSION) +LIBHD_NAME = $(LIBHD_BASE).so.$(LIBHD_VERSION) +LIBHD_SO = $(TOPDIR)/src/$(LIBHD_NAME) +LIBHD_D = $(TOPDIR)/src/.lib + +export CC TOPDIR CFLAGS LIBHD ARCH + +.PHONY: all distclean clean install subdirs + +%.o: %.c + $(CC) -c $(CFLAGS) $< + +all: subdirs $(TARGETS) + +install: all + +ifneq "$(SUBDIRS)" "" +subdirs: + @for i in $(SUBDIRS) ; do make -C $$i $(MAKECMDGOALS) || exit ; done +endif + +clean: subdirs + @rm -rf $(OBJS) .depend $(CLEANFILES) *~ + +distclean: subdirs + @rm -rf $(OBJS) .depend $(CLEANFILES) $(DISTCLEANFILES) *~ + +ifneq "$(CFILES)" "" +ifeq ($(findstring $(MAKECMDGOALS), clean distclean),) +.depend: $(CFILES) + @$(CC) -MG -MM $(CFLAGS) $(CFILES) >$@ + +-include .depend +endif +endif diff --git a/src/hwinfo/README b/src/hwinfo/README new file mode 100644 index 0000000000..2740fb5c8c --- /dev/null +++ b/src/hwinfo/README @@ -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, : add at begin of + list): + hwprobe=[+-]::[:] + + , and 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: 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 ( is the combined base_class & sub_class), + [see 1st example below]: + + 14: PS/2 00.0: 10500 PS/2 Mouse + ^^^^^ --> + [Created at mouse.110] + Vendor: s0200 "Unknown" + ^^^^^ --> + Model: 0002 "Generic PS/2 Mouse" + ^^^^ --> + Device File: /dev/psaux + ^^^^^^^^^^ --> + 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 index 0000000000..ea158a22a3 --- /dev/null +++ b/src/hwinfo/VERSION @@ -0,0 +1 @@ +10.16 diff --git a/src/hwinfo/doc/example1.c b/src/hwinfo/doc/example1.c new file mode 100644 index 0000000000..7de3e477df --- /dev/null +++ b/src/hwinfo/doc/example1.c @@ -0,0 +1,26 @@ +#include +#include + +#include + +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 index 0000000000..cc2a9db823 --- /dev/null +++ b/src/hwinfo/doc/example2.c @@ -0,0 +1,26 @@ +#include +#include + +#include + +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 index 0000000000..62b274f1c0 --- /dev/null +++ b/src/hwinfo/doc/footer.html @@ -0,0 +1 @@ + diff --git a/src/hwinfo/doc/hwinfo.8 b/src/hwinfo/doc/hwinfo.8 new file mode 100644 index 0000000000..03bca33152 --- /dev/null +++ b/src/hwinfo/doc/hwinfo.8 @@ -0,0 +1,92 @@ +.\" Michal Svec +.\" +.\" 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 -- +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 - hwinfo +Michal Svec - 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 index 0000000000..419a3289ab --- /dev/null +++ b/src/hwinfo/doc/libhd.doc @@ -0,0 +1,109 @@ +/*! \mainpage libhd documentation + +

Introduction

+ +libhd is a hardware detection lib. + +

Changes

+ +\ref libhd_5_12 + +

Examples

+ +\ref example1 + +\ref example2 + +*/ + + +/*! \page examples Examples + +\ref example1 + +\ref example2 + +
+ +\subsection example1 Get list of SCSI controllers + +\include example1.c + +
+ +\subsection example2 Get primary display controller + +\include example2.c + +*/ + +/*! \page changes Changes + +\ref libhd_5_12 + +
+ +\subsection libhd_5_12 libhd-5.12 + +
    + +
  • changes in \ref hd_t + +
      + +
    • \ref hd_t::bus "bus" is now a struct, use \ref hd_t::bus "bus.id" instead. + +
    • \ref hd_t::base_class "base_class" is now a struct, use \ref hd_t::base_class "base_class.id" instead. + +
    • \ref hd_t::sub_class "sub_class" is now a struct, use \ref hd_t::sub_class "sub_class.id" instead. + +
    • \ref hd_t::prog_if "prog_if" is now a struct, use \ref hd_t::prog_if "prog_if.id" instead. + +
    • \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. + +
    • \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. + +
    • \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. + +
    • \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. + +
    • \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. + +
    • \ref hd_t::compat_vendor "compat_vendor" is a struct replacing compat_vend. + Use \ref hd_t::compat_vendor "compat_vendor.id" now. + +
    • \ref hd_t::compat_device "compat_device" is a struct replacing compat_dev. + Use \ref hd_t::compat_device "compat_device.id" now. + +
    + +
  • interface functions removed + +
      + +
    • hd_bus_name is gone. Use \ref hd_t::bus "bus.name" instead. + +
    • 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. + +
    • hd_vendor_name is gone. Use \ref hd_t::vendor "vendor.name" instead. + +
    • hd_device_name is gone. Use \ref hd_t::device "device.name" instead. + +
    • hd_sub_device_name is gone. Use \ref hd_t::sub_device "sub_device.name" instead. + +
    • hd_find_device_by_name is gone. + +
    + +
+ +
+ +*/ + diff --git a/src/hwinfo/doc/libhd.doxy b/src/hwinfo/doc/libhd.doxy new file mode 100644 index 0000000000..30bc2fa1c6 --- /dev/null +++ b/src/hwinfo/doc/libhd.doxy @@ -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 , where +# is the value of the INPUT_FILTER tag, and 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 index 0000000000..c13cda60da --- /dev/null +++ b/src/hwinfo/gen-hwcfg-disk.sh @@ -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 index 0000000000..1081a6b23f --- /dev/null +++ b/src/hwinfo/getsysinfo @@ -0,0 +1,77 @@ +#! /bin/sh + +if [ "$1" ] ; then + cat </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 index 0000000000..6bcfb25b40 --- /dev/null +++ b/src/hwinfo/hwbootscan @@ -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 index 0000000000..26484eafe3 --- /dev/null +++ b/src/hwinfo/hwbootscan.rc @@ -0,0 +1,101 @@ +#! /bin/sh +# Copyright (c) 2002 SuSE GmbH Nuernberg, Germany. All rights reserved. +# +# Author: Marcus Meissner +# +# /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 index 0000000000..8b32957f35 --- /dev/null +++ b/src/hwinfo/hwinfo.c @@ -0,0 +1,2103 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#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 index 0000000000..75e9a79218 --- /dev/null +++ b/src/hwinfo/hwscan.c @@ -0,0 +1,625 @@ +#include +#include +#include +#include +#include + +#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 index 0000000000..becc07dae5 --- /dev/null +++ b/src/hwinfo/hwscand.c @@ -0,0 +1,257 @@ + +/* hwscan front end + Copyright 2004 by SUSE () */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#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= 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 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) */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#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 ){ + 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 index 0000000000..1e3243c4e2 --- /dev/null +++ b/src/hwinfo/init_message.h @@ -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 index 0000000000..b6443ed059 --- /dev/null +++ b/src/hwinfo/scripts/mci @@ -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() { + 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 index 0000000000..b8e55a167c --- /dev/null +++ b/src/hwinfo/src/Makefile @@ -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 index 0000000000..b4c62b08a1 --- /dev/null +++ b/src/hwinfo/src/hd/Makefile @@ -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 index 0000000000..d71e45eeea --- /dev/null +++ b/src/hwinfo/src/hd/adb.c @@ -0,0 +1,78 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#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 index 0000000000..de686121aa --- /dev/null +++ b/src/hwinfo/src/hd/adb.h @@ -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 index 0000000000..fcdfabdc0c --- /dev/null +++ b/src/hwinfo/src/hd/bios.c @@ -0,0 +1,1014 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#if defined(__i386__) || defined (__x86_64__) || defined(__ia64__) +#include +#endif +typedef unsigned long kernel_ulong_t; +#include +#ifdef __UCLIBC__ +#include +#else +#include +#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 index 0000000000..cdb046f6dc --- /dev/null +++ b/src/hwinfo/src/hd/bios.h @@ -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 index 0000000000..2a8f400785 --- /dev/null +++ b/src/hwinfo/src/hd/block.c @@ -0,0 +1,1578 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "hd.h" +#include "hd_int.h" +#include "hddb.h" +#include "block.h" + +/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + * block device stuff + * + * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + */ + +static void get_block_devs(hd_data_t *hd_data); +static void add_partitions(hd_data_t *hd_data, hd_t *hd, char *path); +static void add_cdrom_info(hd_data_t *hd_data, hd_t *hd); +static void add_other_sysfs_info(hd_data_t *hd_data, hd_t *hd, struct sysfs_device *sf_dev); +static void add_ide_sysfs_info(hd_data_t *hd_data, hd_t *hd, struct sysfs_device *sf_dev); +static void add_scsi_sysfs_info(hd_data_t *hd_data, hd_t *hd, struct sysfs_device *sf_dev); +static void read_partitions(hd_data_t *hd_data); +static void read_cdroms(hd_data_t *hd_data); +static cdrom_info_t *new_cdrom_entry(cdrom_info_t **ci); +static cdrom_info_t *get_cdrom_entry(cdrom_info_t *ci, int n); +static void get_scsi_tape(hd_data_t *hd_data); +static void get_generic_scsi_devs(hd_data_t *hd_data); +static void add_disk_size(hd_data_t *hd_data, hd_t *hd); + + +void hd_scan_sysfs_block(hd_data_t *hd_data) +{ + if(!hd_probe_feature(hd_data, pr_block)) return; + + hd_data->module = mod_block; + + /* some clean-up */ + remove_hd_entries(hd_data); + + hd_data->disks = free_str_list(hd_data->disks); + hd_data->partitions = free_str_list(hd_data->partitions); + hd_data->cdroms = free_str_list(hd_data->cdroms); + + if(hd_probe_feature(hd_data, pr_block_mods)) { + PROGRESS(1, 0, "block modules"); + load_module(hd_data, "ide_cd"); + load_module(hd_data, "sr_mod"); + load_module(hd_data, "sd_mod"); + load_module(hd_data, "st"); + } + + PROGRESS(2, 0, "sysfs drivers"); + + hd_sysfs_driver_list(hd_data); + + PROGRESS(3, 0, "cdrom"); + + read_cdroms(hd_data); + + PROGRESS(4, 0, "partition"); + + read_partitions(hd_data); + + PROGRESS(5, 0, "get sysfs block dev data"); + + get_block_devs(hd_data); + + if(hd_data->cdrom) { + ADD2LOG("oops: cdrom list not empty\n"); + } +} + + +void get_block_devs(hd_data_t *hd_data) +{ + str_list_t *sl; + char *s, *t; + unsigned u1, u2, u3; + uint64_t ul0; + hd_t *hd, *hd1; + hd_dev_num_t dev_num; + + struct sysfs_bus *sf_bus; + struct sysfs_class *sf_class; + struct sysfs_class_device *sf_cdev; + struct sysfs_device *sf_dev; + struct dlist *sf_cdev_list; + struct dlist *sf_ide_list = NULL; + struct sysfs_device *sf_ide; + + sf_bus = sysfs_open_bus("ide"); + if(sf_bus) { + sf_ide_list = sysfs_get_bus_devices(sf_bus); + if(sf_ide_list) dlist_for_each_data(sf_ide_list, sf_ide, struct sysfs_device) { + ADD2LOG( + " ide: bus_id = %s path = %s\n", + sf_ide->bus_id, + hd_sysfs_id(sf_ide->path) + ); + } + } + + sf_class = sysfs_open_class("block"); + + if(!sf_class) { + ADD2LOG("sysfs: no such class: block\n"); + return; + } + + sf_cdev_list = sysfs_get_class_devices(sf_class); + if(sf_cdev_list) dlist_for_each_data(sf_cdev_list, sf_cdev, struct sysfs_class_device) { + ADD2LOG( + " block: name = %s, path = %s\n", + sf_cdev->name, + hd_sysfs_id(sf_cdev->path) + ); + + memset(&dev_num, 0, sizeof dev_num); + + if((s = hd_attr_str(sysfs_get_classdev_attr(sf_cdev, "dev")))) { + if(sscanf(s, "%u:%u", &u1, &u2) == 2) { + dev_num.type = 'b'; + dev_num.major = u1; + dev_num.minor = u2; + dev_num.range = 1; + } + ADD2LOG(" dev = %u:%u\n", u1, u2); + } + + if(hd_attr_uint(sysfs_get_classdev_attr(sf_cdev, "range"), &ul0, 0)) { + dev_num.range = ul0; + ADD2LOG(" range = %u\n", dev_num.range); + } + + sf_dev = sysfs_get_classdev_device(sf_cdev); + if(sf_dev) { + ADD2LOG( + " block device: bus = %s, bus_id = %s driver = %s\n path = %s\n", + sf_dev->bus, + sf_dev->bus_id, + sf_dev->driver_name, + hd_sysfs_id(sf_dev->path) + ); + } + + hd = NULL; + + /* check if disk is DASD and has already been found by s390.c */ + if(sf_dev && sf_dev->driver_name && strstr(sf_dev->driver_name,"dasd")) + { + char bid[9]; + hd_res_t* res; + //fprintf(stderr,"dn %s bi %s\n",sf_dev->driver_name,sf_dev->bus_id); + for(hd=hd_data->hd;hd;hd=hd->next) + { + //fprintf(stderr,"bcid %d\n",hd->base_class.id); + if(hd->base_class.id == bc_storage_device + && hd->detail + && hd->detail->ccw.type == hd_detail_ccw) + { + for(res=hd->res;res;res=res->next) + { + if(res->io.type==res_io) + { + sprintf(bid,"%01x.%01x.%04x", + hd->detail->ccw.data->lcss >> 8, + hd->detail->ccw.data->lcss & 0xff, + (unsigned short)res->io.base); + //fprintf(stderr,"bid %s\n",bid); + if (strcmp(bid,sf_dev->bus_id)==0) goto out; + } + } + } + } + hd=NULL; + out:; + } + else if((sl = search_str_list(hd_data->disks, hd_sysfs_name2_dev(sf_cdev->name)))) { + hd = add_hd_entry(hd_data, __LINE__, 0); + hd->sub_class.id = sc_sdev_disk; + } + else if((sl = search_str_list(hd_data->cdroms, hd_sysfs_name2_dev(sf_cdev->name)))) { + hd = add_hd_entry(hd_data, __LINE__, 0); + hd->sub_class.id = sc_sdev_cdrom; + } + else if( + sf_dev && + sf_dev->bus && + (!strcmp(sf_dev->bus, "scsi") || !strcmp(sf_dev->bus, "ide")) + ) { + hd = add_hd_entry(hd_data, __LINE__, 0); + hd->sub_class.id = sc_sdev_other; + } + + if(hd) { + str_printf(&hd->unix_dev_name, 0, "/dev/%s", hd_sysfs_name2_dev(sf_cdev->name)); + + hd->base_class.id = bc_storage_device; + + hd->sysfs_id = new_str(hd_sysfs_id(sf_cdev->path)); + + if(sf_dev) hd->sysfs_device_link = new_str(hd_sysfs_id(sf_dev->path)); + + hd->unix_dev_num = dev_num; + + hd->bus.id = bus_none; + + if(sf_dev) { + if(sf_dev->bus) { + if(!strcmp(sf_dev->bus, "ide")) hd->bus.id = bus_ide; + else if(!strcmp(sf_dev->bus, "scsi")) hd->bus.id = bus_scsi; + } + hd->sysfs_bus_id = new_str(sf_dev->bus_id); + } + + if(sf_dev && (s = hd_sysfs_id(sf_dev->path))) { + + /* parent has longest matching sysfs id */ + u2 = strlen(s); + for(u3 = 0, hd1 = hd_data->hd; hd1; hd1 = hd1->next) { + if(hd1->sysfs_id) { + u1 = strlen(hd1->sysfs_id); + if(u1 > u3 && u1 <= u2 && !strncmp(s, hd1->sysfs_id, u1)) { + u3 = u1; + hd->attached_to = hd1->idx; + } + } + } + + /* find longest matching sysfs id we have a driver for */ + s = new_str(s); + t = strrchr(s, '/'); + if(t) *t = 0; + t = hd_sysfs_find_driver(hd_data, s, 0); + if(t) { + add_str_list(&hd->drivers, t); + } + s = free_mem(s); + + /* look for ide-scsi handled devices */ + if(hd->bus.id == bus_scsi) { + if(sf_ide_list) dlist_for_each_data(sf_ide_list, sf_ide, struct sysfs_device) { + if( + strcmp(sf_dev->path, sf_ide->path) && + !strncmp(sf_dev->path, sf_ide->path, strlen(sf_ide->path)) && + sscanf(sf_ide->bus_id, "%u.%u", &u1, &u2) == 2 + ) { + str_printf(&hd->unix_dev_name2, 0, "/dev/hd%c", 'a' + (u1 << 1) + u2); + } + } + } + } + + /* + * set hd->drivers before calling any of add_xxx_sysfs_info() + */ + if( + sf_dev && + sf_dev->driver_name && + *sf_dev->driver_name && + strcmp(sf_dev->driver_name, "unknown") + ) { + add_str_list(&hd->drivers, sf_dev->driver_name); + } + + if(hd->bus.id == bus_ide) { + add_ide_sysfs_info(hd_data, hd, sf_dev); + } + else if(hd->bus.id == bus_scsi) { + add_scsi_sysfs_info(hd_data, hd, sf_dev); + } + else { + add_other_sysfs_info(hd_data, hd, sf_dev); + } + + + if(hd->sub_class.id == sc_sdev_cdrom) { + add_cdrom_info(hd_data, hd); + } + + if( + hd->sub_class.id == sc_sdev_disk && + hd_probe_feature(hd_data, pr_block_part) + ) { + add_partitions(hd_data, hd, sf_cdev->path); + } + + } + + } + + sysfs_close_class(sf_class); + + sysfs_close_bus(sf_bus); +} + + +/* + * Find driver for sysfs_id. + * + * Return driver for id (exact = 1) or longest matching id (exact = 0). + */ +char *hd_sysfs_find_driver(hd_data_t *hd_data, char *sysfs_id, int exact) +{ + hd_sysfsdrv_t *sf; + char *t; + unsigned u1, u2, u3; + + if(!sysfs_id || !*sysfs_id) return NULL; + + t = NULL; + + if(exact) { + for(sf = hd_data->sysfsdrv; sf; sf = sf->next) { + if(!strcmp(sysfs_id, sf->device)) { + t = sf->driver; + break; + } + } + } + else { + u2 = strlen(sysfs_id); + u3 = 0; + for(sf = hd_data->sysfsdrv; sf; sf = sf->next) { + u1 = strlen(sf->device); + if(u1 > u3 && u1 <= u2 && !strncmp(sysfs_id, sf->device, u1)) { + u3 = u1; + t = sf->driver; + } + } + } + + return t; +} + + +void add_partitions(hd_data_t *hd_data, hd_t *hd, char *path) +{ + hd_t *hd1; + str_list_t *sl; + char *s; + size_t len; + + s = hd->unix_dev_name + sizeof "/dev/" - 1; + len = strlen(s); + for(sl = hd_data->partitions; sl; sl = sl->next) { + if(!strncmp(sl->str, s, len)) { + hd1 = add_hd_entry(hd_data, __LINE__, 0); + hd1->base_class.id = bc_partition; + str_printf(&hd1->unix_dev_name, 0, "/dev/%s", sl->str); + hd1->attached_to = hd->idx; + + str_printf(&hd1->sysfs_id, 0, "%s/%s", hd->sysfs_id, hd_sysfs_dev2_name(sl->str)); + } + } +} + + +void add_cdrom_info(hd_data_t *hd_data, hd_t *hd) +{ + cdrom_info_t *ci, **prev; + + hd->detail = free_hd_detail(hd->detail); + hd->detail = new_mem(sizeof *hd->detail); + hd->detail->type = hd_detail_cdrom; + + for(ci = *(prev = &hd_data->cdrom); ci; ci = *(prev = &ci->next)) { + if(!strcmp(hd->unix_dev_name + sizeof "/dev/" - 1, ci->name)) { + hd->detail->cdrom.data = ci; + *prev = ci->next; + hd->detail->cdrom.data->next = NULL; + break; + } + } + + if((ci = hd->detail->cdrom.data)) { + /* update prog_if: cdr, cdrw, ... */ + if( + /* ###### FIXME: dosn't work anyway: ide-scsi doesn't support sysfs */ + hd->bus.id == bus_scsi && + !search_str_list(hd->drivers, "ide-scsi") /* could be ide, though */ + ) { + /* scsi devs lie */ + if(ci->dvd && (ci->cdrw || ci->dvdr || ci->dvdram)) { + ci->dvd = ci->dvdr = ci->dvdram = 0; + } + ci->dvdr = ci->dvdram = 0; + ci->cdr = ci->cdrw = 0; + if(hd->prog_if.id == pif_cdr) ci->cdr = 1; + } + + /* trust ide info */ + if(ci->dvd) { + hd->is.dvd = 1; + hd->prog_if.id = pif_dvd; + } + if(ci->cdr) { + hd->is.cdr = 1; + hd->prog_if.id = pif_cdr; + } + if(ci->cdrw) { + hd->is.cdrw = 1; + hd->prog_if.id = pif_cdrw; + } + if(ci->dvdr) { + hd->is.dvdr = 1; + hd->prog_if.id = pif_dvdr; + } + if(ci->dvdram) { + hd->is.dvdram = 1; + hd->prog_if.id = pif_dvdram; + } + } + + if( + hd_probe_feature(hd_data, pr_block_cdrom) && + hd_report_this(hd_data, hd) + ) { + hd_read_cdrom_info(hd_data, hd); + } +} + + +void add_other_sysfs_info(hd_data_t *hd_data, hd_t *hd, struct sysfs_device *sf_dev) +{ + unsigned u0, u1; + char c; + + if(hd->sysfs_id) { + if( + sscanf(hd->sysfs_id, "/block/cciss!c%ud%u", &u0, &u1) == 2 + ) { + hd->slot = (u0 << 8) + u1; + str_printf(&hd->device.name, 0, "CCISS disk %u/%u", u0, u1); + } + else if( + sscanf(hd->sysfs_id, "/block/ida!c%ud%u", &u0, &u1) == 2 + ) { + hd->slot = (u0 << 8) + u1; + str_printf(&hd->device.name, 0, "SMART Array %u/%u", u0, u1); + } + else if( + sscanf(hd->sysfs_id, "/block/rd!c%ud%u", &u0, &u1) == 2 + ) { + hd->slot = (u0 << 8) + u1; + str_printf(&hd->device.name, 0, "DAC960 RAID Array %u/%u", u0, u1); + } + else if( + sscanf(hd->sysfs_id, "/block/i2o!hd%c", &c) == 1 && + c >= 'a' + ) { + hd->slot = c - 'a'; + str_printf(&hd->device.name, 0, "I2O disk %u", hd->slot); + } + else if( + sscanf(hd->sysfs_id, "/block/dasd%c", &c) == 1 && + c >= 'a' + ) { + hd->slot = c - 'a'; + hd->device.name = new_str("S390 Disk"); + } + } + + add_disk_size(hd_data, hd); +} + + +void add_ide_sysfs_info(hd_data_t *hd_data, hd_t *hd, struct sysfs_device *sf_dev) +{ + char *fname = NULL, buf[256], *dev_name, *s; + unsigned u0, u1, u2, size = 0; + str_list_t *sl, *sl0; + hd_res_t *res; + FILE *f; + + if(!hd_report_this(hd_data, hd)) return; + + if(hd->sysfs_bus_id && sscanf(hd->sysfs_bus_id, "%u.%u", &u0, &u1) == 2) { + /* host.master/slave */ + hd->slot = (u0 << 1) + u1; + } + + if( + hd->unix_dev_name && + strlen(hd->unix_dev_name) > 5 + ) { + dev_name = hd->unix_dev_name + 5; + + str_printf(&fname, 0, PROC_IDE "/%s/media", dev_name); + if((sl = read_file(fname, 0, 1))) { + + if(strstr(sl->str, "floppy")) + hd->sub_class.id = sc_sdev_floppy; + else if(strstr(sl->str, "cdrom")) + hd->sub_class.id = sc_sdev_cdrom; + else if(strstr(sl->str, "tape")) + hd->sub_class.id = sc_sdev_tape; + + free_str_list(sl); + } + + str_printf(&fname, 0, PROC_IDE "/%s/model", dev_name); + if((sl = read_file(fname, 0, 1))) { + hd->vendor.name = canon_str(sl->str, strlen(sl->str)); + if((s = strchr(hd->vendor.name, ' '))) { + hd->device.name = canon_str(s, strlen(s)); + if(*hd->device.name) { + *s = 0; + } + else { + hd->device.name = free_mem(hd->device.name); + } + } + if(!hd->device.name) { + hd->device.name = hd->vendor.name; + hd->vendor.name = NULL; + } + + free_str_list(sl); + } + + str_printf(&fname, 0, PROC_IDE "/%s/driver", dev_name); + if((sl = read_file(fname, 0, 1))) { + if((s = strchr(sl->str, ' '))) *s = 0; + s = canon_str(sl->str, strlen(sl->str)); + add_str_list(&hd->drivers, s); + s = free_mem(s); + free_str_list(sl); + } + + str_printf(&fname, 0, PROC_IDE "/%s/capacity", dev_name); + if((sl = read_file(fname, 0, 1))) { + if(sscanf(sl->str, "%u", &u0) == 1 && u0 != 0x7fffffff) { + res = add_res_entry(&hd->res, new_mem(sizeof *res)); + res->size.type = res_size; + res->size.unit = size_unit_sectors; + res->size.val1 = size = u0; + res->size.val2 = 512; // ####### FIXME: sector size? + } + free_str_list(sl); + } + + str_printf(&fname, 0, PROC_IDE "/%s/geometry", dev_name); + if((sl0 = read_file(fname, 0, 2))) { + for(sl = sl0; sl; sl = sl->next) { + if(sscanf(sl->str, " physical %u / %u / %u", &u0, &u1, &u2) == 3) { + if(u0 || u1 || u2) { + if(size && u1 && u2) { + u0 = size / (u1 * u2); + } + res = add_res_entry(&hd->res, new_mem(sizeof *res)); + res->disk_geo.type = res_disk_geo; + res->disk_geo.cyls = u0; + res->disk_geo.heads = u1; + res->disk_geo.sectors = u2; + res->disk_geo.geotype = geo_physical; + } + continue; + } + + if(sscanf(sl->str, " logical %u / %u / %u", &u0, &u1, &u2) == 3) { + if(size && u1 && u2) { + u0 = size / (u1 * u2); + } + res = add_res_entry(&hd->res, new_mem(sizeof *res)); + res->disk_geo.type = res_disk_geo; + res->disk_geo.cyls = u0; + res->disk_geo.heads = u1; + res->disk_geo.sectors = u2; + res->disk_geo.geotype = geo_logical; + } + } + free_str_list(sl0); + } + + str_printf(&fname, 0, PROC_IDE "/%s/cache", dev_name); + if((sl = read_file(fname, 0, 1))) { + if(sscanf(sl->str, "%u", &u0) == 1 && u0) { + res = add_res_entry(&hd->res, new_mem(sizeof *res)); + res->cache.type = res_cache; + res->cache.size = u0; + } + free_str_list(sl); + } + + str_printf(&fname, 0, PROC_IDE "/%s/identify", dev_name); + if((f = fopen(fname, "r"))) { + u1 = 0; + memset(buf, sizeof buf, 0); + while(u1 < sizeof buf - 1 && fscanf(f, "%x", &u0) == 1) { + buf[u1++] = u0 >> 8; buf[u1++] = u0; + } + fclose(f); + + /* ok, we now have the ATA/ATAPI ident block */ + + if(buf[0x14] || buf[0x15]) { /* has serial id */ + hd->serial = canon_str(buf + 0x14, 20); + } + if(buf[0x2e] || buf[0x2f]) { /* has revision id */ + hd->revision.name = canon_str(buf + 0x2e, 8); + } + } + + free_mem(fname); + } + + if(!size) add_disk_size(hd_data, hd); +} + + +/* + * assumes hd->drivers aleady includes scsi device drivers (like 'sd') + */ +void add_scsi_sysfs_info(hd_data_t *hd_data, hd_t *hd, struct sysfs_device *sf_dev) +{ + hd_t *hd1; + char *s, *t, *cs, *pr_str; + unsigned u0, u1, u2, u3; + int fd, k; + unsigned char scsi_cmd_buf[0x300]; + struct sg_io_hdr hdr; + unsigned char *uc; + scsi_t *scsi; + hd_res_t *geo, *size; + uint64_t ul0; + + if(!hd_report_this(hd_data, hd)) return; + + hd->detail = new_mem(sizeof *hd->detail); + hd->detail->type = hd_detail_scsi; + hd->detail->scsi.data = scsi = new_mem(sizeof *scsi); + + if(hd->sysfs_bus_id && sscanf(hd->sysfs_bus_id, "%u:%u:%u:%u", &u0, &u1, &u2, &u3) == 4) { + /* host:channel:id:lun */ + hd->slot = (u0 << 8) + (u1 << 4) + u2; + hd->func = u3; + } + + if((s = hd_attr_str(sysfs_get_device_attr(sf_dev, "vendor")))) { + cs = canon_str(s, strlen(s)); + ADD2LOG(" vendor = %s\n", cs); + if(*cs) { + hd->vendor.name = cs; + } + else { + free_mem(cs); + } + } + + if((s = hd_attr_str(sysfs_get_device_attr(sf_dev, "model")))) { + cs = canon_str(s, strlen(s)); + ADD2LOG(" model = %s\n", cs); + if(*cs) { + hd->device.name = cs; + } + else { + free_mem(cs); + } + + /* sata entries are somewhat strange... */ + if( + hd->vendor.name && + !strcmp(hd->vendor.name, "ATA") && + hd->device.name + ) { + hd->bus.id = bus_ide; + + if((cs = strchr(hd->device.name, ' '))) { + t = canon_str(cs, strlen(cs)); + if(*t) { + *cs = 0; + free_mem(hd->vendor.name); + hd->vendor.name = hd->device.name; + hd->device.name = t; + } + else { + t = free_mem(t); + } + } + + if(!strcmp(hd->vendor.name, "ATA")) { + hd->vendor.name = free_mem(hd->vendor.name); + } + } + } + + if((s = hd_attr_str(sysfs_get_device_attr(sf_dev, "rev")))) { + cs = canon_str(s, strlen(s)); + ADD2LOG(" rev = %s\n", cs); + if(*cs) { + hd->revision.name = cs; + } + else { + free_mem(cs); + } + } + + if(hd_attr_uint(sysfs_get_device_attr(sf_dev, "type"), &ul0, 0)) { + ADD2LOG(" type = %u\n", (unsigned) ul0); + if(ul0 == 6 /* scanner */) { + hd->sub_class.id = sc_sdev_scanner; + } + else if(ul0 == 3 /* processor */ && hd->vendor.name) { + if( + !strncmp(hd->vendor.name, "HP", sizeof "HP" - 1) || + !strncmp(hd->vendor.name, "EPSON", sizeof "EPSON" - 1) + ) { + hd->sub_class.id = sc_sdev_scanner; + } + } + + /* + * typically needed for usb card readers (unused slots) + */ + if( + hd->base_class.id == bc_storage_device && + hd->sub_class.id == sc_sdev_other + ) { + switch(ul0) { + case 0: + if(search_str_list(hd->drivers, "sd")) { + hd->sub_class.id = sc_sdev_disk; + } + break; + + case 5: + if(search_str_list(hd->drivers, "sr")) { + hd->sub_class.id = sc_sdev_cdrom; + } + break; + } + } + + } + + /* s390: wwpn & fcp lun */ + if(hd_attr_uint(sysfs_get_device_attr(sf_dev, "wwpn"), &ul0, 0)) { + ADD2LOG(" wwpn = 0x%016"PRIx64"\n", ul0); + scsi->wwpn = ul0; + + /* it's a bit of a hack, actually */ + t = new_str(hd_sysfs_id(sf_dev->path)); + if(t) { + if((s = strrchr(t, '/'))) *s = 0; + if((s = strrchr(t, '/'))) *s = 0; + if((s = strrchr(t, '/'))) { + scsi->controller_id = new_str(s + 1); + } + } + t = free_mem(t); + } + + if(hd_attr_uint(sysfs_get_device_attr(sf_dev, "fcp_lun"), &ul0, 0)) { + ADD2LOG(" fcp_lun = 0x%016"PRIx64"\n", ul0); + scsi->fcp_lun = ul0; + } + + /* ppc: get rom id */ + if((hd1 = hd_get_device_by_idx(hd_data, hd->attached_to)) && hd1->rom_id) { + str_printf(&hd->rom_id, 0, "%s/@%u", hd1->rom_id, (hd->slot & 0xf)); + } + + pr_str = NULL; + + if( + hd_report_this(hd_data, hd) && + hd->unix_dev_name && + hd->sub_class.id == sc_sdev_cdrom && + hd_data->in_vmware != 1 /* VMWare doesn't like it */ + ) { + PROGRESS(5, 0, hd->unix_dev_name); + fd = open(hd->unix_dev_name, O_RDONLY | O_NONBLOCK); + if(fd >= 0) { + + str_printf(&pr_str, 0, "%s cache", hd->unix_dev_name); + PROGRESS(5, 1, pr_str); + + memset(scsi_cmd_buf, 0, sizeof scsi_cmd_buf); + memset(&hdr, 0, sizeof(hdr)); + + hdr.interface_id = 'S'; + hdr.cmd_len = 6; + hdr.dxfer_direction = SG_DXFER_FROM_DEV; + hdr.dxferp = scsi_cmd_buf + 8 + 6; + hdr.dxfer_len = 0xff; + hdr.cmdp = scsi_cmd_buf + 8; + hdr.cmdp[0] = 0x1a; + hdr.cmdp[2] = 0x08; + hdr.cmdp[4] = 0xff; + + k = ioctl(fd, SG_IO, &hdr); + + if(k) { + ADD2LOG("%s status(0x1a:8) 0x%x\n", hd->unix_dev_name, k); + } + else { + unsigned char *ptr = hdr.dxferp; + + uc = ptr + 4 + ptr[3] + 2; + scsi->cache = uc[0]; + ADD2LOG(" scsi cache: 0x%02x\n", uc[0]); + + if((scsi->cache & 4)) { + hd->prog_if.id = pif_cdr; + } + } + + close(fd); + } + } + + + if( + hd_report_this(hd_data, hd) && + hd->unix_dev_name && + hd->sub_class.id == sc_sdev_disk && + !hd_probe_feature(hd_data, pr_scsi_noserial) + ) { + PROGRESS(5, 0, hd->unix_dev_name); + fd = open(hd->unix_dev_name, O_RDONLY | O_NONBLOCK); + if(fd >= 0) { + + str_printf(&pr_str, 0, "%s geo", hd->unix_dev_name); + PROGRESS(5, 1, pr_str); + + if(hd_getdisksize(hd_data, hd->unix_dev_name, fd, &geo, &size) == 1) { + /* (low-level) unformatted disk */ + hd->is.notready = 1; + } + + if(geo) add_res_entry(&hd->res, geo); + if(size) add_res_entry(&hd->res, size); + + str_printf(&pr_str, 0, "%s serial", hd->unix_dev_name); + PROGRESS(5, 2, pr_str); + + memset(scsi_cmd_buf, 0, sizeof scsi_cmd_buf); + memset(&hdr, 0, sizeof(hdr)); + + hdr.interface_id = 'S'; + hdr.cmd_len = 6; + hdr.dxfer_direction = SG_DXFER_FROM_DEV; + hdr.dxferp = scsi_cmd_buf + 8 + 6; + hdr.dxfer_len = 0x24; + hdr.cmdp = scsi_cmd_buf + 8; + hdr.cmdp[0] = 0x12; + hdr.cmdp[1] = 0x01; + hdr.cmdp[2] = 0x80; + hdr.cmdp[4] = 0x24; + + k = ioctl(fd, SG_IO, &hdr); + + if(k) { + ADD2LOG("%s status(0x12) 0x%x\n", scsi->dev_name, k); + } + else { + unsigned char *ptr = hdr.dxferp; + + ADD2LOG(" serial id len: %u\n", ptr[3]); + + if((hd->serial = canon_str(ptr + 4, ptr[3]))) { + if(!*hd->serial) hd->serial = free_mem(hd->serial); + } + } + + close(fd); + } + } + + pr_str = free_mem(pr_str); + + + if( + hd->base_class.id == bc_storage_device && + hd->sub_class.id == sc_sdev_scanner + ) { + hd->base_class.id = bc_scanner; + } + + // ###### FIXME: usb-storage: disk vs. floppy? + +} + + +void read_partitions(hd_data_t *hd_data) +{ + str_list_t *sl, *sl0, *pl0 = NULL; + char buf[256], *s1, *name, *base; + char *last_base = new_str(" "); + char *last_name = new_str(" "); + int l, is_disk; + + if(!(sl0 = read_file(PROC_PARTITIONS, 2, 0))) return; + + if(hd_data->debug) { + ADD2LOG("----- "PROC_PARTITIONS" -----\n"); + for(sl = sl0; sl; sl = sl->next) { + ADD2LOG(" %s", sl->str); + } + ADD2LOG("----- "PROC_PARTITIONS" end -----\n"); + } + + for(sl = sl0; sl; sl = sl->next) { + *buf = 0; + if(sscanf(sl->str, "%*s %*s %*s %255s", buf) > 0) { + if(*buf) add_str_list(&pl0, buf); + } + } + + free_str_list(sl0); + + for(is_disk = 1, sl = pl0; sl; sl = sl->next) { + base = sl->str; + l = strlen(base); + if(!l) continue; + + s1 = base + l - 1; + while(isdigit(*s1) && s1 > base) s1--; + if(s1 == base) continue; + + name = new_str(base); + s1[1] = 0; + + if(!strcmp(last_base, base)) { + if(!strcmp(last_name, base)) is_disk = 0; + } + else { + is_disk = strncmp(last_name, base, strlen(last_name)) ? 1 : 0; + } + + if(!search_str_list(hd_data->cdroms, name)) { + if( + strncmp(name, "loop", sizeof "loop" - 1) && + ( + hd_data->flags.list_md || + ( + strncmp(name, "md", sizeof "md" - 1) && + strncmp(name, "dm-", sizeof "dm-" - 1) + ) + ) + ) { + add_str_list(is_disk ? &hd_data->disks : &hd_data->partitions, name); + } + } + free_mem(last_base); + free_mem(last_name); + + last_base = new_str(base); + last_name = name; name = NULL; + } + + free_mem(last_base); + free_mem(last_name); + + free_str_list(pl0); + + if(hd_data->debug) { + ADD2LOG("disks:\n"); + for(sl = hd_data->disks; sl; sl = sl->next) ADD2LOG(" %s\n", sl->str); + ADD2LOG("partitions:\n"); + for(sl = hd_data->partitions; sl; sl = sl->next) ADD2LOG(" %s\n", sl->str); + } +} + + +/* + * Read iso9660/el torito info, if there is a CD inserted. + * Returns NULL if nothing was found + */ +cdrom_info_t *hd_read_cdrom_info(hd_data_t *hd_data, hd_t *hd) +{ + int fd; + char *s; + cdrom_info_t *ci; + struct iso_primary_descriptor iso_desc; + unsigned char sector[0x800]; + unsigned et; + unsigned u0, u1, u2; + +#ifdef LIBHD_MEMCHECK + { + if(libhd_log) + fprintf(libhd_log, "; %s\t%p\t%p\n", __FUNCTION__, CALLED_FROM(hd_read_cdrom_info, hd_data), hd_data); + } +#endif + + /* free existing entry */ + if(hd->detail && hd->detail->type != hd_detail_cdrom) { + hd->detail = free_hd_detail(hd->detail); + } + + if(!hd->detail) { + hd->detail = new_mem(sizeof *hd->detail); + hd->detail->type = hd_detail_cdrom; + hd->detail->cdrom.data = new_mem(sizeof *hd->detail->cdrom.data); + } + + ci = hd->detail->cdrom.data; + + hd->is.notready = 0; + + if((fd = open(hd->unix_dev_name, O_RDONLY)) < 0) { + /* we are here if there is no CD in the drive */ + hd->is.notready = 1; + return NULL; + } + + ci->iso9660.ok = 0; + if( + lseek(fd, 0x8000, SEEK_SET) >= 0 && + read(fd, &iso_desc, sizeof iso_desc) == sizeof iso_desc + ) { + ci->cdrom = 1; + if(!memcmp(iso_desc.id, "CD001", 5)) { + ci->iso9660.ok = 1; + /* now, fill in the fields */ + s = canon_str(iso_desc.volume_id, sizeof iso_desc.volume_id); + if(!*s) s = free_mem(s); + ci->iso9660.volume = s; + + s = canon_str(iso_desc.publisher_id, sizeof iso_desc.publisher_id); + if(!*s) s = free_mem(s); + ci->iso9660.publisher = s; + + s = canon_str(iso_desc.preparer_id, sizeof iso_desc.preparer_id); + if(!*s) s = free_mem(s); + ci->iso9660.preparer = s; + + s = canon_str(iso_desc.application_id, sizeof iso_desc.application_id); + if(!*s) s = free_mem(s); + ci->iso9660.application = s; + + s = canon_str(iso_desc.creation_date, sizeof iso_desc.creation_date); + if(!*s) s = free_mem(s); + ci->iso9660.creation_date = s; + } + } + + if( + ci->iso9660.ok && + lseek(fd, 0x8800, SEEK_SET) >= 0 && + read(fd, §or, sizeof sector) == sizeof sector + ) { + if( + sector[0] == 0 && sector[6] == 1 && + !memcmp(sector + 1, "CD001", 5) && + !memcmp(sector + 7, "EL TORITO SPECIFICATION", 23) + ) { + et = sector[0x47] + (sector[0x48] << 8) + (sector[0x49] << 16) + (sector[0x4a] << 24); + ADD2LOG(" %s: el torito boot catalog at 0x%04x\n", ci->name, et); + if( + lseek(fd, et * 0x800, SEEK_SET) >= 0 && + read(fd, §or, sizeof sector) == sizeof sector && + sector[0] == 1 + ) { + ci->el_torito.ok = 1; + ci->el_torito.catalog = et; + ci->el_torito.platform = sector[1]; + s = canon_str(sector + 4, 24); + if(!*s) s = free_mem(s); + ci->el_torito.id_string = s; + ci->el_torito.bootable = sector[0x20] == 0x88 ? 1 : 0; + ci->el_torito.media_type = sector[0x21]; + ADD2LOG(" media type: %u\n", ci->el_torito.media_type); + ci->el_torito.load_address = (sector[0x22] + (sector[0x23] << 8)) << 4; + ADD2LOG(" load address: 0x%04x\n", ci->el_torito.load_address); +#if 0 + if(ci->el_torito.platform == 0 && ci->el_torito.load_address == 0) + ci->el_torito.load_address = 0x7c00; +#endif + ci->el_torito.load_count = sector[0x26] + (sector[0x27] << 8); + ci->el_torito.start = sector[0x28] + (sector[0x29] << 8) + (sector[0x2a] << 16) + (sector[0x2b] << 24); + if(ci->el_torito.media_type >= 1 && ci->el_torito.media_type <= 3) { + ci->el_torito.geo.c = 80; + ci->el_torito.geo.h = 2; + } + switch(ci->el_torito.media_type) { + case 1: + ci->el_torito.geo.s = 15; + break; + case 2: + ci->el_torito.geo.s = 18; + break; + case 3: + ci->el_torito.geo.s = 36; + break; + } + if( + lseek(fd, ci->el_torito.start * 0x800, SEEK_SET) >= 0 && + read(fd, §or, sizeof sector) == sizeof sector + ) { + if(ci->el_torito.media_type == 4) { + /* ##### we should go on and read the 1st partition sector in this case... */ + ci->el_torito.geo.h = (unsigned) sector[0x1be + 5] + 1; + ci->el_torito.geo.s = sector[0x1be + 6] & 0x3f; + ci->el_torito.geo.c = sector[0x1be + 7] + (((unsigned) sector[0x1be + 6] >> 6) << 8); + } + if( + sector[0x1fe] == 0x55 && sector[0x1ff] == 0xaa && + sector[0x0b] == 0 && sector[0x0c] == 2 && + sector[0x0e] == 1 && sector[0x0f] == 0 + ) { + u0 = sector[0x13] + (sector[0x14] << 8); /* partition size */ + u1 = sector[0x18] + (sector[0x19] << 8); /* sectors per track */ + u2 = sector[0x1a] + (sector[0x1b] << 8); /* heads */ + u0 = u0 ? u0 : sector[0x20] + (sector[0x21] << 8) + (sector[0x22] << 16) + ((unsigned) sector[0x23] << 24); + if(sector[0x26] == 0x29) { + s = canon_str(sector + 0x2b, 11); + if(!*s) s = free_mem(s); + ci->el_torito.label = s; + } + if(!ci->el_torito.label) { + s = canon_str(sector + 3, 8); + if(!*s) s = free_mem(s); + ci->el_torito.label = s; + } + if( + (ci->el_torito.media_type == 0 || ci->el_torito.media_type > 3) && + u0 && u1 && u2 + ) { + ci->el_torito.geo.h = u2; + ci->el_torito.geo.s = u1; + ci->el_torito.geo.size = u0; + ci->el_torito.geo.c = ci->el_torito.geo.size / (u1 * u2); + } + } + } + + ci->el_torito.geo.size = ci->el_torito.geo.s * ci->el_torito.geo.c * ci->el_torito.geo.h; + } + } + } + + close(fd); + + return ci; +} + + +/* + * Read the list of CDROM devices known to the kernel. The info is taken + * from /proc/sys/dev/cdrom/info. + */ +void read_cdroms(hd_data_t *hd_data) +{ + char *s, *t, *v; + str_list_t *sl, *sl0; + cdrom_info_t *ci; + int i, line, entries = 0; + unsigned val; + + if(!(sl0 = read_file(PROC_CDROM_INFO, 2, 0))) return; + + if((hd_data->debug & HD_DEB_CDROM)) { + ADD2LOG("----- "PROC_CDROM_INFO" -----\n"); + for(sl = sl0; sl; sl = sl->next) { + if(*sl->str != '\n') ADD2LOG("%s", sl->str); + } + ADD2LOG("----- "PROC_CDROM_INFO" end -----\n"); + } + + for(sl = sl0; sl; sl = sl->next) { + if( + (line = 0, strstr(sl->str, "drive name:") == sl->str) || + (line++, strstr(sl->str, "drive speed:") == sl->str) || + (line++, strstr(sl->str, "Can write CD-R:") == sl->str) || + (line++, strstr(sl->str, "Can write CD-RW:") == sl->str) || + (line++, strstr(sl->str, "Can read DVD:") == sl->str) || + (line++, strstr(sl->str, "Can write DVD-R:") == sl->str) || + (line++, strstr(sl->str, "Can write DVD-RAM:") == sl->str) + ) { + s = strchr(sl->str, ':') + 1; + i = 0; + while((t = strsep(&s, " \t\n"))) { + if(!*t) continue; + i++; + switch(line) { + case 0: /* drive name */ + ci = new_cdrom_entry(&hd_data->cdrom); + entries++; + add_str_list(&hd_data->cdroms, t); + ci->name = new_str(t); + break; + + case 1: /* drive speed */ + case 2: /* Can write CD-R */ + case 3: /* Can write CD-RW */ + case 4: /* Can read DVD */ + case 5: /* Can write DVD-R */ + case 6: /* Can write DVD-RAM */ + ci = get_cdrom_entry(hd_data->cdrom, entries - i); + if(ci) { + val = strtoul(t, &v, 10); + if(!*v) { + switch(line) { + case 1: + ci->speed = val; + break; + case 2: + ci->cdr = val; + break; + case 3: + ci->cdrw = val; + break; + case 4: + ci->dvd = val; + break; + case 5: + ci->dvdr = val; + break; + case 6: + ci->dvdram = val; + break; + } + } + } + break; + } + } + } + } + + free_str_list(sl0); +} + + +/* add new entries at the _start_ of the list */ +cdrom_info_t *new_cdrom_entry(cdrom_info_t **ci) +{ + cdrom_info_t *new_ci = new_mem(sizeof *new_ci); + + new_ci->next = *ci; + return *ci = new_ci; +} + + +/* return nth entry */ +cdrom_info_t *get_cdrom_entry(cdrom_info_t *ci, int n) +{ + if(n < 0) return NULL; + + while(n--) { + if(!ci) return NULL; + ci = ci->next; + } + + return ci; +} + + +/* + * Add generic scsi devs. + */ +void hd_scan_sysfs_scsi(hd_data_t *hd_data) +{ + if(!hd_probe_feature(hd_data, pr_scsi)) return; + + hd_data->module = mod_scsi; + + /* some clean-up */ + remove_hd_entries(hd_data); + + PROGRESS(1, 0, "scsi modules"); + + load_module(hd_data, "sg"); + + PROGRESS(2, 0, "scsi tape"); + + get_scsi_tape(hd_data); + + PROGRESS(3, 0, "scsi generic"); + + get_generic_scsi_devs(hd_data); +} + + +void get_scsi_tape(hd_data_t *hd_data) +{ + char *s, *t; + unsigned u1, u2, u3; + uint64_t ul0; + hd_t *hd, *hd1; + hd_dev_num_t dev_num; + + struct sysfs_class *sf_class; + struct sysfs_class_device *sf_cdev; + struct sysfs_device *sf_dev; + struct dlist *sf_cdev_list; + + sf_class = sysfs_open_class("scsi_tape"); + + if(!sf_class) { + ADD2LOG("sysfs: no such class: scsi_tape\n"); + return; + } + + sf_cdev_list = sysfs_get_class_devices(sf_class); + if(sf_cdev_list) dlist_for_each_data(sf_cdev_list, sf_cdev, struct sysfs_class_device) { + ADD2LOG( + " scsi tape: name = %s, path = %s\n", + sf_cdev->name, + hd_sysfs_id(sf_cdev->path) + ); + + memset(&dev_num, 0, sizeof dev_num); + + if((s = hd_attr_str(sysfs_get_classdev_attr(sf_cdev, "dev")))) { + if(sscanf(s, "%u:%u", &u1, &u2) == 2) { + dev_num.type = 'c'; + dev_num.major = u1; + dev_num.minor = u2; + dev_num.range = 1; + } + ADD2LOG(" dev = %u:%u\n", u1, u2); + } + + if(hd_attr_uint(sysfs_get_classdev_attr(sf_cdev, "range"), &ul0, 0)) { + dev_num.range = ul0; + ADD2LOG(" range = %u\n", dev_num.range); + } + + sf_dev = sysfs_get_classdev_device(sf_cdev); + if(sf_dev) { + s = hd_sysfs_id(sf_dev->path); + ADD2LOG( + " scsi device: bus = %s, bus_id = %s driver = %s\n path = %s\n", + sf_dev->bus, + sf_dev->bus_id, + sf_dev->driver_name, + s + ); + + for(hd = hd_data->hd; hd; hd = hd->next) { + if( + hd->module == hd_data->module && + hd->sysfs_device_link && + hd->base_class.id == bc_storage_device && + hd->sub_class.id == sc_sdev_tape && + s && + !strcmp(hd->sysfs_device_link, s) + ) break; + } + + if(!hd) { + hd = add_hd_entry(hd_data, __LINE__, 0); + hd->base_class.id = bc_storage_device; + hd->sub_class.id = sc_sdev_tape; + + hd->bus.id = bus_scsi; + + hd->sysfs_device_link = new_str(s); + + hd->sysfs_bus_id = new_str(sf_dev->bus_id); + + /* parent has longest matching sysfs id */ + u2 = strlen(s); + for(u3 = 0, hd1 = hd_data->hd; hd1; hd1 = hd1->next) { + if(hd1->sysfs_id) { + u1 = strlen(hd1->sysfs_id); + if(u1 > u3 && u1 <= u2 && !strncmp(s, hd1->sysfs_id, u1)) { + u3 = u1; + hd->attached_to = hd1->idx; + } + } + } + + /* find longest matching sysfs id we have a driver for */ + s = new_str(s); + t = strrchr(s, '/'); + if(t) *t = 0; + t = hd_sysfs_find_driver(hd_data, s, 0); + if(t) { + add_str_list(&hd->drivers, t); + } + s = free_mem(s); + + if( + sf_dev->driver_name && + *sf_dev->driver_name && + strcmp(sf_dev->driver_name, "unknown") + ) { + add_str_list(&hd->drivers, sf_dev->driver_name); + } + + add_scsi_sysfs_info(hd_data, hd, sf_dev); + } + + s = hd_sysfs_name2_dev(sf_cdev->name); + + if(!hd->unix_dev_name || strlen(s) + sizeof "/dev/" - 1 < strlen(hd->unix_dev_name)) { + str_printf(&hd->unix_dev_name, 0, "/dev/%s", s); + hd->unix_dev_num = dev_num; + free_mem(hd->sysfs_id); + hd->sysfs_id = new_str(hd_sysfs_id(sf_cdev->path)); + } + } + } + + sysfs_close_class(sf_class); +} + + +void get_generic_scsi_devs(hd_data_t *hd_data) +{ + char *s, *t; + unsigned u1, u2, u3; + uint64_t ul0; + hd_t *hd, *hd1; + hd_dev_num_t dev_num; + + struct sysfs_class *sf_class; + struct sysfs_class_device *sf_cdev; + struct sysfs_device *sf_dev; + struct dlist *sf_cdev_list; + + sf_class = sysfs_open_class("scsi_generic"); + + if(!sf_class) { + ADD2LOG("sysfs: no such class: scsi_generic\n"); + return; + } + + sf_cdev_list = sysfs_get_class_devices(sf_class); + if(sf_cdev_list) dlist_for_each_data(sf_cdev_list, sf_cdev, struct sysfs_class_device) { + ADD2LOG( + " scsi: name = %s, path = %s\n", + sf_cdev->name, + hd_sysfs_id(sf_cdev->path) + ); + + memset(&dev_num, 0, sizeof dev_num); + + if((s = hd_attr_str(sysfs_get_classdev_attr(sf_cdev, "dev")))) { + if(sscanf(s, "%u:%u", &u1, &u2) == 2) { + dev_num.type = 'c'; + dev_num.major = u1; + dev_num.minor = u2; + dev_num.range = 1; + } + ADD2LOG(" dev = %u:%u\n", u1, u2); + } + + if(hd_attr_uint(sysfs_get_classdev_attr(sf_cdev, "range"), &ul0, 0)) { + dev_num.range = ul0; + ADD2LOG(" range = %u\n", dev_num.range); + } + + sf_dev = sysfs_get_classdev_device(sf_cdev); + if(sf_dev) { + s = hd_sysfs_id(sf_dev->path); + + ADD2LOG( + " scsi device: bus = %s, bus_id = %s driver = %s\n path = %s\n", + sf_dev->bus, + sf_dev->bus_id, + sf_dev->driver_name, + s + ); + } + + for(hd = hd_data->hd; hd; hd = hd->next) { + if( + hd->sysfs_device_link && + hd->bus.id == bus_scsi && + s && + !strcmp(hd->sysfs_device_link, s) + ) break; + } + + if(hd) { + if(!hd->unix_dev_name2) { + str_printf(&hd->unix_dev_name2, 0, "/dev/%s", hd_sysfs_name2_dev(sf_cdev->name)); + hd->unix_dev_num2 = dev_num; + } + } + + hd = NULL; + + if( + sf_dev && + sf_dev->driver_name && + !strcmp(sf_dev->driver_name, "unknown") + ) { + hd = add_hd_entry(hd_data, __LINE__, 0); + hd->base_class.id = bc_storage_device; + hd->sub_class.id = sc_sdev_other; + + str_printf(&hd->unix_dev_name, 0, "/dev/%s", hd_sysfs_name2_dev(sf_cdev->name)); + + hd->bus.id = bus_scsi; + + hd->sysfs_id = new_str(hd_sysfs_id(sf_cdev->path)); + + hd->unix_dev_num = dev_num; + + if(sf_dev) hd->sysfs_bus_id = new_str(sf_dev->bus_id); + + if(sf_dev && (s = hd_sysfs_id(sf_dev->path))) { + + /* parent has longest matching sysfs id */ + u2 = strlen(s); + for(u3 = 0, hd1 = hd_data->hd; hd1; hd1 = hd1->next) { + if(hd1->sysfs_id) { + u1 = strlen(hd1->sysfs_id); + if(u1 > u3 && u1 <= u2 && !strncmp(s, hd1->sysfs_id, u1)) { + u3 = u1; + hd->attached_to = hd1->idx; + } + } + } + + /* find longest matching sysfs id we have a driver for */ + s = new_str(s); + t = strrchr(s, '/'); + if(t) *t = 0; + t = hd_sysfs_find_driver(hd_data, s, 0); + if(t) { + add_str_list(&hd->drivers, t); + } + s = free_mem(s); + + } + + add_scsi_sysfs_info(hd_data, hd, sf_dev); + + } + + } + + sysfs_close_class(sf_class); +} + + +void add_disk_size(hd_data_t *hd_data, hd_t *hd) +{ + hd_res_t *geo, *size; + int fd; + char *pr_str; + + pr_str = NULL; + + if( + hd->unix_dev_name && + hd->sub_class.id == sc_sdev_disk + ) { + PROGRESS(5, 0, hd->unix_dev_name); + fd = open(hd->unix_dev_name, O_RDONLY | O_NONBLOCK); + if(fd >= 0) { + + str_printf(&pr_str, 0, "%s geo", hd->unix_dev_name); + PROGRESS(5, 1, pr_str); + + if(hd_getdisksize(hd_data, hd->unix_dev_name, fd, &geo, &size) == 1) { + /* (low-level) unformatted disk */ + hd->is.notready = 1; + } + + if(geo) add_res_entry(&hd->res, geo); + if(size) add_res_entry(&hd->res, size); + + close(fd); + } + } + + pr_str = free_mem(pr_str); +} + + diff --git a/src/hwinfo/src/hd/block.h b/src/hwinfo/src/hd/block.h new file mode 100644 index 0000000000..d3dad4360d --- /dev/null +++ b/src/hwinfo/src/hd/block.h @@ -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 index 0000000000..5095c28709 --- /dev/null +++ b/src/hwinfo/src/hd/braille.c @@ -0,0 +1,455 @@ +#include +#include +#include +#include +#include +#include + +#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 + * 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 + * 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 + * 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 + * 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 index 0000000000..7c5496e477 --- /dev/null +++ b/src/hwinfo/src/hd/braille.h @@ -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 index 0000000000..e8f4fd81f2 --- /dev/null +++ b/src/hwinfo/src/hd/cpu.c @@ -0,0 +1,777 @@ +#include +#include +#include +#include + +#ifdef __ia64__ +#include +#include +#include +#include +#endif + +#ifdef __powerpc__ +#include +#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 index 0000000000..1ff02fa928 --- /dev/null +++ b/src/hwinfo/src/hd/cpu.h @@ -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 index 0000000000..6a4c693b6f --- /dev/null +++ b/src/hwinfo/src/hd/edd.c @@ -0,0 +1,242 @@ +#include +#include +#include +#include +#include +#include +#include + +#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 index 0000000000..c931ff82fb --- /dev/null +++ b/src/hwinfo/src/hd/edd.h @@ -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 index 0000000000..62e3148f0d --- /dev/null +++ b/src/hwinfo/src/hd/fb.c @@ -0,0 +1,136 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#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 index 0000000000..08b77ab225 --- /dev/null +++ b/src/hwinfo/src/hd/fb.h @@ -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 index 0000000000..3c34feb50f --- /dev/null +++ b/src/hwinfo/src/hd/floppy.c @@ -0,0 +1,162 @@ +#include +#include +#include +#include +#include +#include +#include + +#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 index 0000000000..c12815a139 --- /dev/null +++ b/src/hwinfo/src/hd/floppy.h @@ -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 index 0000000000..8db54e3f84 --- /dev/null +++ b/src/hwinfo/src/hd/hd.c @@ -0,0 +1,5684 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +typedef unsigned long kernel_ulong_t; +#include +#include +#include +#define _LINUX_AUDIT_H_ +#include + +#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 index 0000000000..2e61cce2ba --- /dev/null +++ b/src/hwinfo/src/hd/hd.h @@ -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 +#include +#include +#include + +/* + * 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 index 0000000000..36958642cd --- /dev/null +++ b/src/hwinfo/src/hd/hd_int.h @@ -0,0 +1,236 @@ +#include +#include + +#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 index 0000000000..691ecbe6d9 --- /dev/null +++ b/src/hwinfo/src/hd/hddb.c @@ -0,0 +1,2748 @@ +#include +#include +#include +#include +#include + +#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, "%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, "%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 index 0000000000..f8d8956f5c --- /dev/null +++ b/src/hwinfo/src/hd/hddb.h @@ -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 index 0000000000..2636b68a14 --- /dev/null +++ b/src/hwinfo/src/hd/hddb_int.h @@ -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 index 0000000000..65dffef7c6 --- /dev/null +++ b/src/hwinfo/src/hd/hdp.c @@ -0,0 +1,1262 @@ +#include +#include +#include +#include +#include + +#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 index 0000000000..e69de29bb2 diff --git a/src/hwinfo/src/hd/ibm-notebooks.h b/src/hwinfo/src/hd/ibm-notebooks.h new file mode 100644 index 0000000000..b47d50c165 --- /dev/null +++ b/src/hwinfo/src/hd/ibm-notebooks.h @@ -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 index 0000000000..790d090137 --- /dev/null +++ b/src/hwinfo/src/hd/input.c @@ -0,0 +1,267 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +#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 index 0000000000..1329c27834 --- /dev/null +++ b/src/hwinfo/src/hd/input.h @@ -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 index 0000000000..36d43cc1f0 --- /dev/null +++ b/src/hwinfo/src/hd/int.c @@ -0,0 +1,1147 @@ +#include +#include +#include +#include +typedef unsigned long kernel_ulong_t; +#include +#ifdef __UCLIBC__ +#include +#else +#include +#endif +#include +#include + +#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 index 0000000000..5ef482551a --- /dev/null +++ b/src/hwinfo/src/hd/int.h @@ -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 index 0000000000..3b5d6d0f29 --- /dev/null +++ b/src/hwinfo/src/hd/isa.c @@ -0,0 +1,114 @@ +#include +#include +#include + +#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 index 0000000000..cda4c3cec3 --- /dev/null +++ b/src/hwinfo/src/hd/isa.h @@ -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 index 0000000000..28fbdde6b6 --- /dev/null +++ b/src/hwinfo/src/hd/isapnp.c @@ -0,0 +1,438 @@ +#include +#include +#include + +#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 index 0000000000..b593726b52 --- /dev/null +++ b/src/hwinfo/src/hd/isapnp.h @@ -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 index 0000000000..63ed8394b6 --- /dev/null +++ b/src/hwinfo/src/hd/isdn.c @@ -0,0 +1,311 @@ +#include +#include +#include + +#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 index 0000000000..3e5cc42363 --- /dev/null +++ b/src/hwinfo/src/hd/isdn.h @@ -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 index 0000000000..58384e7d2d --- /dev/null +++ b/src/hwinfo/src/hd/kbd.c @@ -0,0 +1,308 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#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 +#include +#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 index 0000000000..8fe84479ce --- /dev/null +++ b/src/hwinfo/src/hd/kbd.h @@ -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 index 0000000000..4f7ec2f6cb --- /dev/null +++ b/src/hwinfo/src/hd/klog.c @@ -0,0 +1,153 @@ +#include +#include +#include +#include + +#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 index 0000000000..3119b109a3 --- /dev/null +++ b/src/hwinfo/src/hd/klog.h @@ -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 index 0000000000..c8b9afa5fe --- /dev/null +++ b/src/hwinfo/src/hd/manual.c @@ -0,0 +1,1549 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +#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 index 0000000000..a08e642c37 --- /dev/null +++ b/src/hwinfo/src/hd/manual.h @@ -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 index 0000000000..d2f394869c --- /dev/null +++ b/src/hwinfo/src/hd/memory.c @@ -0,0 +1,206 @@ +#include +#include +#include +#include +#include + +#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 index 0000000000..f76aa78e0f --- /dev/null +++ b/src/hwinfo/src/hd/memory.h @@ -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 index 0000000000..1780ccd691 --- /dev/null +++ b/src/hwinfo/src/hd/misc.c @@ -0,0 +1,742 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#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 index 0000000000..10b1ef04a9 --- /dev/null +++ b/src/hwinfo/src/hd/misc.h @@ -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 index 0000000000..e6f8aab08e --- /dev/null +++ b/src/hwinfo/src/hd/modem.c @@ -0,0 +1,1083 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#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 index 0000000000..f19599d1ec --- /dev/null +++ b/src/hwinfo/src/hd/modem.h @@ -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 index 0000000000..110d897893 --- /dev/null +++ b/src/hwinfo/src/hd/monitor.c @@ -0,0 +1,600 @@ +#include +#include +#include + +#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 index 0000000000..a74a0bb372 --- /dev/null +++ b/src/hwinfo/src/hd/monitor.h @@ -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 index 0000000000..83a576bf63 --- /dev/null +++ b/src/hwinfo/src/hd/mouse.c @@ -0,0 +1,785 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#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 index 0000000000..10a038a55d --- /dev/null +++ b/src/hwinfo/src/hd/mouse.h @@ -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 index 0000000000..955740fe2a --- /dev/null +++ b/src/hwinfo/src/hd/net.c @@ -0,0 +1,546 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define u8 uint8_t +#define u16 uint16_t +#define u32 uint32_t +#define u64 uint64_t +#include +#include +#include +#include + +#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 index 0000000000..3e49379fe7 --- /dev/null +++ b/src/hwinfo/src/hd/net.h @@ -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 index 0000000000..d9b5b32a20 --- /dev/null +++ b/src/hwinfo/src/hd/parallel.c @@ -0,0 +1,295 @@ +#include +#include +#include +#include +#include +#include +#include + +#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 index 0000000000..7df1f51816 --- /dev/null +++ b/src/hwinfo/src/hd/parallel.h @@ -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 index 0000000000..0ee6a0b0b1 --- /dev/null +++ b/src/hwinfo/src/hd/pci.c @@ -0,0 +1,604 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +typedef unsigned long kernel_ulong_t; +#include +#ifdef __UCLIBC__ +#include +#else +#include +#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 index 0000000000..d1e475be0d --- /dev/null +++ b/src/hwinfo/src/hd/pci.h @@ -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 index 0000000000..1bda468b58 --- /dev/null +++ b/src/hwinfo/src/hd/pcmcia.c @@ -0,0 +1,272 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#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 index 0000000000..ddf7b57958 --- /dev/null +++ b/src/hwinfo/src/hd/pcmcia.h @@ -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 index 0000000000..da1864c0d2 --- /dev/null +++ b/src/hwinfo/src/hd/pppoe.c @@ -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 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#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 index 0000000000..859e99fb50 --- /dev/null +++ b/src/hwinfo/src/hd/pppoe.h @@ -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 index 0000000000..0a2a28fa5f --- /dev/null +++ b/src/hwinfo/src/hd/prom.c @@ -0,0 +1,694 @@ +#include +#include +#include +#include +#include +#include + +#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 index 0000000000..8f8505ef82 --- /dev/null +++ b/src/hwinfo/src/hd/prom.h @@ -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 index 0000000000..942564b4ff --- /dev/null +++ b/src/hwinfo/src/hd/s390.c @@ -0,0 +1,246 @@ +#include +#include +#include + +#include "hd.h" +#include "hd_int.h" +#include "hddb.h" +#include "s390.h" + +#if defined(__s390__) || defined(__s390x__) + +#include +#include + +#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 index 0000000000..9ab4124b9c --- /dev/null +++ b/src/hwinfo/src/hd/s390.h @@ -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 index 0000000000..3122442d65 --- /dev/null +++ b/src/hwinfo/src/hd/sbus.c @@ -0,0 +1,691 @@ +#include +#include +#include +#include +#include +#include + +#include "hd.h" +#include "hd_int.h" +#include "sbus.h" + +#ifdef __sparc__ + +#ifdef DIET +typedef unsigned int u_int; +#endif + +#include + +#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 index 0000000000..de8564f718 --- /dev/null +++ b/src/hwinfo/src/hd/sbus.h @@ -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 index 0000000000..d43d9faff8 --- /dev/null +++ b/src/hwinfo/src/hd/serial.c @@ -0,0 +1,239 @@ +#include +#include +#include +#include +#include +#include +#include + +#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 index 0000000000..1b59242747 --- /dev/null +++ b/src/hwinfo/src/hd/serial.h @@ -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 index 0000000000..72715078bc --- /dev/null +++ b/src/hwinfo/src/hd/smbios.c @@ -0,0 +1,1662 @@ +#include +#include + +#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 index 0000000000..79d339292d --- /dev/null +++ b/src/hwinfo/src/hd/smbios.h @@ -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 index 0000000000..ad5f506106 --- /dev/null +++ b/src/hwinfo/src/hd/sys.c @@ -0,0 +1,260 @@ +#define _GNU_SOURCE /* we want memmem() */ +#include +#include +#include +#include +#include +#include + +#include +#include + +#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 index 0000000000..fca3f69b65 --- /dev/null +++ b/src/hwinfo/src/hd/sys.h @@ -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 index 0000000000..11a48e90b2 --- /dev/null +++ b/src/hwinfo/src/hd/usb.c @@ -0,0 +1,780 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#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 index 0000000000..9d35423a2c --- /dev/null +++ b/src/hwinfo/src/hd/usb.h @@ -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 index 0000000000..99c90341f2 --- /dev/null +++ b/src/hwinfo/src/hd/version.h @@ -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 index 0000000000..facef7756f --- /dev/null +++ b/src/hwinfo/src/hd/veth.c @@ -0,0 +1,63 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +#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 index 0000000000..8928941a46 --- /dev/null +++ b/src/hwinfo/src/hd/veth.h @@ -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 index 0000000000..d327c8dd3b --- /dev/null +++ b/src/hwinfo/src/hd/wlan.c @@ -0,0 +1,1041 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +#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 + * Note : in 99% of the case, we will just open the inet_sock. + * The remaining 1% case are not fully correct... + */ + + /* Try all families we support */ + for(i = 0; i < sizeof(families)/sizeof(int); ++i) + { + /* Try to open the socket, if success returns it */ + sock = socket(families[i], SOCK_DGRAM, 0); + if(sock >= 0) + return sock; + } + + return -1; +} + +static inline int +iw_get_ext(int skfd, /* Socket to the kernel */ + const char * ifname, /* Device name */ + int request, /* WE ID */ + struct iwreq * pwrq) /* Fixed part of the request */ +{ + /* Set device name */ + strncpy(pwrq->ifr_name, ifname, IFNAMSIZ); + /* Do the request */ + return(ioctl(skfd, request, pwrq)); +} + +int iw_get_range_info(int skfd, + const char * ifname, + struct iw_range * range) +{ + struct iwreq wrq; + char buffer[sizeof(struct iw_range) * 2]; /* Large enough */ + struct iw_range * range_raw; + + /* Cleanup */ + bzero(buffer, sizeof(buffer)); + + wrq.u.data.pointer = (caddr_t) buffer; + wrq.u.data.length = sizeof(buffer); + wrq.u.data.flags = 0; + if(iw_get_ext(skfd, ifname, SIOCGIWRANGE, &wrq) < 0) + return(-1); + + /* Point to the buffer */ + range_raw = (struct iw_range *) buffer; + + /* For new versions, we can check the version directly, for old versions + * we use magic. 300 bytes is a also magic number, don't touch... */ + if(wrq.u.data.length < 300) { + /* That's v10 or earlier. Ouch ! Let's make a guess...*/ + range_raw->we_version_compiled = 9; + } + + /* Check how it needs to be processed */ + if(range_raw->we_version_compiled > 15) { + /* This is our native format, that's easy... */ + /* Copy stuff at the right place, ignore extra */ + memcpy((char *) range, buffer, sizeof(struct iw_range)); + } + else { + /* not supported */ + return(-1); + } + + return(0); +} + +double iw_freq2float(const struct iw_freq * in) +{ + int i; + double res = (double) in->m; + for(i = 0; i < in->e; i++) + res *= 10; + return(res); +} + +void hd_scan_wlan(hd_data_t *hd_data) +{ + hd_t *hd; + hd_res_t *res; + struct iw_range range; + int k; + int skfd; + struct wpa_driver_ops *wpa_drv=NULL; + + if(!hd_probe_feature(hd_data, pr_wlan)) return; + + hd_data->module = mod_wlan; + + PROGRESS(1, 0, "detecting wlan features"); + + if ((skfd = iw_sockets_open()) < 0) { + ADD2LOG( "could not open socket, wlan feature query failed\n" ); + return; + } + + for(hd = hd_data->hd; hd; hd = hd->next) { + if( + hd->base_class.id == bc_network && + hd->unix_dev_name ) { + /* Get list of frequencies / channels */ + if(iw_get_range_info(skfd, hd->unix_dev_name, &range) < 0) { + /* this failed, maybe device does not support wireless extensions */ + continue; + } + ADD2LOG("*** device %s is wireless ***\n", hd->unix_dev_name); + hd->is.wlan = 1; + res = new_mem(sizeof *res); + res->any.type = res_wlan; + + if(range.num_frequency > 0) { + char buff[20]; + for(k = 0; k < range.num_frequency; k++) { + snprintf(buff, 19, "%i", range.freq[k].i); + add_str_list(&res->wlan.channels, buff); + snprintf(buff, 19, "%g", (float)iw_freq2float(&(range.freq[k]))/1000000000); + add_str_list(&res->wlan.frequencies, buff); + } + for(k = 0; k < range.num_bitrates; k++) { + snprintf(buff, 19, "%g", (float)range.bitrate[k]/1000000); + add_str_list(&res->wlan.bitrates, buff); + } + for(k = 0; k < range.num_encoding_sizes; k++) { + snprintf(buff, 19, "WEP%i", range.encoding_size[k]*8); + add_str_list(&res->wlan.enc_modes, buff); + } + + /* open mode is always supported */ + add_str_list(&res->wlan.auth_modes, "open"); + /* if WEP is supported, be assume shared key auth support */ + if(range.num_encoding_sizes) { + add_str_list(&res->wlan.auth_modes, "sharedkey"); + } + + /* detect WPA capabilities */ + if (hd->drivers) { + if (search_str_list(hd->drivers, "hostap_cs") || + search_str_list(hd->drivers, "hostap_pci") || + search_str_list(hd->drivers, "hostap_plx") ) + wpa_drv = &wpa_driver_hostap_ops; + /* prism54 is not ready yet + else if (search_str_list(hd->drivers, "prism54")==0) + wpa_drv = &wpa_driver_prism54_ops; + */ + else if (search_str_list(hd->drivers, "ath_pci")) + wpa_drv = &wpa_driver_madwifi_ops; + else if (strncmp(hd->drivers->str, "at76", 4)==0) + wpa_drv = &wpa_driver_atmel_ops; + else if (search_str_list(hd->drivers, "ndiswrapper")) + wpa_drv = &wpa_driver_ndiswrapper_ops; + else if ((search_str_list(hd->drivers, "ipw2100")) || + (search_str_list(hd->drivers, "ipw2200")) ) + wpa_drv = &wpa_driver_ipw_ops; + } + + if (wpa_drv) { + if (wpa_drv->set_wpa(hd->unix_dev_name, 1) == 0) { + add_str_list(&res->wlan.auth_modes, "wpa-psk"); + add_str_list(&res->wlan.auth_modes, "wpa-eap"); + if (wpa_drv->set_auth_alg && + wpa_drv->set_auth_alg(hd->unix_dev_name, AUTH_ALG_LEAP)==0) + add_str_list(&res->wlan.auth_modes, "wpa-leap"); + if (wpa_drv->set_key(hd->unix_dev_name, WPA_ALG_TKIP, "ff:ff:ff:ff:ff:ff", + 0, 0, 0, 0, + "00000000000000000000000000000000", 32) ==0) + add_str_list(&res->wlan.enc_modes, "TKIP"); + if (wpa_drv->set_key(hd->unix_dev_name, WPA_ALG_CCMP, "ff:ff:ff:ff:ff:ff", + 0, 0, 0, 0, + "0000000000000000", 16) ==0) + add_str_list(&res->wlan.enc_modes, "CCMP"); + wpa_drv->set_wpa(hd->unix_dev_name, 0); + } + } + } + add_res_entry(&hd->res, res); + } + } +} + +/* following functions are copied from wpa_supplicant + they are used to detect WPA capabilities */ + +/* begin hostap */ + +#define PRISM2_IOCTL_PRISM2_PARAM (SIOCIWFIRSTPRIV + 0) +#define PRISM2_IOCTL_HOSTAPD (SIOCDEVPRIVATE + 14) +#define HOSTAP_CRYPT_ALG_NAME_LEN 16 +#define HOSTAP_CRYPT_FLAG_SET_TX_KEY (1 << (0)) +#define PRISM2_HOSTAPD_GENERIC_ELEMENT_HDR_LEN \ + ((int) (&((struct prism2_hostapd_param *) 0)->u.generic_elem.data)) + +enum { + PRISM2_SET_ENCRYPTION = 6, + PRISM2_HOSTAPD_SET_GENERIC_ELEMENT = 12, + PRISM2_PARAM_AP_AUTH_ALGS = 15, + PRISM2_PARAM_HOST_ROAMING = 21, + PRISM2_PARAM_WPA = 36, + PRISM2_PARAM_PRIVACY_INVOKED = 37, +}; + +struct prism2_hostapd_param { + u32 cmd; + u8 sta_addr[ETH_ALEN]; + union { + struct { + u16 aid; + u16 capability; + u8 tx_supp_rates; + } add_sta; + struct { + u32 inactive_sec; + } get_info_sta; + struct { + u8 alg[HOSTAP_CRYPT_ALG_NAME_LEN]; + u32 flags; + u32 err; + u8 idx; + u8 seq[8]; /* sequence counter (set: RX, get: TX) */ + u16 key_len; + u8 key[0]; + } crypt; + struct { + u32 flags_and; + u32 flags_or; + } set_flags_sta; + struct { + u16 rid; + u16 len; + u8 data[0]; + } rid; + struct { + u8 len; + u8 data[0]; + } generic_elem; + struct { + u16 cmd; + u16 reason_code; + } mlme; + struct { + u8 ssid_len; + u8 ssid[32]; + } scan_req; + } u; +}; + + +int hostapd_ioctl(const char *dev, struct prism2_hostapd_param *param, + int len, int show_err) +{ + int s; + int ret =0; + struct iwreq iwr; + + s = socket(PF_INET, SOCK_DGRAM, 0); + if (s < 0) { + return -1; + } + + memset(&iwr, 0, sizeof(iwr)); + strncpy(iwr.ifr_name, dev, IFNAMSIZ); + iwr.u.data.pointer = (caddr_t) param; + iwr.u.data.length = len; + + if (ioctl(s, PRISM2_IOCTL_HOSTAPD, &iwr) < 0) { + ret=1; + } + close(s); + + return 0; +} + +int prism2param(const char *ifname, int param, int value) +{ + struct iwreq iwr; + int *i, s, ret = 0; + + s = socket(PF_INET, SOCK_DGRAM, 0); + if (s < 0) { + return -1; + } + + memset(&iwr, 0, sizeof(iwr)); + strncpy(iwr.ifr_name, ifname, IFNAMSIZ); + i = (int *) iwr.u.name; + *i++ = param; + *i++ = value; + + if (ioctl(s, PRISM2_IOCTL_PRISM2_PARAM, &iwr) < 0) { + ret = -1; + } + close(s); + return ret; +} + +int wpa_driver_hostap_set_auth_alg(const char *ifname, int auth_alg) +{ + int algs = 0; + + if (auth_alg & AUTH_ALG_OPEN_SYSTEM) + algs |= 1; + if (auth_alg & AUTH_ALG_SHARED_KEY) + algs |= 2; + if (auth_alg & AUTH_ALG_LEAP) + algs |= 4; + if (algs == 0) + algs = 1; /* at least one algorithm should be set */ + + return prism2param(ifname, PRISM2_PARAM_AP_AUTH_ALGS, algs); +} + +int wpa_driver_hostap_set_wpa(const char *ifname, int enabled) +{ + int ret = 0; + + if (prism2param(ifname, PRISM2_PARAM_HOST_ROAMING, + enabled ? 2 : 0) < 0) + ret = -1; + if (prism2param(ifname, PRISM2_PARAM_PRIVACY_INVOKED, enabled) < 0) + ret = -1; + if (prism2param(ifname, PRISM2_PARAM_WPA, enabled) < 0) + ret = -1; + + return ret; +} + +int wpa_driver_hostap_set_key(const char *ifname, wpa_alg alg, + unsigned char *addr, int key_idx, + int set_tx, u8 *seq, size_t seq_len, + u8 *key, size_t key_len) +{ + struct prism2_hostapd_param *param; + u8 *buf; + size_t blen; + int ret = 0; + char *alg_name; + + switch (alg) { + case WPA_ALG_NONE: + alg_name = "none"; + break; + case WPA_ALG_WEP: + alg_name = "WEP"; + break; + case WPA_ALG_TKIP: + alg_name = "TKIP"; + break; + case WPA_ALG_CCMP: + alg_name = "CCMP"; + break; + default: + return -1; + } + + if (seq_len > 8) + return -2; + + blen = sizeof(*param) + key_len; + buf = malloc(blen); + if (buf == NULL) + return -1; + memset(buf, 0, blen); + + param = (struct prism2_hostapd_param *) buf; + param->cmd = PRISM2_SET_ENCRYPTION; + memset(param->sta_addr, 0xff, ETH_ALEN); + + strncpy(param->u.crypt.alg, alg_name, HOSTAP_CRYPT_ALG_NAME_LEN); + param->u.crypt.flags = set_tx ? HOSTAP_CRYPT_FLAG_SET_TX_KEY : 0; + param->u.crypt.idx = key_idx; + memcpy(param->u.crypt.seq, seq, seq_len); + param->u.crypt.key_len = key_len; + memcpy((u8 *) (param + 1), key, key_len); + + if (hostapd_ioctl(ifname, param, blen, 1)) { + ret = -1; + } + free(buf); + + return ret; +} + +struct wpa_driver_ops wpa_driver_hostap_ops = { + .set_wpa = wpa_driver_hostap_set_wpa, + .set_key = wpa_driver_hostap_set_key, + .set_auth_alg = wpa_driver_hostap_set_auth_alg, +}; + +/* end hostap */ + +/* begin madwifi */ + +#define IEEE80211_IOCTL_SETPARAM (SIOCIWFIRSTPRIV+0) +#define IEEE80211_IOCTL_SETKEY (SIOCIWFIRSTPRIV+2) +#define IEEE80211_CIPHER_WEP 0 +#define IEEE80211_CIPHER_TKIP 1 +#define IEEE80211_CIPHER_AES_CCM 3 +#define IEEE80211_ADDR_LEN 6 +#define IEEE80211_KEY_XMIT 0x01 +#define IEEE80211_KEY_RECV 0x02 +#define IEEE80211_KEYBUF_SIZE 16 +#define IEEE80211_MICBUF_SIZE 16 + +enum { + IEEE80211_PARAM_WPA = 10, /* WPA mode (0,1,2) */ + IEEE80211_PARAM_ROAMING = 12, /* roaming mode */ + IEEE80211_PARAM_PRIVACY = 13, /* privacy invoked */ +}; + +struct ieee80211req_key { + u_int8_t ik_type; /* key/cipher type */ + u_int8_t ik_pad; + u_int16_t ik_keyix; /* key index */ + u_int8_t ik_keylen; /* key length in bytes */ + u_int8_t ik_flags; +#define IEEE80211_KEY_DEFAULT 0x80 /* default xmit key */ + u_int8_t ik_macaddr[IEEE80211_ADDR_LEN]; + u_int64_t ik_keyrsc; /* key receive sequence counter */ + u_int64_t ik_keytsc; /* key transmit sequence counter */ + u_int8_t ik_keydata[IEEE80211_KEYBUF_SIZE+IEEE80211_MICBUF_SIZE]; +}; + +int +set80211param(const char *dev, int op, int arg) +{ + struct iwreq iwr; + int s=-1; + + if (s < 0 ? (s = socket(AF_INET, SOCK_DGRAM, 0)) == -1 : 0) { + return -1; + } + + memset(&iwr, 0, sizeof(iwr)); + strncpy(iwr.ifr_name, dev, IFNAMSIZ); + iwr.u.mode = op; + memcpy(iwr.u.name+sizeof(__u32), &arg, sizeof(arg)); + + if (ioctl(s, IEEE80211_IOCTL_SETPARAM, &iwr) < 0) { + return -1; + } + return 0; +} + +static int +wpa_driver_madwifi_set_wpa(const char *ifname, int enabled) +{ + int ret = 0; + + if (set80211param(ifname, IEEE80211_PARAM_ROAMING, enabled ? 2 : 0) < 0) + ret = -1; + if (set80211param(ifname, IEEE80211_PARAM_PRIVACY, enabled) < 0) + ret = -1; + if (set80211param(ifname, IEEE80211_PARAM_WPA, enabled ? 3 : 0) < 0) + ret = -1; + + return ret; +} + +static int +set80211priv(const char *dev, int op, void *data, int len) +{ + struct iwreq iwr; + int s=-1; + + if (s < 0 ? (s = socket(AF_INET, SOCK_DGRAM, 0)) == -1 : 0) { + return -1; + } + + memset(&iwr, 0, sizeof(iwr)); + strncpy(iwr.ifr_name, dev, IFNAMSIZ); + if (len < IFNAMSIZ) { + /* + * Argument data fits inline; put it there. + */ + memcpy(iwr.u.name, data, len); + } else { + /* + * Argument data too big for inline transfer; setup a + * parameter block instead; the kernel will transfer + * the data for the driver. + */ + iwr.u.data.pointer = data; + iwr.u.data.length = len; + } + + if (ioctl(s, op, &iwr) < 0) { + return -1; + } + return 0; +} + +static int +wpa_driver_madwifi_set_key(const char *ifname, wpa_alg alg, + unsigned char *addr, int key_idx, + int set_tx, u8 *seq, size_t seq_len, + u8 *key, size_t key_len) +{ + struct ieee80211req_key wk; + char *alg_name; + u_int8_t cipher; + + if (alg == WPA_ALG_NONE) + return 0; + + switch (alg) { + case WPA_ALG_WEP: + alg_name = "WEP"; + cipher = IEEE80211_CIPHER_WEP; + break; + case WPA_ALG_TKIP: + alg_name = "TKIP"; + cipher = IEEE80211_CIPHER_TKIP; + break; + case WPA_ALG_CCMP: + alg_name = "CCMP"; + cipher = IEEE80211_CIPHER_AES_CCM; + break; + default: + return -1; + } + + if (seq_len > sizeof(u_int64_t)) { + return -2; + } + if (key_len > sizeof(wk.ik_keydata)) { + return -3; + } + + memset(&wk, 0, sizeof(wk)); + wk.ik_type = cipher; + wk.ik_flags = IEEE80211_KEY_RECV; + if (set_tx) { + wk.ik_flags |= IEEE80211_KEY_XMIT | IEEE80211_KEY_DEFAULT; + memcpy(wk.ik_macaddr, addr, IEEE80211_ADDR_LEN); + } else + memset(wk.ik_macaddr, 0, IEEE80211_ADDR_LEN); + wk.ik_keyix = key_idx; + wk.ik_keylen = key_len; + memcpy(&wk.ik_keyrsc, seq, seq_len); + memcpy(wk.ik_keydata, key, key_len); + + return set80211priv(ifname, IEEE80211_IOCTL_SETKEY, &wk, sizeof(wk)); +} + +struct wpa_driver_ops wpa_driver_madwifi_ops = { + .set_wpa = wpa_driver_madwifi_set_wpa, + .set_key = wpa_driver_madwifi_set_key, +}; + +/* end madwifi */ + +/* begin ipw */ + +#define IPW_IOCTL_WPA_SUPPLICANT SIOCIWFIRSTPRIV+30 +#define IPW_CMD_SET_WPA_PARAM 1 +#define IPW_CMD_SET_ENCRYPTION 3 +#define IPW_PARAM_WPA_ENABLED 1 +#define IPW_PARAM_AUTH_ALGS 5 +#define IPW_CRYPT_ALG_NAME_LEN 16 + +struct ipw_param { + u32 cmd; + u8 sta_addr[ETH_ALEN]; + union { + struct { + u8 name; + u32 value; + } wpa_param; + struct { + u32 len; + u8 *data; + } wpa_ie; + struct{ + int command; + int reason_code; + } mlme; + struct { + u8 alg[IPW_CRYPT_ALG_NAME_LEN]; + u8 set_tx; + u32 err; + u8 idx; + u8 seq[8]; + u16 key_len; + u8 key[0]; + } crypt; + + } u; +}; + +int ipw_ioctl(const char *dev, struct ipw_param *param, int len) +{ + struct iwreq iwr; + int s; + int ret = 0; + + s = socket(PF_INET, SOCK_DGRAM, 0); + if (s < 0) { + return -1; + } + + memset(&iwr, 0, sizeof(iwr)); + strncpy(iwr.ifr_name, dev, IFNAMSIZ); + iwr.u.data.pointer = (caddr_t) param; + iwr.u.data.length = len; + + if (ioctl(s, IPW_IOCTL_WPA_SUPPLICANT, &iwr) < 0) { + ret = -1; + } + + close(s); + return ret; +} + +int wpa_driver_ipw_set_wpa(const char *ifname, int enabled) +{ + int ret = 0; + struct ipw_param param; + + memset(¶m, 0, sizeof(param)); + param.cmd = IPW_CMD_SET_WPA_PARAM; + param.u.wpa_param.name = IPW_PARAM_WPA_ENABLED; + param.u.wpa_param.value = enabled; + + if (ipw_ioctl(ifname, ¶m, sizeof(param)) < 0) + ret = -1; + + return ret; +} + +int wpa_driver_ipw_set_key(const char *ifname, wpa_alg alg, + unsigned char *addr, int key_idx, int set_tx, + u8 *seq, size_t seq_len, + u8 *key, size_t key_len) +{ + struct ipw_param *param; + u8 *buf; + size_t blen; + int ret = 0; + char *alg_name; + + switch (alg) { + case WPA_ALG_NONE: + alg_name = "none"; + break; + case WPA_ALG_WEP: + alg_name = "WEP"; + break; + case WPA_ALG_TKIP: + alg_name = "TKIP"; + break; + case WPA_ALG_CCMP: + alg_name = "CCMP"; + break; + default: + return -1; + } + + if (seq_len > 8) + return -2; + + blen = sizeof(*param) + key_len; + buf = malloc(blen); + if (buf == NULL) + return -1; + memset(buf, 0, blen); + + param = (struct ipw_param *) buf; + param->cmd = IPW_CMD_SET_ENCRYPTION; + memset(param->sta_addr, 0xff, ETH_ALEN); + strncpy(param->u.crypt.alg, alg_name, IPW_CRYPT_ALG_NAME_LEN); + param->u.crypt.set_tx = set_tx ? 1 : 0; + param->u.crypt.idx = key_idx; + memcpy(param->u.crypt.seq, seq, seq_len); + param->u.crypt.key_len = key_len; + memcpy((u8 *) (param + 1), key, key_len); + + if (ipw_ioctl(ifname, param, blen)) { + ret = -1; + } + free(buf); + + return ret; +} + +int wpa_driver_ipw_set_auth_alg(const char *ifname, int auth_alg) +{ + int algs = 0; + struct ipw_param param; + + if (auth_alg & AUTH_ALG_OPEN_SYSTEM) + algs |= 1; + if (auth_alg & AUTH_ALG_SHARED_KEY) + algs |= 2; + if (auth_alg & AUTH_ALG_LEAP) + algs |= 4; + if (algs == 0) + algs = 1; /* at least one algorithm should be set */ + + memset(¶m, 0, sizeof(param)); + param.cmd = IPW_CMD_SET_WPA_PARAM; + param.u.wpa_param.name = IPW_PARAM_AUTH_ALGS; + param.u.wpa_param.value = algs; + + return ipw_ioctl(ifname, ¶m, sizeof(param)); +} + +struct wpa_driver_ops wpa_driver_ipw_ops = { + .set_wpa = wpa_driver_ipw_set_wpa, + .set_key = wpa_driver_ipw_set_key, + .set_auth_alg = wpa_driver_ipw_set_auth_alg +}; + +/* end ipw */ + +/* begin atmel */ + +#define ATMEL_WPA_IOCTL (SIOCIWFIRSTPRIV + 2) +#define ATMEL_WPA_IOCTL_PARAM (SIOCIWFIRSTPRIV + 3) +#define ATMEL_WPA_IOCTL_GET_PARAM (SIOCIWFIRSTPRIV + 4) + +#define MAX_KEY_LENGTH 40 + +/* ATMEL_WPA_IOCTL ioctl() cmd: */ +enum { + SET_WPA_ENCRYPTION = 1, + SET_CIPHER_SUITES = 2, +}; + +/* ATMEL_WPA_IOCTL_PARAM ioctl() cmd: */ +enum { + ATMEL_PARAM_WPA = 1, + ATMEL_PARAM_PRIVACY_INVOKED = 2, + ATMEL_PARAM_WPA_TYPE = 3, +}; + +struct atmel_param{ + unsigned char sta_addr[6]; + int cmd; + u8 alg; + u8 key_idx; + u8 set_tx; + u8 seq[8]; + u8 seq_len; + u16 key_len; + u8 key[MAX_KEY_LENGTH]; + struct{ + int reason_code; + u8 state; + }mlme; + u8 pairwise_suite; + u8 group_suite; + u8 key_mgmt_suite; +}; + +int atmel_ioctl(const char *dev, struct atmel_param *param, int len) +{ + int s; + int ret=0; + struct iwreq iwr; + + s = socket(PF_INET, SOCK_DGRAM, 0); + if (s < 0) { + return -1; + } + + memset(&iwr, 0, sizeof(iwr)); + strncpy(iwr.ifr_name, dev, IFNAMSIZ); + iwr.u.data.pointer = (caddr_t) param; + iwr.u.data.length = len; + + if (ioctl(s, ATMEL_WPA_IOCTL, &iwr) < 0) { + ret = -1; + } + close(s); + + return 0; +} + +int atmel2param(const char *ifname, int param, int value) +{ + struct iwreq iwr; + int *i, s, ret = 0; + + s = socket(PF_INET, SOCK_DGRAM, 0); + if (s < 0) { + return -1; + } + + memset(&iwr, 0, sizeof(iwr)); + strncpy(iwr.ifr_name, ifname, IFNAMSIZ); + i = (int *) iwr.u.name; + *i++ = param; + *i++ = value; + + if (ioctl(s, ATMEL_WPA_IOCTL_PARAM, &iwr) < 0) { + ret = -1; + } + close(s); + return ret; +} + +int wpa_driver_atmel_set_wpa(const char *ifname, int enabled) +{ + int ret = 0; + + if (atmel2param(ifname, ATMEL_PARAM_PRIVACY_INVOKED, enabled) < 0) + ret = -1; + if (atmel2param(ifname, ATMEL_PARAM_WPA, enabled) < 0) + ret = -1; + + return ret; +} + +int wpa_driver_atmel_set_key(const char *ifname, wpa_alg alg, + unsigned char *addr, int key_idx, + int set_tx, u8 *seq, size_t seq_len, + u8 *key, size_t key_len) +{ + int ret = 0; + struct atmel_param *param; + u8 *buf; + u8 alg_type; + + size_t blen; + char *alg_name; + + switch (alg) { + case WPA_ALG_NONE: + alg_name = "none"; + alg_type = 0; + break; + case WPA_ALG_WEP: + alg_name = "WEP"; + alg_type = 1; + break; + case WPA_ALG_TKIP: + alg_name = "TKIP"; + alg_type = 2; + break; + case WPA_ALG_CCMP: + alg_name = "CCMP"; + alg_type = 3; + break; + default: + return -1; + } + + if (seq_len > 8) + return -2; + + blen = sizeof(*param) + key_len; + buf = malloc(blen); + if (buf == NULL) + return -1; + memset(buf, 0, blen); + + param = (struct atmel_param *) buf; + + param->cmd = SET_WPA_ENCRYPTION; + + if (addr == NULL) + memset(param->sta_addr, 0xff, ETH_ALEN); + else + memcpy(param->sta_addr, addr, ETH_ALEN); + + param->alg = alg_type; + param->key_idx = key_idx; + param->set_tx = set_tx; + memcpy(param->seq, seq, seq_len); + param->seq_len = seq_len; + param->key_len = key_len; + memcpy((u8 *)param->key, key, key_len); + + if (atmel_ioctl(ifname, param, blen)) { + ret = -1; + } + free(buf); + + return ret; +} + +struct wpa_driver_ops wpa_driver_atmel_ops = { + .set_wpa = wpa_driver_atmel_set_wpa, + .set_key = wpa_driver_atmel_set_key, +}; + +/* end atmel */ + +/* begin ndiswrapper */ + +#define WPA_SET_WPA SIOCIWFIRSTPRIV+1 +#define WPA_SET_KEY SIOCIWFIRSTPRIV+2 +#define WPA_SET_AUTH_ALG SIOCIWFIRSTPRIV+8 + +struct wpa_key +{ + wpa_alg alg; + u8 *addr; + int key_index; + int set_tx; + u8 *seq; + size_t seq_len; + u8 *key; + size_t key_len; +}; + +int wpa_ndiswrapper_set_ext(const char *ifname, int request, struct iwreq *pwrq) +{ + int s; + int ret; + + s = socket( AF_INET, SOCK_DGRAM, 0); + if (s < 0) + return -1; + + strncpy(pwrq->ifr_name, ifname, IFNAMSIZ); + ret = ioctl(s, request, pwrq); + close(s); + return ret; +} + +int wpa_ndiswrapper_set_wpa(const char *ifname, int enabled) +{ + struct iwreq priv_req; + int ret = 0; + + memset(&priv_req, 0, sizeof(priv_req)); + + priv_req.u.data.flags = enabled; + if (wpa_ndiswrapper_set_ext(ifname, WPA_SET_WPA, &priv_req) < 0) + ret = -1; + return ret; +} + +int wpa_ndiswrapper_set_key(const char *ifname, wpa_alg alg, u8 *addr, + int key_idx, int set_tx, u8 *seq, + size_t seq_len, u8 *key, size_t key_len) +{ + struct wpa_key wpa_key; + int ret = 0; + struct iwreq priv_req; + + memset(&priv_req, 0, sizeof(priv_req)); + + wpa_key.alg = alg; + wpa_key.addr = addr; + wpa_key.key_index = key_idx; + wpa_key.set_tx = set_tx; + wpa_key.seq = seq; + wpa_key.seq_len = seq_len; + wpa_key.key = key; + wpa_key.key_len = key_len; + + priv_req.u.data.pointer = (void *)&wpa_key; + + if (wpa_ndiswrapper_set_ext(ifname, WPA_SET_KEY, &priv_req) < 0) + ret = -1; + return ret; +} + +static int wpa_ndiswrapper_set_auth_alg(const char *ifname, int auth_alg) +{ + int ret = 0; + struct iwreq priv_req; + + memset(&priv_req, 0, sizeof(priv_req)); + + priv_req.u.param.value = auth_alg; + if (wpa_ndiswrapper_set_ext(ifname, WPA_SET_AUTH_ALG, &priv_req) < 0) + ret = -1; + return ret; +} + +struct wpa_driver_ops wpa_driver_ndiswrapper_ops = { + .set_wpa = wpa_ndiswrapper_set_wpa, + .set_key = wpa_ndiswrapper_set_key, + .set_auth_alg = wpa_ndiswrapper_set_auth_alg, +}; + +/* end ndiswrapper */ + +#endif /* !defined(LIBHD_TINY) */ + diff --git a/src/hwinfo/src/hd/wlan.h b/src/hwinfo/src/hd/wlan.h new file mode 100644 index 0000000000..6608a303a5 --- /dev/null +++ b/src/hwinfo/src/hd/wlan.h @@ -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 index 0000000000..53b8b37650 --- /dev/null +++ b/src/hwinfo/src/ids/Makefile @@ -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 index 0000000000..9be446cd91 --- /dev/null +++ b/src/hwinfo/src/ids/cdb_x11 @@ -0,0 +1,349 @@ +#!/usr/bin/perl -w +# Copyright (c) 1996 SuSE GmbH Nuernberg, Germany. All rights reserved. +# +# Author: Dirk Hessing , 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 = ; + 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 index 0000000000..eedbe4aa1f --- /dev/null +++ b/src/hwinfo/src/ids/check_hd.c @@ -0,0 +1,2859 @@ +#define _GNU_SOURCE /* memmem */ +#include +#include +#include +#include +#include +#include +#include +#include + +#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 index 0000000000..a76f353155 --- /dev/null +++ b/src/hwinfo/src/ids/convert_hd @@ -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 = (); + 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 = "\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' + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +EOF +; + + return $dtd; +} + + +sub hd_dtd_internal +{ + my $dtd = <<'EOF' + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +]> +EOF +; + + return $dtd; +} + diff --git a/src/hwinfo/src/ids/get_adaptec b/src/hwinfo/src/ids/get_adaptec new file mode 100755 index 0000000000..3de5336225 --- /dev/null +++ b/src/hwinfo/src/ids/get_adaptec @@ -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 index 0000000000..27a09bda65 --- /dev/null +++ b/src/hwinfo/src/ids/get_pcmcia @@ -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 index 0000000000..345d5d6a66 --- /dev/null +++ b/src/hwinfo/src/ids/hd_ids.c @@ -0,0 +1,8 @@ +#include +#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 index 0000000000..451b784500 --- /dev/null +++ b/src/hwinfo/src/ids/src/braille @@ -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 index 0000000000..06b63bc909 --- /dev/null +++ b/src/hwinfo/src/ids/src/bus @@ -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 index 0000000000..17b48e5aaa --- /dev/null +++ b/src/hwinfo/src/ids/src/camera @@ -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 index 0000000000..4e414550ac --- /dev/null +++ b/src/hwinfo/src/ids/src/chipcard @@ -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 index 0000000000..8ac04f4fc8 --- /dev/null +++ b/src/hwinfo/src/ids/src/class @@ -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 index 0000000000..7a40f03c58 --- /dev/null +++ b/src/hwinfo/src/ids/src/dvb @@ -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 index 0000000000..323beb7924 --- /dev/null +++ b/src/hwinfo/src/ids/src/extra @@ -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 index 0000000000..87926f049b --- /dev/null +++ b/src/hwinfo/src/ids/src/isapnp @@ -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 index 0000000000..95df289eb8 --- /dev/null +++ b/src/hwinfo/src/ids/src/modem @@ -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 index 0000000000..f45fe149b2 --- /dev/null +++ b/src/hwinfo/src/ids/src/modem.i386 @@ -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 index 0000000000..5d443b2faf --- /dev/null +++ b/src/hwinfo/src/ids/src/monitor @@ -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 index 0000000000..6e82a0ed16 --- /dev/null +++ b/src/hwinfo/src/ids/src/mouse @@ -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 index 0000000000..71e644edef --- /dev/null +++ b/src/hwinfo/src/ids/src/network @@ -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= irq= ++driver.module.insmod 8390|ne io= irq= + +# 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 index 0000000000..4cd40d78f0 --- /dev/null +++ b/src/hwinfo/src/ids/src/pci @@ -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 index 0000000000..4cc45b697a --- /dev/null +++ b/src/hwinfo/src/ids/src/pcmcia @@ -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 index 0000000000..1499c585f8 --- /dev/null +++ b/src/hwinfo/src/ids/src/ppc @@ -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 index 0000000000..dc9cf1c55b --- /dev/null +++ b/src/hwinfo/src/ids/src/s390 @@ -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 index 0000000000..38fc5df93e --- /dev/null +++ b/src/hwinfo/src/ids/src/scanner @@ -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 index 0000000000..f28c396ade --- /dev/null +++ b/src/hwinfo/src/ids/src/sound @@ -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 index 0000000000..3090c507ae --- /dev/null +++ b/src/hwinfo/src/ids/src/special @@ -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 index 0000000000..173c922a03 --- /dev/null +++ b/src/hwinfo/src/ids/src/storage @@ -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=, ++driver.module.insmod aha152x aha152x=, + +# 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 index 0000000000..c0adb626ca --- /dev/null +++ b/src/hwinfo/src/ids/src/tv @@ -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 index 0000000000..5b9426275f --- /dev/null +++ b/src/hwinfo/src/ids/src/usb @@ -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 index 0000000000..adbcf0e397 --- /dev/null +++ b/src/hwinfo/src/ids/src/usb2 @@ -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 index 0000000000..30bb3e80a8 --- /dev/null +++ b/src/hwinfo/src/ids/src/x11.amd64 @@ -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 index 0000000000..ef79c31299 --- /dev/null +++ b/src/hwinfo/src/ids/src/x11.axp @@ -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 index 0000000000..30bb3e80a8 --- /dev/null +++ b/src/hwinfo/src/ids/src/x11.i386 @@ -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 index 0000000000..27c78617c0 --- /dev/null +++ b/src/hwinfo/src/ids/src/x11.ia64 @@ -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 index 0000000000..0dc17c4df7 --- /dev/null +++ b/src/hwinfo/src/ids/src/x11.ppc @@ -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 index 0000000000..d9112c5e93 --- /dev/null +++ b/src/hwinfo/src/ids/src/x11.ppc.special @@ -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 index 0000000000..0ea811c094 --- /dev/null +++ b/src/hwinfo/src/ids/src/x11.sparc @@ -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 index 0000000000..a3c42434af --- /dev/null +++ b/src/hwinfo/src/ids/update_x11 @@ -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 () { + 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 index 0000000000..68f9558721 --- /dev/null +++ b/src/hwinfo/src/int10/AsmMacros.h @@ -0,0 +1,458 @@ +/* $XConsortium: AsmMacros.h /main/13 1996/10/25 11:33:12 kaleb $ */ +/* + * (c) Copyright 1993,1994 by David Wexelblat + * + * 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 + +#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 + +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 +# ifndef __USLC__ +# define __USLC__ +# endif +# endif +#ifndef SCO325 +# include +#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 index 0000000000..bcba090279 --- /dev/null +++ b/src/hwinfo/src/int10/Makefile @@ -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 index 0000000000..4b7d0fa029 --- /dev/null +++ b/src/hwinfo/src/int10/README @@ -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. + + + diff --git a/src/hwinfo/src/int10/emu_vm86.c b/src/hwinfo/src/int10/emu_vm86.c new file mode 100644 index 0000000000..654cff8ac5 --- /dev/null +++ b/src/hwinfo/src/int10/emu_vm86.c @@ -0,0 +1,214 @@ +#include +#include +#ifdef __i386__ +#include +#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 index 0000000000..99a009d0a9 --- /dev/null +++ b/src/hwinfo/src/int10/i10_int.c @@ -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 +#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 index 0000000000..717356f476 --- /dev/null +++ b/src/hwinfo/src/int10/i10_io.c @@ -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 +#if defined(__alpha__) || defined (__ia64__) +#include +#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 index 0000000000..387cebb658 --- /dev/null +++ b/src/hwinfo/src/int10/i10_pci.c @@ -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 +#include +#include +#include +#include +#include +#include +#include +#if defined (__alpha__) || defined (__ia64__) +#include +#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 + +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;iSlot.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 index 0000000000..8fcdef160c --- /dev/null +++ b/src/hwinfo/src/int10/i10_v86.c @@ -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 +#include +#include +#include +#include +#ifdef __i386__ +#include +#else +#include "vm86_struct.h" +#endif +#include +#include "v86bios.h" +#include "AsmMacros.h" + +extern int emu_vm86(struct vm86_struct *vm, unsigned debug); + +#define INT2PTR(a) ((a) + (unsigned char *) 0) + +void log_err(char *format, ...) __attribute__ ((format (printf, 1, 2))); + +struct vm86_struct vm86s; + +static int vm86_GP_fault(void); +static int vm86_do_int(int num); +#ifdef __i386__ +static int vm86_rep(struct vm86_struct *ptr); +#endif +void log_registers(void); + +#define CPU_REG(x) (vm86s.regs.x) +#define CPU_REG_LW(reg) (*((CARD16 *)&CPU_REG(reg))) +#define CPU_REG_HW(reg) (*((CARD16 *)&CPU_REG(reg) + 1)) +#define CPU_REG_LB(reg) (*(CARD8 *)&CPU_REG(e##reg)) +#define SEG_ADR(type, seg, reg) type((CPU_REG_LW(seg) << 4) + CPU_REG_LW(e##reg) + (unsigned char *) 0) +#define DF (1 << 10) + +struct pio P; + +void +setup_io(void) +{ + P.inb = (CARD8(*)(CARD16))inb; + P.inw = (CARD16(*)(CARD16))inw; + P.inl = (CARD32(*)(CARD16))inl; + P.outb = (void(*)(CARD16,CARD8))outb; + P.outw = (void(*)(CARD16,CARD16))outw; + P.outl = (void(*)(CARD16,CARD32))outl; +} + + +static void +setup_vm86(unsigned long bios_start, i86biosRegsPtr regs) +{ + CARD32 eip; + CARD16 cs; + + vm86s.flags = VM86_SCREEN_BITMAP; + vm86s.flags = 0; + vm86s.screen_bitmap = 0; + vm86s.cpu_type = CPU_586; + memset(&vm86s.int_revectored, 0xff,sizeof(vm86s.int_revectored)) ; + memset(&vm86s.int21_revectored, 0xff,sizeof(vm86s.int21_revectored)) ; + + eip = bios_start & 0xFFFF; + cs = (bios_start & 0xFF0000) >> 4; + + CPU_REG(eax) = regs->ax; + CPU_REG(ebx) = regs->bx; + CPU_REG(ecx) = regs->cx; + CPU_REG(edx) = regs->dx; + CPU_REG(esi) = 0; + CPU_REG(edi) = regs->di; + CPU_REG(ebp) = 0; + CPU_REG(eip) = eip; + CPU_REG(cs) = cs; + CPU_REG(esp) = 0x100; + CPU_REG(ss) = 0x30; /* This is the standard pc bios stack */ + CPU_REG(es) = regs->es; + CPU_REG(ds) = 0x40; /* standard pc ds */ + CPU_REG(fs) = 0; + CPU_REG(gs) = 0; + CPU_REG(eflags) |= (VIF_MASK | VIP_MASK); +} + +void +collect_bios_regs(i86biosRegsPtr regs) +{ + regs->ax = CPU_REG(eax); + regs->bx = CPU_REG(ebx); + regs->cx = CPU_REG(ecx); + regs->dx = CPU_REG(edx); + regs->es = CPU_REG(es); + regs->ds = CPU_REG(ds); + regs->di = CPU_REG(edi); + regs->si = CPU_REG(esi); +} + +static int do_vm86(int cpuemu) +{ + int retval; + +#ifdef V86BIOS_DEBUG + dump_registers(); +#endif + +#ifdef __i386__ + if(cpuemu) { + retval = emu_vm86(&vm86s, cpuemu & 2); + } + else { + retval = vm86_rep(&vm86s); + } +#else + retval = emu_vm86(&vm86s, cpuemu & 2); +#endif + + switch (VM86_TYPE(retval)) { + case VM86_UNKNOWN: + if (!vm86_GP_fault()) + return 0; + break; + case VM86_STI: + log_err("vm86_sti :-((\n"); + log_registers(); + return 0; + case VM86_INTx: + if (!vm86_do_int(VM86_ARG(retval))) { + log_err("Unknown vm86_int: %X\n",VM86_ARG(retval)); + log_registers(); + return 0; + } + /* I'm not sure yet what to do if we can handle ints */ + break; + case VM86_SIGNAL: + log_err("VBE: received a signal!\n"); + log_registers(); + return 0; + default: + log_err("unknown type(0x%x)=0x%x\n", + VM86_ARG(retval),VM86_TYPE(retval)); + log_registers(); + return 0; + } + + return 1; +} + +void +do_x86(unsigned long bios_start, i86biosRegsPtr regs, int cpuemu) +{ + setup_vm86(bios_start, regs); + while(do_vm86(cpuemu)) {}; + collect_bios_regs(regs); +} + +/* get the linear address */ +#define LIN_PREF_SI ((pref_seg << 4) + CPU_REG_LW(esi)) + +#define LWECX (prefix66 ^ prefix67 ? CPU_REG(ecx) : CPU_REG_LW(ecx)) + +static int +vm86_GP_fault(void) +{ + unsigned char *csp, *lina; + CARD32 org_eip; + int pref_seg; + int done,is_rep,prefix66,prefix67; + + + csp = lina = SEG_ADR((unsigned char *), cs, ip); +#ifdef V86BIOS_DEBUG + printf("exception: \n"); + dump_code(); +#endif + + is_rep = 0; + prefix66 = prefix67 = 0; + pref_seg = -1; + + /* eat up prefixes */ + done = 0; + do { + switch (*(csp++)) { + case 0x66: /* operand prefix */ prefix66=1; break; + case 0x67: /* address prefix */ prefix67=1; break; + case 0x2e: /* CS */ pref_seg=CPU_REG(cs); break; + case 0x3e: /* DS */ pref_seg=CPU_REG(ds); break; + case 0x26: /* ES */ pref_seg=CPU_REG(es); break; + case 0x36: /* SS */ pref_seg=CPU_REG(ss); break; + case 0x65: /* GS */ pref_seg=CPU_REG(gs); break; + case 0x64: /* FS */ pref_seg=CPU_REG(fs); break; + case 0xf2: /* repnz */ + case 0xf3: /* rep */ is_rep=1; break; + default: done=1; + } + } while (!done); + csp--; /* oops one too many */ + org_eip = CPU_REG(eip); + CPU_REG_LW(eip) += (csp - lina); + + switch (*csp) { + + case 0x6c: /* insb */ + /* NOTE: ES can't be overwritten; prefixes 66,67 should use esi,edi,ecx + * but is anyone using extended regs in real mode? */ + /* WARNING: no test for DI wrapping! */ + CPU_REG_LW(edi) += port_rep_inb(CPU_REG_LW(edx), + SEG_ADR((CARD8 *),es,di), + CPU_REG_LW(eflags)&DF, + (is_rep? LWECX:1)); + if (is_rep) LWECX = 0; + CPU_REG_LW(eip)++; + break; + + case 0x6d: /* (rep) insw / insd */ + /* NOTE: ES can't be overwritten */ + /* WARNING: no test for _DI wrapping! */ + if (prefix66) { + CPU_REG_LW(edi) += port_rep_inl(CPU_REG_LW(edx), + SEG_ADR((CARD32 *),es,di), + CPU_REG_LW(eflags)&DF, + (is_rep? LWECX:1)); + } + else { + CPU_REG_LW(edi) += port_rep_inw(CPU_REG_LW(edx), + SEG_ADR((CARD16 *),es,di), + CPU_REG_LW(eflags)&DF, + (is_rep? LWECX:1)); + } + if (is_rep) LWECX = 0; + CPU_REG_LW(eip)++; + break; + + case 0x6e: /* (rep) outsb */ + if (pref_seg < 0) pref_seg = CPU_REG_LW(ds); + /* WARNING: no test for _SI wrapping! */ + CPU_REG_LW(esi) += port_rep_outb(CPU_REG_LW(edx),(CARD8*)INT2PTR(LIN_PREF_SI), + CPU_REG_LW(eflags)&DF, + (is_rep? LWECX:1)); + if (is_rep) LWECX = 0; + CPU_REG_LW(eip)++; + break; + + case 0x6f: /* (rep) outsw / outsd */ + if (pref_seg < 0) pref_seg = CPU_REG_LW(ds); + /* WARNING: no test for _SI wrapping! */ + if (prefix66) { + CPU_REG_LW(esi) += port_rep_outl(CPU_REG_LW(edx), + (CARD32 *)INT2PTR(LIN_PREF_SI), + CPU_REG_LW(eflags)&DF, + (is_rep? LWECX:1)); + } + else { + CPU_REG_LW(esi) += port_rep_outw(CPU_REG_LW(edx), + (CARD16 *)INT2PTR(LIN_PREF_SI), + CPU_REG_LW(eflags)&DF, + (is_rep? LWECX:1)); + } + if (is_rep) LWECX = 0; + CPU_REG_LW(eip)++; + break; + + case 0xe5: /* inw xx, inl xx */ + if (prefix66) CPU_REG(eax) = P.inl((int) csp[1]); + else CPU_REG_LW(eax) = P.inw((int) csp[1]); + CPU_REG_LW(eip) += 2; + break; + case 0xe4: /* inb xx */ + CPU_REG_LW(eax) &= ~(CARD32)0xff; + CPU_REG_LB(ax) |= P.inb((int) csp[1]); + CPU_REG_LW(eip) += 2; + break; + case 0xed: /* inw dx, inl dx */ + if (prefix66) CPU_REG(eax) = P.inl(CPU_REG_LW(edx)); + else CPU_REG_LW(eax) = P.inw(CPU_REG_LW(edx)); + CPU_REG_LW(eip) += 1; + break; + case 0xec: /* inb dx */ + CPU_REG_LW(eax) &= ~(CARD32)0xff; + CPU_REG_LB(ax) |= P.inb(CPU_REG_LW(edx)); + CPU_REG_LW(eip) += 1; + break; + + case 0xe7: /* outw xx */ + if (prefix66) P.outl((int)csp[1], CPU_REG(eax)); + else P.outw((int)csp[1], CPU_REG_LW(eax)); + CPU_REG_LW(eip) += 2; + break; + case 0xe6: /* outb xx */ + P.outb((int) csp[1], CPU_REG_LB(ax)); + CPU_REG_LW(eip) += 2; + break; + case 0xef: /* outw dx */ + if (prefix66) P.outl(CPU_REG_LW(edx), CPU_REG(eax)); + else P.outw(CPU_REG_LW(edx), CPU_REG_LW(eax)); + CPU_REG_LW(eip) += 1; + break; + case 0xee: /* outb dx */ + P.outb(CPU_REG_LW(edx), CPU_REG_LB(ax)); + CPU_REG_LW(eip) += 1; + break; + + case 0xf4: +#ifdef V86BIOS_DEBUG + printf("hlt at %p\n", lina); +#endif + return 0; + + case 0x0f: + log_err("CPU 0x0f Trap at eip=0x%lx\n",CPU_REG(eip)); + goto op0ferr; + break; + + case 0xf0: /* lock */ + default: + log_err("unknown reason for exception\n"); + log_registers(); + op0ferr: + log_err("cannot continue\n"); + return 0; + } /* end of switch() */ + return 1; +} + +static int +vm86_do_int(int num) +{ + int val; + struct regs86 regs; + + /* try to run bios interrupt */ + + /* if not installed fall back */ +#define COPY(x) regs.x = CPU_REG(x) +#define COPY_R(x) CPU_REG(x) = regs.x + + COPY(eax); + COPY(ebx); + COPY(ecx); + COPY(edx); + COPY(esi); + COPY(edi); + COPY(ebp); + COPY(eip); + COPY(esp); + COPY(cs); + COPY(ss); + COPY(ds); + COPY(es); + COPY(fs); + COPY(gs); + COPY(eflags); + + if (!(val = int_handler(num,®s))) + if (!(val = run_bios_int(num,®s))) + return val; + + COPY_R(eax); + COPY_R(ebx); + COPY_R(ecx); + COPY_R(edx); + COPY_R(esi); + COPY_R(edi); + COPY_R(ebp); + COPY_R(eip); + COPY_R(esp); + COPY_R(cs); + COPY_R(ss); + COPY_R(ds); + COPY_R(es); + COPY_R(fs); + COPY_R(gs); + COPY_R(eflags); + + return val; +#undef COPY +#undef COPY_R +} + +#ifdef __i386__ + +static int +vm86_rep(struct vm86_struct *ptr) +{ + + int __res; + + /* stay away from %ebx */ + __asm__ __volatile__("push %%ebx\n\tmov %%ecx,%%ebx\n\tpush %%gs\n\tint $0x80\n\tpop %%gs\n\tpop %%ebx\n" + :"=a" (__res):"a" ((int)113), + "c" ((struct vm86_struct *)ptr)); + + if ((__res) < 0) { + errno = -__res; + __res=-1; + } + else errno = 0; + return __res; +} + +#endif + +#ifdef __i386__ + +#define pushw(base, ptr, val) \ +__asm__ __volatile__( \ + "decw %w0\n\t" \ + "movb %h2,(%1,%0)\n\t" \ + "decw %w0\n\t" \ + "movb %b2,(%1,%0)" \ + : "=r" (ptr) \ + : "r" (base), "q" (val), "0" (ptr)) + +#else + +#define pushw(base, ptr, val) { \ + ptr = ((ptr) - 1) & 0xffff; \ + *((unsigned char *)(base) + (ptr)) = (val) >> 8; \ + ptr = ((ptr) - 1) & 0xffff; \ + *((unsigned char *)(base) + (ptr)) = (val); \ + } + +#endif + +int +run_bios_int(int num, struct regs86 *regs) +{ + CARD16 *ssp; + CARD32 sp; + CARD32 eflags; + +#ifdef V86BIOS_DEBUG + static int firsttime = 1; +#endif + /* check if bios vector is initialized */ + if (((CARD16*)0)[(num<<1)+1] == 0x0000) { /* SYS_BIOS_SEG ?*/ + return 0; + } + +#ifdef V86BIOS_DEBUG + if (firsttime) { + dprint(0,0x3D0); + firsttime = 0; + } +#endif + + ssp = (CARD16*)INT2PTR(CPU_REG(ss)<<4); + sp = (CARD32) CPU_REG_LW(esp); + + eflags = regs->eflags; + eflags = ((eflags & VIF_MASK) != 0) + ? (eflags | IF_MASK) : (eflags & ~(CARD32) IF_MASK); + pushw(ssp, sp, eflags); + pushw(ssp, sp, regs->cs); + pushw(ssp, sp, (CARD16)regs->eip); + regs->esp -= 6; + regs->cs = ((CARD16 *) 0)[(num << 1) + 1]; + regs->eip = (regs->eip & 0xFFFF0000) | ((CARD16 *) 0)[num << 1]; +#ifdef V86BIOS_DEBUG + dump_code(); +#endif + regs->eflags = regs->eflags + & ~(VIF_MASK | TF_MASK | IF_MASK | NT_MASK); + return 1; +} + +CARD32 +getIntVect(int num) +{ + return ((CARD32*)0)[num]; +} + +CARD32 +getIP(void) +{ + return (CPU_REG(cs) << 4) + CPU_REG(eip); +} + +void log_registers() +{ + log_err( + " eax %08x, ebx %08x, ecx %08x, edx %08x\n" + " esi %08x, edi %08x, ebp %08x, esp %08x\n" + " ds %04x, es %04x, fs %04x, gs %04x, ss %04x\n" + " cs:eip %04x:%08x\n", + (unsigned) CPU_REG(eax), (unsigned) CPU_REG(ebx), (unsigned) CPU_REG(ecx), (unsigned) CPU_REG(edx), + (unsigned) CPU_REG(esi), (unsigned) CPU_REG(edi), (unsigned) CPU_REG(ebp), (unsigned) CPU_REG(esp), + (unsigned) CPU_REG(ds), (unsigned) CPU_REG(es), + (unsigned) CPU_REG(fs), (unsigned) CPU_REG(gs), (unsigned) CPU_REG(ss), + (unsigned) CPU_REG(cs), (unsigned) CPU_REG(eip) + ); +} + diff --git a/src/hwinfo/src/int10/i10_vbios.c b/src/hwinfo/src/int10/i10_vbios.c new file mode 100644 index 0000000000..c9521991b8 --- /dev/null +++ b/src/hwinfo/src/int10/i10_vbios.c @@ -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 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#if defined(__alpha__) || defined (__ia64__) +#include +//#elif defined(HAVE_SYS_PERM) +#else +#include +#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 index 0000000000..04c1507f46 --- /dev/null +++ b/src/hwinfo/src/int10/int10.c @@ -0,0 +1,299 @@ +#include +#include +#include +#include +#include + +#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 index 0000000000..840f9d4aea --- /dev/null +++ b/src/hwinfo/src/int10/pci.h @@ -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 index 0000000000..c0c8acca6a --- /dev/null +++ b/src/hwinfo/src/int10/v86bios.h @@ -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 + +#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 index 0000000000..edcb715f91 --- /dev/null +++ b/src/hwinfo/src/int10/vbios.h @@ -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 index 0000000000..772e6cab23 --- /dev/null +++ b/src/hwinfo/src/int10/vm86_struct.h @@ -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 index 0000000000..5e52e6b505 --- /dev/null +++ b/src/hwinfo/src/isdn/Makefile @@ -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 index 0000000000..4a66c7f03e --- /dev/null +++ b/src/hwinfo/src/isdn/cdb/ISDN.axp.txt @@ -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 index 0000000000..bae7d097c5 --- /dev/null +++ b/src/hwinfo/src/isdn/cdb/ISDN.i386.txt @@ -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 index 0000000000..d4acd85b12 --- /dev/null +++ b/src/hwinfo/src/isdn/cdb/ISDN.ppc.txt @@ -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 index 0000000000..71dab3db08 --- /dev/null +++ b/src/hwinfo/src/isdn/cdb/ISDN.x86_64.txt @@ -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 index 0000000000..43cba1fa66 --- /dev/null +++ b/src/hwinfo/src/isdn/cdb/Makefile @@ -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 index 0000000000..935e243a3f --- /dev/null +++ b/src/hwinfo/src/isdn/cdb/cdb_hwdb.h @@ -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 index 0000000000..92147e182a --- /dev/null +++ b/src/hwinfo/src/isdn/cdb/cdb_read.c @@ -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 index 0000000000..3eb01e6e6b --- /dev/null +++ b/src/hwinfo/src/isdn/cdb/cdb_read.h @@ -0,0 +1,50 @@ +#include +#include +#include +#include +#include +#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 index 0000000000..3404075f9f --- /dev/null +++ b/src/hwinfo/src/isdn/cdb/isdn_cdb.c @@ -0,0 +1,244 @@ +#include +#include +#include +#include +#include +#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 index 0000000000..15f1653d6f --- /dev/null +++ b/src/hwinfo/src/isdn/cdb/isdn_cdb.lex @@ -0,0 +1,64 @@ +WSP [ \t] +VALCHAR [^\|] + +%START Main NextLine NewEntry Value + +%{ +#include "isdn_cdb_def.h" +%} +%% + int item = 0; + +
{ +# BEGIN NextLine; +^\| { + if (new_entry()) + exit(99); + BEGIN NewEntry; + } +^{WSP}+ ; +\n ; +} + +{ +.* ; +\n BEGIN Main; +} + +{ +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; +} + +{ +\| 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 index 0000000000..10da231dd1 --- /dev/null +++ b/src/hwinfo/src/isdn/cdb/isdn_cdb_def.h @@ -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 index 0000000000..d5dc95e5f3 --- /dev/null +++ b/src/hwinfo/src/isdn/cdb/mk_isdnhwdb.c @@ -0,0 +1,293 @@ +#include +#include +#include +#include +#include +#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 index 0000000000..f793eb4040 --- /dev/null +++ b/src/hwinfo/src/isdn/cdbisdn.c @@ -0,0 +1,400 @@ +#include +#include +#include +#include +#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 index 0000000000..14f7575deb --- /dev/null +++ b/src/hwinfo/src/isdn/isa_probe.c @@ -0,0 +1,238 @@ +#if defined(__i386__) + +#include +#include + +#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 index 0000000000..a384036638 --- /dev/null +++ b/src/hwinfo/src/isdn/libihw.txt @@ -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 index 0000000000..bcba090279 --- /dev/null +++ b/src/hwinfo/src/smp/Makefile @@ -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 index 0000000000..7ccf29e7b5 --- /dev/null +++ b/src/hwinfo/src/smp/README @@ -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 index 0000000000..4ccfc76ce1 --- /dev/null +++ b/src/hwinfo/src/smp/smp.c @@ -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 +#include +#include +#include +#include +#include +#include + +#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 index 0000000000..a3ede4a87d --- /dev/null +++ b/src/hwinfo/src/x86emu/LICENSE @@ -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 index 0000000000..362c4142d1 --- /dev/null +++ b/src/hwinfo/src/x86emu/Makefile @@ -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 index 0000000000..ed8f2f0e04 --- /dev/null +++ b/src/hwinfo/src/x86emu/debug.c @@ -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 +#include +#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 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 index 0000000000..5edaf154fd --- /dev/null +++ b/src/hwinfo/src/x86emu/decode.c @@ -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 +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 index 0000000000..4b801dc94c --- /dev/null +++ b/src/hwinfo/src/x86emu/fpu.c @@ -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 index 0000000000..fd8ecff755 --- /dev/null +++ b/src/hwinfo/src/x86emu/include/x86emu.h @@ -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 index 0000000000..a62b49362b --- /dev/null +++ b/src/hwinfo/src/x86emu/include/x86emu/fpu_regs.h @@ -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 index 0000000000..5d224ce410 --- /dev/null +++ b/src/hwinfo/src/x86emu/include/x86emu/regs.h @@ -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 index 0000000000..f31d77fe63 --- /dev/null +++ b/src/hwinfo/src/x86emu/include/x86emu/types.h @@ -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 +#endif + +/* + * The following kludge is an attempt to work around typedef conflicts with + * . + */ +#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 index 0000000000..6fc936b284 --- /dev/null +++ b/src/hwinfo/src/x86emu/ops.c @@ -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 index 0000000000..7cb585bc89 --- /dev/null +++ b/src/hwinfo/src/x86emu/ops2.c @@ -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 index 0000000000..56ab8cc9ac --- /dev/null +++ b/src/hwinfo/src/x86emu/prim_ops.c @@ -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 index 0000000000..cf13517878 --- /dev/null +++ b/src/hwinfo/src/x86emu/sys.c @@ -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 +#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 index 0000000000..239f6c1f34 --- /dev/null +++ b/src/hwinfo/src/x86emu/validate.c @@ -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 +#include +#include +#include +#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 index 0000000000..8abedf6160 --- /dev/null +++ b/src/hwinfo/src/x86emu/x86emu/debug.h @@ -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 index 0000000000..bb2bc0bee8 --- /dev/null +++ b/src/hwinfo/src/x86emu/x86emu/decode.h @@ -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 index 0000000000..5fb271463b --- /dev/null +++ b/src/hwinfo/src/x86emu/x86emu/fpu.h @@ -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 index 0000000000..65ea676543 --- /dev/null +++ b/src/hwinfo/src/x86emu/x86emu/ops.h @@ -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 index 0000000000..041255f186 --- /dev/null +++ b/src/hwinfo/src/x86emu/x86emu/prim_asm.h @@ -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 index 0000000000..21ab1451f2 --- /dev/null +++ b/src/hwinfo/src/x86emu/x86emu/prim_ops.h @@ -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 index 0000000000..3adf61ec69 --- /dev/null +++ b/src/hwinfo/src/x86emu/x86emu/x86emui.h @@ -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 +#else +#include +#include +#include +#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 */ -- 2.39.2