summaryrefslogtreecommitdiffstats
path: root/usr.sbin/pciconf
diff options
context:
space:
mode:
authorimp <imp@FreeBSD.org>2001-05-31 18:31:43 +0000
committerimp <imp@FreeBSD.org>2001-05-31 18:31:43 +0000
commitce2cd03ba2aa741fa04795da6d399002974da513 (patch)
treec0b7a357617d371cd2b161f28297433e89dfad93 /usr.sbin/pciconf
parentbfdc5a0e560812f7c844a2bddadd28ecba9898c2 (diff)
downloadFreeBSD-src-ce2cd03ba2aa741fa04795da6d399002974da513.zip
FreeBSD-src-ce2cd03ba2aa741fa04795da6d399002974da513.tar.gz
Support a range of registers to read.
eg pciconf -r pci0:10:0 0:0xff and keep the output of the old singleton the same. Reviewed by: audit@, dd MFC after: 10 days
Diffstat (limited to 'usr.sbin/pciconf')
-rw-r--r--usr.sbin/pciconf/pciconf.85
-rw-r--r--usr.sbin/pciconf/pciconf.c43
2 files changed, 38 insertions, 10 deletions
diff --git a/usr.sbin/pciconf/pciconf.8 b/usr.sbin/pciconf/pciconf.8
index 7e8e893..8f51c6e 100644
--- a/usr.sbin/pciconf/pciconf.8
+++ b/usr.sbin/pciconf/pciconf.8
@@ -38,7 +38,7 @@
.Nm
.Fl r Ar selector
.Op Fl b | Fl h
-.Ar reg
+.Ar reg Ns Op : Ns Ar reg2
.Nm
.Fl w Ar selector
.Op Fl b | Fl h
@@ -146,6 +146,9 @@ option reads a configuration space register at byte offset
of device
.Ar selector
and prints out its value in hexadecimal.
+The optional second
+.Ar reg2
+specifies a range to read.
The
.Fl w
option writes the
diff --git a/usr.sbin/pciconf/pciconf.c b/usr.sbin/pciconf/pciconf.c
index 27e5cd3..d42759c 100644
--- a/usr.sbin/pciconf/pciconf.c
+++ b/usr.sbin/pciconf/pciconf.c
@@ -81,7 +81,7 @@ usage()
fprintf(stderr, "%s\n%s\n%s\n%s\n",
"usage: pciconf -l [-v]",
" pciconf -a sel",
- " pciconf -r [-b | -h] sel addr",
+ " pciconf -r [-b | -h] sel addr[:addr]",
" pciconf -w [-b | -h] sel addr [value]");
exit (1);
}
@@ -449,23 +449,48 @@ getsel(const char *str)
}
static void
-readit(const char *name, const char *reg, int width)
+readone(int fd, struct pcisel *sel, long reg, int width)
{
- int fd;
struct pci_io pi;
- pi.pi_sel = getsel(name);
- pi.pi_reg = strtoul(reg, (char **)0, 0); /* XXX error check */
+ pi.pi_sel = *sel;
+ pi.pi_reg = reg;
pi.pi_width = width;
+ if (ioctl(fd, PCIOCREAD, &pi) < 0)
+ err(1, "ioctl(PCIOCREAD)");
+
+ printf("0x%08x", pi.pi_data);
+}
+
+static void
+readit(const char *name, const char *reg, int width)
+{
+ long rstart;
+ long rend;
+ long r;
+ char *end;
+ int i;
+ int fd;
+ struct pcisel sel;
+
fd = open(_PATH_DEVPCI, O_RDWR, 0);
if (fd < 0)
err(1, "%s", _PATH_DEVPCI);
- if (ioctl(fd, PCIOCREAD, &pi) < 0)
- err(1, "ioctl(PCIOCREAD)");
-
- printf("0x%08x\n", pi.pi_data);
+ rend = rstart = strtol(reg, &end, 0);
+ if (end && *end == ':') {
+ end++;
+ rend = strtol(end, (char **) 0, 0);
+ }
+ sel = getsel(name);
+ for (i = 1, r = rstart; r <= rend; i++, r += width) {
+ readone(fd, &sel, r, width);
+ putchar(i % 4 ? ' ' : '\n');
+ }
+ if (i % 4 != 1)
+ putchar('\n');
+ close(fd);
}
static void
OpenPOWER on IntegriCloud