Remove CONFIG_KTHREAD_POISON
[akaros.git] / kern / src / hexdump.c
index 45f0822..6b81d42 100644 (file)
@@ -25,6 +25,7 @@
 #include <string.h>
 #include <assert.h>
 #include <smp.h>
+#include <pmap.h>
 
 static int isprint(int c)
 {
@@ -33,35 +34,65 @@ static int isprint(int c)
 
 void hexdump(void *v, int length)
 {
-        int i;
-        uint8_t *m = v;
-       uintptr_t memory = (uintptr_t)v;
-        int all_zero = 0;
+       int i;
+       uint8_t *m = v;
+       uintptr_t memory = (uintptr_t) v;
+       int all_zero = 0;
 
-        for (i = 0; i < length; i += 16) {
-                int j;
+       for (i = 0; i < length; i += 16) {
+               int j;
 
-                all_zero++;
-                for (j = 0; j < 16; j++) {
-                        if(m[i+j] != 0) {
-                                all_zero = 0;
-                                break;
-                        }
-                }
+               all_zero++;
+               for (j = 0; (j < 16) && (i + j < length); j++) {
+                       if (m[i + j] != 0) {
+                               all_zero = 0;
+                               break;
+                       }
+               }
 
-                if (all_zero < 2) {
-                        printk("%08lx:", memory + i);
-                        for (j = 0; j < 16; j++)
-                                printk(" %02x", m[i+j]);
-                        printk("  ");
-                        for (j = 0; j < 16; j++)
-                                printk("%c",
-                                       isprint(m[i+j]) ? m[i+j] : '.');
-                        printk("\n");
-                } else if (all_zero == 2) {
-                        printk("...\n");
-                }
-        }
+               if (all_zero < 2) {
+                       printk("%08lx:", memory + i);
+                       for (j = 0; j < 16; j++)
+                               printk(" %02x", m[i + j]);
+                       printk("  ");
+                       for (j = 0; j < 16; j++)
+                               printk("%c", isprint(m[i + j]) ? m[i + j] : '.');
+                       printk("\n");
+               } else if (all_zero == 2) {
+                       printk("...\n");
+               }
+       }
 }
 
+/* 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;
+}