[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