summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/intel/common/gen_decoder.c11
-rw-r--r--src/intel/common/gen_decoder.h1
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 */