gdb_server: support gdb target description

* Add a parameter in .get_gdb_reg_list() to return different
  register lists as generating target description.
* Modify STRUCT REG to let gdb generate target description
  according to register information.

The modified structure of register is
struct reg {
        const char *name;
        uint32_t number;  /* for regnum="num" */
        struct reg_feature *feature;  /* for register group feature name */
        bool caller_save;  /* for save-restore="yes|no" */
        void *value;
        bool dirty;
        bool valid;
        bool exist;
        uint32_t size;
        struct reg_data_type *reg_data_type;  /* for type="type" */
        const char *group;  /* for group="general|float|vector" */
        void *arch_info;
        const struct reg_arch_type *type;
};

Change-Id: I2096b67adf94518ba0b8b23d8c6a9f64ad7932b8
Signed-off-by: Hsiangkai Wang <hsiangkai@gmail.com>
Reviewed-on: http://openocd.zylin.com/1382
Tested-by: jenkins
Reviewed-by: Franck Jullien <franck.jullien@gmail.com>
Reviewed-by: Spencer Oliver <spen@spen-soft.co.uk>
Reviewed-by: Andreas Fritiofson <andreas.fritiofson@gmail.com>
This commit is contained in:
Hsiangkai Wang
2013-05-07 21:43:35 +08:00
committed by Spencer Oliver
parent 9f2922aa7a
commit d979d78e97
16 changed files with 657 additions and 56 deletions

View File

@@ -26,12 +26,105 @@
struct target;
enum reg_type {
REG_TYPE_INT8,
REG_TYPE_INT16,
REG_TYPE_INT32,
REG_TYPE_INT64,
REG_TYPE_INT128,
REG_TYPE_UINT8,
REG_TYPE_UINT16,
REG_TYPE_UINT32,
REG_TYPE_UINT64,
REG_TYPE_UINT128,
REG_TYPE_CODE_PTR,
REG_TYPE_DATA_PTR,
REG_TYPE_IEEE_SINGLE,
REG_TYPE_IEEE_DOUBLE,
REG_TYPE_ARCH_DEFINED,
};
struct reg_feature {
const char *name;
};
struct reg_data_type_vector {
struct reg_data_type *type;
uint32_t count;
};
struct reg_data_type_union_field {
const char *name;
struct reg_data_type *type;
struct reg_data_type_union_field *next;
};
struct reg_data_type_union {
struct reg_data_type_union_field *fields;
};
struct reg_data_type_bitfield {
uint32_t start;
uint32_t end;
};
struct reg_data_type_struct_field {
const char *name;
bool use_bitfields;
union {
struct reg_data_type_bitfield *bitfield;
struct reg_data_type *type;
};
struct reg_data_type_struct_field *next;
};
struct reg_data_type_struct {
uint32_t size;
struct reg_data_type_struct_field *fields;
};
struct reg_data_type_flags_field {
const char *name;
struct reg_data_type_bitfield *bitfield;
struct reg_data_type_flags_field *next;
};
struct reg_data_type_flags {
uint32_t size;
struct reg_data_type_flags_field *fields;
};
enum reg_data_type_class {
REG_TYPE_CLASS_VECTOR,
REG_TYPE_CLASS_UNION,
REG_TYPE_CLASS_STRUCT,
REG_TYPE_CLASS_FLAGS,
};
struct reg_data_type {
enum reg_type type;
const char *id;
enum reg_data_type_class type_class;
union {
struct reg_data_type_vector *reg_type_vector;
struct reg_data_type_union *reg_type_union;
struct reg_data_type_struct *reg_type_struct;
struct reg_data_type_flags *reg_type_flags;
};
};
struct reg {
const char *name;
uint32_t number;
struct reg_feature *feature;
bool caller_save;
void *value;
bool dirty;
bool valid;
bool exist;
uint32_t size;
struct reg_data_type *reg_data_type;
const char *group;
void *arch_info;
const struct reg_arch_type *type;
};