printdump(), used for tracing
authorRonald G. Minnich <rminnich@gmail.com>
Fri, 29 Aug 2014 06:36:05 +0000 (06:36 +0000)
committerBarret Rhoden <brho@cs.berkeley.edu>
Wed, 3 Sep 2014 00:00:36 +0000 (17:00 -0700)
Git-fu'd by brho.

kern/include/kdebug.h
kern/src/hexdump.c

index 4405b2b..970e01f 100644 (file)
@@ -31,6 +31,7 @@ void __print_func_exit(const char *func, const char *file);
 #define print_func_exit() __print_func_exit(__FUNCTION__, __FILE__)
 void hexdump(void *v, int length);
 void pahexdump(uintptr_t pa, int length);
+int printdump(char *buf, int buflen, uint8_t *data);
 
 #include <oprofile.h>
 #define TRACEME() oprofile_add_backtrace(read_pc(), read_bp())
index fa94f2e..7abcb5c 100644 (file)
@@ -69,3 +69,22 @@ 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 buflen, uint8_t *data)
+{
+       int ret = 0;
+       int ix = 0;
+       while (ret < buflen) {
+               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++;
+       }
+       return ret;
+}