[PATCH] ARM: teach __asmeq that r12 and ip are the same register
Ard Biesheuvel
ard.biesheuvel at linaro.org
Wed Jan 28 14:00:04 PST 2015
On 28 January 2015 at 21:46, Nicolas Pitre <nicolas.pitre at linaro.org> wrote:
> On Wed, 28 Jan 2015, Ard Biesheuvel wrote:
>
>> The __asmeq macro is used inside inline asm statements to ensure that
>> register asm variables that explicitly specify a register are mapped
>> correctly onto those registers when used in inline asm input and output
>> constraints. However, the string based matching fails to take into account
>> that 'ip' may also be referred to as 'r12', (e.g., by clang), causing false
>> negatives.
>>
>> Fix this by making __asmeq consider the ("ip","r12") and ("r12","ip")
>> cases specifically.
>>
>> Signed-off-by: Ard Biesheuvel <ard.biesheuvel at linaro.org>
>
> gcc is likely to do the same substitution with r10 ("sl") and r11
> ("fp"). Might as well add them right away for completeness.
>
I just checked with my 4.8 gcc toolchain: r11 indeed gets emitted as
fp when used in inline asm, but r10 is just r10.
So I should update the patch to include fp as well.
> Then, does clang call sp, lr, pc as r13, r14 and r15? I guess not as
> this is probably against the latest ARM assembly conventions.
>
@Behan, could you answer this one?
>> ---
>> Even though clang shouldn't be susceptible to the same bug, there is still
>> value in retaining these assertions there, so instead of just turning
>> __asmeq into a nop if __clang__ is defined, let's make it work correctly.
>>
>> arch/arm/include/asm/compiler.h | 5 ++++-
>> 1 file changed, 4 insertions(+), 1 deletion(-)
>>
>> diff --git a/arch/arm/include/asm/compiler.h b/arch/arm/include/asm/compiler.h
>> index 8155db2f7fa1..c3a316a59710 100644
>> --- a/arch/arm/include/asm/compiler.h
>> +++ b/arch/arm/include/asm/compiler.h
>> @@ -8,8 +8,11 @@
>> * This string is meant to be concatenated with the inline asm string and
>> * will cause compilation to stop on mismatch.
>> * (for details, see gcc PR 15089)
>> + * For compatibility with clang, we have to explicitly take the equivalence
>> + * of 'r12' and 'ip into account as well.
>> */
>> -#define __asmeq(x, y) ".ifnc " x "," y " ; .err ; .endif\n\t"
>> +#define __asmeq(x, y) ".ifnc " x "," y " ; .ifnc " x y ",ipr12 ; " \
>> + ".ifnc " x y ",r12ip ; .err ; .endif ; .endif ; .endif\n\t"
>>
>>
>> #endif /* __ASM_ARM_COMPILER_H */
>> --
>> 1.8.3.2
>>
>>
More information about the linux-arm-kernel
mailing list