[Pdbg] [PATCH v4 15/30] libpdbg: Add functions to get parent in backend or system tree

Alistair Popple alistair at popple.id.au
Wed Oct 9 15:11:06 AEDT 2019


Reviewed-by: Alistair Popple <alistair at popple.id.au>

On Thursday, 3 October 2019 2:18:54 PM AEDT Amitay Isaacs wrote:
> When using backend targets, the parent should be calculated based on
> backend tree and not system tree (e.g. cfam).
>
> Signed-off-by: Amitay Isaacs <amitay at ozlabs.org>
> ---
>  libpdbg/cfam.c    |  4 ++--
>  libpdbg/libpdbg.c | 24 +++++++++++++++++-------
>  libpdbg/target.h  |  2 ++
>  3 files changed, 21 insertions(+), 9 deletions(-)
> 
> diff --git a/libpdbg/cfam.c b/libpdbg/cfam.c
> index 868ca76..da4c5fc 100644
> --- a/libpdbg/cfam.c
> +++ b/libpdbg/cfam.c
> @@ -294,7 +294,7 @@ DECLARE_HW_UNIT(p8_opb_hmfsi);
>  
>  static int cfam_hmfsi_read(struct fsi *fsi, uint32_t addr, uint32_t *data)
>  {
> -	struct pdbg_target *parent_fsi = pdbg_target_require_parent("fsi", &fsi-
>target);
> +	struct pdbg_target *parent_fsi = require_target_parent("fsi", &fsi-
>target, false);
>  
>  	addr += pdbg_target_address(&fsi->target, NULL);
>  
> @@ -303,7 +303,7 @@ static int cfam_hmfsi_read(struct fsi *fsi, uint32_t 
addr, uint32_t *data)
>  
>  static int cfam_hmfsi_write(struct fsi *fsi, uint32_t addr, uint32_t data)
>  {
> -	struct pdbg_target *parent_fsi = pdbg_target_require_parent("fsi", &fsi-
>target);
> +	struct pdbg_target *parent_fsi = require_target_parent("fsi", &fsi-
>target, false);
>  
>  	addr += pdbg_target_address(&fsi->target, NULL);
>  
> diff --git a/libpdbg/libpdbg.c b/libpdbg/libpdbg.c
> index 7e72024..eaf2782 100644
> --- a/libpdbg/libpdbg.c
> +++ b/libpdbg/libpdbg.c
> @@ -198,34 +198,44 @@ uint32_t pdbg_target_index(struct pdbg_target *target)
>  }
>  
>  /* Find a target parent from the given class */
> -struct pdbg_target *pdbg_target_parent(const char *class, struct 
pdbg_target *target)
> +struct pdbg_target *target_parent(const char *klass, struct pdbg_target 
*target, bool system)
>  {
>  	struct pdbg_target *parent;
>  
> -	if (!class)
> -		return get_parent(target, true);
> +	if (!klass)
> +		return get_parent(target, system);
>  
> -	for (parent = get_parent(target, true); parent && get_parent(parent, 
true); parent = get_parent(parent, true)) {
> +	for (parent = get_parent(target, system); parent && get_parent(parent, 
system); parent = get_parent(parent, system)) {
>  		const char *tclass = pdbg_target_class_name(parent);
>  
>  		if (!tclass)
>  			continue;
>  
> -		if (!strcmp(class, tclass))
> +		if (!strcmp(klass, tclass))
>  			return parent;
>  	}
>  
>  	return NULL;
>  }
>  
> -struct pdbg_target *pdbg_target_require_parent(const char *class, struct 
pdbg_target *target)
> +struct pdbg_target *pdbg_target_parent(const char *klass, struct 
pdbg_target *target)
>  {
> -	struct pdbg_target *parent = pdbg_target_parent(class, target);
> +	return target_parent(klass, target, true);
> +}
> +
> +struct pdbg_target *require_target_parent(const char *klass, struct 
pdbg_target *target, bool system)
> +{
> +	struct pdbg_target *parent = target_parent(klass, target, system);
>  
>  	assert(parent);
>  	return parent;
>  }
>  
> +struct pdbg_target *pdbg_target_require_parent(const char *klass, struct 
pdbg_target *target)
> +{
> +	return require_target_parent(klass, target, true);
> +}
> +
>  /* Searched up the tree for the first target of the right class and returns 
its index */
>  uint32_t pdbg_parent_index(struct pdbg_target *target, char *class)
>  {
> diff --git a/libpdbg/target.h b/libpdbg/target.h
> index a8b0d3d..df4f3f8 100644
> --- a/libpdbg/target.h
> +++ b/libpdbg/target.h
> @@ -54,6 +54,8 @@ struct pdbg_target {
>  };
>  
>  struct pdbg_target *get_parent(struct pdbg_target *target, bool system);
> +struct pdbg_target *target_parent(const char *klass, struct pdbg_target 
*target, bool system);
> +struct pdbg_target *require_target_parent(const char *klass, struct 
pdbg_target *target, bool system);
>  struct pdbg_target_class *find_target_class(const char *name);
>  struct pdbg_target_class *require_target_class(const char *name);
>  struct pdbg_target_class *get_target_class(struct pdbg_target *target);
> 






More information about the Pdbg mailing list