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:
committed by
Spencer Oliver
parent
9f2922aa7a
commit
d979d78e97
@@ -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;
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user