From: oharboe at B. <oh...@ma...> - 2009-03-03 13:05:58
|
Author: oharboe Date: 2009-03-03 13:05:49 +0100 (Tue, 03 Mar 2009) New Revision: 1396 Modified: trunk/src/target/target.c Log: test code for elf parsing. Modified: trunk/src/target/target.c =================================================================== --- trunk/src/target/target.c 2009-03-02 12:51:42 UTC (rev 1395) +++ trunk/src/target/target.c 2009-03-03 12:05:49 UTC (rev 1396) @@ -76,6 +76,7 @@ int handle_load_image_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc); int handle_dump_image_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc); int handle_verify_image_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc); +int handle_test_image_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc); int handle_bp_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc); int handle_rbp_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc); int handle_wp_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc); @@ -1329,6 +1330,7 @@ register_command(cmd_ctx, NULL, "load_image", handle_load_image_command, COMMAND_EXEC, "load_image <file> <address> ['bin'|'ihex'|'elf'|'s19'] [min_address] [max_length]"); register_command(cmd_ctx, NULL, "dump_image", handle_dump_image_command, COMMAND_EXEC, "dump_image <file> <address> <size>"); register_command(cmd_ctx, NULL, "verify_image", handle_verify_image_command, COMMAND_EXEC, "verify_image <file> [offset] [type]"); + register_command(cmd_ctx, NULL, "test_image", handle_test_image_command, COMMAND_EXEC, "test_image <file> [offset] [type]"); if((retval = target_request_register_commands(cmd_ctx)) != ERROR_OK) return retval; @@ -2161,7 +2163,7 @@ return ERROR_OK; } -int handle_verify_image_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) +int handle_verify_image_command_internal(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc, int verify) { u8 *buffer; u32 buf_cnt; @@ -2225,55 +2227,61 @@ break; } - /* calculate checksum of image */ - image_calculate_checksum( buffer, buf_cnt, &checksum ); - - retval = target_checksum_memory(target, image.sections[i].base_address, buf_cnt, &mem_checksum); - if( retval != ERROR_OK ) + if (verify) { - free(buffer); - break; - } + /* calculate checksum of image */ + image_calculate_checksum( buffer, buf_cnt, &checksum ); - if( checksum != mem_checksum ) - { - /* failed crc checksum, fall back to a binary compare */ - u8 *data; + retval = target_checksum_memory(target, image.sections[i].base_address, buf_cnt, &mem_checksum); + if( retval != ERROR_OK ) + { + free(buffer); + break; + } - command_print(cmd_ctx, "checksum mismatch - attempting binary compare"); + if( checksum != mem_checksum ) + { + /* failed crc checksum, fall back to a binary compare */ + u8 *data; - data = (u8*)malloc(buf_cnt); + command_print(cmd_ctx, "checksum mismatch - attempting binary compare"); - /* Can we use 32bit word accesses? */ - int size = 1; - int count = buf_cnt; - if ((count % 4) == 0) - { - size *= 4; - count /= 4; - } - retval = target->type->read_memory(target, image.sections[i].base_address, size, count, data); - if (retval == ERROR_OK) - { - int t; - for (t = 0; t < buf_cnt; t++) + data = (u8*)malloc(buf_cnt); + + /* Can we use 32bit word accesses? */ + int size = 1; + int count = buf_cnt; + if ((count % 4) == 0) { - if (data[t] != buffer[t]) + size *= 4; + count /= 4; + } + retval = target->type->read_memory(target, image.sections[i].base_address, size, count, data); + if (retval == ERROR_OK) + { + int t; + for (t = 0; t < buf_cnt; t++) { - command_print(cmd_ctx, "Verify operation failed address 0x%08x. Was 0x%02x instead of 0x%02x\n", t + image.sections[i].base_address, data[t], buffer[t]); - free(data); - free(buffer); - retval=ERROR_FAIL; - goto done; + if (data[t] != buffer[t]) + { + command_print(cmd_ctx, "Verify operation failed address 0x%08x. Was 0x%02x instead of 0x%02x\n", t + image.sections[i].base_address, data[t], buffer[t]); + free(data); + free(buffer); + retval=ERROR_FAIL; + goto done; + } + if ((t%16384)==0) + { + keep_alive(); + } } - if ((t%16384)==0) - { - keep_alive(); - } } + + free(data); } - - free(data); + } else + { + command_print(cmd_ctx, "address 0x%08x length 0x%08x", image.sections[i].base_address, buf_cnt); } free(buffer); @@ -2298,6 +2306,16 @@ return retval; } +int handle_verify_image_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) +{ + return handle_verify_image_command_internal(cmd_ctx, cmd, args, argc, 1); +} + +int handle_test_image_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) +{ + return handle_verify_image_command_internal(cmd_ctx, cmd, args, argc, 0); +} + int handle_bp_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) { int retval; @@ -4198,17 +4216,18 @@ int i; int ms=timeval_ms(); int size=0; + int retval=ERROR_OK; for (i=0; i<fastload_num;i++) { - int retval; target_t *target = get_current_target(cmd_ctx); - if ((retval = target_write_buffer(target, fastload[i].address, fastload[i].length, fastload[i].data)) != ERROR_OK) + command_print(cmd_ctx, "Write to 0x%08x, length 0x%08x", fastload[i].address, fastload[i].length); + if (retval==ERROR_OK) { - return retval; + retval = target_write_buffer(target, fastload[i].address, fastload[i].length, fastload[i].data); } size+=fastload[i].length; } int after=timeval_ms(); command_print(cmd_ctx, "Loaded image %f kBytes/s", (float)(size/1024.0)/((float)(after-ms)/1000.0)); - return ERROR_OK; + return retval; } |