Import /rc/bin/pci from Harvey.
authorDan Cross <crossd@gmail.com>
Thu, 4 Aug 2016 21:42:47 +0000 (17:42 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Fri, 5 Aug 2016 00:49:37 +0000 (17:49 -0700)
As per Dr. Minnich's request. This is the original from Harvey; it
is an 'rc' script.

Change-Id: If7e4014c87bbd5a9d7a7fc9989c23394ee2743c3
Signed-off-by: Dan Cross <crossd@gmail.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
kern/kfs/bin/pci [new file with mode: 0755]

diff --git a/kern/kfs/bin/pci b/kern/kfs/bin/pci
new file mode 100755 (executable)
index 0000000..3b771e3
--- /dev/null
@@ -0,0 +1,116 @@
+#!/bin/rc
+# pci [-bv] - dump pci configuration
+rfork e
+fn verbose {
+       if (! test -f /lib/pci)
+               echo $0: no /lib/pci >[1=2]
+       awk '
+
+       function lower(s) {
+               gsub(/A/, "a", s)
+               gsub(/B/, "b", s)
+               gsub(/C/, "c", s)
+               gsub(/D/, "d", s)
+               gsub(/E/, "e", s)
+               gsub(/F/, "f", s)
+               return s
+       }
+       BEGIN{
+               file="/lib/pci"
+               FS="\t"
+               while(getline <file > 0){
+                       if(/^;/) continue
+                       if(/^[0-9a-fA-F]/){
+                               vid=lower($1)
+                               vendor[vid] = $2
+                       }
+                       if(/^   [0-9a-fA-F]/){
+                               did=lower($2)
+                               id[vid "/" did] = $3
+                       }
+               }
+               FS = " "
+       }
+
+       {
+               print $0
+               vid = $4
+               sub(/\/.*/, "", vid)
+               if(vid in vendor){
+                       s = vendor[vid]
+                       if($4 in id)
+                               s = s " " id[$4]
+                       print "\t" s
+               }
+       }
+'
+}
+fn usage {
+       echo usage: $1 '[-bv]' >[1=2]
+       exit usage
+}
+
+filter=cat
+bridges=yes
+done=0
+while (~ $done 0 && ! ~ $#* 0 && ~ $1 -*) {
+       if (~ $1 -*b*)
+               bridges=no
+       if (~ $1 -*v*)
+               filter=verbose
+       switch ($1) {
+       case --
+               done = 1                # no break in rc, alas
+       case -*[~bv]*
+               usage $0
+       }
+       shift
+}
+if (! ~ $#* 0)
+       usage $0
+
+# DMG 06/02/2016 Make pci(8) recognize virtio devices
+# source: http://git.qemu.org/?p=qemu.git;a=blob;f=include/hw/pci/pci.h
+# devices with vendor code 0x1af4 are QEMU own virtio devices.
+# useful device codes below:
+# 0x1000: virtio network card
+# 0x1001: virtio block device
+# 0x1002: virtio balloon
+# 0x1003: virtio console
+# 0x1004: virtio SCSI
+# 0x1005: virtio RNG (random numbers generator)
+# 0x1009: virtio 9P transport
+# based on this information, the translation table below is amended
+# to show these devices in the pci (8) output.
+
+builtin cd '#$/pci' && grep . *ctl | {
+       if (~ $bridges no)
+               sed /:06/d
+       if not
+               cat
+       } |
+       sed '
+       s/ctl:/:        /
+       t noop
+: noop
+       s/:     (02\..*\ 1af4\/1000)/:  virtio-net     \1/
+       s/:     (01\..*\ 1af4\/1001)/:  virtio-disk    \1/
+       s/:     (00\..*\ 1af4\/1002)/:  virtio-balloon \1/
+       s/:     (07\..*\ 1af4\/1003)/:  virtio-console \1/
+       s/:     (01\..*\ 1af4\/1004)/:  virtio-scsi    \1/
+       s/:     (00\..*\ 1af4\/1005)/:  virtio-rng     \1/
+       s/:     (00\..*\ 1af4\/1009)/:  virtio-9p      \1/
+       s/:     01/:    disk  01/
+       s/:     02/:    net   02/
+       s/:     03/:    vid   03/
+       s/:     04/:    aud   04/
+       s/:     05/:    mem   05/
+       s/:     06/:    brg   06/
+       s/:     07/:    ser   07/
+       s/:     0c\.03/:        usb   0c.03/
+       s/:     0c\.05/:        smb   0c.05/
+       s/:     0d/:    rad   0d/
+       s/:     10/:    cryp  10/
+       t
+       s/      /       ---  /
+' | $filter