|
@@ -132,11 +132,20 @@ hex(unsigned char ch)
|
|
static unsigned char *
|
|
static unsigned char *
|
|
mem2hex(char *mem, char *buf, int count)
|
|
mem2hex(char *mem, char *buf, int count)
|
|
{
|
|
{
|
|
|
|
+ char *tmp;
|
|
unsigned char ch;
|
|
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;
|
|
longjmp_on_fault = 1;
|
|
|
|
+
|
|
|
|
+ memcpy(tmp, mem, count);
|
|
|
|
+
|
|
while (count-- > 0) {
|
|
while (count-- > 0) {
|
|
- ch = *mem++;
|
|
|
|
|
|
+ ch = *tmp++;
|
|
*buf++ = hexchars[ch >> 4];
|
|
*buf++ = hexchars[ch >> 4];
|
|
*buf++ = hexchars[ch & 0xf];
|
|
*buf++ = hexchars[ch & 0xf];
|
|
}
|
|
}
|
|
@@ -151,21 +160,33 @@ mem2hex(char *mem, char *buf, int count)
|
|
static char *
|
|
static char *
|
|
hex2mem(char *buf, char *mem, int count)
|
|
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;
|
|
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);
|
|
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);
|
|
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;
|
|
longjmp_on_fault = 0;
|
|
|
|
|
|
return buf;
|
|
return buf;
|