* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
- * along with this program; if not, write to the *
- * Free Software Foundation, Inc., *
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *
+ * along with this program. If not, see <http://www.gnu.org/licenses/>. *
***************************************************************************/
#ifdef HAVE_CONFIG_H
extern struct target_type cortexa_target;
extern struct target_type cortexr4_target;
extern struct target_type arm11_target;
+extern struct target_type ls1_sap_target;
extern struct target_type mips_m4k_target;
extern struct target_type avr_target;
extern struct target_type dsp563xx_target;
extern struct target_type nds32_v3m_target;
extern struct target_type or1k_target;
extern struct target_type quark_x10xx_target;
+extern struct target_type quark_d20xx_target;
static struct target_type *target_types[] = {
&arm7tdmi_target,
&cortexa_target,
&cortexr4_target,
&arm11_target,
+ &ls1_sap_target,
&mips_m4k_target,
&avr_target,
&dsp563xx_target,
&nds32_v3m_target,
&or1k_target,
&quark_x10xx_target,
+ &quark_d20xx_target,
NULL,
};
static struct target_event_callback *target_event_callbacks;
static struct target_timer_callback *target_timer_callbacks;
LIST_HEAD(target_reset_callback_list);
+LIST_HEAD(target_trace_callback_list);
static const int polling_interval = 100;
static const Jim_Nvp nvp_assert[] = {
}
/* returns a pointer to the n-th configured target */
-static struct target *get_target_by_num(int num)
+struct target *get_target_by_num(int num)
{
struct target *target = all_targets;
if (target->state == TARGET_HALTED)
target->halt_issued = false;
else {
- long long t = timeval_ms() - target->halt_issued_time;
+ int64_t t = timeval_ms() - target->halt_issued_time;
if (t > DEFAULT_HALT_TIMEOUT) {
target->halt_issued = false;
LOG_INFO("Halt timed out, wake up GDB.");
retval = retval2;
}
+ if (retval == ERROR_OK) {
+ /* check if algorithm set rp = 0 after fifo writer loop finished */
+ retval = target_read_u32(target, rp_addr, &rp);
+ if (retval == ERROR_OK && rp == 0) {
+ LOG_ERROR("flash write algorithm aborted by target");
+ retval = ERROR_FLASH_OPERATION_FAILED;
+ }
+ }
+
return retval;
}
LOG_ERROR("Target not examined yet");
return ERROR_FAIL;
}
+ if (!target->type->read_memory) {
+ LOG_ERROR("Target %s doesn't support read_memory", target_name(target));
+ return ERROR_FAIL;
+ }
return target->type->read_memory(target, address, size, count, buffer);
}
LOG_ERROR("Target not examined yet");
return ERROR_FAIL;
}
+ if (!target->type->read_phys_memory) {
+ LOG_ERROR("Target %s doesn't support read_phys_memory", target_name(target));
+ return ERROR_FAIL;
+ }
return target->type->read_phys_memory(target, address, size, count, buffer);
}
LOG_ERROR("Target not examined yet");
return ERROR_FAIL;
}
+ if (!target->type->write_memory) {
+ LOG_ERROR("Target %s doesn't support write_memory", target_name(target));
+ return ERROR_FAIL;
+ }
return target->type->write_memory(target, address, size, count, buffer);
}
LOG_ERROR("Target not examined yet");
return ERROR_FAIL;
}
+ if (!target->type->write_phys_memory) {
+ LOG_ERROR("Target %s doesn't support write_phys_memory", target_name(target));
+ return ERROR_FAIL;
+ }
return target->type->write_phys_memory(target, address, size, count, buffer);
}
target->examined = false;
}
-static int err_read_phys_memory(struct target *target, uint32_t address,
- uint32_t size, uint32_t count, uint8_t *buffer)
-{
- LOG_ERROR("Not implemented: %s", __func__);
- return ERROR_FAIL;
-}
-
-static int err_write_phys_memory(struct target *target, uint32_t address,
- uint32_t size, uint32_t count, const uint8_t *buffer)
-{
- LOG_ERROR("Not implemented: %s", __func__);
- return ERROR_FAIL;
-}
-
static int handle_target(void *priv);
static int target_init_one(struct command_context *cmd_ctx,
* implement it in stages, but warn if we need to do so.
*/
if (type->mmu) {
- if (type->write_phys_memory == NULL) {
- LOG_ERROR("type '%s' is missing write_phys_memory",
- type->name);
- type->write_phys_memory = err_write_phys_memory;
- }
- if (type->read_phys_memory == NULL) {
- LOG_ERROR("type '%s' is missing read_phys_memory",
- type->name);
- type->read_phys_memory = err_read_phys_memory;
- }
if (type->virt2phys == NULL) {
LOG_ERROR("type '%s' is missing virt2phys", type->name);
type->virt2phys = identity_virt2phys;
return ERROR_OK;
}
+int target_register_trace_callback(int (*callback)(struct target *target,
+ size_t len, uint8_t *data, void *priv), void *priv)
+{
+ struct target_trace_callback *entry;
+
+ if (callback == NULL)
+ return ERROR_COMMAND_SYNTAX_ERROR;
+
+ entry = malloc(sizeof(struct target_trace_callback));
+ if (entry == NULL) {
+ LOG_ERROR("error allocating buffer for trace callback entry");
+ return ERROR_COMMAND_SYNTAX_ERROR;
+ }
+
+ entry->callback = callback;
+ entry->priv = priv;
+ list_add(&entry->list, &target_trace_callback_list);
+
+
+ return ERROR_OK;
+}
+
int target_register_timer_callback(int (*callback)(void *priv), int time_ms, int periodic, void *priv)
{
struct target_timer_callback **callbacks_p = &target_timer_callbacks;
return ERROR_OK;
}
+int target_unregister_trace_callback(int (*callback)(struct target *target,
+ size_t len, uint8_t *data, void *priv), void *priv)
+{
+ struct target_trace_callback *entry;
+
+ if (callback == NULL)
+ return ERROR_COMMAND_SYNTAX_ERROR;
+
+ list_for_each_entry(entry, &target_trace_callback_list, list) {
+ if (entry->callback == callback && entry->priv == priv) {
+ list_del(&entry->list);
+ free(entry);
+ break;
+ }
+ }
+
+ return ERROR_OK;
+}
+
int target_unregister_timer_callback(int (*callback)(void *priv), void *priv)
{
if (callback == NULL)
return ERROR_OK;
}
+int target_call_trace_callbacks(struct target *target, size_t len, uint8_t *data)
+{
+ struct target_trace_callback *callback;
+
+ list_for_each_entry(callback, &target_trace_callback_list, list)
+ callback->callback(target, len, data, callback->priv);
+
+ return ERROR_OK;
+}
+
static int target_timer_callback_periodic_restart(
struct target_timer_callback *cb, struct timeval *now)
{
return ERROR_OK;
}
- LOG_USER("target state: %s", target_state_name(target));
+ LOG_USER("%s: target state: %s", target_name(target),
+ target_state_name(target));
if (target->state != TARGET_HALTED)
return ERROR_OK;
*/
int target_write_buffer(struct target *target, uint32_t address, uint32_t size, const uint8_t *buffer)
{
- LOG_DEBUG("writing buffer of %i byte at 0x%8.8x",
- (int)size, (unsigned)address);
+ LOG_DEBUG("writing buffer of %" PRIi32 " byte at 0x%8.8" PRIx32,
+ size, address);
if (!target_was_examined(target)) {
LOG_ERROR("Target not examined yet");
return ERROR_OK;
if ((address + size - 1) < address) {
- /* GDB can request this when e.g. PC is 0xfffffffc*/
- LOG_ERROR("address + size wrapped(0x%08x, 0x%08x)",
- (unsigned)address,
- (unsigned)size);
+ /* GDB can request this when e.g. PC is 0xfffffffc */
+ LOG_ERROR("address + size wrapped (0x%08" PRIx32 ", 0x%08" PRIx32 ")",
+ address,
+ size);
return ERROR_FAIL;
}
*/
int target_read_buffer(struct target *target, uint32_t address, uint32_t size, uint8_t *buffer)
{
- LOG_DEBUG("reading buffer of %i byte at 0x%8.8x",
- (int)size, (unsigned)address);
+ LOG_DEBUG("reading buffer of %" PRIi32 " byte at 0x%8.8" PRIx32,
+ size, address);
if (!target_was_examined(target)) {
LOG_ERROR("Target not examined yet");
return ERROR_OK;
if ((address + size - 1) < address) {
- /* GDB can request this when e.g. PC is 0xfffffffc*/
- LOG_ERROR("address + size wrapped(0x%08" PRIx32 ", 0x%08" PRIx32 ")",
+ /* GDB can request this when e.g. PC is 0xfffffffc */
+ LOG_ERROR("address + size wrapped (0x%08" PRIx32 ", 0x%08" PRIx32 ")",
address,
size);
return ERROR_FAIL;
if (retval != ERROR_OK) {
buffer = malloc(size);
if (buffer == NULL) {
- LOG_ERROR("error allocating buffer for section (%d bytes)", (int)size);
+ LOG_ERROR("error allocating buffer for section (%" PRId32 " bytes)", size);
return ERROR_COMMAND_SYNTAX_ERROR;
}
retval = target_read_buffer(target, address, size, buffer);
return retval;
}
-int target_blank_check_memory(struct target *target, uint32_t address, uint32_t size, uint32_t* blank)
+int target_blank_check_memory(struct target *target, uint32_t address, uint32_t size, uint32_t* blank,
+ uint8_t erased_value)
{
int retval;
if (!target_was_examined(target)) {
if (target->type->blank_check_memory == 0)
return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
- retval = target->type->blank_check_memory(target, address, size, blank);
+ retval = target->type->blank_check_memory(target, address, size, blank, erased_value);
return retval;
}
if (retval == ERROR_OK) {
*value = target_buffer_get_u16(target, value_buf);
- LOG_DEBUG("address: 0x%8.8" PRIx32 ", value: 0x%4.4x",
+ LOG_DEBUG("address: 0x%8.8" PRIx32 ", value: 0x%4.4" PRIx16,
address,
*value);
} else {
int retval = target_read_memory(target, address, 1, 1, value);
if (retval == ERROR_OK) {
- LOG_DEBUG("address: 0x%8.8" PRIx32 ", value: 0x%2.2x",
+ LOG_DEBUG("address: 0x%8.8" PRIx32 ", value: 0x%2.2" PRIx8,
address,
*value);
} else {
return ERROR_FAIL;
}
- LOG_DEBUG("address: 0x%8.8" PRIx32 ", value: 0x%8.8x",
+ LOG_DEBUG("address: 0x%8.8" PRIx32 ", value: 0x%8.8" PRIx16,
address,
value);
return ERROR_FAIL;
}
- LOG_DEBUG("address: 0x%8.8" PRIx32 ", value: 0x%2.2x",
+ LOG_DEBUG("address: 0x%8.8" PRIx32 ", value: 0x%2.2" PRIx8,
address, value);
retval = target_write_memory(target, address, 1, 1, &value);
if (powerRestored)
runPowerRestore = 1;
- long long current = timeval_ms();
- static long long lastPower;
- int waitMore = lastPower + 2000 > current;
+ int64_t current = timeval_ms();
+ static int64_t lastPower;
+ bool waitMore = lastPower + 2000 > current;
if (powerDropout && !waitMore) {
runPowerDropout = 1;
lastPower = current;
int srstDeasserted;
srstDeasserted = prevSrstAsserted && !srstAsserted;
- static long long lastSrst;
+ static int64_t lastSrst;
waitMore = lastSrst + 2000 > current;
if (srstDeasserted && !waitMore) {
runSrstDeasserted = 1;
target->backoff.times *= 2;
target->backoff.times++;
}
- LOG_USER("Polling target %s failed, GDB will be halted. Polling again in %dms",
- target_name(target),
- target->backoff.times * polling_interval);
/* Tell GDB to halt the debugger. This allows the user to
* run monitor commands to handle the situation.
*/
target_call_event_callbacks(target, TARGET_EVENT_GDB_HALT);
- return retval;
}
- /* Since we succeeded, we reset backoff count */
if (target->backoff.times > 0) {
- LOG_USER("Polling target %s succeeded again, trying to reexamine", target_name(target));
+ LOG_USER("Polling target %s failed, trying to reexamine", target_name(target));
target_reset_examined(target);
retval = target_examine_one(target);
/* Target examination could have failed due to unstable connection,
* but we set the examined flag anyway to repoll it later */
if (retval != ERROR_OK) {
target->examined = true;
+ LOG_USER("Examination failed, GDB will be halted. Polling again in %dms",
+ target->backoff.times * polling_interval);
return retval;
}
}
+ /* Since we succeeded, we reset backoff count */
target->backoff.times = 0;
}
}
int target_wait_state(struct target *target, enum target_state state, int ms)
{
int retval;
- long long then = 0, cur;
- int once = 1;
+ int64_t then = 0, cur;
+ bool once = true;
for (;;) {
retval = target_poll(target);
break;
cur = timeval_ms();
if (once) {
- once = 0;
+ once = false;
then = timeval_ms();
LOG_DEBUG("waiting for target %s...",
Jim_Nvp_value2name_simple(nvp_target_state, state)->name);
COMMAND_HANDLER(handle_dump_image_command)
{
- struct fileio fileio;
+ struct fileio *fileio;
uint8_t *buffer;
int retval, retvaltemp;
uint32_t address, size;
if (retval != ERROR_OK)
break;
- retval = fileio_write(&fileio, this_run_size, buffer, &size_written);
+ retval = fileio_write(fileio, this_run_size, buffer, &size_written);
if (retval != ERROR_OK)
break;
free(buffer);
if ((ERROR_OK == retval) && (duration_measure(&bench) == ERROR_OK)) {
- int filesize;
- retval = fileio_size(&fileio, &filesize);
+ size_t filesize;
+ retval = fileio_size(fileio, &filesize);
if (retval != ERROR_OK)
return retval;
command_print(CMD_CTX,
- "dumped %ld bytes in %fs (%0.3f KiB/s)", (long)filesize,
+ "dumped %zu bytes in %fs (%0.3f KiB/s)", filesize,
duration_elapsed(&bench), duration_kbps(&bench, filesize));
}
- retvaltemp = fileio_close(&fileio);
+ retvaltemp = fileio_close(fileio);
if (retvaltemp != ERROR_OK)
return retvaltemp;
uint32_t count;
uint32_t v;
const char *varname;
+ const char *phys;
+ bool is_phys;
int n, e, retval;
uint32_t i;
* argv[3] = memory address
* argv[4] = count of times to read
*/
- if (argc != 4) {
- Jim_WrongNumArgs(interp, 1, argv, "varname width addr nelems");
+ if (argc < 4 || argc > 5) {
+ Jim_WrongNumArgs(interp, 1, argv, "varname width addr nelems [phys]");
return JIM_ERR;
}
varname = Jim_GetString(argv[0], &len);
len = l;
if (e != JIM_OK)
return e;
+ is_phys = false;
+ if (argc > 4) {
+ phys = Jim_GetString(argv[4], &n);
+ if (!strncmp(phys, "phys", n))
+ is_phys = true;
+ else
+ return JIM_ERR;
+ }
switch (width) {
case 8:
width = 1;
sprintf(buf, "mem2array address: 0x%08" PRIx32 " is not aligned for %" PRId32 " byte reads",
addr,
width);
- Jim_AppendStrings(interp, Jim_GetResult(interp), buf , NULL);
+ Jim_AppendStrings(interp, Jim_GetResult(interp), buf, NULL);
return JIM_ERR;
}
if (count > (buffersize / width))
count = (buffersize / width);
- retval = target_read_memory(target, addr, width, count, buffer);
+ if (is_phys)
+ retval = target_read_phys_memory(target, addr, width, count, buffer);
+ else
+ retval = target_read_memory(target, addr, width, count, buffer);
if (retval != ERROR_OK) {
/* BOO !*/
- LOG_ERROR("mem2array: Read @ 0x%08x, w=%d, cnt=%d, failed",
- (unsigned int)addr,
- (int)width,
- (int)count);
+ LOG_ERROR("mem2array: Read @ 0x%08" PRIx32 ", w=%" PRId32 ", cnt=%" PRId32 ", failed",
+ addr,
+ width,
+ count);
Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
Jim_AppendStrings(interp, Jim_GetResult(interp), "mem2array: cannot read memory", NULL);
e = JIM_ERR;
uint32_t count;
uint32_t v;
const char *varname;
+ const char *phys;
+ bool is_phys;
int n, e, retval;
uint32_t i;
* argv[3] = memory address
* argv[4] = count to write
*/
- if (argc != 4) {
- Jim_WrongNumArgs(interp, 0, argv, "varname width addr nelems");
+ if (argc < 4 || argc > 5) {
+ Jim_WrongNumArgs(interp, 0, argv, "varname width addr nelems [phys]");
return JIM_ERR;
}
varname = Jim_GetString(argv[0], &len);
len = l;
if (e != JIM_OK)
return e;
+ is_phys = false;
+ if (argc > 4) {
+ phys = Jim_GetString(argv[4], &n);
+ if (!strncmp(phys, "phys", n))
+ is_phys = true;
+ else
+ return JIM_ERR;
+ }
switch (width) {
case 8:
width = 1;
} else {
char buf[100];
Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
- sprintf(buf, "array2mem address: 0x%08x is not aligned for %d byte reads",
- (unsigned int)addr,
- (int)width);
- Jim_AppendStrings(interp, Jim_GetResult(interp), buf , NULL);
+ sprintf(buf, "array2mem address: 0x%08" PRIx32 " is not aligned for %" PRId32 " byte reads",
+ addr,
+ width);
+ Jim_AppendStrings(interp, Jim_GetResult(interp), buf, NULL);
return JIM_ERR;
}
}
len -= count;
- retval = target_write_memory(target, addr, width, count, buffer);
+ if (is_phys)
+ retval = target_write_phys_memory(target, addr, width, count, buffer);
+ else
+ retval = target_write_memory(target, addr, width, count, buffer);
if (retval != ERROR_OK) {
/* BOO !*/
- LOG_ERROR("array2mem: Write @ 0x%08x, w=%d, cnt=%d, failed",
- (unsigned int)addr,
- (int)width,
- (int)count);
+ LOG_ERROR("array2mem: Write @ 0x%08" PRIx32 ", w=%" PRId32 ", cnt=%" PRId32 ", failed",
+ addr,
+ width,
+ count);
Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
Jim_AppendStrings(interp, Jim_GetResult(interp), "array2mem: cannot read memory", NULL);
e = JIM_ERR;
struct target *target = Jim_CmdPrivData(goi.interp);
if (!target->tap->enabled)
return jim_target_tap_disabled(interp);
- if (!(target_was_examined(target))) {
- LOG_ERROR("Target not examined yet");
- return ERROR_TARGET_NOT_EXAMINED;
- }
+
if (!target->type->assert_reset || !target->type->deassert_reset) {
Jim_SetResultFormatted(interp,
"No target-specific reset for %s",
Jim_Obj *new_cmd;
Jim_Cmd *cmd;
const char *cp;
- char *cp2;
int e;
int x;
struct target *target;
}
/* TYPE */
- e = Jim_GetOpt_String(goi, &cp2, NULL);
+ e = Jim_GetOpt_String(goi, &cp, NULL);
if (e != JIM_OK)
return e;
- cp = cp2;
struct transport *tr = get_current_transport();
if (tr->override_target) {
e = tr->override_target(&cp);
return ERROR_FAIL;
}
int i;
- int ms = timeval_ms();
+ int64_t ms = timeval_ms();
int size = 0;
int retval = ERROR_OK;
for (i = 0; i < fastload_num; i++) {
size += fastload[i].length;
}
if (retval == ERROR_OK) {
- int after = timeval_ms();
+ int64_t after = timeval_ms();
command_print(CMD_CTX, "Loaded image %f kBytes/s", (float)(size/1024.0)/((float)(after-ms)/1000.0));
}
return retval;