diff --git a/src/freedreno/decode/buffers.c b/src/freedreno/decode/buffers.c index 068a4f1f4f2..85c804f1915 100644 --- a/src/freedreno/decode/buffers.c +++ b/src/freedreno/decode/buffers.c @@ -28,6 +28,7 @@ #include #include +#include #include "util/rb_tree.h" #include "buffers.h" @@ -191,7 +192,20 @@ add_buffer(uint64_t gpuaddr, unsigned int len, void *hostptr) rb_tree_insert(&buffers, &buf->node, buffer_insert_cmp); } - assert(buf->gpuaddr == gpuaddr); + /* We can end up in scenarios where we capture parts of a buffer that + * has been suballocated from twice, once as a dumped buffer and once + * as a cmd.. possibly the kernel should get more clever about this, + * but we need to tolerate it: + */ + if (buf->gpuaddr != gpuaddr) { + assert(gpuaddr > buf->gpuaddr); + assert((gpuaddr + len) <= (buf->gpuaddr + buf->len)); + + void *ptr = ((uint8_t *)buf->hostptr) + (gpuaddr - buf->gpuaddr); + assert(!memcmp(ptr, hostptr, len)); + + return; + } buf->hostptr = hostptr; buf->len = len;