openrisc: add profiling function
Change-Id: Ifee89b289069590e6086a4713b165989578e29ec Signed-off-by: Franck Jullien <franck.jullien@gmail.com> Reviewed-on: http://openocd.zylin.com/2494 Tested-by: jenkins Reviewed-by: Spencer Oliver <spen@spen-soft.co.uk>
This commit is contained in:
parent
217403ce09
commit
b4b1976e4e
|
@ -29,6 +29,7 @@
|
||||||
#include <target/target.h>
|
#include <target/target.h>
|
||||||
#include <target/breakpoints.h>
|
#include <target/breakpoints.h>
|
||||||
#include <target/target_type.h>
|
#include <target/target_type.h>
|
||||||
|
#include <helper/time_support.h>
|
||||||
#include <helper/fileio.h>
|
#include <helper/fileio.h>
|
||||||
#include "or1k_tap.h"
|
#include "or1k_tap.h"
|
||||||
#include "or1k.h"
|
#include "or1k.h"
|
||||||
|
@ -1205,6 +1206,53 @@ static int or1k_checksum_memory(struct target *target, uint32_t address,
|
||||||
return ERROR_FAIL;
|
return ERROR_FAIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int or1k_profiling(struct target *target, uint32_t *samples,
|
||||||
|
uint32_t max_num_samples, uint32_t *num_samples, uint32_t seconds)
|
||||||
|
{
|
||||||
|
struct timeval timeout, now;
|
||||||
|
struct or1k_common *or1k = target_to_or1k(target);
|
||||||
|
struct or1k_du *du_core = or1k_to_du(or1k);
|
||||||
|
int retval = ERROR_OK;
|
||||||
|
|
||||||
|
gettimeofday(&timeout, NULL);
|
||||||
|
timeval_add_time(&timeout, seconds, 0);
|
||||||
|
|
||||||
|
LOG_INFO("Starting or1k profiling. Sampling npc as fast as we can...");
|
||||||
|
|
||||||
|
/* Make sure the target is running */
|
||||||
|
target_poll(target);
|
||||||
|
if (target->state == TARGET_HALTED)
|
||||||
|
retval = target_resume(target, 1, 0, 0, 0);
|
||||||
|
|
||||||
|
if (retval != ERROR_OK) {
|
||||||
|
LOG_ERROR("Error while resuming target");
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t sample_count = 0;
|
||||||
|
|
||||||
|
for (;;) {
|
||||||
|
uint32_t reg_value;
|
||||||
|
retval = du_core->or1k_jtag_read_cpu(&or1k->jtag, GROUP0 + 16 /* NPC */, 1, ®_value);
|
||||||
|
if (retval != ERROR_OK) {
|
||||||
|
LOG_ERROR("Error while reading NPC");
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
samples[sample_count++] = reg_value;
|
||||||
|
|
||||||
|
gettimeofday(&now, NULL);
|
||||||
|
if ((sample_count >= max_num_samples) ||
|
||||||
|
((now.tv_sec >= timeout.tv_sec) && (now.tv_usec >= timeout.tv_usec))) {
|
||||||
|
LOG_INFO("Profiling completed. %" PRIu32 " samples.", sample_count);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
*num_samples = sample_count;
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
COMMAND_HANDLER(or1k_tap_select_command_handler)
|
COMMAND_HANDLER(or1k_tap_select_command_handler)
|
||||||
{
|
{
|
||||||
struct target *target = get_current_target(CMD_CTX);
|
struct target *target = get_current_target(CMD_CTX);
|
||||||
|
@ -1406,4 +1454,6 @@ struct target_type or1k_target = {
|
||||||
.examine = or1k_examine,
|
.examine = or1k_examine,
|
||||||
|
|
||||||
.get_gdb_fileio_info = or1k_get_gdb_fileio_info,
|
.get_gdb_fileio_info = or1k_get_gdb_fileio_info,
|
||||||
|
|
||||||
|
.profiling = or1k_profiling,
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue