linux-arm-kernel.lists.infradead.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] fix Thumb-2 decompressor broken by "Auto calculate ZRELADDR"
@ 2010-07-30 19:35 Rabin Vincent
  2010-07-30 20:57 ` Uwe Kleine-König
  0 siblings, 1 reply; 10+ messages in thread
From: Rabin Vincent @ 2010-07-30 19:35 UTC (permalink / raw)
  To: linux-arm-kernel

"ARM: Auto calculate ZRELADDR and provide option for exceptions" broke the
Thumb-2 decompressor because it removed an entry in the LC0 table but didn't
adjust the offset the Thumb-2 code uses to load the SP from that table.

Fix it, and also change the ARM code to use the separate SP-load since
ARM instructions that include the SP in the LDM register list are
deprecated.

Signed-off-by: Rabin Vincent <rabin@rab.in>
---
 arch/arm/boot/compressed/head.S |    4 ++--
 1 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/arch/arm/boot/compressed/head.S b/arch/arm/boot/compressed/head.S
index abf4d65..47924fc 100644
--- a/arch/arm/boot/compressed/head.S
+++ b/arch/arm/boot/compressed/head.S
@@ -170,9 +170,9 @@ not_angel:
 
 		.text
 		adr	r0, LC0
- ARM(		ldmia	r0, {r1, r2, r3, r5, r6, r11, ip, sp})
+ ARM(		ldmia	r0, {r1, r2, r3, r5, r6, r11, ip})
  THUMB(		ldmia	r0, {r1, r2, r3, r5, r6, r11, ip}	)
- THUMB(		ldr	sp, [r0, #32]				)
+		ldr	sp, [r0, #28]
 #ifdef CONFIG_AUTO_ZRELADDR
 		@ determine final kernel image address
 		and	r4, pc, #0xf8000000
-- 
1.7.1

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

* [PATCH] fix Thumb-2 decompressor broken by "Auto calculate ZRELADDR"
  2010-07-30 19:35 [PATCH] fix Thumb-2 decompressor broken by "Auto calculate ZRELADDR" Rabin Vincent
@ 2010-07-30 20:57 ` Uwe Kleine-König
  2010-07-30 23:44   ` Rabin Vincent
  2010-07-31  9:04   ` Russell King - ARM Linux
  0 siblings, 2 replies; 10+ messages in thread
From: Uwe Kleine-König @ 2010-07-30 20:57 UTC (permalink / raw)
  To: linux-arm-kernel

On Sat, Jul 31, 2010 at 01:05:23AM +0530, Rabin Vincent wrote:
> "ARM: Auto calculate ZRELADDR and provide option for exceptions" broke the
> Thumb-2 decompressor because it removed an entry in the LC0 table but didn't
> adjust the offset the Thumb-2 code uses to load the SP from that table.
> 
> Fix it, and also change the ARM code to use the separate SP-load since
> ARM instructions that include the SP in the LDM register list are
> deprecated.
I only found:

	LDM{<cond>}<addressing_mode> <Rn>{!}, <registers>
	...
	If the base register <Rn> is specified in <registers>, and base
	register write-back is specified,
	the final value of <Rn> is UNPREDICTABLE.

Are you really sure about this?  Where do you know it from?
 
Best regards
Uwe

-- 
Pengutronix e.K.                           | Uwe Kleine-K?nig            |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |

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

* [PATCH] fix Thumb-2 decompressor broken by "Auto calculate ZRELADDR"
  2010-07-30 20:57 ` Uwe Kleine-König
@ 2010-07-30 23:44   ` Rabin Vincent
  2010-07-31  9:04   ` Russell King - ARM Linux
  1 sibling, 0 replies; 10+ messages in thread
From: Rabin Vincent @ 2010-07-30 23:44 UTC (permalink / raw)
  To: linux-arm-kernel

2010/7/31 Uwe Kleine-K?nig <u.kleine-koenig@pengutronix.de>:
> On Sat, Jul 31, 2010 at 01:05:23AM +0530, Rabin Vincent wrote:
>> Fix it, and also change the ARM code to use the separate SP-load since
>> ARM instructions that include the SP in the LDM register list are
>> deprecated.
> I only found:
>
> ? ? ? ?LDM{<cond>}<addressing_mode> <Rn>{!}, <registers>
> ? ? ? ?...
> ? ? ? ?If the base register <Rn> is specified in <registers>, and base
> ? ? ? ?register write-back is specified,
> ? ? ? ?the final value of <Rn> is UNPREDICTABLE.
>
> Are you really sure about this? ?Where do you know it from?

This is in section "A8.6.53 LDM / LDMIA / LDMFD" of the
ARM ARM (v7 edition):

  LDM<c><q> <Rn>{!}, <registers>

  <registers> The SP can be in the list in ARM code, but not
  in Thumb code. However, ARM instructions that include the
  SP in the list are deprecated.

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

* [PATCH] fix Thumb-2 decompressor broken by "Auto calculate ZRELADDR"
  2010-07-30 20:57 ` Uwe Kleine-König
  2010-07-30 23:44   ` Rabin Vincent
@ 2010-07-31  9:04   ` Russell King - ARM Linux
  2010-07-31 12:08     ` Uwe Kleine-König
  1 sibling, 1 reply; 10+ messages in thread
From: Russell King - ARM Linux @ 2010-07-31  9:04 UTC (permalink / raw)
  To: linux-arm-kernel

On Fri, Jul 30, 2010 at 10:57:56PM +0200, Uwe Kleine-K?nig wrote:
> On Sat, Jul 31, 2010 at 01:05:23AM +0530, Rabin Vincent wrote:
> > "ARM: Auto calculate ZRELADDR and provide option for exceptions" broke the
> > Thumb-2 decompressor because it removed an entry in the LC0 table but didn't
> > adjust the offset the Thumb-2 code uses to load the SP from that table.
> > 
> > Fix it, and also change the ARM code to use the separate SP-load since
> > ARM instructions that include the SP in the LDM register list are
> > deprecated.
> I only found:
> 
> 	LDM{<cond>}<addressing_mode> <Rn>{!}, <registers>
> 	...
> 	If the base register <Rn> is specified in <registers>, and base
> 	register write-back is specified,
> 	the final value of <Rn> is UNPREDICTABLE.
> 
> Are you really sure about this?  Where do you know it from?

It doesn't matter.  The point is that you deleted an entry from the
table which the ldmia/ldmia+ldr loads from and didn't adjust the
resulting code properly.

- ARM(          ldmia   r0, {r1, r2, r3, r5, r6, r11, ip, sp})
+ ARM(          ldmia   r0, {r1, r2, r3, r5, r6, r11, ip})
  THUMB(                ldmia   r0, {r1, r2, r3, r5, r6, r11, ip}       )
- THUMB(                ldr     sp, [r0, #32]                           )
+               ldr     sp, [r0, #28]

In case you're wondering, it's this part, found in the "Instruction
details" section of "A8.6.53 LDM / LDMIA / LDMFD":

"The SP can be in the list in ARM code, but not in Thumb code. However,
ARM instructions that include the SP in the list are deprecated."

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

* [PATCH] fix Thumb-2 decompressor broken by "Auto calculate ZRELADDR"
  2010-07-31  9:04   ` Russell King - ARM Linux
@ 2010-07-31 12:08     ` Uwe Kleine-König
  2010-07-31 12:31       ` Russell King - ARM Linux
  0 siblings, 1 reply; 10+ messages in thread
From: Uwe Kleine-König @ 2010-07-31 12:08 UTC (permalink / raw)
  To: linux-arm-kernel

On Sat, Jul 31, 2010 at 10:04:45AM +0100, Russell King - ARM Linux wrote:
> On Fri, Jul 30, 2010 at 10:57:56PM +0200, Uwe Kleine-K?nig wrote:
> > On Sat, Jul 31, 2010 at 01:05:23AM +0530, Rabin Vincent wrote:
> > > "ARM: Auto calculate ZRELADDR and provide option for exceptions" broke the
> > > Thumb-2 decompressor because it removed an entry in the LC0 table but didn't
> > > adjust the offset the Thumb-2 code uses to load the SP from that table.
> > > 
> > > Fix it, and also change the ARM code to use the separate SP-load since
> > > ARM instructions that include the SP in the LDM register list are
> > > deprecated.
> > I only found:
> > 
> > 	LDM{<cond>}<addressing_mode> <Rn>{!}, <registers>
> > 	...
> > 	If the base register <Rn> is specified in <registers>, and base
> > 	register write-back is specified,
> > 	the final value of <Rn> is UNPREDICTABLE.
> > 
> > Are you really sure about this?  Where do you know it from?
> 
> It doesn't matter.  The point is that you deleted an entry from the
> table which the ldmia/ldmia+ldr loads from and didn't adjust the
> resulting code properly.
Yes, got that.
> 
> - ARM(          ldmia   r0, {r1, r2, r3, r5, r6, r11, ip, sp})
> + ARM(          ldmia   r0, {r1, r2, r3, r5, r6, r11, ip})
>   THUMB(                ldmia   r0, {r1, r2, r3, r5, r6, r11, ip}       )
> - THUMB(                ldr     sp, [r0, #32]                           )
> +               ldr     sp, [r0, #28]
We can simpify this further to just

	@ Thumb code doesn't allow sp to be in the list, for ARM it's
	@ deprecated, so use a seperate ldr for it.
	ldmia   r0, {r1, r2, r3, r5, r6, r11, ip}
	ldr     sp, [r0, #32]

> In case you're wondering, it's this part, found in the "Instruction
> details" section of "A8.6.53 LDM / LDMIA / LDMFD":
> 
> "The SP can be in the list in ARM code, but not in Thumb code. However,
> ARM instructions that include the SP in the list are deprecated."
OK, I didn't have the v7 ARMARM.

Thanks
Uwe

-- 
Pengutronix e.K.                           | Uwe Kleine-K?nig            |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |

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

* [PATCH] fix Thumb-2 decompressor broken by "Auto calculate ZRELADDR"
  2010-07-31 12:08     ` Uwe Kleine-König
@ 2010-07-31 12:31       ` Russell King - ARM Linux
  2010-07-31 12:50         ` Uwe Kleine-König
  0 siblings, 1 reply; 10+ messages in thread
From: Russell King - ARM Linux @ 2010-07-31 12:31 UTC (permalink / raw)
  To: linux-arm-kernel

On Sat, Jul 31, 2010 at 02:08:27PM +0200, Uwe Kleine-K?nig wrote:
> On Sat, Jul 31, 2010 at 10:04:45AM +0100, Russell King - ARM Linux wrote:
> > It doesn't matter.  The point is that you deleted an entry from the
> > table which the ldmia/ldmia+ldr loads from and didn't adjust the
> > resulting code properly.
> Yes, got that.
> > 
> > - ARM(          ldmia   r0, {r1, r2, r3, r5, r6, r11, ip, sp})
> > + ARM(          ldmia   r0, {r1, r2, r3, r5, r6, r11, ip})
> >   THUMB(                ldmia   r0, {r1, r2, r3, r5, r6, r11, ip}       )
> > - THUMB(                ldr     sp, [r0, #32]                           )
> > +               ldr     sp, [r0, #28]
> We can simpify this further to just
> 
> 	@ Thumb code doesn't allow sp to be in the list, for ARM it's
> 	@ deprecated, so use a seperate ldr for it.
> 	ldmia   r0, {r1, r2, r3, r5, r6, r11, ip}
> 	ldr     sp, [r0, #32]

No, you mean #28.

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

* [PATCH] fix Thumb-2 decompressor broken by "Auto calculate ZRELADDR"
  2010-07-31 12:31       ` Russell King - ARM Linux
@ 2010-07-31 12:50         ` Uwe Kleine-König
  2010-08-03  0:40           ` [PATCHv2] " Rabin Vincent
  0 siblings, 1 reply; 10+ messages in thread
From: Uwe Kleine-König @ 2010-07-31 12:50 UTC (permalink / raw)
  To: linux-arm-kernel

On Sat, Jul 31, 2010 at 01:31:42PM +0100, Russell King - ARM Linux wrote:
> On Sat, Jul 31, 2010 at 02:08:27PM +0200, Uwe Kleine-K?nig wrote:
> > On Sat, Jul 31, 2010 at 10:04:45AM +0100, Russell King - ARM Linux wrote:
> > > It doesn't matter.  The point is that you deleted an entry from the
> > > table which the ldmia/ldmia+ldr loads from and didn't adjust the
> > > resulting code properly.
> > Yes, got that.
> > > 
> > > - ARM(          ldmia   r0, {r1, r2, r3, r5, r6, r11, ip, sp})
> > > + ARM(          ldmia   r0, {r1, r2, r3, r5, r6, r11, ip})
> > >   THUMB(                ldmia   r0, {r1, r2, r3, r5, r6, r11, ip}       )
> > > - THUMB(                ldr     sp, [r0, #32]                           )
> > > +               ldr     sp, [r0, #28]
> > We can simpify this further to just
> > 
> > 	@ Thumb code doesn't allow sp to be in the list, for ARM it's
> > 	@ deprecated, so use a seperate ldr for it.
> > 	ldmia   r0, {r1, r2, r3, r5, r6, r11, ip}
> > 	ldr     sp, [r0, #32]
> 
> No, you mean #28.
oops, yes of course.

Best regards
Uwe

-- 
Pengutronix e.K.                           | Uwe Kleine-K?nig            |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |

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

* [PATCHv2] fix Thumb-2 decompressor broken by "Auto calculate ZRELADDR"
  2010-07-31 12:50         ` Uwe Kleine-König
@ 2010-08-03  0:40           ` Rabin Vincent
  2010-08-03  7:36             ` Uwe Kleine-König
  0 siblings, 1 reply; 10+ messages in thread
From: Rabin Vincent @ 2010-08-03  0:40 UTC (permalink / raw)
  To: linux-arm-kernel

"ARM: Auto calculate ZRELADDR and provide option for exceptions" broke
the Thumb-2 decompressor because it removed an entry in the LC0 table
but didn't adjust the offset the Thumb-2 code uses to load the SP from
that table.

Fix it, and also change the ARM code to use the separate SP-load since
ARM instructions that include the SP in the LDM register list are
deprecated.

Signed-off-by: Rabin Vincent <rabin@rab.in>
---
v2: don't need separate code for ARM and THUMB since they're now
    the same.

 arch/arm/boot/compressed/head.S |    5 ++---
 1 files changed, 2 insertions(+), 3 deletions(-)

diff --git a/arch/arm/boot/compressed/head.S b/arch/arm/boot/compressed/head.S
index abf4d65..6af9907 100644
--- a/arch/arm/boot/compressed/head.S
+++ b/arch/arm/boot/compressed/head.S
@@ -170,9 +170,8 @@ not_angel:
 
 		.text
 		adr	r0, LC0
- ARM(		ldmia	r0, {r1, r2, r3, r5, r6, r11, ip, sp})
- THUMB(		ldmia	r0, {r1, r2, r3, r5, r6, r11, ip}	)
- THUMB(		ldr	sp, [r0, #32]				)
+		ldmia	r0, {r1, r2, r3, r5, r6, r11, ip}
+		ldr	sp, [r0, #28]
 #ifdef CONFIG_AUTO_ZRELADDR
 		@ determine final kernel image address
 		and	r4, pc, #0xf8000000
-- 
1.7.1

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

* [PATCHv2] fix Thumb-2 decompressor broken by "Auto calculate ZRELADDR"
  2010-08-03  0:40           ` [PATCHv2] " Rabin Vincent
@ 2010-08-03  7:36             ` Uwe Kleine-König
  2010-08-03  7:47               ` Eric Miao
  0 siblings, 1 reply; 10+ messages in thread
From: Uwe Kleine-König @ 2010-08-03  7:36 UTC (permalink / raw)
  To: linux-arm-kernel

Hello Rabin,

On Tue, Aug 03, 2010 at 06:10:06AM +0530, Rabin Vincent wrote:
> "ARM: Auto calculate ZRELADDR and provide option for exceptions" broke
> the Thumb-2 decompressor because it removed an entry in the LC0 table
> but didn't adjust the offset the Thumb-2 code uses to load the SP from
> that table.
> 
> Fix it, and also change the ARM code to use the separate SP-load since
> ARM instructions that include the SP in the LDM register list are
> deprecated.
> 
> Signed-off-by: Rabin Vincent <rabin@rab.in>
Acked-and-regretted-by: Uwe Kleine-K?nig <u.kleine-koenig@pengutronix.de>

Thanks
Uwe

> ---
> v2: don't need separate code for ARM and THUMB since they're now
>     the same.
> 
>  arch/arm/boot/compressed/head.S |    5 ++---
>  1 files changed, 2 insertions(+), 3 deletions(-)
> 
> diff --git a/arch/arm/boot/compressed/head.S b/arch/arm/boot/compressed/head.S
> index abf4d65..6af9907 100644
> --- a/arch/arm/boot/compressed/head.S
> +++ b/arch/arm/boot/compressed/head.S
> @@ -170,9 +170,8 @@ not_angel:
>  
>  		.text
>  		adr	r0, LC0
> - ARM(		ldmia	r0, {r1, r2, r3, r5, r6, r11, ip, sp})
> - THUMB(		ldmia	r0, {r1, r2, r3, r5, r6, r11, ip}	)
> - THUMB(		ldr	sp, [r0, #32]				)
> +		ldmia	r0, {r1, r2, r3, r5, r6, r11, ip}
> +		ldr	sp, [r0, #28]
>  #ifdef CONFIG_AUTO_ZRELADDR
>  		@ determine final kernel image address
>  		and	r4, pc, #0xf8000000
> -- 
> 1.7.1
> 
> 

-- 
Pengutronix e.K.                           | Uwe Kleine-K?nig            |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |

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

* [PATCHv2] fix Thumb-2 decompressor broken by "Auto calculate ZRELADDR"
  2010-08-03  7:36             ` Uwe Kleine-König
@ 2010-08-03  7:47               ` Eric Miao
  0 siblings, 0 replies; 10+ messages in thread
From: Eric Miao @ 2010-08-03  7:47 UTC (permalink / raw)
  To: linux-arm-kernel

2010/8/3 Uwe Kleine-K?nig <u.kleine-koenig@pengutronix.de>:
> Hello Rabin,
>
> On Tue, Aug 03, 2010 at 06:10:06AM +0530, Rabin Vincent wrote:
>> "ARM: Auto calculate ZRELADDR and provide option for exceptions" broke
>> the Thumb-2 decompressor because it removed an entry in the LC0 table
>> but didn't adjust the offset the Thumb-2 code uses to load the SP from
>> that table.
>>
>> Fix it, and also change the ARM code to use the separate SP-load since
>> ARM instructions that include the SP in the LDM register list are
>> deprecated.
>>
>> Signed-off-by: Rabin Vincent <rabin@rab.in>
> Acked-and-regretted-by: Uwe Kleine-K?nig <u.kleine-koenig@pengutronix.de>

Nah, I seemed to introduce that so you don't have to feel regret :-)

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

end of thread, other threads:[~2010-08-03  7:47 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-07-30 19:35 [PATCH] fix Thumb-2 decompressor broken by "Auto calculate ZRELADDR" Rabin Vincent
2010-07-30 20:57 ` Uwe Kleine-König
2010-07-30 23:44   ` Rabin Vincent
2010-07-31  9:04   ` Russell King - ARM Linux
2010-07-31 12:08     ` Uwe Kleine-König
2010-07-31 12:31       ` Russell King - ARM Linux
2010-07-31 12:50         ` Uwe Kleine-König
2010-08-03  0:40           ` [PATCHv2] " Rabin Vincent
2010-08-03  7:36             ` Uwe Kleine-König
2010-08-03  7:47               ` Eric Miao

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).