linux-arm-kernel.lists.infradead.org archive mirror
 help / color / mirror / Atom feed
From: dave.martin@linaro.org (Dave Martin)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH v4 0/5] ARM: omap[34]: Thumb-2 compatibility fixes
Date: Mon, 14 Feb 2011 15:37:26 +0000	[thread overview]
Message-ID: <20110214153726.GA20144@arm.com> (raw)
In-Reply-To: <alpine.LFD.2.00.1102140950580.14920@xanadu.home>

On Mon, Feb 14, 2011 at 10:00:23AM -0500, Nicolas Pitre wrote:
> On Mon, 14 Feb 2011, Dave Martin wrote:
> 
> > @@ -289,8 +297,20 @@ clean_l2:
> >  	 *  - should be faster and will change with kernel
> >  	 *  - 'might' have to copy address, load and jump to it
> >  	 */
> > +#ifdef CONFIG_THUMB2_KERNEL
> > +	/* kernel is non-interworking : must do this from Thumb */
> > +	adr	r1, . + 1
> > +	bx	r1
> > +	.thumb
> > +#endif
> >  	ldr	r1, kernel_flush
> 
> Didn't you mean this instead:
> 
> 	/* kernel is non-interworking : must do this from Thumb */
> 	adr	r1, 1f + 1
> 	bx	r1
> 	.thumb
> 1:	ldr	r1, kernel_flush
> 	...

Note that this is intended as an experimental hack, not a real patch
(apologies if I didn't make that clear...)

Well, actually I meant "add r1, pc, #1" ... which means I was too
busy trying to be clever... oops!

That is of course exactly equivalent to your code...

> 
> ?
> 
> >  	blx	r1
> > +#ifdef CONFIG_THUMB2_KERNEL
> > +	.align
> > +	bx	pc
> > +	nop
> > +	.arm
> 
> Also here, the .align has the potential to introduce a zero halfword in 
> the instruction stream before the bx.  What about:
> 
> 	adr	r3, 1f
> 	bx	r3
> 	.align
> 	.arm
> 1:	...

.align inserts a 16-bit nop when misaligned in Thumb in a text section,
and a word-aligned bx pc is a specific architecturally allowed way
to do an inline switch to ARM.  The linker uses this trick for PLT
veneers etc.

A nicer fix for doing this sort of call from low-level code which
might be ARM is to convert arch/arm/mm/*-v7.S to use "bx lr" to return.

Generally, we can do this for all arches >= v5, without any
incompatibility.  However, since the need for it will be rare and it
will generate patch noise for not much real benefit,
I haven't proposed this.

Updated patch below.

Cheers
---Dave

diff --git a/arch/arm/mach-omap2/sleep34xx.S b/arch/arm/mach-omap2/sleep34xx.S
index a204c78..6ae8a92 100644
--- a/arch/arm/mach-omap2/sleep34xx.S
+++ b/arch/arm/mach-omap2/sleep34xx.S
@@ -32,6 +32,14 @@
 #include "sdrc.h"
 #include "control.h"
 
+#undef ARM
+#undef THUMB
+#undef BSYM
+#define ARM(x...) x
+#define THUMB(x...)
+#define BSYM(x) (x)
+	.arm
+
 /*
  * Registers access definitions
  */
@@ -289,8 +297,20 @@ clean_l2:
 	 *  - should be faster and will change with kernel
 	 *  - 'might' have to copy address, load and jump to it
 	 */
-	ldr	r1, kernel_flush
+#ifdef CONFIG_THUMB2_KERNEL
+	/* kernel is non-interworking : must do this from Thumb */
+	adr	r1, 1f + 1
+	bx	r1
+	.thumb
+#endif
+1:	ldr	r1, kernel_flush
 	blx	r1
+#ifdef CONFIG_THUMB2_KERNEL
+	.align
+	bx	pc
+	nop
+	.arm
+#endif
 
 omap3_do_wfi:
 	ldr	r4, sdrc_power		@ read the SDRC_POWER register
diff --git a/arch/arm/mach-omap2/sram34xx.S b/arch/arm/mach-omap2/sram34xx.S
index 829d235..64faab8 100644
--- a/arch/arm/mach-omap2/sram34xx.S
+++ b/arch/arm/mach-omap2/sram34xx.S
@@ -34,6 +34,14 @@
 #include "sdrc.h"
 #include "cm2xxx_3xxx.h"
 
+#undef ARM
+#undef THUMB
+#undef BSYM
+#define ARM(x...) x
+#define THUMB(x...)
+#define BSYM(x) (x)
+	.arm
+
 	.text
 
 /* r1 parameters */
-- 
1.7.1

  reply	other threads:[~2011-02-14 15:37 UTC|newest]

Thread overview: 15+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-02-09 15:01 [PATCH v4 0/5] ARM: omap[34]: Thumb-2 compatibility fixes Dave Martin
2011-02-09 15:01 ` [PATCH v4 1/5] ARM: omap4: Provide do_wfi() for Thumb-2 Dave Martin
2011-02-09 16:19   ` Nicolas Pitre
2011-02-09 15:01 ` [PATCH v4 2/5] ARM: omap4: Convert END() to ENDPROC() for correct linkage with CONFIG_THUMB2_KERNEL Dave Martin
2011-02-09 15:01 ` [PATCH v4 3/5] ARM: omap3: Remove hand-encoded SMC instructions Dave Martin
2011-02-09 15:01 ` [PATCH v4 4/5] ARM: omap3: Thumb-2 compatibility for sram34xx.S Dave Martin
2011-02-09 15:01 ` [PATCH v4 5/5] ARM: omap3: Thumb-2 compatibility for sleep34xx.S Dave Martin
2011-02-11 23:31 ` [PATCH v4 0/5] ARM: omap[34]: Thumb-2 compatibility fixes Kevin Hilman
2011-02-14 13:17   ` Dave Martin
2011-02-14 15:00     ` Nicolas Pitre
2011-02-14 15:37       ` Dave Martin [this message]
2011-02-14 20:10         ` Nicolas Pitre
2011-02-14 23:15         ` Kevin Hilman
2011-02-15 10:45           ` Dave Martin
2011-02-15 16:15             ` Kevin Hilman

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20110214153726.GA20144@arm.com \
    --to=dave.martin@linaro.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).