All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2] ARM: teach __asmeq that r11 == fp and r12 == ip
@ 2015-01-29  9:44 Ard Biesheuvel
  2015-01-29 11:48 ` Russell King - ARM Linux
                   ` (2 more replies)
  0 siblings, 3 replies; 6+ messages in thread
From: Ard Biesheuvel @ 2015-01-29  9:44 UTC (permalink / raw)
  To: linux-arm-kernel

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 'fp' is often referred to as 'r11' and 'ip' is often referred to as
'r12', (e.g., by clang), causing false negatives.

Fix this by making __asmeq consider the ("fp","r11"), ("r11","fp"),
("ip","r12") and ("r12","ip") cases specifically.

Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
---
v2:
Added r11 but not r10, as the latter is only referred to as 'sl' in
objdump output, but GCC emitted inline asm substitutes the references
with 'r10' instead. sp/lr/pc are unambiguous between GCC and clang.

Primary purpose of this patch is to fix the incompatibility between clang
and GCC, but the side effect is that it relaxes the requirement imposed on
the programmer to refer to a register by the same name as the compiler does.
If that is seen as a substantial upside by some, we could indeed still decide
to add r10, r13, r14 and r15 (for which no such incompatibility exists) as well.
However, those are not currently used in __asmeq invocations anywhere under
arch/arm

 arch/arm/include/asm/compiler.h | 15 ++++++++++++++-
 1 file changed, 14 insertions(+), 1 deletion(-)

diff --git a/arch/arm/include/asm/compiler.h b/arch/arm/include/asm/compiler.h
index 8155db2f7fa1..29fe85e59439 100644
--- a/arch/arm/include/asm/compiler.h
+++ b/arch/arm/include/asm/compiler.h
@@ -8,8 +8,21 @@
  * 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 specifically take the equivalence
+ * of 'r11' <-> 'fp' and 'r12' <-> '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 ",fpr11; " 		\
+	    ".ifnc " x y ",r11fp; "		\
+	      ".ifnc " x y ",ipr12; " 		\
+	        ".ifnc " x y ",r12ip; "		\
+	          ".err; "			\
+	        ".endif; "			\
+	      ".endif; "			\
+	    ".endif; "				\
+	  ".endif; "				\
+	".endif\n\t"
 
 
 #endif /* __ASM_ARM_COMPILER_H */
-- 
1.8.3.2

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH v2] ARM: teach __asmeq that r11 == fp and r12 == ip
  2015-01-29  9:44 [PATCH v2] ARM: teach __asmeq that r11 == fp and r12 == ip Ard Biesheuvel
@ 2015-01-29 11:48 ` Russell King - ARM Linux
  2015-01-30  7:21   ` Ard Biesheuvel
  2015-01-29 12:44 ` Alex Elder
  2015-01-29 16:49 ` Nicolas Pitre
  2 siblings, 1 reply; 6+ messages in thread
From: Russell King - ARM Linux @ 2015-01-29 11:48 UTC (permalink / raw)
  To: linux-arm-kernel

On Thu, Jan 29, 2015 at 09:44:46AM +0000, 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 'fp' is often referred to as 'r11' and 'ip' is often referred to as
> 'r12', (e.g., by clang), causing false negatives.
> 
> Fix this by making __asmeq consider the ("fp","r11"), ("r11","fp"),
> ("ip","r12") and ("r12","ip") cases specifically.
> 
> Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>

The method adopted is rather horrid in itself, but I guess there's no
other way to deal with this... so I'm okay with the patch.  (I won't
say I'm happy with it!)

-- 
FTTC broadband for 0.8mile line: currently at 10.5Mbps down 400kbps up
according to speedtest.net.

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH v2] ARM: teach __asmeq that r11 == fp and r12 == ip
  2015-01-29  9:44 [PATCH v2] ARM: teach __asmeq that r11 == fp and r12 == ip Ard Biesheuvel
  2015-01-29 11:48 ` Russell King - ARM Linux
@ 2015-01-29 12:44 ` Alex Elder
  2015-01-29 16:49 ` Nicolas Pitre
  2 siblings, 0 replies; 6+ messages in thread
From: Alex Elder @ 2015-01-29 12:44 UTC (permalink / raw)
  To: linux-arm-kernel

On 01/29/2015 03:44 AM, 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 'fp' is often referred to as 'r11' and 'ip' is often referred to as
> 'r12', (e.g., by clang), causing false negatives.
> 
> Fix this by making __asmeq consider the ("fp","r11"), ("r11","fp"),
> ("ip","r12") and ("r12","ip") cases specifically.
> 
> Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>

I'm satisfied.  Kind of awkward, but it does what's needed,
and solves the general problem rather than a specific instance
of it in "bcm_kona_smc.c".

I tested it in my environment with "r12" and "ip" used in
all combinations and can confirm they all work as desired.

Thanks for doing this Ard.

Reviewed-by: Alex Elder <elder@linaro.org>

> ---
> v2:
> Added r11 but not r10, as the latter is only referred to as 'sl' in
> objdump output, but GCC emitted inline asm substitutes the references
> with 'r10' instead. sp/lr/pc are unambiguous between GCC and clang.
> 
> Primary purpose of this patch is to fix the incompatibility between clang
> and GCC, but the side effect is that it relaxes the requirement imposed on
> the programmer to refer to a register by the same name as the compiler does.
> If that is seen as a substantial upside by some, we could indeed still decide
> to add r10, r13, r14 and r15 (for which no such incompatibility exists) as well.
> However, those are not currently used in __asmeq invocations anywhere under
> arch/arm
> 
>  arch/arm/include/asm/compiler.h | 15 ++++++++++++++-
>  1 file changed, 14 insertions(+), 1 deletion(-)
> 
> diff --git a/arch/arm/include/asm/compiler.h b/arch/arm/include/asm/compiler.h
> index 8155db2f7fa1..29fe85e59439 100644
> --- a/arch/arm/include/asm/compiler.h
> +++ b/arch/arm/include/asm/compiler.h
> @@ -8,8 +8,21 @@
>   * 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 specifically take the equivalence
> + * of 'r11' <-> 'fp' and 'r12' <-> '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 ",fpr11; " 		\
> +	    ".ifnc " x y ",r11fp; "		\
> +	      ".ifnc " x y ",ipr12; " 		\
> +	        ".ifnc " x y ",r12ip; "		\
> +	          ".err; "			\
> +	        ".endif; "			\
> +	      ".endif; "			\
> +	    ".endif; "				\
> +	  ".endif; "				\
> +	".endif\n\t"
>  
>  
>  #endif /* __ASM_ARM_COMPILER_H */
> 

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH v2] ARM: teach __asmeq that r11 == fp and r12 == ip
  2015-01-29  9:44 [PATCH v2] ARM: teach __asmeq that r11 == fp and r12 == ip Ard Biesheuvel
  2015-01-29 11:48 ` Russell King - ARM Linux
  2015-01-29 12:44 ` Alex Elder
@ 2015-01-29 16:49 ` Nicolas Pitre
  2 siblings, 0 replies; 6+ messages in thread
From: Nicolas Pitre @ 2015-01-29 16:49 UTC (permalink / raw)
  To: linux-arm-kernel

On Thu, 29 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 'fp' is often referred to as 'r11' and 'ip' is often referred to as
> 'r12', (e.g., by clang), causing false negatives.
> 
> Fix this by making __asmeq consider the ("fp","r11"), ("r11","fp"),
> ("ip","r12") and ("r12","ip") cases specifically.
> 
> Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
> ---
> v2:
> Added r11 but not r10, as the latter is only referred to as 'sl' in
> objdump output, but GCC emitted inline asm substitutes the references
> with 'r10' instead. sp/lr/pc are unambiguous between GCC and clang.
> 
> Primary purpose of this patch is to fix the incompatibility between clang
> and GCC, but the side effect is that it relaxes the requirement imposed on
> the programmer to refer to a register by the same name as the compiler does.
> If that is seen as a substantial upside by some, we could indeed still decide
> to add r10, r13, r14 and r15 (for which no such incompatibility exists) as well.
> However, those are not currently used in __asmeq invocations anywhere under
> arch/arm
> 
>  arch/arm/include/asm/compiler.h | 15 ++++++++++++++-
>  1 file changed, 14 insertions(+), 1 deletion(-)
> 
> diff --git a/arch/arm/include/asm/compiler.h b/arch/arm/include/asm/compiler.h
> index 8155db2f7fa1..29fe85e59439 100644
> --- a/arch/arm/include/asm/compiler.h
> +++ b/arch/arm/include/asm/compiler.h
> @@ -8,8 +8,21 @@
>   * 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 specifically take the equivalence
> + * of 'r11' <-> 'fp' and 'r12' <-> '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 ",fpr11; " 		\
> +	    ".ifnc " x y ",r11fp; "		\
> +	      ".ifnc " x y ",ipr12; " 		\
> +	        ".ifnc " x y ",r12ip; "		\
> +	          ".err; "			\
> +	        ".endif; "			\
> +	      ".endif; "			\
> +	    ".endif; "				\
> +	  ".endif; "				\
> +	".endif\n\t"

I share RMK's yuck reaction, but for lack of a better idea:

Acked-by: Nicolas Pitre <nico@linaro.org>



Nicolas

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH v2] ARM: teach __asmeq that r11 == fp and r12 == ip
  2015-01-29 11:48 ` Russell King - ARM Linux
@ 2015-01-30  7:21   ` Ard Biesheuvel
  2015-01-30 10:18     ` Russell King - ARM Linux
  0 siblings, 1 reply; 6+ messages in thread
From: Ard Biesheuvel @ 2015-01-30  7:21 UTC (permalink / raw)
  To: linux-arm-kernel

On 29 January 2015 at 11:48, Russell King - ARM Linux
<linux@arm.linux.org.uk> wrote:
> On Thu, Jan 29, 2015 at 09:44:46AM +0000, 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 'fp' is often referred to as 'r11' and 'ip' is often referred to as
>> 'r12', (e.g., by clang), causing false negatives.
>>
>> Fix this by making __asmeq consider the ("fp","r11"), ("r11","fp"),
>> ("ip","r12") and ("r12","ip") cases specifically.
>>
>> Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
>
> The method adopted is rather horrid in itself, but I guess there's no
> other way to deal with this... so I'm okay with the patch.  (I won't
> say I'm happy with it!)
>

How about we retain the old version unless __clang__ is defined?

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH v2] ARM: teach __asmeq that r11 == fp and r12 == ip
  2015-01-30  7:21   ` Ard Biesheuvel
@ 2015-01-30 10:18     ` Russell King - ARM Linux
  0 siblings, 0 replies; 6+ messages in thread
From: Russell King - ARM Linux @ 2015-01-30 10:18 UTC (permalink / raw)
  To: linux-arm-kernel

On Fri, Jan 30, 2015 at 07:21:18AM +0000, Ard Biesheuvel wrote:
> On 29 January 2015 at 11:48, Russell King - ARM Linux
> <linux@arm.linux.org.uk> wrote:
> > On Thu, Jan 29, 2015 at 09:44:46AM +0000, 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 'fp' is often referred to as 'r11' and 'ip' is often referred to as
> >> 'r12', (e.g., by clang), causing false negatives.
> >>
> >> Fix this by making __asmeq consider the ("fp","r11"), ("r11","fp"),
> >> ("ip","r12") and ("r12","ip") cases specifically.
> >>
> >> Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
> >
> > The method adopted is rather horrid in itself, but I guess there's no
> > other way to deal with this... so I'm okay with the patch.  (I won't
> > say I'm happy with it!)
> >
> 
> How about we retain the old version unless __clang__ is defined?

I don't see much point - that only adds to the complexity with a
#ifdef.  The register names are equivalent in any compiler.

It's better that we avoid #ifdefs so we get better build coverage.

-- 
FTTC broadband for 0.8mile line: currently at 10.5Mbps down 400kbps up
according to speedtest.net.

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2015-01-30 10:18 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-01-29  9:44 [PATCH v2] ARM: teach __asmeq that r11 == fp and r12 == ip Ard Biesheuvel
2015-01-29 11:48 ` Russell King - ARM Linux
2015-01-30  7:21   ` Ard Biesheuvel
2015-01-30 10:18     ` Russell King - ARM Linux
2015-01-29 12:44 ` Alex Elder
2015-01-29 16:49 ` Nicolas Pitre

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.