kgdb: update mem2hex/hex2mem funcs
authorRobin Getz <robin.getz@analog.com>
Mon, 21 Dec 2009 23:40:44 +0000 (18:40 -0500)
committerWolfgang Denk <wd@denx.de>
Sun, 17 Jan 2010 23:24:21 +0000 (00:24 +0100)
Convert the funcs to do the conversion inline so that we can do the copy
all at once with memcpy.  This let's us push out an weird arch-specific
issue with accessing different regions of memory to the memcpy function
like the MMRs on Blackfin systems, and it should be a bit faster.

Signed-off-by: Robin Getz <robin.getz@analog.com>
Signed-off-by: Mike Frysinger <vapier@gentoo.org>
common/kgdb.c

index 862f3684e2afbbda0cde825d8aaaacfe97d8833a..0531452a23be652555296a1b4503f7911ac49424 100644 (file)
@@ -132,11 +132,20 @@ hex(unsigned char ch)
 static unsigned char *
 mem2hex(char *mem, char *buf, int count)
 {
+       char *tmp;
        unsigned char ch;
 
+       /*
+        * We use the upper half of buf as an intermediate buffer for the
+        * raw memory copy.  Hex conversion will work against this one.
+        */
+       tmp = buf + count;
        longjmp_on_fault = 1;
+
+       memcpy(tmp, mem, count);
+
        while (count-- > 0) {
-               ch = *mem++;
+               ch = *tmp++;
                *buf++ = hexchars[ch >> 4];
                *buf++ = hexchars[ch & 0xf];
        }
@@ -151,21 +160,33 @@ mem2hex(char *mem, char *buf, int count)
 static char *
 hex2mem(char *buf, char *mem, int count)
 {
-       int i, hexValue;
-       unsigned char ch;
-       char *mem_start = mem;
+       int hexValue;
+       char *tmp_raw, *tmp_hex;
+
+       /*
+        * We use the upper half of buf as an intermediate buffer for the
+        * raw memory that is converted from hex.
+        */
+       tmp_raw = buf + count * 2;
+       tmp_hex = tmp_raw - 1;
 
        longjmp_on_fault = 1;
-       for (i=0; i<count; i++) {
-               if ((hexValue = hex(*buf++)) < 0)
+       while (tmp_hex >= buf) {
+               tmp_raw--;
+               hexValue = hex(*tmp_hex--);
+               if (hexValue < 0)
                        kgdb_error(KGDBERR_NOTHEXDIG);
-               ch = hexValue << 4;
-               if ((hexValue = hex(*buf++)) < 0)
+               *tmp_raw = hexValue;
+               hexValue = hex(*tmp_hex--);
+               if (hexValue < 0)
                        kgdb_error(KGDBERR_NOTHEXDIG);
-               ch |= hexValue;
-               *mem++ = ch;
+               *tmp_raw |= hexValue << 4;
+
        }
-       kgdb_flush_cache_range((void *)mem_start, (void *)(mem - 1));
+
+       memcpy(mem, tmp_raw, count);
+
+       kgdb_flush_cache_range((void *)mem, (void *)(mem+count));
        longjmp_on_fault = 0;
 
        return buf;