diff options
author | Matthias Welwarsky <matthias.welwarsky@sysgo.com> | 2018-03-08 14:40:10 +0100 |
---|---|---|
committer | Matthias Welwarsky <matthias@welwarsky.de> | 2018-03-27 09:15:27 +0100 |
commit | 0808c6e8a3bd82316988d3d86bd6b212eefff6a2 (patch) | |
tree | e1a2506cdb1a640e719c4d960e682f91bc6f9f93 | |
parent | 78a44055c50f4ea10ebb14714c4b6563cd64f71b (diff) |
tdesc: bitfields may carry a type
a bitfield may carry a type (bool or int), add support for that.
Change-Id: Ic831a9b8eac8579e8fdd7d0f01b7f1c9259e6739
Signed-off-by: Matthias Welwarsky <matthias.welwarsky@sysgo.com>
Reviewed-on: http://openocd.zylin.com/4459
Tested-by: jenkins
Reviewed-by: Matthias Welwarsky <matthias@welwarsky.de>
-rw-r--r-- | src/server/gdb_server.c | 15 | ||||
-rw-r--r-- | src/target/register.h | 3 |
2 files changed, 13 insertions, 5 deletions
diff --git a/src/server/gdb_server.c b/src/server/gdb_server.c index 74074a1f..428547b4 100644 --- a/src/server/gdb_server.c +++ b/src/server/gdb_server.c @@ -1909,6 +1909,8 @@ static int gdb_memory_map(struct connection *connection, static const char *gdb_get_reg_type_name(enum reg_type type) { switch (type) { + case REG_TYPE_BOOL: + return "bool"; case REG_TYPE_INT: return "int"; case REG_TYPE_INT8: @@ -1921,6 +1923,8 @@ static const char *gdb_get_reg_type_name(enum reg_type type) return "int64"; case REG_TYPE_INT128: return "int128"; + case REG_TYPE_UINT: + return "uint"; case REG_TYPE_UINT8: return "uint8"; case REG_TYPE_UINT16: @@ -2040,9 +2044,9 @@ static int gdb_generate_reg_type_description(struct target *target, type->id, type->reg_type_struct->size); while (field != NULL) { xml_printf(&retval, tdesc, pos, size, - "<field name=\"%s\" start=\"%d\" end=\"%d\"/>\n", - field->name, field->bitfield->start, - field->bitfield->end); + "<field name=\"%s\" start=\"%d\" end=\"%d\" type=\"%s\" />\n", + field->name, field->bitfield->start, field->bitfield->end, + gdb_get_reg_type_name(field->bitfield->type)); field = field->next; } @@ -2088,8 +2092,9 @@ static int gdb_generate_reg_type_description(struct target *target, field = type->reg_type_flags->fields; while (field != NULL) { xml_printf(&retval, tdesc, pos, size, - "<field name=\"%s\" start=\"%d\" end=\"%d\"/>\n", - field->name, field->bitfield->start, field->bitfield->end); + "<field name=\"%s\" start=\"%d\" end=\"%d\" type=\"%s\" />\n", + field->name, field->bitfield->start, field->bitfield->end, + gdb_get_reg_type_name(field->bitfield->type)); field = field->next; } diff --git a/src/target/register.h b/src/target/register.h index dc18e9a8..32c1f39a 100644 --- a/src/target/register.h +++ b/src/target/register.h @@ -25,12 +25,14 @@ struct target; enum reg_type { + REG_TYPE_BOOL, REG_TYPE_INT, REG_TYPE_INT8, REG_TYPE_INT16, REG_TYPE_INT32, REG_TYPE_INT64, REG_TYPE_INT128, + REG_TYPE_UINT, REG_TYPE_UINT8, REG_TYPE_UINT16, REG_TYPE_UINT32, @@ -66,6 +68,7 @@ struct reg_data_type_union { struct reg_data_type_bitfield { uint32_t start; uint32_t end; + enum reg_type type; }; struct reg_data_type_struct_field { |