<p>Alexander Couzens has uploaded this change for <strong>review</strong>.</p><p><a href="https://review.coreboot.org/21438">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">add util/iotool: a simple tool to do inb/outb calls<br><br>Change-Id: I4bc8501a355b76a47df7619c4cae22f76c8f5927<br>Signed-off-by: Alexander Couzens <lynxis@fe80.eu><br>---<br>A util/iotool/Makefile<br>A util/iotool/iob.c<br>2 files changed, 94 insertions(+), 0 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://review.coreboot.org:29418/coreboot refs/changes/38/21438/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">diff --git a/util/iotool/Makefile b/util/iotool/Makefile<br>new file mode 100644<br>index 0000000..7dae3f1<br>--- /dev/null<br>+++ b/util/iotool/Makefile<br>@@ -0,0 +1,5 @@<br>+<br>+CFLAGS ?= -Wall -Werror -g -static<br>+<br>+iob: iob.c<br>+ $(CC) $(CFLAGS) -o iob iob.c<br>diff --git a/util/iotool/iob.c b/util/iotool/iob.c<br>new file mode 100644<br>index 0000000..2d31070<br>--- /dev/null<br>+++ b/util/iotool/iob.c<br>@@ -0,0 +1,89 @@<br>+<br>+#include <stdlib.h><br>+#include <stdio.h><br>+<br>+#include <string.h><br>+#include <sys/io.h><br>+<br>+void usage() {<br>+    fprintf(stderr, "iob r|w address value\n");<br>+}<br>+<br>+void request_perm() {<br>+ int ret;<br>+<br>+  ret = iopl(3);<br>+       if (ret) {<br>+           fprintf(stderr, "iopl failed\n");<br>+          exit(2);<br>+     }<br>+}<br>+<br>+int readio(const char *saddr) {<br>+   char *endptr;<br>+        unsigned short int addr = 0;<br>+ unsigned short int value = 0;<br>+<br>+     addr = strtol(saddr, &endptr, 0);<br>+        if (endptr != NULL && *endptr != '\0') {<br>+             fprintf(stderr, "Invalid address '%s'\n", saddr);<br>+          return 1;<br>+    }<br>+<br>+ request_perm();<br>+      value = inb(addr);<br>+   printf("read %04x = %02x\n", addr, value);<br>+<br>+      return 0;<br>+}<br>+<br>+int writeio(const char *saddr, const char *svalue) {<br>+      char *endptr;<br>+        unsigned short int addr = 0;<br>+ unsigned short int value = 0;<br>+<br>+     addr = strtol(saddr, &endptr, 0) & 0xffff;<br>+   if (endptr != NULL && *endptr != '\0') {<br>+             fprintf(stderr, "Invalid address '%s'\n", saddr);<br>+          return 1;<br>+    }<br>+<br>+ value = strtol(svalue, &endptr, 0) & 0xffff;<br>+ if (endptr != NULL && *endptr != '\0') {<br>+             fprintf(stderr, "Invalid value '%s'\n", svalue);<br>+           return 1;<br>+    }<br>+<br>+ request_perm();<br>+      outb(value, addr);<br>+   fprintf(stderr, "written %02x = %02x\n", addr, value);<br>+<br>+  return 0;<br>+}<br>+<br>+int main(int argc, const char *argv[]) {<br>+  if (argc <= 2 || argc > 4) {<br>+           usage();<br>+             exit(1);<br>+     }<br>+<br>+ if (argv[1][0] == 'r' && argv[1][1] == '\0') {<br>+               /* read */<br>+           if (argc != 3) {<br>+                     usage();<br>+                     exit(1);<br>+             }<br>+            return readio(argv[2]);<br>+      } else if (argv[1][0] == 'w' && argv[1][1] == '\0') {<br>+                /* write */<br>+          if (argc != 4) {<br>+                     usage();<br>+                     exit(1);<br>+             }<br>+            return writeio(argv[2], argv[3]);<br>+    } else {<br>+             usage();<br>+             exit(1);<br>+     }<br>+    return 0;<br>+}<br></pre><p>To view, visit <a href="https://review.coreboot.org/21438">change 21438</a>. To unsubscribe, visit <a href="https://review.coreboot.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://review.coreboot.org/21438"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: coreboot </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>
<div style="display:none"> Gerrit-Change-Id: I4bc8501a355b76a47df7619c4cae22f76c8f5927 </div>
<div style="display:none"> Gerrit-Change-Number: 21438 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Alexander Couzens <lynxis@fe80.eu> </div>