summaryrefslogtreecommitdiffstats
path: root/src/mesa/drivers/dri/i965/intel_batchbuffer.c
diff options
context:
space:
mode:
authorJordan Justen <[email protected]>2017-03-28 12:03:37 -0700
committerJordan Justen <[email protected]>2017-04-06 13:26:08 -0700
commitd5bd0e411ede67f5c56f95ae4d905d8d94c9be2f (patch)
tree10be56421c5957e546e47dbdcde8406a463a039f /src/mesa/drivers/dri/i965/intel_batchbuffer.c
parent7c33372f82707d42293b1772d53ab50a2f56d6a3 (diff)
intel/gen_decoder: return -1 for unknown command formats
Decoding with aubinator encountered a command of 0xffffffff. With the previous code, it caused aubinator to jump 255 + 2 dwords to start decoding again. Instead we can attempt to detect the known instruction formats. If the format is not recognized, then we can advance just 1 dword. v2: * Update aubinator_error_decode * Actually convert the length variable returned into a *signed* integer in aubinator.c, intel_batchbuffer.c and aubinator_error_decode.c. Signed-off-by: Jordan Justen <[email protected]> Acked-by: Lionel Landwerlin <[email protected]>
Diffstat (limited to 'src/mesa/drivers/dri/i965/intel_batchbuffer.c')
-rw-r--r--src/mesa/drivers/dri/i965/intel_batchbuffer.c8
1 files changed, 4 insertions, 4 deletions
diff --git a/src/mesa/drivers/dri/i965/intel_batchbuffer.c b/src/mesa/drivers/dri/i965/intel_batchbuffer.c
index 54bab9efb02..54777d1c34f 100644
--- a/src/mesa/drivers/dri/i965/intel_batchbuffer.c
+++ b/src/mesa/drivers/dri/i965/intel_batchbuffer.c
@@ -220,7 +220,7 @@ do_batch_dump(struct brw_context *brw)
uint32_t *data = batch->bo->virtual ? batch->bo->virtual : batch->map;
uint32_t *end = data + USED_BATCH(*batch);
uint32_t gtt_offset = batch->bo->virtual ? batch->bo->offset64 : 0;
- unsigned int length;
+ int length;
bool color = INTEL_DEBUG & DEBUG_COLOR;
const char *header_color = color ? BLUE_HEADER : "";
@@ -228,9 +228,11 @@ do_batch_dump(struct brw_context *brw)
for (uint32_t *p = data; p < end; p += length) {
struct gen_group *inst = gen_spec_find_instruction(spec, p);
+ length = gen_group_get_length(inst, p);
+ assert(inst == NULL || length > 0);
+ length = MAX2(1, length);
if (inst == NULL) {
fprintf(stderr, "unknown instruction %08x\n", p[0]);
- length = (p[0] & 0xff) + 2;
continue;
}
@@ -316,8 +318,6 @@ do_batch_dump(struct brw_context *brw)
gtt_offset, p[1] & ~0x3fu, color);
break;
}
-
- length = gen_group_get_length(inst, p);
}
if (ret == 0) {