mips_m4k : Fix soft breakpoint endianess handling
authorDrasko DRASKOVIC <drasko.draskovic@gmail.com>
Fri, 1 Jul 2011 19:12:54 +0000 (21:12 +0200)
committerDrasko DRASKOVIC <drasko.draskovic@gmail.com>
Fri, 1 Jul 2011 19:31:08 +0000 (21:31 +0200)
In order to compare data read from the target with some marcros or data
defined on the host, we must transform this read data from target
endianess to host endianess.
target_read_memory() gets bytes from target to the host, but keeps them in _target_
endianess. This is OK if we just want to temporary keep this data on the
host, like keeping breakpoint->orig_instr. But if we want to use this
data for any ispections and comparisons on the host side, we must
transform it to _host_ endianess, by using target_buffer_get_u32()
function.
Currently this transformation is missing, and check current_instr ==
MIPS32_SDBBP will never pass if target and host endianess differ,
because current_instr will be kept in _target_ endianess and
MIPS32_SDBBP will be kept in _host_ endianess,

The patch fix this issue by using target_buffer_get_u32() to transform current_instr to
_host_ endianess before comparison.

src/target/mips_m4k.c

index 9b4e1a4..b84783b 100644 (file)
@@ -616,6 +616,14 @@ static int mips_m4k_unset_breakpoint(struct target *target,
                        {
                                return retval;
                        }
+
+                       /**
+                        * target_read_memory() gets us data in _target_ endianess.
+                        * If we want to use this data on the host for comparisons with some macros
+                        * we must first transform it to _host_ endianess using target_buffer_get_u32().
+                        */
+                       current_instr = target_buffer_get_u32(target, (uint8_t *)&current_instr);
+
                        if (current_instr == MIPS32_SDBBP)
                        {
                                if ((retval = target_write_memory(target, breakpoint->address, 4, 1,