If trap_en and priv are set in the SQ_WAVE_STATUS then read 12 or 16 words from 0x6C (SQ_WAVE_TTMP0...) and display inline with rest of SGPRs. Signed-off-by: Tom St Denis <tom.stdenis at amd.com> --- src/app/print_waves.c | 33 ++++++++++++++++++++++++++++++--- src/lib/read_gpr.c | 16 +++++++++++++++- src/lib/wave_status.c | 1 + src/umr.h | 1 + 4 files changed, 47 insertions(+), 4 deletions(-) diff --git a/src/app/print_waves.c b/src/app/print_waves.c index e4e6b87566fb..851b08b3d3d4 100644 --- a/src/app/print_waves.c +++ b/src/app/print_waves.c @@ -35,7 +35,7 @@ void umr_print_waves(struct umr_asic *asic) { - uint32_t x, se, sh, cu, simd, wave, sgprs[1024], shift, opcodes[8]; + uint32_t x, y, se, sh, cu, simd, wave, sgprs[1024], shift, opcodes[8]; uint32_t vgprs[64 * 256]; uint32_t thread; uint64_t pgm_addr; @@ -93,7 +93,7 @@ void umr_print_waves(struct umr_asic *asic) (unsigned long)ws.hw_id.value, (unsigned long)ws.gpr_alloc.value, (unsigned long)ws.lds_alloc.value, (unsigned long)ws.trapsts.value, (unsigned long)ws.ib_sts.value, (unsigned long)ws.tba_hi, (unsigned long)ws.tba_lo, (unsigned long)ws.tma_hi, (unsigned long)ws.tma_lo, (unsigned long)ws.ib_dbg0, (unsigned long)ws.m0 ); - if (ws.wave_status.halt) + if (ws.wave_status.halt) { for (x = 0; x < ((ws.gpr_alloc.sgpr_size + 1) << shift); x += 4) printf(">SGPRS[%u..%u] = { %08lx, %08lx, %08lx, %08lx }\n", (unsigned)(x), @@ -102,6 +102,19 @@ void umr_print_waves(struct umr_asic *asic) (unsigned long)sgprs[x+1], (unsigned long)sgprs[x+2], (unsigned long)sgprs[x+3]); + if (ws.wave_status.trap_en && ws.wave_status.priv) { + y = asic->family <= FAMILY_VI ? 12 : 16; + for (x = 0x6C; x < (y + 0x6C); x += 4) { + printf(">SGPRS[%u..%u] = { %08lx, %08lx, %08lx, %08lx }\n", + (unsigned)(x), + (unsigned)(x + 3), + (unsigned long)sgprs[x], + (unsigned long)sgprs[x+1], + (unsigned long)sgprs[x+2], + (unsigned long)sgprs[x+3]); + } + } + } pgm_addr = (((uint64_t)ws.pc_hi << 32) | ws.pc_lo) - (sizeof(opcodes)/2); umr_read_vram(asic, ws.hw_id.vm_id, pgm_addr, sizeof(opcodes), opcodes); @@ -139,11 +152,12 @@ void umr_print_waves(struct umr_asic *asic) PP(wave_status, valid); PP(wave_status, spi_prio); PP(wave_status, wave_prio); + PP(wave_status, priv); PP(wave_status, trap_en); + PP(wave_status, trap); PP(wave_status, ttrace_en); PP(wave_status, export_rdy); PP(wave_status, in_barrier); - PP(wave_status, trap); PP(wave_status, ecc_err); PP(wave_status, skip_export); PP(wave_status, perf_en); @@ -183,6 +197,19 @@ void umr_print_waves(struct umr_asic *asic) (unsigned long)sgprs[x+1], (unsigned long)sgprs[x+2], (unsigned long)sgprs[x+3]); + + if (ws.wave_status.trap_en && ws.wave_status.priv) { + y = asic->family <= FAMILY_VI ? 12 : 16; + for (x = 0x6C; x < (y + 0x6C); x += 4) { + printf("\t[%4u..%4u] = { %08lx, %08lx, %08lx, %08lx }\n", + (unsigned)(x), + (unsigned)(x + 3), + (unsigned long)sgprs[x], + (unsigned long)sgprs[x+1], + (unsigned long)sgprs[x+2], + (unsigned long)sgprs[x+3]); + } + } } diff --git a/src/lib/read_gpr.c b/src/lib/read_gpr.c index 4d9cdd72b04c..7384f92beda5 100644 --- a/src/lib/read_gpr.c +++ b/src/lib/read_gpr.c @@ -54,6 +54,7 @@ static void wave_read_regs_via_mmio(struct umr_asic *asic, uint32_t simd, int umr_read_sgprs(struct umr_asic *asic, struct umr_wave_status *ws, uint32_t *dst) { uint64_t addr, shift; + int r; if (asic->family <= FAMILY_CIK) shift = 3; // on SI..CIK allocations were done in 8-dword blocks @@ -72,11 +73,24 @@ int umr_read_sgprs(struct umr_asic *asic, struct umr_wave_status *ws, uint32_t * (0ULL << 52); // thread_id lseek(asic->fd.gpr, addr, SEEK_SET); - return read(asic->fd.gpr, dst, 4 * ((ws->gpr_alloc.sgpr_size + 1) << shift)); + r = read(asic->fd.gpr, dst, 4 * ((ws->gpr_alloc.sgpr_size + 1) << shift)); + if (r < 0) + return r; + + // read trap if any + if (ws->wave_status.trap_en && ws->wave_status.priv) { + addr += 0x6C; + lseek(asic->fd.gpr, addr, SEEK_SET); + r = read(asic->fd.gpr, &dst[0x6C], 4 * (asic->family <= FAMILY_VI ? 12 : 16)); + } + return r; } else { umr_grbm_select_index(asic, ws->hw_id.se_id, ws->hw_id.sh_id, ws->hw_id.cu_id); wave_read_regs_via_mmio(asic, ws->hw_id.simd_id, ws->hw_id.wave_id, 0, 0x200, (ws->gpr_alloc.sgpr_size + 1) << shift, dst); + if (ws->wave_status.trap_en && ws->wave_status.priv) + wave_read_regs_via_mmio(asic, ws->hw_id.simd_id, ws->hw_id.wave_id, 0, 0x26C, + asic->family <= FAMILY_VI ? 12 : 16, &dst[0x6C]); umr_grbm_select_index(asic, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF); return 0; } diff --git a/src/lib/wave_status.c b/src/lib/wave_status.c index 3f4d33b66c4a..667fa8d6a9d0 100644 --- a/src/lib/wave_status.c +++ b/src/lib/wave_status.c @@ -129,6 +129,7 @@ static int umr_get_wave_status_vi(struct umr_asic *asic, unsigned se, unsigned s x = 1; ws->wave_status.value = value = buf[x++]; ws->wave_status.scc = (value & 1); + ws->wave_status.priv = (value >> 5) & 1; ws->wave_status.execz = (value >> 9) & 1; ws->wave_status.vccz = (value >> 10) & 1; ws->wave_status.in_tg = (value >> 11) & 1; diff --git a/src/umr.h b/src/umr.h index 7a214bfb565e..309b5e33b9a1 100644 --- a/src/umr.h +++ b/src/umr.h @@ -271,6 +271,7 @@ struct umr_wave_status { struct { uint32_t value, + priv, scc, execz, vccz, -- 2.14.3