[Mesa-dev] [PATCH] rtasm: deal with size overflows by casting to ptrdiff_t
Brian Paul
brianp at vmware.com
Wed Jan 22 09:03:22 PST 2014
On 01/21/2014 06:37 PM, Ilia Mirkin wrote:
> This was discovered as a result of the draw-elements-base-vertex-neg
> piglit test, which passes very negative offsets in, followed up by large
> indices. The nouveau code correctly adjusts the pointer, but the
> transfer code needs to do the proper inverse correction. Similarly fix
> up the SSE code to do a 64-bit multiply to compute the proper offset.
>
> Signed-off-by: Ilia Mirkin <imirkin at alum.mit.edu>
> ---
>
> With this change, nouveau passes for the draw-elements-base-vertex-neg piglit
> test with user_varrays, on a 64-bit setup both with and without
> GALLIUM_NOSSE=1. I'm pretty sure that the change should be minimal to a
> non-x86 setup since the rexw will be a no-op. I guess there will be an extra
> register use for the mov, but it shouldn't be too expensive, esp on anything
> remotely current.
>
> src/gallium/auxiliary/translate/translate_generic.c | 2 +-
> src/gallium/auxiliary/translate/translate_sse.c | 8 ++++++--
> 2 files changed, 7 insertions(+), 3 deletions(-)
>
> diff --git a/src/gallium/auxiliary/translate/translate_generic.c b/src/gallium/auxiliary/translate/translate_generic.c
> index 5bf97db..5ffce32 100644
> --- a/src/gallium/auxiliary/translate/translate_generic.c
> +++ b/src/gallium/auxiliary/translate/translate_generic.c
> @@ -638,7 +638,7 @@ static ALWAYS_INLINE void PIPE_CDECL generic_run_one( struct translate_generic *
> }
>
> src = tg->attrib[attr].input_ptr +
> - tg->attrib[attr].input_stride * index;
> + (ptrdiff_t)tg->attrib[attr].input_stride * index;
>
> copy_size = tg->attrib[attr].copy_size;
> if(likely(copy_size >= 0))
> diff --git a/src/gallium/auxiliary/translate/translate_sse.c b/src/gallium/auxiliary/translate/translate_sse.c
> index a78ea91..a72454a 100644
> --- a/src/gallium/auxiliary/translate/translate_sse.c
> +++ b/src/gallium/auxiliary/translate/translate_sse.c
> @@ -1121,7 +1121,9 @@ static boolean init_inputs( struct translate_sse *p,
> x86_cmovcc(p->func, tmp_EAX, buf_max_index, cc_AE);
> }
>
> - x86_imul(p->func, tmp_EAX, buf_stride);
> + x86_mov(p->func, p->tmp2_EDX, buf_stride);
> + x64_rexw(p->func);
> + x86_imul(p->func, tmp_EAX, p->tmp2_EDX);
> x64_rexw(p->func);
> x86_add(p->func, tmp_EAX, buf_base_ptr);
>
> @@ -1207,7 +1209,9 @@ static struct x86_reg get_buffer_ptr( struct translate_sse *p,
> x86_cmp(p->func, ptr, buf_max_index);
> x86_cmovcc(p->func, ptr, buf_max_index, cc_AE);
>
> - x86_imul(p->func, ptr, buf_stride);
> + x86_mov(p->func, p->tmp2_EDX, buf_stride);
> + x64_rexw(p->func);
> + x86_imul(p->func, ptr, p->tmp2_EDX);
> x64_rexw(p->func);
> x86_add(p->func, ptr, buf_base_ptr);
> return ptr;
>
I'm no x86 expert, but this looks OK to me, and if it works for you...
Reviewed-by: Brian Paul <brianp at vmware.com>
Should this go into the 10.0.x branch too?
More information about the mesa-dev
mailing list