#include "config.h"
#endif
+#include "replacements.h"
#include "target.h"
#include "log.h"
extern target_type_t arm720t_target;
extern target_type_t arm9tdmi_target;
extern target_type_t arm920t_target;
+extern target_type_t arm966e_target;
target_type_t *target_types[] =
{
&arm9tdmi_target,
&arm920t_target,
&arm720t_target,
+ &arm966e_target,
NULL,
};
if ((retval = target->type->read_memory(target, address, 1, unaligned, buffer)) != ERROR_OK)
return retval;
+ buffer += unaligned;
address += unaligned;
size -= unaligned;
}
if ((retval = target->type->read_memory(target, address, 4, aligned / 4, buffer)) != ERROR_OK)
return retval;
+ buffer += aligned;
address += aligned;
size -= aligned;
}
return ERROR_OK;
}
+void target_read_u32(struct target_s *target, u32 address, u32 *value)
+{
+ u8 value_buf[4];
+
+ target->type->read_memory(target, address, 4, 1, value_buf);
+
+ *value = target_buffer_get_u32(target, value_buf);
+}
+
+void target_read_u16(struct target_s *target, u32 address, u16 *value)
+{
+ u8 value_buf[2];
+
+ target->type->read_memory(target, address, 2, 1, value_buf);
+
+ *value = target_buffer_get_u16(target, value_buf);
+}
+
+void target_read_u8(struct target_s *target, u32 address, u8 *value)
+{
+ target->type->read_memory(target, address, 1, 1, value);
+}
+
+void target_write_u32(struct target_s *target, u32 address, u32 value)
+{
+ u8 value_buf[4];
+
+ target_buffer_set_u32(target, value_buf, value);
+ target->type->write_memory(target, address, 4, 1, value_buf);
+}
+
+void target_write_u16(struct target_s *target, u32 address, u16 value)
+{
+ u8 value_buf[2];
+
+ target_buffer_set_u16(target, value_buf, value);
+ target->type->write_memory(target, address, 2, 1, value_buf);
+}
+
+void target_write_u8(struct target_s *target, u32 address, u8 value)
+{
+ target->type->read_memory(target, address, 1, 1, &value);
+}
+
int target_register_user_commands(struct command_context_s *cmd_ctx)
{
register_command(cmd_ctx, NULL, "reg", handle_reg_command, COMMAND_EXEC, NULL);
int i;
for (i = 0; i < cache->num_regs; i++)
{
- value = buf_to_char(cache->reg_list[i].value, cache->reg_list[i].size);
+ value = buf_to_str(cache->reg_list[i].value, cache->reg_list[i].size, 16);
command_print(cmd_ctx, "(%i) %s (/%i): 0x%s (dirty: %i, valid: %i)", count++, cache->reg_list[i].name, cache->reg_list[i].size, value, cache->reg_list[i].dirty, cache->reg_list[i].valid);
free(value);
}
}
arch_type->get(reg);
}
- value = buf_to_char(reg->value, reg->size);
+ value = buf_to_str(reg->value, reg->size, 16);
command_print(cmd_ctx, "%s (/%i): 0x%s", reg->name, reg->size, value);
free(value);
return ERROR_OK;
/* set register value */
if (argc == 2)
{
- u32 new_value = strtoul(args[1], NULL, 0);
+ u8 *buf = malloc(CEIL(reg->size, 8));
+ str_to_buf(args[1], strlen(args[1]), buf, reg->size, 0);
+
reg_arch_type_t *arch_type = register_get_arch_type(reg->arch_type);
if (arch_type == NULL)
{
return ERROR_OK;
}
- arch_type->set(reg, new_value);
- value = buf_to_char(reg->value, reg->size);
+ arch_type->set(reg, buf);
+
+ value = buf_to_str(reg->value, reg->size, 16);
command_print(cmd_ctx, "%s (/%i): 0x%s", reg->name, reg->size, value);
free(value);
+ free(buf);
+
return ERROR_OK;
}
command_print(cmd_ctx, "error: unknown error");
break;
}
+ return ERROR_OK;
}
output_len = 0;
switch (size)
{
case 4:
- output_len += snprintf(output + output_len, 128 - output_len, "%8.8x ", ((u32*)buffer)[i]);
+ output_len += snprintf(output + output_len, 128 - output_len, "%8.8x ", target_buffer_get_u32(target, &buffer[i*4]));
break;
case 2:
- output_len += snprintf(output + output_len, 128 - output_len, "%4.4x ", ((u16*)buffer)[i]);
+ output_len += snprintf(output + output_len, 128 - output_len, "%4.4x ", target_buffer_get_u16(target, &buffer[i*2]));
break;
case 1:
- output_len += snprintf(output + output_len, 128 - output_len, "%2.2x ", ((u8*)buffer)[i]);
+ output_len += snprintf(output + output_len, 128 - output_len, "%2.2x ", buffer[i*1]);
break;
}
u32 value = 0;
int retval;
target_t *target = get_current_target(cmd_ctx);
+ u8 value_buf[4];
if (argc < 2)
return ERROR_OK;
switch (cmd[2])
{
case 'w':
- retval = target->type->write_memory(target, address, 4, 1, (u8*)&value);
+ target_buffer_set_u32(target, value_buf, value);
+ retval = target->type->write_memory(target, address, 4, 1, value_buf);
break;
case 'h':
- retval = target->type->write_memory(target, address, 2, 1, (u8*)&value);
+ target_buffer_set_u16(target, value_buf, value);
+ retval = target->type->write_memory(target, address, 2, 1, value_buf);
break;
case 'b':
- retval = target->type->write_memory(target, address, 1, 1, (u8*)&value);
+ value_buf[0] = value;
+ retval = target->type->write_memory(target, address, 1, 1, value_buf);
break;
default:
return ERROR_OK;
u32 size;
u8 buffer[560];
+ struct timeval start, end, duration;
+
target_t *target = get_current_target(cmd_ctx);
if (argc != 3)
return ERROR_OK;
}
+ gettimeofday(&start, NULL);
+
while (size > 0)
{
u32 this_run_size = (size > 560) ? 560 : size;
fclose(binary);
+ gettimeofday(&end, NULL);
+
+ timeval_subtract(&duration, &end, &start);
+ command_print(cmd_ctx, "dumped %i byte in %is %ius", strtoul(args[2], NULL, 0), duration.tv_sec, duration.tv_usec);
+
return ERROR_OK;
}
{
if (breakpoint->type == BKPT_SOFT)
{
- char* buf = buf_to_char(breakpoint->orig_instr, breakpoint->length);
+ char* buf = buf_to_str(breakpoint->orig_instr, breakpoint->length, 16);
command_print(cmd_ctx, "0x%8.8x, 0x%x, %i, 0x%s", breakpoint->address, breakpoint->length, breakpoint->set, buf);
free(buf);
}
break;
}
}
+ else
+ {
+ command_print(cmd_ctx, "breakpoint added at address 0x%8.8x", strtoul(args[0], NULL, 0));
+ }
+ }
+ else
+ {
+ command_print(cmd_ctx, "usage: bp <address> <length> ['hw']");
}
return ERROR_OK;