aub_viewer_decode_ctx_init(struct aub_viewer_decode_ctx *ctx,
struct aub_viewer_cfg *cfg,
struct aub_viewer_decode_cfg *decode_cfg,
+ const struct gen_device_info *devinfo,
struct gen_spec *spec,
- struct gen_disasm *disasm,
struct gen_batch_decode_bo (*get_bo)(void *, bool, uint64_t),
unsigned (*get_state_size)(void *, uint32_t),
void *user_data)
ctx->get_bo = get_bo;
ctx->get_state_size = get_state_size;
ctx->user_data = user_data;
+ ctx->devinfo = devinfo;
ctx->engine = I915_ENGINE_CLASS_RENDER;
ctx->cfg = cfg;
ctx->decode_cfg = decode_cfg;
ctx->spec = spec;
- ctx->disasm = disasm;
}
static void
const uint32_t *p, *batch = (const uint32_t *) _batch, *end = batch + batch_size / sizeof(uint32_t);
int length;
+ if (ctx->n_batch_buffer_start >= 100) {
+ ImGui::TextColored(ctx->cfg->error_color,
+ "0x%08" PRIx64 ": Max batch buffer jumps exceeded", batch_addr);
+ return;
+ }
+
+ ctx->n_batch_buffer_start++;
+
for (p = batch; p < end; p += length) {
inst = gen_spec_find_instruction(ctx->spec, ctx->engine, p);
length = gen_group_get_length(inst, p);
}
if (strcmp(inst_name, "MI_BATCH_BUFFER_START") == 0) {
- uint64_t next_batch_addr;
+ uint64_t next_batch_addr = 0xd0d0d0d0;
bool ppgtt = false;
- bool second_level;
+ bool second_level = false;
struct gen_field_iterator iter;
gen_field_iterator_init(&iter, inst, p, 0, false);
while (gen_field_iterator_next(&iter)) {
break;
}
}
+
+ ctx->n_batch_buffer_start--;
}