target/smp: use a struct list_head to hold the smp targets
Instead of reinventing a simply linked list, reuse the list helper for the list of targets in a smp cluster. Using the existing helper, that implements a double linked list, makes trivial going through the list in reverse order. Change-Id: Ib36ad2955f15cd2a601b0b9e36ca6d948b12d00f Signed-off-by: Antonio Borneo <borneo.antonio@gmail.com> Reviewed-on: https://review.openocd.org/c/openocd/+/6783 Tested-by: jenkins
This commit is contained in:
@@ -639,14 +639,11 @@ static int cortex_a_dpm_setup(struct cortex_a_common *a, uint32_t didr)
|
||||
static struct target *get_cortex_a(struct target *target, int32_t coreid)
|
||||
{
|
||||
struct target_list *head;
|
||||
struct target *curr;
|
||||
|
||||
head = target->head;
|
||||
while (head) {
|
||||
curr = head->target;
|
||||
foreach_smp_target(head, target->smp_targets) {
|
||||
struct target *curr = head->target;
|
||||
if ((curr->coreid == coreid) && (curr->state == TARGET_HALTED))
|
||||
return curr;
|
||||
head = head->next;
|
||||
}
|
||||
return target;
|
||||
}
|
||||
@@ -656,14 +653,12 @@ static int cortex_a_halt_smp(struct target *target)
|
||||
{
|
||||
int retval = 0;
|
||||
struct target_list *head;
|
||||
struct target *curr;
|
||||
head = target->head;
|
||||
while (head) {
|
||||
curr = head->target;
|
||||
|
||||
foreach_smp_target(head, target->smp_targets) {
|
||||
struct target *curr = head->target;
|
||||
if ((curr != target) && (curr->state != TARGET_HALTED)
|
||||
&& target_was_examined(curr))
|
||||
retval += cortex_a_halt(curr);
|
||||
head = head->next;
|
||||
}
|
||||
return retval;
|
||||
}
|
||||
@@ -684,7 +679,7 @@ static int update_halt_gdb(struct target *target)
|
||||
if (target->gdb_service)
|
||||
gdb_target = target->gdb_service->target;
|
||||
|
||||
foreach_smp_target(head, target->head) {
|
||||
foreach_smp_target(head, target->smp_targets) {
|
||||
curr = head->target;
|
||||
/* skip calling context */
|
||||
if (curr == target)
|
||||
@@ -951,11 +946,10 @@ static int cortex_a_restore_smp(struct target *target, int handle_breakpoints)
|
||||
{
|
||||
int retval = 0;
|
||||
struct target_list *head;
|
||||
struct target *curr;
|
||||
target_addr_t address;
|
||||
head = target->head;
|
||||
while (head) {
|
||||
curr = head->target;
|
||||
|
||||
foreach_smp_target(head, target->smp_targets) {
|
||||
struct target *curr = head->target;
|
||||
if ((curr != target) && (curr->state != TARGET_RUNNING)
|
||||
&& target_was_examined(curr)) {
|
||||
/* resume current address , not in step mode */
|
||||
@@ -963,8 +957,6 @@ static int cortex_a_restore_smp(struct target *target, int handle_breakpoints)
|
||||
handle_breakpoints, 0);
|
||||
retval += cortex_a_internal_restart(curr);
|
||||
}
|
||||
head = head->next;
|
||||
|
||||
}
|
||||
return retval;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user