aboutsummaryrefslogtreecommitdiff
path: root/src/rtos
diff options
context:
space:
mode:
authorAntonio Borneo <borneo.antonio@gmail.com>2021-12-16 01:59:14 +0100
committerAntonio Borneo <borneo.antonio@gmail.com>2022-02-14 15:10:10 +0000
commit16cc853bcfbcc8dba6eadd91b434c05387034c0a (patch)
treecee31fec1a5bb238ab7d1e9b0170edbfdfc2ffa2 /src/rtos
parent5ab74bde06541ce199390ead348a3e107ee9c0f4 (diff)
downloadriscv-openocd-16cc853bcfbcc8dba6eadd91b434c05387034c0a.zip
riscv-openocd-16cc853bcfbcc8dba6eadd91b434c05387034c0a.tar.gz
riscv-openocd-16cc853bcfbcc8dba6eadd91b434c05387034c0a.tar.bz2
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
Diffstat (limited to 'src/rtos')
-rw-r--r--src/rtos/hwthread.c8
-rw-r--r--src/rtos/linux.c16
2 files changed, 10 insertions, 14 deletions
diff --git a/src/rtos/hwthread.c b/src/rtos/hwthread.c
index 3702b0b..7c99886 100644
--- a/src/rtos/hwthread.c
+++ b/src/rtos/hwthread.c
@@ -23,6 +23,7 @@
#include "target/target.h"
#include "target/target_type.h"
#include "target/register.h"
+#include <target/smp.h>
#include "rtos.h"
#include "helper/log.h"
#include "helper/types.h"
@@ -107,7 +108,7 @@ static int hwthread_update_threads(struct rtos *rtos)
/* determine the number of "threads" */
if (target->smp) {
- for (head = target->head; head; head = head->next) {
+ foreach_smp_target(head, target->smp_targets) {
struct target *curr = head->target;
if (!target_was_examined(curr))
@@ -123,7 +124,7 @@ static int hwthread_update_threads(struct rtos *rtos)
if (target->smp) {
/* loop over all threads */
- for (head = target->head; head; head = head->next) {
+ foreach_smp_target(head, target->smp_targets) {
struct target *curr = head->target;
if (!target_was_examined(curr))
@@ -218,7 +219,8 @@ static struct target *hwthread_find_thread(struct target *target, int64_t thread
if (!target)
return NULL;
if (target->smp) {
- for (struct target_list *head = target->head; head; head = head->next) {
+ struct target_list *head;
+ foreach_smp_target(head, target->smp_targets) {
if (thread_id == threadid_from_target(head->target))
return head->target;
}
diff --git a/src/rtos/linux.c b/src/rtos/linux.c
index 84b4c65..d147c1c 100644
--- a/src/rtos/linux.c
+++ b/src/rtos/linux.c
@@ -30,6 +30,7 @@
#include "rtos.h"
#include "rtos_standard_stackings.h"
#include <target/register.h>
+#include <target/smp.h>
#include "server/gdb_server.h"
#define LINUX_USER_KERNEL_BORDER 0xc0000000
@@ -191,16 +192,14 @@ static int linux_os_thread_reg_list(struct rtos *rtos,
/* search target to perform the access */
struct reg **gdb_reg_list;
struct target_list *head;
- head = target->head;
found = 0;
- do {
+ foreach_smp_target(head, target->smp_targets) {
if (head->target->coreid == next->core_id) {
target = head->target;
found = 1;
break;
}
- head = head->next;
- } while (head);
+ }
if (found == 0) {
LOG_ERROR
@@ -397,7 +396,6 @@ static int get_name(struct target *target, struct threads *t)
static int get_current(struct target *target, int create)
{
struct target_list *head;
- head = target->head;
uint8_t *buf;
uint32_t val;
uint32_t ti_addr;
@@ -413,7 +411,7 @@ static int get_current(struct target *target, int create)
ctt = ctt->next;
}
- while (head) {
+ foreach_smp_target(head, target->smp_targets) {
struct reg **reg_list;
int reg_list_size;
int retval;
@@ -474,7 +472,6 @@ static int get_current(struct target *target, int create)
}
free(reg_list);
- head = head->next;
}
free(buffer);
@@ -1394,9 +1391,8 @@ static int linux_os_smp_init(struct target *target)
struct linux_os *os_linux =
(struct linux_os *)rtos->rtos_specific_params;
struct current_thread *ct;
- head = target->head;
- while (head) {
+ foreach_smp_target(head, target->smp_targets) {
if (head->target->rtos != rtos) {
struct linux_os *smp_os_linux =
(struct linux_os *)head->target->rtos->rtos_specific_params;
@@ -1413,8 +1409,6 @@ static int linux_os_smp_init(struct target *target)
os_linux->nr_cpus++;
free(smp_os_linux);
}
-
- head = head->next;
}
return ERROR_OK;