diff options
Diffstat (limited to 'src/intel/common')
-rw-r--r-- | src/intel/common/gen_decoder.c | 11 | ||||
-rw-r--r-- | src/intel/common/gen_decoder.h | 1 |
2 files changed, 9 insertions, 3 deletions
diff --git a/src/intel/common/gen_decoder.c b/src/intel/common/gen_decoder.c index ac7c94f41e6..d2190cb8b1f 100644 --- a/src/intel/common/gen_decoder.c +++ b/src/intel/common/gen_decoder.c @@ -850,9 +850,13 @@ gen_field_decode(struct gen_field_iterator *iter) else memset(iter->name, 0, sizeof(iter->name)); - if ((iter->field->end - iter->field->start) > 32) - v.qw = ((uint64_t) iter->p[iter->dword+1] << 32) | iter->p[iter->dword]; - else + memset(&v, 0, sizeof(v)); + + if ((iter->field->end - iter->field->start) > 32) { + if (&iter->p[iter->dword + 1] < iter->p_end) + v.qw = ((uint64_t) iter->p[iter->dword+1] << 32); + v.qw |= iter->p[iter->dword]; + } else v.qw = iter->p[iter->dword]; const char *enum_name = NULL; @@ -941,6 +945,7 @@ gen_field_iterator_init(struct gen_field_iterator *iter, else iter->field = group->next->fields; iter->p = p; + iter->p_end = &p[gen_group_get_length(iter->group, iter->p)]; iter->print_colors = print_colors; gen_field_decode(iter); diff --git a/src/intel/common/gen_decoder.h b/src/intel/common/gen_decoder.h index b8666ca3044..88375c8223d 100644 --- a/src/intel/common/gen_decoder.h +++ b/src/intel/common/gen_decoder.h @@ -57,6 +57,7 @@ struct gen_field_iterator { char value[128]; struct gen_group *struct_desc; const uint32_t *p; + const uint32_t *p_end; int dword; /**< current field starts at &p[dword] */ int start; /**< current field starts at this bit number */ int end; /**< current field ends at this bit number */ |