[Mesa-dev] [PATCH 2/4] radeonsi: fix segfault in descriptor dumping

Nicolai Hähnle nhaehnle at gmail.com
Mon Sep 11 15:06:32 UTC 2017


From: Nicolai Hähnle <nicolai.haehnle at amd.com>

---
 src/gallium/drivers/radeonsi/si_debug.c | 18 ++++++++++++++++++
 1 file changed, 18 insertions(+)

diff --git a/src/gallium/drivers/radeonsi/si_debug.c b/src/gallium/drivers/radeonsi/si_debug.c
index 182574d653b..b092eba6ebd 100644
--- a/src/gallium/drivers/radeonsi/si_debug.c
+++ b/src/gallium/drivers/radeonsi/si_debug.c
@@ -659,20 +659,38 @@ static void si_dump_descriptor_list(struct si_screen *screen,
 				    const char *shader_name,
 				    const char *elem_name,
 				    unsigned element_dw_size,
 				    unsigned num_elements,
 				    slot_remap_func slot_remap,
 				    struct u_log_context *log)
 {
 	if (!desc->list)
 		return;
 
+	/* In some cases, the caller doesn't know how many elements are really
+	 * uploaded. Reduce num_elements to fit in the range of active slots. */
+	unsigned active_range_dw_begin =
+		desc->first_active_slot * desc->element_dw_size;
+	unsigned active_range_dw_end =
+		active_range_dw_begin + desc->num_active_slots * desc->element_dw_size;
+
+	while (num_elements > 0) {
+		int i = slot_remap(num_elements - 1);
+		unsigned dw_begin = i * element_dw_size;
+		unsigned dw_end = dw_begin + element_dw_size;
+
+		if (dw_begin >= active_range_dw_begin && dw_end <= active_range_dw_end)
+			break;
+
+		num_elements--;
+	}
+
 	struct si_log_chunk_desc_list *chunk =
 		CALLOC_VARIANT_LENGTH_STRUCT(si_log_chunk_desc_list,
 					     4 * element_dw_size * num_elements);
 	chunk->shader_name = shader_name;
 	chunk->elem_name = elem_name;
 	chunk->element_dw_size = element_dw_size;
 	chunk->num_elements = num_elements;
 	chunk->slot_remap = slot_remap;
 	chunk->chip_class = screen->b.chip_class;
 
-- 
2.11.0



More information about the mesa-dev mailing list