summaryrefslogtreecommitdiff
path: root/sys/src/cmd/io.c
diff options
context:
space:
mode:
authoraiju <devnull@localhost>2011-04-15 21:01:29 +0200
committeraiju <devnull@localhost>2011-04-15 21:01:29 +0200
commit2c6802e80f2bc7be660981b183fe89ecd72061ce (patch)
treebf95f457935e7fbbc3899e9b9c8a395fe3849e04 /sys/src/cmd/io.c
parent68d6b0808bbd57a91abf2a5ac4571e4372a8d3fc (diff)
added io/seg utility
Diffstat (limited to 'sys/src/cmd/io.c')
-rw-r--r--sys/src/cmd/io.c55
1 files changed, 55 insertions, 0 deletions
diff --git a/sys/src/cmd/io.c b/sys/src/cmd/io.c
new file mode 100644
index 000000000..59ccf22fd
--- /dev/null
+++ b/sys/src/cmd/io.c
@@ -0,0 +1,55 @@
+#include <u.h>
+#include <libc.h>
+
+const char const * datac[] = {0,"#P/iob","#P/iow",0,"#P/iol",0,0,0,"#P/msr"};
+
+void
+main(int argc, char** argv) {
+ int fd, size, op;
+ ulong port;
+ uvlong data;
+ uchar datab[8];
+
+ data = 0;
+ size = 1;
+ op = -1;
+ ARGBEGIN {
+ case 'W': size = 2; break;
+ case 'L': size = 4; break;
+ case 'M': size = 8; break;
+ case 'r': op = OREAD; break;
+ case 'w': op = OWRITE; break;
+ default: sysfatal("bad flag %c", ARGC());
+ } ARGEND;
+ if(op == -1) sysfatal("no operation selected");
+ if(argc < 1) sysfatal("no port selected");
+ if(op == OWRITE && argc < 2) sysfatal("no data selected");
+ port = strtoul(argv[0], 0, 0);
+ if(op == OWRITE) data = strtoull(argv[1], 0, 0);
+
+ fd = open(datac[size], op);
+ if(fd == -1) sysfatal("open: %r");
+
+ if(op == OWRITE) {
+ datab[0] = data;
+ datab[1] = data >> 8;
+ datab[2] = data >> 16;
+ datab[3] = data >> 24;
+ datab[4] = data >> 32;
+ datab[5] = data >> 40;
+ datab[6] = data >> 48;
+ datab[7] = data >> 56;
+ if(pwrite(fd, datab, size, port) != size)
+ sysfatal("pwrite: %r");
+ }
+ else {
+ memset(datab, 0, 8);
+ if(pread(fd, datab, size, port) != size)
+ sysfatal("pread: %r");
+ data = datab[0] | (datab[1] << 8) | (datab[2] << 16) |
+ (datab[3] << 24) | ((vlong)datab[4] << 32) |
+ ((vlong)datab[5] << 40) | ((vlong)datab[6] << 48) |
+ ((vlong)datab[7] << 56);
+ print("0x%llx\n", data);
+ }
+} \ No newline at end of file