From 01d8a6e03a4c1055e5c0ef6d5b6cfdadce545007 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Fr=C3=A9d=C3=A9ric=20Recoules?= Date: Wed, 6 May 2020 19:19:21 +0200 Subject: [PATCH] pcm: dmix: assembly: fix the interface for safety MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit - move 'size' and 'old_ebx' in the output section since they are clobbered; - add the "memory" clobber since input pointers are accessed; - (minor) add the "cc" clobber since flags are clobbered. The compiler is missing some dataflow information about the execution of the assembly chunks. For instance, it assumes that 'size' remains unchanged and that no input pointer is accessed. The compiler optimizer may take advantage of these assumption and produce a wrong code. Note: currently produces the same binary output. Signed-off-by: Frédéric Recoules Signed-off-by: Takashi Iwai --- src/pcm/pcm_dmix_i386.h | 45 +++++++++++++++++---------------------- src/pcm/pcm_dmix_x86_64.h | 27 +++++++++++------------ 2 files changed, 32 insertions(+), 40 deletions(-) diff --git a/src/pcm/pcm_dmix_i386.h b/src/pcm/pcm_dmix_i386.h index e816d5e0..3ea0737d 100644 --- a/src/pcm/pcm_dmix_i386.h +++ b/src/pcm/pcm_dmix_i386.h @@ -142,12 +142,11 @@ static void MIX_AREAS_16(unsigned int size, "7:" "\tmovl %[old_ebx], %%ebx\n" /* ebx is GOT pointer (-fPIC) */ - : /* no output regs */ - : [size] "m" (size), - [dst] "m" (dst), [src] "m" (src), [sum] "m" (sum), + : [size] "+m" (size), [old_ebx] "=m" (old_ebx) + : [dst] "m" (dst), [src] "m" (src), [sum] "m" (sum), [dst_step] "m" (dst_step), [src_step] "m" (src_step), - [sum_step] "m" (sum_step), [old_ebx] "m" (old_ebx) - : "esi", "edi", "edx", "ecx", "eax" + [sum_step] "m" (sum_step) + : "esi", "edi", "edx", "ecx", "eax", "memory", "cc" ); } @@ -233,12 +232,11 @@ static void MIX_AREAS_16_MMX(unsigned int size, "5:" "\tmovl %[old_ebx], %%ebx\n" /* ebx is GOT pointer (-fPIC) */ - : /* no output regs */ - : [size] "m" (size), - [dst] "m" (dst), [src] "m" (src), [sum] "m" (sum), + : [size] "+m" (size), [old_ebx] "=m" (old_ebx) + : [dst] "m" (dst), [src] "m" (src), [sum] "m" (sum), [dst_step] "m" (dst_step), [src_step] "m" (src_step), - [sum_step] "m" (sum_step), [old_ebx] "m" (old_ebx) - : "esi", "edi", "edx", "ecx", "eax" + [sum_step] "m" (sum_step) + : "esi", "edi", "edx", "ecx", "eax", "memory", "cc" ); } @@ -347,12 +345,11 @@ static void MIX_AREAS_32(unsigned int size, "6:" "\tmovl %[old_ebx], %%ebx\n" /* ebx is GOT pointer (-fPIC) */ - : /* no output regs */ - : [size] "m" (size), - [dst] "m" (dst), [src] "m" (src), [sum] "m" (sum), + : [size] "+m" (size), [old_ebx] "=m" (old_ebx) + : [dst] "m" (dst), [src] "m" (src), [sum] "m" (sum), [dst_step] "m" (dst_step), [src_step] "m" (src_step), - [sum_step] "m" (sum_step), [old_ebx] "m" (old_ebx) - : "esi", "edi", "edx", "ecx", "eax" + [sum_step] "m" (sum_step) + : "esi", "edi", "edx", "ecx", "eax", "memory", "cc" ); } @@ -454,12 +451,11 @@ static void MIX_AREAS_24(unsigned int size, "6:" "\tmovl %[old_ebx], %%ebx\n" /* ebx is GOT pointer (-fPIC) */ - : /* no output regs */ - : [size] "m" (size), - [dst] "m" (dst), [src] "m" (src), [sum] "m" (sum), + : [size] "+m" (size), [old_ebx] "=m" (old_ebx) + : [dst] "m" (dst), [src] "m" (src), [sum] "m" (sum), [dst_step] "m" (dst_step), [src_step] "m" (src_step), - [sum_step] "m" (sum_step), [old_ebx] "m" (old_ebx) - : "esi", "edi", "edx", "ecx", "eax" + [sum_step] "m" (sum_step) + : "esi", "edi", "edx", "ecx", "eax", "memory", "cc" ); } @@ -554,11 +550,10 @@ static void MIX_AREAS_24_CMOV(unsigned int size, "6:" "\tmovl %[old_ebx], %%ebx\n" /* ebx is GOT pointer (-fPIC) */ - : /* no output regs */ - : [size] "m" (size), - [dst] "m" (dst), [src] "m" (src), [sum] "m" (sum), + : [size] "+m" (size), [old_ebx] "=m" (old_ebx) + : [dst] "m" (dst), [src] "m" (src), [sum] "m" (sum), [dst_step] "m" (dst_step), [src_step] "m" (src_step), - [sum_step] "m" (sum_step), [old_ebx] "m" (old_ebx) - : "esi", "edi", "edx", "ecx", "eax" + [sum_step] "m" (sum_step) + : "esi", "edi", "edx", "ecx", "eax", "memory", "cc" ); } diff --git a/src/pcm/pcm_dmix_x86_64.h b/src/pcm/pcm_dmix_x86_64.h index dc433b35..7f711547 100644 --- a/src/pcm/pcm_dmix_x86_64.h +++ b/src/pcm/pcm_dmix_x86_64.h @@ -114,12 +114,11 @@ static void MIX_AREAS_16(unsigned int size, "\temms\n" "\tmovq %[old_rbx], %%rbx\n" - : /* no output regs */ - : [size] "m" (size), - [dst] "m" (dst), [src] "m" (src), [sum] "m" (sum), + : [size] "+m" (size), [old_rbx] "=m" (old_rbx) + : [dst] "m" (dst), [src] "m" (src), [sum] "m" (sum), [dst_step] "m" (dst_step), [src_step] "m" (src_step), - [sum_step] "m" (sum_step), [old_rbx] "m" (old_rbx) - : "rsi", "rdi", "edx", "ecx", "eax" + [sum_step] "m" (sum_step) + : "rsi", "rdi", "edx", "ecx", "eax", "memory", "cc" ); } @@ -230,12 +229,11 @@ static void MIX_AREAS_32(unsigned int size, "6:" "\tmovq %[old_rbx], %%rbx\n" - : /* no output regs */ - : [size] "m" (size), - [dst] "m" (dst), [src] "m" (src), [sum] "m" (sum), + : [size] "+m" (size), [old_rbx] "=m" (old_rbx) + : [dst] "m" (dst), [src] "m" (src), [sum] "m" (sum), [dst_step] "m" (dst_step), [src_step] "m" (src_step), - [sum_step] "m" (sum_step), [old_rbx] "m" (old_rbx) - : "rsi", "rdi", "edx", "ecx", "eax" + [sum_step] "m" (sum_step) + : "rsi", "rdi", "edx", "ecx", "eax", "memory", "cc" ); } @@ -334,11 +332,10 @@ static void MIX_AREAS_24(unsigned int size, "6:" "\tmovq %[old_rbx], %%rbx\n" - : /* no output regs */ - : [size] "m" (size), - [dst] "m" (dst), [src] "m" (src), [sum] "m" (sum), + : [size] "+m" (size), [old_rbx] "=m" (old_rbx) + : [dst] "m" (dst), [src] "m" (src), [sum] "m" (sum), [dst_step] "m" (dst_step), [src_step] "m" (src_step), - [sum_step] "m" (sum_step), [old_rbx] "m" (old_rbx) - : "rsi", "rdi", "edx", "ecx", "eax" + [sum_step] "m" (sum_step) + : "rsi", "rdi", "edx", "ecx", "eax", "memory", "cc" ); } -- 2.47.1