We used to print invalid data when the last field what clamped to 32bits due to Dword Length of the whole instruction :
0x000ce0b4: 0x10000002: MI_STORE_DATA_IMM 0x000ce0b4: 0x10000002 : Dword 0 DWord Length: 2 Store Qword: 0 Use Global GTT: false 0x000ce0b8: 0x00045010 : Dword 1 Core Mode Enable: 0 Address: 0x00045010 0x000ce0bc: 0x00000000 : Dword 2 0x000ce0c0: 0x00000000 : Dword 3 Immediate Data: 8791026489807077376 With this change we have the proper value : 0x000ce0b4: 0x10000002: MI_STORE_DATA_IMM (4 Dwords) 0x000ce0b4: 0x10000002 : Dword 0 DWord Length: 2 Store Qword: 0 Use Global GTT: false 0x000ce0b8: 0x00045010 : Dword 1 Core Mode Enable: 0 Address: 0x00045010 0x000ce0bc: 0x00000000 : Dword 2 0x000ce0c0: 0x00000000 : Dword 3 Immediate Data: 0 Signed-off-by: Lionel Landwerlin <lionel.g.landwer...@intel.com> --- src/intel/common/gen_decoder.c | 11 ++++++++--- 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 61ecf2eb392..ee05afb1051 100644 --- a/src/intel/common/gen_decoder.c +++ b/src/intel/common/gen_decoder.c @@ -855,9 +855,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->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; @@ -946,6 +950,7 @@ gen_field_iterator_init(struct gen_field_iterator *iter, else iter->field = group->next->fields; iter->p = p; + iter->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 2f05104178e..7bf8d433bc1 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 *end; int dword; /**< current field starts at &p[dword] */ int group_iter; -- 2.13.3 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev