[Pdbg] [PATCH 12/14] libpdbg/p9chip.c: ram allow ram to be used on running threads

Nicholas Piggin npiggin at gmail.com
Mon Apr 9 17:35:20 AEST 2018


Like the sreset change. The global state isn't nice, we may have to
find a good way to move these bits into targets in the longer term.

Signed-off-by: Nicholas Piggin <npiggin at gmail.com>
---
 libpdbg/p9chip.c | 22 ++++++++++++++++++++--
 1 file changed, 20 insertions(+), 2 deletions(-)

diff --git a/libpdbg/p9chip.c b/libpdbg/p9chip.c
index ab0e9a1..e3f6d8a 100644
--- a/libpdbg/p9chip.c
+++ b/libpdbg/p9chip.c
@@ -150,6 +150,8 @@ static int p9_thread_sreset(struct thread *thread)
 	return 0;
 }
 
+static bool ram_setup_did_stop = false;
+
 static int p9_ram_setup(struct thread *thread)
 {
 	struct dt_node *dn;
@@ -165,8 +167,11 @@ static int p9_ram_setup(struct thread *thread)
 		   so do that now. This will also update the thread status */
 		p9_thread_probe(dn->target);
 		tmp = target_to_thread(dn->target);
-		if (tmp->status != (THREAD_STATUS_QUIESCE | THREAD_STATUS_ACTIVE))
-			return 1;
+		if (tmp->status != (THREAD_STATUS_QUIESCE | THREAD_STATUS_ACTIVE)) {
+			if (p9_thread_stop(tmp))
+				return 1;
+			ram_setup_did_stop = true;
+		}
 	}
 
 	/* Wait or NEST_ACTIVE to clear */
@@ -234,9 +239,22 @@ static int p9_ram_instruction(struct thread *thread, uint64_t opcode, uint64_t *
 
 static int p9_ram_destroy(struct thread *thread)
 {
+	struct dt_node *dn;
+	struct core *chip = target_to_core(thread->target.dn->parent->target);
+
 	/* Disable ram mode */
 	CHECK_ERR(thread_write(thread, P9_RAM_MODEREG, 0));
 
+	dt_for_each_compatible(chip->target.dn, dn, "ibm,power9-thread") {
+		struct thread *tmp;
+
+		tmp = target_to_thread(dn->target);
+		if (ram_setup_did_stop)
+			p9_thread_start(tmp);
+	}
+
+	ram_setup_did_stop = false;
+
 	return 0;
 }
 
-- 
2.17.0



More information about the Pdbg mailing list