aboutsummaryrefslogtreecommitdiff
path: root/src/target
diff options
context:
space:
mode:
Diffstat (limited to 'src/target')
-rw-r--r--src/target/nds32.c51
-rw-r--r--src/target/nds32.h8
-rw-r--r--src/target/nds32_aice.c34
-rw-r--r--src/target/nds32_aice.h35
-rw-r--r--src/target/nds32_v3_common.c31
5 files changed, 82 insertions, 77 deletions
diff --git a/src/target/nds32.c b/src/target/nds32.c
index e09ce6f0..4d256497 100644
--- a/src/target/nds32.c
+++ b/src/target/nds32.c
@@ -395,7 +395,7 @@ static const struct reg_arch_type nds32_reg_access_type_64 = {
static struct reg_cache *nds32_build_reg_cache(struct target *target,
struct nds32 *nds32)
{
- struct reg_cache *cache = malloc(sizeof(struct reg_cache));
+ struct reg_cache *cache = calloc(sizeof(struct reg_cache), 1);
struct reg *reg_list = calloc(TOTAL_REG_NUM, sizeof(struct reg));
struct nds32_reg *reg_arch_info = calloc(TOTAL_REG_NUM, sizeof(struct nds32_reg));
int i;
@@ -423,7 +423,7 @@ static struct reg_cache *nds32_build_reg_cache(struct target *target,
reg_list[i].size = nds32_reg_size(i);
reg_list[i].arch_info = &reg_arch_info[i];
- reg_list[i].reg_data_type = malloc(sizeof(struct reg_data_type));
+ reg_list[i].reg_data_type = calloc(sizeof(struct reg_data_type), 1);
if (FD0 <= reg_arch_info[i].num && reg_arch_info[i].num <= FD31) {
reg_list[i].value = &(reg_arch_info[i].value_64);
@@ -1649,6 +1649,15 @@ int nds32_init_arch_info(struct target *target, struct nds32 *nds32)
nds32->active_syscall_id = NDS32_SYSCALL_UNDEFINED;
nds32->virtual_hosting_errno = 0;
nds32->virtual_hosting_ctrl_c = false;
+ nds32->attached = false;
+
+ nds32->syscall_break.asid = 0;
+ nds32->syscall_break.length = 4;
+ nds32->syscall_break.set = 0;
+ nds32->syscall_break.orig_instr = NULL;
+ nds32->syscall_break.next = NULL;
+ nds32->syscall_break.unique_id = 0x515CAll + target->target_number;
+ nds32->syscall_break.linked_BRP = 0;
nds32_reg_init();
@@ -2187,27 +2196,21 @@ int nds32_assert_reset(struct target *target)
return ERROR_OK;
}
-static uint32_t nds32_backup_edm_ctl;
-static bool gdb_attached;
-
static int nds32_gdb_attach(struct nds32 *nds32)
{
- LOG_DEBUG("nds32_gdb_attach");
+ LOG_DEBUG("nds32_gdb_attach, target coreid: %d", nds32->target->coreid);
- if (gdb_attached == false) {
+ if (nds32->attached == false) {
if (nds32->keep_target_edm_ctl) {
/* backup target EDM_CTL */
struct aice_port_s *aice = target_to_aice(nds32->target);
- aice_read_debug_reg(aice, NDS_EDM_SR_EDM_CTL, &nds32_backup_edm_ctl);
+ aice_read_debug_reg(aice, NDS_EDM_SR_EDM_CTL, &nds32->backup_edm_ctl);
}
target_halt(nds32->target);
- /* turn on polling */
- jtag_poll_set_enabled(true);
-
- gdb_attached = true;
+ nds32->attached = true;
}
return ERROR_OK;
@@ -2218,7 +2221,7 @@ static int nds32_gdb_detach(struct nds32 *nds32)
LOG_DEBUG("nds32_gdb_detach");
bool backup_virtual_hosting_setting;
- if (gdb_attached) {
+ if (nds32->attached) {
backup_virtual_hosting_setting = nds32->virtual_hosting;
/* turn off virtual hosting before resume as gdb-detach */
@@ -2229,13 +2232,10 @@ static int nds32_gdb_detach(struct nds32 *nds32)
if (nds32->keep_target_edm_ctl) {
/* restore target EDM_CTL */
struct aice_port_s *aice = target_to_aice(nds32->target);
- aice_write_debug_reg(aice, NDS_EDM_SR_EDM_CTL, nds32_backup_edm_ctl);
+ aice_write_debug_reg(aice, NDS_EDM_SR_EDM_CTL, nds32->backup_edm_ctl);
}
- /* turn off polling */
- jtag_poll_set_enabled(false);
-
- gdb_attached = false;
+ nds32->attached = false;
}
return ERROR_OK;
@@ -2245,7 +2245,12 @@ static int nds32_callback_event_handler(struct target *target,
enum target_event event, void *priv)
{
int retval = ERROR_OK;
- struct nds32 *nds32 = priv;
+ int target_number = *(int *)priv;
+
+ if (target_number != target->target_number)
+ return ERROR_OK;
+
+ struct nds32 *nds32 = target_to_nds32(target);
switch (event) {
case TARGET_EVENT_GDB_ATTACH:
@@ -2266,11 +2271,9 @@ int nds32_init(struct nds32 *nds32)
/* Initialize anything we can set up without talking to the target */
nds32->memory.access_channel = NDS_MEMORY_ACC_CPU;
- /* turn off polling by default */
- jtag_poll_set_enabled(false);
-
/* register event callback */
- target_register_event_callback(nds32_callback_event_handler, nds32);
+ target_register_event_callback(nds32_callback_event_handler,
+ &(nds32->target->target_number));
return ERROR_OK;
}
@@ -2467,7 +2470,7 @@ int nds32_profiling(struct target *target, uint32_t *samples,
iteration = max_num_samples;
int pc_regnum = nds32->register_map(nds32, PC);
- aice->port->api->profiling(10, iteration, pc_regnum, samples, num_samples);
+ aice_profiling(aice, 10, iteration, pc_regnum, samples, num_samples);
register_cache_invalidate(nds32->core_cache);
diff --git a/src/target/nds32.h b/src/target/nds32.h
index 304fc35f..fe5ee00e 100644
--- a/src/target/nds32.h
+++ b/src/target/nds32.h
@@ -296,6 +296,8 @@ struct nds32 {
/** Record syscall ID for other operations to do special processing for target */
int active_syscall_id;
+ struct breakpoint syscall_break;
+
/** Flag reporting whether global stop is active. */
bool global_stop;
@@ -309,6 +311,9 @@ struct nds32 {
* handler, it should be true. */
bool keep_target_edm_ctl;
+ /* Value of $EDM_CTL before target enters debug mode */
+ uint32_t backup_edm_ctl;
+
/** always use word-aligned address to access memory */
bool word_access_mem;
@@ -346,6 +351,9 @@ struct nds32 {
* hardware breakpoints or not in ROM */
bool auto_convert_hw_bp;
+ /* Flag to indicate the target is attached by debugger or not */
+ bool attached;
+
/** Backpointer to the target. */
struct target *target;
diff --git a/src/target/nds32_aice.c b/src/target/nds32_aice.c
index b3a830b3..cfb6d86c 100644
--- a/src/target/nds32_aice.c
+++ b/src/target/nds32_aice.c
@@ -31,7 +31,7 @@ int aice_read_reg_64(struct aice_port_s *aice, uint32_t num, uint64_t *val)
return ERROR_FAIL;
}
- return aice->port->api->read_reg_64(num, val);
+ return aice->port->api->read_reg_64(aice->coreid, num, val);
}
int aice_write_reg_64(struct aice_port_s *aice, uint32_t num, uint64_t val)
@@ -41,17 +41,7 @@ int aice_write_reg_64(struct aice_port_s *aice, uint32_t num, uint64_t val)
return ERROR_FAIL;
}
- return aice->port->api->write_reg_64(num, val);
-}
-
-int aice_select_target(struct aice_port_s *aice, uint32_t target_id)
-{
- if (aice->port->api->select_target == NULL) {
- LOG_WARNING("Not implemented: %s", __func__);
- return ERROR_FAIL;
- }
-
- return aice->port->api->select_target(target_id);
+ return aice->port->api->write_reg_64(aice->coreid, num, val);
}
int aice_read_tlb(struct aice_port_s *aice, uint32_t virtual_address,
@@ -62,7 +52,7 @@ int aice_read_tlb(struct aice_port_s *aice, uint32_t virtual_address,
return ERROR_FAIL;
}
- return aice->port->api->read_tlb(virtual_address, physical_address);
+ return aice->port->api->read_tlb(aice->coreid, virtual_address, physical_address);
}
int aice_cache_ctl(struct aice_port_s *aice, uint32_t subtype, uint32_t address)
@@ -72,7 +62,7 @@ int aice_cache_ctl(struct aice_port_s *aice, uint32_t subtype, uint32_t address)
return ERROR_FAIL;
}
- return aice->port->api->cache_ctl(subtype, address);
+ return aice->port->api->cache_ctl(aice->coreid, subtype, address);
}
int aice_set_retry_times(struct aice_port_s *aice, uint32_t a_retry_times)
@@ -92,7 +82,7 @@ int aice_program_edm(struct aice_port_s *aice, char *command_sequence)
return ERROR_FAIL;
}
- return aice->port->api->program_edm(command_sequence);
+ return aice->port->api->program_edm(aice->coreid, command_sequence);
}
int aice_set_command_mode(struct aice_port_s *aice,
@@ -114,7 +104,7 @@ int aice_execute(struct aice_port_s *aice, uint32_t *instructions,
return ERROR_FAIL;
}
- return aice->port->api->execute(instructions, instruction_num);
+ return aice->port->api->execute(aice->coreid, instructions, instruction_num);
}
int aice_set_custom_srst_script(struct aice_port_s *aice, const char *script)
@@ -156,3 +146,15 @@ int aice_set_count_to_check_dbger(struct aice_port_s *aice, uint32_t count_to_ch
return aice->port->api->set_count_to_check_dbger(count_to_check);
}
+
+int aice_profiling(struct aice_port_s *aice, uint32_t interval, uint32_t iteration,
+ uint32_t reg_no, uint32_t *samples, uint32_t *num_samples)
+{
+ if (aice->port->api->profiling == NULL) {
+ LOG_WARNING("Not implemented: %s", __func__);
+ return ERROR_FAIL;
+ }
+
+ return aice->port->api->profiling(aice->coreid, interval, iteration,
+ reg_no, samples, num_samples);
+}
diff --git a/src/target/nds32_aice.h b/src/target/nds32_aice.h
index 6c74e69d..d5356433 100644
--- a/src/target/nds32_aice.h
+++ b/src/target/nds32_aice.h
@@ -24,7 +24,6 @@
int aice_read_reg_64(struct aice_port_s *aice, uint32_t num, uint64_t *val);
int aice_write_reg_64(struct aice_port_s *aice, uint32_t num, uint64_t val);
-int aice_select_target(struct aice_port_s *aice, uint32_t target_id);
int aice_read_tlb(struct aice_port_s *aice, uint32_t virtual_address,
uint32_t *physical_address);
int aice_cache_ctl(struct aice_port_s *aice, uint32_t subtype, uint32_t address);
@@ -38,6 +37,8 @@ int aice_set_custom_srst_script(struct aice_port_s *aice, const char *script);
int aice_set_custom_trst_script(struct aice_port_s *aice, const char *script);
int aice_set_custom_restart_script(struct aice_port_s *aice, const char *script);
int aice_set_count_to_check_dbger(struct aice_port_s *aice, uint32_t count_to_check);
+int aice_profiling(struct aice_port_s *aice, uint32_t interval, uint32_t iteration,
+ uint32_t reg_no, uint32_t *samples, uint32_t *num_samples);
static inline int aice_open(struct aice_port_s *aice, struct aice_port_param_s *param)
{
@@ -57,70 +58,70 @@ static inline int aice_reset(struct aice_port_s *aice)
static inline int aice_assert_srst(struct aice_port_s *aice,
enum aice_srst_type_s srst)
{
- return aice->port->api->assert_srst(srst);
+ return aice->port->api->assert_srst(aice->coreid, srst);
}
static inline int aice_run(struct aice_port_s *aice)
{
- return aice->port->api->run();
+ return aice->port->api->run(aice->coreid);
}
static inline int aice_halt(struct aice_port_s *aice)
{
- return aice->port->api->halt();
+ return aice->port->api->halt(aice->coreid);
}
static inline int aice_step(struct aice_port_s *aice)
{
- return aice->port->api->step();
+ return aice->port->api->step(aice->coreid);
}
static inline int aice_read_register(struct aice_port_s *aice, uint32_t num,
uint32_t *val)
{
- return aice->port->api->read_reg(num, val);
+ return aice->port->api->read_reg(aice->coreid, num, val);
}
static inline int aice_write_register(struct aice_port_s *aice, uint32_t num,
uint32_t val)
{
- return aice->port->api->write_reg(num, val);
+ return aice->port->api->write_reg(aice->coreid, num, val);
}
static inline int aice_read_debug_reg(struct aice_port_s *aice, uint32_t addr,
uint32_t *val)
{
- return aice->port->api->read_debug_reg(addr, val);
+ return aice->port->api->read_debug_reg(aice->coreid, addr, val);
}
static inline int aice_write_debug_reg(struct aice_port_s *aice, uint32_t addr,
const uint32_t val)
{
- return aice->port->api->write_debug_reg(addr, val);
+ return aice->port->api->write_debug_reg(aice->coreid, addr, val);
}
static inline int aice_read_mem_unit(struct aice_port_s *aice, uint32_t addr,
uint32_t size, uint32_t count, uint8_t *buffer)
{
- return aice->port->api->read_mem_unit(addr, size, count, buffer);
+ return aice->port->api->read_mem_unit(aice->coreid, addr, size, count, buffer);
}
static inline int aice_write_mem_unit(struct aice_port_s *aice, uint32_t addr,
uint32_t size, uint32_t count, const uint8_t *buffer)
{
- return aice->port->api->write_mem_unit(addr, size, count, buffer);
+ return aice->port->api->write_mem_unit(aice->coreid, addr, size, count, buffer);
}
static inline int aice_read_mem_bulk(struct aice_port_s *aice, uint32_t addr,
uint32_t length, uint8_t *buffer)
{
- return aice->port->api->read_mem_bulk(addr, length, buffer);
+ return aice->port->api->read_mem_bulk(aice->coreid, addr, length, buffer);
}
static inline int aice_write_mem_bulk(struct aice_port_s *aice, uint32_t addr,
uint32_t length, const uint8_t *buffer)
{
- return aice->port->api->write_mem_bulk(addr, length, buffer);
+ return aice->port->api->write_mem_bulk(aice->coreid, addr, length, buffer);
}
static inline int aice_idcode(struct aice_port_s *aice, uint32_t *idcode,
@@ -132,7 +133,7 @@ static inline int aice_idcode(struct aice_port_s *aice, uint32_t *idcode,
static inline int aice_state(struct aice_port_s *aice,
enum aice_target_state_s *state)
{
- return aice->port->api->state(state);
+ return aice->port->api->state(aice->coreid, state);
}
static inline int aice_set_jtag_clock(struct aice_port_s *aice, uint32_t a_clock)
@@ -143,19 +144,19 @@ static inline int aice_set_jtag_clock(struct aice_port_s *aice, uint32_t a_clock
static inline int aice_memory_access(struct aice_port_s *aice,
enum nds_memory_access a_access)
{
- return aice->port->api->memory_access(a_access);
+ return aice->port->api->memory_access(aice->coreid, a_access);
}
static inline int aice_memory_mode(struct aice_port_s *aice,
enum nds_memory_select mem_select)
{
- return aice->port->api->memory_mode(mem_select);
+ return aice->port->api->memory_mode(aice->coreid, mem_select);
}
static inline int aice_set_data_endian(struct aice_port_s *aice,
enum aice_target_endian target_data_endian)
{
- return aice->port->api->set_data_endian(target_data_endian);
+ return aice->port->api->set_data_endian(aice->coreid, target_data_endian);
}
#endif
diff --git a/src/target/nds32_v3_common.c b/src/target/nds32_v3_common.c
index e01025f2..3930c250 100644
--- a/src/target/nds32_v3_common.c
+++ b/src/target/nds32_v3_common.c
@@ -29,18 +29,6 @@
#include "nds32_aice.h"
#include "nds32_v3_common.h"
-static struct breakpoint syscall_breakpoint = {
- 0x80,
- 0,
- 4,
- BKPT_SOFT,
- 0,
- NULL,
- NULL,
- 0x515CA11,
- 0,
-};
-
static struct nds32_v3_common_callback *v3_common_callback;
static int nds32_v3_register_mapping(struct nds32 *nds32, int reg_no)
@@ -90,17 +78,18 @@ static int nds32_v3_debug_entry(struct nds32 *nds32, bool enable_watchpoint)
if (enable_watchpoint)
CHECK_RETVAL(v3_common_callback->deactivate_hardware_watchpoint(nds32->target));
+ struct breakpoint *syscall_break = &(nds32->syscall_break);
if (nds32->virtual_hosting) {
- if (syscall_breakpoint.set) {
+ if (syscall_break->set) {
/** disable virtual hosting */
/* remove breakpoint at syscall entry */
- target_remove_breakpoint(nds32->target, &syscall_breakpoint);
- syscall_breakpoint.set = 0;
+ target_remove_breakpoint(nds32->target, syscall_break);
+ syscall_break->set = 0;
uint32_t value_pc;
nds32_get_mapped_reg(nds32, PC, &value_pc);
- if (value_pc == syscall_breakpoint.address)
+ if (value_pc == syscall_break->address)
/** process syscall for virtual hosting */
nds32->hit_syscall = true;
}
@@ -218,10 +207,12 @@ static int nds32_v3_leave_debug_state(struct nds32 *nds32, bool enable_watchpoin
}
/* insert breakpoint at syscall entry */
- syscall_breakpoint.address = syscall_address;
- syscall_breakpoint.type = BKPT_SOFT;
- syscall_breakpoint.set = 1;
- target_add_breakpoint(target, &syscall_breakpoint);
+ struct breakpoint *syscall_break = &(nds32->syscall_break);
+
+ syscall_break->address = syscall_address;
+ syscall_break->type = BKPT_SOFT;
+ syscall_break->set = 1;
+ target_add_breakpoint(target, syscall_break);
}
return ERROR_OK;