Remove CONFIG_KTHREAD_POISON
[akaros.git] / kern / src / hexdump.c
index 0fa1918..6b81d42 100644 (file)
@@ -25,6 +25,7 @@
 #include <string.h>
 #include <assert.h>
 #include <smp.h>
+#include <pmap.h>
 
 static int isprint(int c)
 {
@@ -42,7 +43,7 @@ void hexdump(void *v, int length)
                int j;
 
                all_zero++;
-               for (j = 0; j < 16; j++) {
+               for (j = 0; (j < 16) && (i + j < length); j++) {
                        if (m[i + j] != 0) {
                                all_zero = 0;
                                break;
@@ -62,3 +63,36 @@ void hexdump(void *v, int length)
                }
        }
 }
+
+/* easier in monitor */
+void pahexdump(uintptr_t pa, int len)
+{
+       void *v = KADDR(pa);
+       hexdump(v, len);
+}
+
+/* Print a string, with printables preserved, and \xxx where not possible. */
+int printdump(char *buf, int numprint, int buflen, uint8_t *data)
+{
+       int ret = 0;
+       int ix = 0;
+
+       if (buflen < 1)
+               return ret;
+       buf[ret++] = '\'';
+       /* we want 2 bytes left in the buf (which is ret < buflen - 1), one for the
+        * char, and one for the \' after the loop. */
+       while (ix < numprint && ret < (buflen - 1)) {
+               if (isprint(data[ix])) {
+                       buf[ret++] = data[ix];
+               } else if (ret < buflen - 4) {
+                       /* guarantee there is room for a \xxx sequence */
+                       ret += snprintf(&buf[ret], buflen-ret, "\\%03o", data[ix]);
+               } else {
+                       break;
+               }
+               ix++;
+       }
+       buf[ret++] = '\'';
+       return ret;
+}