pcm: dmix: assembly: fix the interface for safety

- 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 <frederic.recoules@orange.fr>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
Frédéric Recoules 2020-05-06 19:19:21 +02:00 committed by Takashi Iwai
parent b315f21bf7
commit 01d8a6e03a
2 changed files with 32 additions and 40 deletions

View file

@ -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"
);
}