[Pdbg] [PATCH 2/2] libpdbg: Allow programs to register their own hardware units

Amitay Isaacs amitay at ozlabs.org
Wed Sep 4 13:41:05 AEST 2019


Hi Alistair,

This will require some modifications to pdbg_hwunit_register() to check
if there is a clash in the class names and may be even compatible
string.

Also, we can include the strucutre element check (done in
DELCARE_HW_UNIT) in the definition of pdbg_hwunit_register, by
converting that into a macro instead.

The following sequence though works:

   struct foobar {
   };

   DECLARE_HW_UNIT(foobar);
   pdbg_hwunit_register(foobar_hw_unit);

might be easier with:

  struct foobar {
  };

  pdbg_hwunit_register(struct foobar);

Amitay.

On Tue, 2019-09-03 at 17:59 +1000, Alistair Popple wrote:
> Signed-off-by: Alistair Popple <alistair at popple.id.au>
> ---
>  libpdbg/hwunit.c  |  3 ---
>  libpdbg/hwunit.h  | 18 ------------------
>  libpdbg/libpdbg.h | 35 ++++++++++++++++++++++++++++++++++-
>  libpdbg/target.h  | 10 ----------
>  4 files changed, 34 insertions(+), 32 deletions(-)
> 
> diff --git a/libpdbg/hwunit.c b/libpdbg/hwunit.c
> index 5c40d23..c7ec63d 100644
> --- a/libpdbg/hwunit.c
> +++ b/libpdbg/hwunit.c
> @@ -21,9 +21,6 @@
>  
>  #define MAX_HW_UNITS	1024
>  
> -struct pdbg_target pdbg_target_size;
> -uint8_t pdbg_target_size_test[sizeof(struct pdbg_target)];
> -
>  static const struct hw_unit_info *g_hw_unit[MAX_HW_UNITS];
>  static int g_hw_unit_count;
>  
> diff --git a/libpdbg/hwunit.h b/libpdbg/hwunit.h
> index a359af0..be88701 100644
> --- a/libpdbg/hwunit.h
> +++ b/libpdbg/hwunit.h
> @@ -26,26 +26,8 @@
>   * remove a bunch of tedious container_of() typing */
>  #define translate_cast(x) (uint64_t (*)(struct pdbg_target *,
> uint64_t)) (x)
>  
> -struct hw_unit_info {
> -	void *hw_unit;
> -	size_t size;
> -};
> -
> -void pdbg_hwunit_register(const struct hw_unit_info *hw_unit);
>  const struct hw_unit_info *pdbg_hwunit_find_compatible(const char
> *compat);
>  
> -/*
> - * If this macro fails to compile for you, you've probably not
> - * declared the struct pdbg_target as the first member of the
> - * container struct. Not doing so will break other assumptions.
> - */
> -#define DECLARE_HW_UNIT(name)					
> 	\
> -	__attribute__((unused)) static inline void name
> ##_hw_unit_check(void) {	\
> -		((void)sizeof(char[1 - 2 * (container_off(typeof(name),
> target) != 0)])); \
> -	}								\
> -	const struct hw_unit_info __used name ##_hw_unit
> =              \
> -	{ .hw_unit = &name, .size = sizeof(name) };
> -
>  struct htm {
>  	struct pdbg_target target;
>  	int (*start)(struct htm *);
> diff --git a/libpdbg/libpdbg.h b/libpdbg/libpdbg.h
> index e752681..534a803 100644
> --- a/libpdbg/libpdbg.h
> +++ b/libpdbg/libpdbg.h
> @@ -12,9 +12,42 @@
>  extern "C" {
>  #endif
>  
> -struct pdbg_target;
> +struct pdbg_target {
> +	char *name;
> +	char *compatible;
> +	char *class;
> +	int (*probe)(struct pdbg_target *target);
> +	void (*release)(struct pdbg_target *target);
> +	uint64_t (*translate)(struct pdbg_target *target, uint64_t
> addr);
> +	struct pdbg_target *parent;
> +	void *priv;
> +};
> +
>  struct pdbg_target_class;
>  
> +struct hw_unit_info {
> +	void *hw_unit;
> +	size_t size;
> +};
> +
> +/*
> + * If this macro fails to compile for you, you've probably not
> + * declared the struct pdbg_target as the first member of the
> + * container struct. Not doing so will break other assumptions.
> + */
> +#define DECLARE_HW_UNIT(name)					
> 	\
> +	__attribute__((unused)) static inline void name
> ##_hw_unit_check(void) {	\
> +		((void)sizeof(char[1 - 2 * (container_off(typeof(name),
> target) != 0)])); \
> +	}								\
> +	const struct hw_unit_info __used name ##_hw_unit
> =              \
> +	{ .hw_unit = &name, .size = sizeof(name) };
> +
> +/*
> + * Registers a hardware unit implementation. Must be called
> + * prior to pdbg_targets_init().
> + */
> +void pdbg_hwunit_register(const struct hw_unit_info *hw_unit);
> +
>  /* loops/iterators */
>  struct pdbg_target *__pdbg_next_compatible_node(struct pdbg_target
> *root,
>                                                  struct pdbg_target
> *prev,
> diff --git a/libpdbg/target.h b/libpdbg/target.h
> index ba2b20d..7d88d23 100644
> --- a/libpdbg/target.h
> +++ b/libpdbg/target.h
> @@ -32,16 +32,6 @@ struct pdbg_target_class {
>  	struct list_node class_head_link;
>  };
>  
> -struct pdbg_target {
> -	char *name;
> -	char *compatible;
> -	char *class;
> -	int (*probe)(struct pdbg_target *target);
> -	void (*release)(struct pdbg_target *target);
> -	uint64_t (*translate)(struct pdbg_target *target, uint64_t
> addr);
> -	struct pdbg_target *parent;
> -};
> -
>  struct pdbg_target_priv {
>  	int index;
>  	enum pdbg_target_status status;
> -- 
> 2.20.1
> 

Amitay.
-- 

Experience is something you don't get until just after you need it.



More information about the Pdbg mailing list