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

Alistair Popple alistair at popple.id.au
Thu Apr 12 14:27:47 AEST 2018


On Monday, 9 April 2018 5:35:20 PM AEST Nicholas Piggin wrote:
> 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.

Not quite sure what you mean here? It should be possible to add per-target state
variables to the targets. Eg. see `struct thread` in libpdbg/target.h. Does that
help?

- Alistair

> 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;
>  }
>  
> 




More information about the Pdbg mailing list