[PATCH v3] ARM: zImage: add support for ARMv7-M
Joachim Eastwood
manabian at gmail.com
Tue Sep 23 13:42:57 PDT 2014
On 23 September 2014 21:32, Uwe Kleine-König
<u.kleine-koenig at pengutronix.de> wrote:
> Hello Joachim,
>
> On Tue, Sep 23, 2014 at 07:49:25PM +0200, Joachim Eastwood wrote:
>> This patch makes it possible to enter zImage in Thumb mode for ARMv7M
>> (Cortex-M) CPUs that does not support ARM mode. The kernel entry is
>> also made in Thumb mode.
>>
>> Signed-off-by: Joachim Eastwood <manabian at gmail.com>
>> ---
>> Hi,
>>
>> Updated patch per comments from Catalin Marinas.
>>
>> Changes
>> v3: Use defines for ARMv7M CPU registers.
>> v2: Introduce AR_CLASS/M_CLASS macros. This reduces the amount
>> of ifdefs needed in compressed/head.S.
>>
>> Successfully tested on NXP LPC4357 (Cortex-M4).
>>
>> arch/arm/boot/compressed/head.S | 19 +++++++++++++++----
>> arch/arm/include/asm/unified.h | 8 ++++++++
>> 2 files changed, 23 insertions(+), 4 deletions(-)
>>
>> diff --git a/arch/arm/boot/compressed/head.S b/arch/arm/boot/compressed/head.S
>> index 413fd94b5301..cd27090625fe 100644
>> --- a/arch/arm/boot/compressed/head.S
>> +++ b/arch/arm/boot/compressed/head.S
>> @@ -10,8 +10,11 @@
>> */
>> #include <linux/linkage.h>
>> #include <asm/assembler.h>
>> +#include <asm/v7m.h>
>> +
>> + AR_CLASS( .arch armv7-a )
>> + M_CLASS( .arch armv7-m )
>>
>> - .arch armv7-a
>> /*
>> * Debugging stuff
>> *
>> @@ -114,7 +117,7 @@
>> * sort out different calling conventions
>> */
>> .align
>> - .arm @ Always enter in ARM state
>> + AR_CLASS( .arm ) @ Always enter in ARM state for A/R classes
> Semantically we don't want .arm when CPU_THUMBONLY is enabled. At least
> currently this is equivalent with !AR_CLASS. Maybe this is worth to be
> pointed out in a comment?
Won't THUMBONLY always mean !AR_CLASS?
Do you have a particular comment in mind?
>> start:
>> .type start,#function
>> .rept 7
>> @@ -133,6 +136,7 @@ start:
>> THUMB( .thumb )
>> 1:
>> ARM_BE8( setend be ) @ go BE8 if compiled for BE8
>> +#ifndef CONFIG_CPU_V7M
>> mrs r9, cpsr
>> #ifdef CONFIG_ARM_VIRT_EXT
>> bl __hyp_stub_install @ get into SVC mode, reversibly
> I think you need to be more precious here. The following is #ifdef'd
> out:
> #endif
> mov r7, r1 @ save architecture ID
> mov r8, r2 @ save atags pointer
>
> /*
> * Booting from Angel - need to enter SVC mode and disable
> * FIQs/IRQs (numeric definitions from angel arm.h source).
> * We only do this if we were in user mode on entry.
> */
> mrs r2, cpsr @ get current mode
> tst r2, #3 @ not user?
> bne not_angel
> mov r0, #0x17 @ angel_SWIreason_EnterSVC
> ARM( swi 0x123456 ) @ angel_SWI_ARM
> THUMB( svc 0xab ) @ angel_SWI_THUMB
> not_angel:
>> @@ -155,6 +159,7 @@ not_angel:
>> safe_svcmode_maskall r0
>> msr spsr_cxsf, r9 @ Save the CPU boot mode in
>> @ SPSR
>> +#endif
>
> At least saving r1 and r2 should be preserved, shouldn't it? I wonder
> how this could result in a working kernel because r7 and r8 are passed
> to Image which are not initialized with your patch.
Yes, r1 and r2 should be preserved. I have a workaround for the
bootloader in my kernel tree which might explain why it still
worked...
I'll send an updated patch tomorrow.
Thanks for looking.
regards
Joachim Eastwood
More information about the linux-arm-kernel
mailing list