[Pdbg] [PATCH v2 04/16] libpdbg: Add indirect address translation via callback

Amitay Isaacs amitay at ozlabs.org
Wed Nov 7 17:02:16 AEDT 2018


Reviewed-by: Amitay Isaacs <amitay at ozlabs.org>

On Wed, 2018-11-07 at 16:39 +1100, Alistair Popple wrote:
> Some hardware targets have more complicated addressing schemes than a
> simple base address + offset. It may be possible to determine a
> device-tree representation for these schemes but for the moment it is
> more straight forward to define a callback to do the translation.
> 
> Signed-off-by: Alistair Popple <alistair at popple.id.au>
> ---
>  libpdbg/target.c | 7 ++++++-
>  libpdbg/target.h | 7 +++++++
>  2 files changed, 13 insertions(+), 1 deletion(-)
> 
> diff --git a/libpdbg/target.c b/libpdbg/target.c
> index 975ecec..7468863 100644
> --- a/libpdbg/target.c
> +++ b/libpdbg/target.c
> @@ -20,8 +20,13 @@ static struct pdbg_target
> *get_class_target_addr(struct pdbg_target *target, con
>  {
>  	/* Check class */
>  	while (strcmp(target->class, name)) {
> +
> +		if (target->translate)
> +			*addr = target->translate(target, *addr);
> +		else
> +			*addr += dt_get_address(target, 0, NULL);
> +
>  		/* Keep walking the tree translating addresses */
> -		*addr += dt_get_address(target, 0, NULL);
>  		target = target->parent;
>  
>  		/* The root node doesn't have an address space so it's
> diff --git a/libpdbg/target.h b/libpdbg/target.h
> index d1a6aec..289c1ee 100644
> --- a/libpdbg/target.h
> +++ b/libpdbg/target.h
> @@ -38,6 +38,7 @@ struct pdbg_target {
>  	char *class;
>  	int (*probe)(struct pdbg_target *target);
>  	void (*release)(struct pdbg_target *target);
> +	uint64_t (*translate)(struct pdbg_target *target, uint64_t
> addr);
>  	int index;
>  	enum pdbg_target_status status;
>  	const char *dn_name;
> @@ -57,6 +58,12 @@ struct pdbg_target_class
> *require_target_class(const char *name);
>  struct pdbg_target_class *get_target_class(const char *name);
>  bool pdbg_target_is_class(struct pdbg_target *target, const char
> *class);
>  
> +/* This works and should be safe because struct pdbg_target is
> guaranteed to be
> + * the first member of the specialised type (see the DECLARE_HW_UNIT
> definition
> + * below). I'm not sure how sane it is though. Probably not very but
> it does
> + * remove a bunch of tedious container_of() typing */
> +#define translate_cast(x) (uint64_t (*)(struct pdbg_target *,
> uint64_t)) (x)
> +
>  extern struct list_head empty_list;
>  extern struct list_head target_classes;
>  
> -- 
> 2.11.0
> 

Amitay.
-- 

The best God is one that gives nothing and demands nothing. That is 
the only God you can count on.  - Conan



More information about the Pdbg mailing list