gfx10+ are particularly sensitive and are prone to producing completely nonsensical information if trying to read from non-halted waves. On gfx11, we really ought to take SQ_WAVE_VALID_AND_IDLE into account. Rumor has it that reading from active waves can even lead to hangs, though I've never witnessed that personally. Signed-off-by: Nicolai Hähnle <nicolai.haehnle@xxxxxxx> --- src/app/print_waves.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/app/print_waves.c b/src/app/print_waves.c index 04a4447..89f4abb 100644 --- a/src/app/print_waves.c +++ b/src/app/print_waves.c @@ -376,22 +376,25 @@ static void umr_print_waves_gfx_10_11(struct umr_asic *asic) struct umr_wave_data *wd, *owd; int first = 1, col = 0, ring_halted = 0, use_ring = 1; struct umr_shaders_pgm *shader = NULL; struct umr_packet_stream *stream = NULL; struct { uint32_t vmid, size; uint64_t addr; } ib_addr; int start = -1, stop = -1; - if (asic->options.halt_waves) + if (asic->options.halt_waves) { umr_sq_cmd_halt_waves(asic, UMR_SQ_CMD_HALT); + } else { + fprintf(stderr, "[WARNING]: Wave listing is unreliable if waves aren't halted; use -o halt_waves\n"); + } // don't scan for shader info by reading the ring if no_disasm is // requested. This is useful for when the ring or IBs contain // invalid or racy data that cannot be reliably parsed. if (!asic->options.no_disasm && strcmp(asic->options.ring_name, "none")) { if (sscanf(asic->options.ring_name, "%"SCNx32"@%"SCNx64".%"SCNx32, &ib_addr.vmid, &ib_addr.addr, &ib_addr.size) == 3) use_ring = 0; if (asic->options.halt_waves) { // warn users if they don't specify a ring on gfx10 hardware -- 2.40.0