On Feb 10, 2008 9:39 AM, Jan Kiszka <jan.kiszka@web.de> wrote:
Thanks for responding. I'd mentioned it twice already and gotten no
response, so wasn't sure if my microphone was on :-).
If you're feeling energetic, the same sort of cleanup can be done against:
+#ifdef __BIG_ENDIAN
+ tmp_s |= hex(*buf++) << 12;
+ tmp_s |= hex(*buf++) << 8;
+ tmp_s |= hex(*buf++) << 4;
+ tmp_s |= hex(*buf++);
+#else
+ tmp_s |= hex(*buf++) << 4;
+ tmp_s |= hex(*buf++);
+ tmp_s |= hex(*buf++) << 12;
+ tmp_s |= hex(*buf++) << 8;
+#endif
+ if (probe_kernel_write(mem, tmp_s))
+ return ERR_PTR(-EINVAL);
+
+ mem += 2;
+ } else if ((count == 4) && (((long)mem & 3) == 0)) {
+ u32 tmp_l = 0;
+
+#ifdef __BIG_ENDIAN
+ tmp_l |= hex(*buf++) << 28;
+ tmp_l |= hex(*buf++) << 24;
+ tmp_l |= hex(*buf++) << 20;
+ tmp_l |= hex(*buf++) << 16;
+ tmp_l |= hex(*buf++) << 12;
+ tmp_l |= hex(*buf++) << 8;
+ tmp_l |= hex(*buf++) << 4;
+ tmp_l |= hex(*buf++);
+#else
+ tmp_l |= hex(*buf++) << 4;
+ tmp_l |= hex(*buf++);
+ tmp_l |= hex(*buf++) << 12;
+ tmp_l |= hex(*buf++) << 8;
+ tmp_l |= hex(*buf++) << 20;
+ tmp_l |= hex(*buf++) << 16;
+ tmp_l |= hex(*buf++) << 28;
+ tmp_l |= hex(*buf++) << 24;
+#endif
+ if (probe_kernel_write(mem, tmp_l))
+ return ERR_PTR(-EINVAL);
+ mem += 4;
As in, write a helper to parse a hex16, hex32, hex64, then do a
be[16|32|64]_to_cpu, and probe_kernel_write the result.
u64 hex_to_u64(unsigned char *buf)
{
int i;
u64 val = 0;
for (i=0; i<16; i++)
val = val<<4 | hex(buf[i]); /* or *buf++, take your pick */
return val;
}
...
if (probe_kernel_write(mem, be64_to_cpu(hex_to_u64(unsigned char *buf)))
return ERR_PTR(-EINVAL));
mem += 4;
buf += 16;
Or, you know, something like that.
--