From: Øyvind H. <go...@us...> - 2010-03-17 07:42:21
|
This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "Main OpenOCD repository". The branch, master has been updated via 051e2c99ab8111f6bffdb412b40ceef333530ae6 (commit) via 7e447043cd7967bd9b8976d829d5cb79bf359d3c (commit) from 1d9fba8c1488c3774c8bde737c2d658b1f525d09 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 051e2c99ab8111f6bffdb412b40ceef333530ae6 Author: Ãyvind Harboe <oyv...@zy...> Date: Tue Mar 16 14:45:07 2010 +0100 gdb_server: improved gdb load performance by ack'ing memory writes immediately and reporting either at next memory write or stepi/continue time. GDB will then send off a new packet that is ready by the time the previous packet has been written to target memory. On faster adapters this can be as much as 10% improvement. Signed-off-by: Ãyvind Harboe <oyv...@zy...> diff --git a/src/server/gdb_server.c b/src/server/gdb_server.c index 17ca439..f46980e 100644 --- a/src/server/gdb_server.c +++ b/src/server/gdb_server.c @@ -2,7 +2,7 @@ * Copyright (C) 2005 by Dominic Rath * * Dom...@gm... * * * - * Copyright (C) 2007-2009 Ãyvind Harboe * + * Copyright (C) 2007-2010 Ãyvind Harboe * * oyv...@zy... * * * * Copyright (C) 2008 by Spencer Oliver * @@ -61,7 +61,12 @@ struct gdb_connection bool sync; /* set flag to true if you want the next stepi to return immediately. allowing GDB to pick up a fresh set of register values from the target without modifying the target state. */ - + /* We delay reporting memory write errors until next step/continue or memory + * write. This improves performance of gdb load significantly as the GDB packet + * can be replied immediately and a new GDB packet will be ready without delay + * (ca. 10% or so...). + */ + bool mem_write_error; }; @@ -821,6 +826,7 @@ static int gdb_new_connection(struct connection *connection) gdb_connection->busy = 0; gdb_connection->noack_mode = 0; gdb_connection->sync = true; + gdb_connection->mem_write_error = false; /* send ACK to GDB for debug request */ gdb_write(connection, "+", 1); @@ -1361,7 +1367,7 @@ static int gdb_write_memory_binary_packet(struct connection *connection, uint32_t addr = 0; uint32_t len = 0; - int retval; + int retval = ERROR_OK; /* skip command character */ packet++; @@ -1382,14 +1388,18 @@ static int gdb_write_memory_binary_packet(struct connection *connection, return ERROR_SERVER_REMOTE_CLOSED; } - retval = ERROR_OK; - if (len) - { - LOG_DEBUG("addr: 0x%8.8" PRIx32 ", len: 0x%8.8" PRIx32 "", addr, len); + struct gdb_connection *gdb_connection = connection->priv; - retval = target_write_buffer(target, addr, len, (uint8_t*)separator); + if (gdb_connection->mem_write_error) + { + retval = ERROR_FAIL; + /* now that we have reported the memory write error, we can clear the condition */ + gdb_connection->mem_write_error = false; } + /* By replying the packet *immediately* GDB will send us a new packet + * while we write the last one to the target. + */ if (retval == ERROR_OK) { gdb_put_packet(connection, "OK", 2); @@ -1400,6 +1410,17 @@ static int gdb_write_memory_binary_packet(struct connection *connection, return retval; } + if (len) + { + LOG_DEBUG("addr: 0x%8.8" PRIx32 ", len: 0x%8.8" PRIx32 "", addr, len); + + retval = target_write_buffer(target, addr, len, (uint8_t*)separator); + if (retval != ERROR_OK) + { + gdb_connection->mem_write_error = true; + } + } + return ERROR_OK; } @@ -2211,6 +2232,14 @@ static int gdb_input_inner(struct connection *connection) struct gdb_connection *gdb_con = connection->priv; log_add_callback(gdb_log_callback, connection); + if (gdb_con->mem_write_error) + { + LOG_ERROR("Memory write failure!"); + + /* now that we have reported the memory write error, we can clear the condition */ + gdb_con->mem_write_error = false; + } + bool nostep = false; bool already_running = false; if (target->state == TARGET_RUNNING) commit 7e447043cd7967bd9b8976d829d5cb79bf359d3c Author: Ãyvind Harboe <oyv...@zy...> Date: Tue Mar 16 11:40:52 2010 +0100 zy1000: tweak the DCC inner loop a tiny bit Uses FIFO a bit more efficiently now. Signed-off-by: Ãyvind Harboe <oyv...@zy...> diff --git a/src/jtag/zy1000/zy1000.c b/src/jtag/zy1000/zy1000.c index 005a4e0..177d286 100644 --- a/src/jtag/zy1000/zy1000.c +++ b/src/jtag/zy1000/zy1000.c @@ -839,7 +839,7 @@ void embeddedice_write_dcc(struct jtag_tap *tap, int reg_addr, uint8_t *buffer, int post_bits; jtag_pre_post_bits(tap, &pre_bits, &post_bits); - if ((pre_bits > 32) || (post_bits > 32)) + if (pre_bits + post_bits + 6 > 32) { int i; for (i = 0; i < count; i++) @@ -854,15 +854,18 @@ void embeddedice_write_dcc(struct jtag_tap *tap, int reg_addr, uint8_t *buffer, if (post_bits == 0) shift_end_state = end_state; + shiftValueInner(TAP_DRSHIFT, TAP_DRSHIFT, pre_bits, 0); int i; - for (i = 0; i < count; i++) + for (i = 0; i < count - 1; i++) { - shiftValueInner(TAP_DRSHIFT, TAP_DRSHIFT, pre_bits, 0); + /* Fewer pokes means we get to use the FIFO more efficiently */ shiftValueInner(TAP_DRSHIFT, TAP_DRSHIFT, 32, fast_target_buffer_get_u32(buffer, little)); - shiftValueInner(TAP_DRSHIFT, shift_end_state, 6, reg_addr | (1 << 5)); - shiftValueInner(shift_end_state, end_state, post_bits, 0); + shiftValueInner(TAP_DRSHIFT, shift_end_state, 6 + post_bits + pre_bits, (reg_addr | (1 << 5))); buffer += 4; } + shiftValueInner(TAP_DRSHIFT, TAP_DRSHIFT, 32, fast_target_buffer_get_u32(buffer, little)); + shiftValueInner(TAP_DRSHIFT, shift_end_state, 6, reg_addr | (1 << 5)); + shiftValueInner(shift_end_state, end_state, post_bits, 0); } } ----------------------------------------------------------------------- Summary of changes: src/jtag/zy1000/zy1000.c | 13 ++++++++----- src/server/gdb_server.c | 45 +++++++++++++++++++++++++++++++++++++-------- 2 files changed, 45 insertions(+), 13 deletions(-) hooks/post-receive -- Main OpenOCD repository |