freedreno/crashdec: Find potential fault buffers

Denote if a buffer we know about is covering the fault address (kernel
issue), or if the fault address is within the 2 * size range, indicating
that the buffer is potentially the one the GPU read past the end of.

Signed-off-by: Rob Clark <robdclark@chromium.org>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/27700>
This commit is contained in:
Rob Clark 2024-02-08 08:44:34 -08:00 committed by Marge Bot
parent 32db7a9533
commit bcc5ddcc3b
4 changed files with 583 additions and 536 deletions

View file

@ -16,8 +16,8 @@ ringbuffer:
wptr: 56
size: 32768
bos:
- iova: 0x0000000100000000
size: 4096
- iova: 0x0000000100000000-0x0000000100001000
size: 4096 (0x1000)
registers:
00800005 RBBM_STATUS: { GPU_BUSY_IGN_AHB | CP_BUSY | CP_AHB_BUSY_CX_MASTER }
00000000 RBBM_STATUS1: 0

View file

@ -17,116 +17,116 @@ ringbuffer:
wptr: 83
size: 32768
bos:
- iova: 0x0000000100000000
size: 532480
- iova: 0x0000000100000000-0x0000000100082000
size: 532480 (0x82000)
name:
- iova: 0x0000000100082000
size: 40960
- iova: 0x0000000100082000-0x000000010008c000
size: 40960 (0xa000)
name:
- iova: 0x000000010008c000
size: 32768
- iova: 0x000000010008c000-0x0000000100094000
size: 32768 (0x8000)
name:
- iova: 0x0000000100094000
size: 24576
- iova: 0x0000000100094000-0x000000010009a000
size: 24576 (0x6000)
name:
- iova: 0x000000010009a000
size: 8192
- iova: 0x000000010009a000-0x000000010009c000
size: 8192 (0x2000)
name:
- iova: 0x000000010009c000
size: 40960
- iova: 0x000000010009c000-0x00000001000a6000
size: 40960 (0xa000)
name:
- iova: 0x00000001000a6000
size: 32768
- iova: 0x00000001000a6000-0x00000001000ae000
size: 32768 (0x8000)
name:
- iova: 0x00000001000ae000
size: 24576
- iova: 0x00000001000ae000-0x00000001000b4000
size: 24576 (0x6000)
name:
- iova: 0x00000001000b4000
size: 8192
- iova: 0x00000001000b4000-0x00000001000b6000
size: 8192 (0x2000)
name:
- iova: 0x00000001000b6000
size: 20480
- iova: 0x00000001000b6000-0x00000001000bb000
size: 20480 (0x5000)
name:
- iova: 0x00000001000bb000
size: 16384
- iova: 0x00000001000bb000-0x00000001000bf000
size: 16384 (0x4000)
name:
- iova: 0x00000001000bf000
size: 40960
- iova: 0x00000001000bf000-0x00000001000c9000
size: 40960 (0xa000)
name:
- iova: 0x00000001000c9000
size: 32768
- iova: 0x00000001000c9000-0x00000001000d1000
size: 32768 (0x8000)
name:
- iova: 0x00000001000d1000
size: 20480
- iova: 0x00000001000d1000-0x00000001000d6000
size: 20480 (0x5000)
name:
- iova: 0x00000001000d6000
size: 16384
- iova: 0x00000001000d6000-0x00000001000da000
size: 16384 (0x4000)
name:
- iova: 0x00000001000da000
size: 20480
- iova: 0x00000001000da000-0x00000001000df000
size: 20480 (0x5000)
name:
- iova: 0x00000001000df000
size: 16384
- iova: 0x00000001000df000-0x00000001000e3000
size: 16384 (0x4000)
name:
- iova: 0x00000001000e3000
size: 16384
- iova: 0x00000001000e3000-0x00000001000e7000
size: 16384 (0x4000)
name:
- iova: 0x00000001000e7000
size: 1048576
- iova: 0x00000001000e7000-0x00000001001e7000
size: 1048576 (0x100000)
name:
- iova: 0x00000001001e7000
size: 131072
- iova: 0x00000001001e7000-0x0000000100207000
size: 131072 (0x20000)
name:
- iova: 0x0000000100207000
size: 4096
- iova: 0x0000000100207000-0x0000000100208000
size: 4096 (0x1000)
name:
- iova: 0x0000000100208000
size: 16384
- iova: 0x0000000100208000-0x000000010020c000
size: 16384 (0x4000)
name:
- iova: 0x000000010020c000
size: 8192
- iova: 0x000000010020c000-0x000000010020e000
size: 8192 (0x2000)
name:
- iova: 0x000000010020e000
size: 4096
- iova: 0x000000010020e000-0x000000010020f000
size: 4096 (0x1000)
name:
- iova: 0x000000010020f000
size: 16384
- iova: 0x000000010020f000-0x0000000100213000
size: 16384 (0x4000)
name:
- iova: 0x0000000100213000
size: 8192
- iova: 0x0000000100213000-0x0000000100215000
size: 8192 (0x2000)
name:
- iova: 0x0000000100215000
size: 4096
- iova: 0x0000000100215000-0x0000000100216000
size: 4096 (0x1000)
name:
- iova: 0x0000000100216000
size: 16384
- iova: 0x0000000100216000-0x000000010021a000
size: 16384 (0x4000)
name:
- iova: 0x000000010021a000
size: 8192
- iova: 0x000000010021a000-0x000000010021c000
size: 8192 (0x2000)
name:
- iova: 0x000000010021c000
size: 4096
- iova: 0x000000010021c000-0x000000010021d000
size: 4096 (0x1000)
name:
- iova: 0x000000010021d000
size: 16384
- iova: 0x000000010021d000-0x0000000100221000
size: 16384 (0x4000)
name:
- iova: 0x0000000100221000
size: 8192
- iova: 0x0000000100221000-0x0000000100223000
size: 8192 (0x2000)
name:
- iova: 0x0000000100223000
size: 16384
- iova: 0x0000000100223000-0x0000000100227000
size: 16384 (0x4000)
name:
- iova: 0x0000000100227000
size: 16384
- iova: 0x0000000100227000-0x000000010022b000
size: 16384 (0x4000)
name:
- iova: 0x000000010022b000
size: 8192
- iova: 0x000000010022b000-0x000000010022d000
size: 8192 (0x2000)
name:
- iova: 0x000000010022d000
size: 16384
- iova: 0x000000010022d000-0x0000000100231000
size: 16384 (0x4000)
name:
- iova: 0x0000000100231000
size: 32768
- iova: 0x0000000100231000-0x0000000100239000
size: 32768 (0x8000)
name:
gmu-log:
iova: 0x0000000060009000

File diff suppressed because it is too large Load diff

View file

@ -46,6 +46,9 @@ struct rnn *rnn_gmu;
struct rnn *rnn_control;
struct rnn *rnn_pipe;
static uint64_t fault_iova;
static bool has_fault_iova;
struct cffdec_options options = {
.draw_filter = -1,
};
@ -429,6 +432,24 @@ dump_cmdstream(void)
}
}
/*
* Decode optional 'fault-info' section. We only get this section if
* the devcoredump was triggered by an iova fault:
*/
static void
decode_fault_info(void)
{
foreach_line_in_section (line) {
if (startswith(line, " - far:")) {
parseline(line, " - far: %" PRIx64, &fault_iova);
has_fault_iova = true;
}
printf("%s", line);
}
}
/*
* Decode 'bos' (buffers) section:
*/
@ -442,8 +463,32 @@ decode_bos(void)
foreach_line_in_section (line) {
if (startswith(line, " - iova:")) {
parseline(line, " - iova: %" PRIx64, &iova);
continue;
} else if (startswith(line, " size:")) {
parseline(line, " size: %u", &size);
/*
* This is a bit convoluted, vs just printing the lines as
* they come. But we want to have both the iova and size
* so we can print the end address of the buffer
*/
uint64_t end = iova + size;
printf(" - iova: 0x%016" PRIx64 "-0x%016" PRIx64, iova, end);
if (has_fault_iova) {
if ((iova <= fault_iova) && (fault_iova < end)) {
/* Fault address was within what should be a mapped buffer!! */
printf("\t==");
} else if ((iova <= fault_iova) && (fault_iova < (end + size))) {
/* Fault address was near this mapped buffer */
printf("\t>=");
}
}
printf("\n");
printf(" size: %u (0x%x)\n", size, size);
continue;
} else if (startswith(line, " data: !!ascii85 |")) {
uint32_t *buf = popline_ascii85(size / 4);
@ -797,6 +842,8 @@ decode(void)
} else {
rnn_control = NULL;
}
} else if (startswith(line, "fault-info:")) {
decode_fault_info();
} else if (startswith(line, "bos:")) {
decode_bos();
} else if (startswith(line, "ringbuffer:")) {