diff options
author | Nicolai Hähnle <[email protected]> | 2017-09-09 17:36:07 +0200 |
---|---|---|
committer | Nicolai Hähnle <[email protected]> | 2017-09-13 18:24:18 +0200 |
commit | 7e4344151f7c5ddcc04d6f58d236f3bab6493cdf (patch) | |
tree | d395606ef863a9c4367ea150f9d5b489e864e179 /src | |
parent | 81f398dcb1ae10c9adf891df8218bba23bb62898 (diff) |
radeonsi: fix segfault in descriptor dumping
Reviewed-by: Marek Olšák <[email protected]>
Diffstat (limited to 'src')
-rw-r--r-- | src/gallium/drivers/radeonsi/si_debug.c | 18 |
1 files changed, 18 insertions, 0 deletions
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 @@ -666,6 +666,24 @@ static void si_dump_descriptor_list(struct si_screen *screen, 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); |