From: cw00.choi@samsung.com (Chanwoo Choi)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH v6] ARM: zImage: add support for ARMv7-M
Date: Wed, 25 Mar 2015 09:13:28 +0900 [thread overview]
Message-ID: <5511FDA8.5060108@samsung.com> (raw)
In-Reply-To: <1418806573-14897-1-git-send-email-u.kleine-koenig@pengutronix.de>
Hi Uwe,
I tested this patch for STM32F429 SoC (Cortex-M4) on STM32F429IDISCOVERY board.
After applied this patch on latest Linux Kernel (v4.0-rc4),
I completed the kernel booting (uImage) with u-boot.
Looks good to me of this patch.
Tested-by: Chanwoo Choi <cw00.choi@samsung.com>
Thanks,
Chanwoo Choi
On 12/17/2014 05:56 PM, Uwe Kleine-K?nig wrote:
> From: Joachim Eastwood <manabian@gmail.com>
>
> This patch makes it possible to enter zImage in Thumb mode for ARMv7-M
> (Cortex-M) CPUs that do not support ARM mode. The kernel entry is also
> made in Thumb mode.
>
> Signed-off-by: Joachim Eastwood <manabian@gmail.com>
> [ukl: fix spelling in commit log, return early in call_cache_fn]
> Signed-off-by: Uwe Kleine-K?nig <u.kleine-koenig@pengutronix.de>
> ---
> Hello,
>
> I just picked up Joachim's patch and fixed the small concerns I had in
> the last round.
>
> I thought about adding a wrapper for accessing the CPUID registers that
> are located in cp15 on v7-A/R and memory mapped on v7-M. The
> corresponding registers and their address are as follows:
>
> name cp15 reg [1] on -A/R address on -M
> MIDR/CPUID CRm=c0, opc2=0 0xe000ed00
> PFR0 CRm=c1, opc2=0 0xe000ed40
> PFR1 CRm=c1, opc2=1 0xe000ed44
> DFR0 CRm=c1, opc2=2 0xe000ed48
> AFR0 CRm=c1, opc2=3 0xe000ed4c
> MMFR0 CRm=c1, opc2=4 0xe000ed50
> MMFR1 CRm=c1, opc2=5 0xe000ed54
> MMFR2 CRm=c1, opc2=6 0xe000ed58
> MMFR3 CRm=c1, opc2=7 0xe000ed5c
> ISAR0 CRm=c2, opc2=0 0xe000ed60
> ISAR1 CRm=c2, opc2=1 0xe000ed64
> ISAR2 CRm=c2, opc2=2 0xe000ed68
> ISAR3 CRm=c2, opc2=3 0xe000ed6c
> ISAR4 CRm=c2, opc2=4 0xe000ed70
> ISAR5 CRm=c2, opc2=5 0xe000ed74
>
> But there is no nice translation and as cache handling is implementation
> defined on v7-M anyhow there is not much use and I decided to just
> return early in the cache function.
>
> This patch is only compile tested as I don't have a machine with enough
> RAM to run a non-XIP kernel, so Tested-by tags are welcome.
>
> Best regards
> Uwe
>
> [1] all have in common: CRn=c0, opc1=0, so only CRm and opc2 are listed
>
> arch/arm/boot/compressed/head.S | 33 +++++++++++++++++++++++++++------
> arch/arm/include/asm/unified.h | 8 ++++++++
> 2 files changed, 35 insertions(+), 6 deletions(-)
>
> diff --git a/arch/arm/boot/compressed/head.S b/arch/arm/boot/compressed/head.S
> index 68be9017593d..3788eedabb15 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,12 @@
> * sort out different calling conventions
> */
> .align
> - .arm @ Always enter in ARM state
> + /*
> + * Always enter in ARM state for CPUs that support the ARM ISA.
> + * As of today (2014) that's exactly the members of the A and R
> + * classes.
> + */
> + AR_CLASS( .arm )
> start:
> .type start,#function
> .rept 7
> @@ -132,14 +140,15 @@ start:
>
> THUMB( .thumb )
> 1:
> - ARM_BE8( setend be ) @ go BE8 if compiled for BE8
> - mrs r9, cpsr
> + ARM_BE8( setend be ) @ go BE8 if compiled for BE8
> + AR_CLASS( mrs r9, cpsr )
> #ifdef CONFIG_ARM_VIRT_EXT
> bl __hyp_stub_install @ get into SVC mode, reversibly
> #endif
> mov r7, r1 @ save architecture ID
> mov r8, r2 @ save atags pointer
>
> +#ifndef CONFIG_CPU_V7M
> /*
> * Booting from Angel - need to enter SVC mode and disable
> * FIQs/IRQs (numeric definitions from angel arm.h source).
> @@ -155,6 +164,7 @@ not_angel:
> safe_svcmode_maskall r0
> msr spsr_cxsf, r9 @ Save the CPU boot mode in
> @ SPSR
> +#endif
> /*
> * Note that some cache flushing and other stuff may
> * be needed here - is there an Angel SWI call for this?
> @@ -789,6 +799,16 @@ __common_mmu_cache_on:
> call_cache_fn: adr r12, proc_types
> #ifdef CONFIG_CPU_CP15
> mrc p15, 0, r9, c0, c0 @ get processor ID
> +#elif defined(CONFIG_CPU_V7M)
> + /*
> + * On v7-M the processor id is located in the V7M_SCB_CPUID
> + * register, but as cache handling is IMPLEMENTATION DEFINED on
> + * v7-M (if existant at all) we just return early here.
> + * If V7M_SCB_CPUID were used the cpu ID functions (i.e.
> + * __armv7_mmu_cache_{on,off,flush}) would be selected which
> + * use cp15 registers that are not implemented on v7-M.
> + */
> + bx lr
> #else
> ldr r9, =CONFIG_PROCESSOR_ID
> #endif
> @@ -1289,8 +1309,9 @@ __hyp_reentry_vectors:
>
> __enter_kernel:
> mov r0, #0 @ must be 0
> - ARM( mov pc, r4 ) @ call kernel
> - THUMB( bx r4 ) @ entry point is always ARM
> + ARM( mov pc, r4 ) @ call kernel
> + M_CLASS( add r4, r4, #1 ) @ enter in Thumb mode for M class
> + THUMB( bx r4 ) @ entry point is always ARM for A/R classes
>
> reloc_code_end:
>
> diff --git a/arch/arm/include/asm/unified.h b/arch/arm/include/asm/unified.h
> index b88beaba6b4a..200f9a7cd623 100644
> --- a/arch/arm/include/asm/unified.h
> +++ b/arch/arm/include/asm/unified.h
> @@ -24,6 +24,14 @@
> .syntax unified
> #endif
>
> +#ifdef CONFIG_CPU_V7M
> +#define AR_CLASS(x...)
> +#define M_CLASS(x...) x
> +#else
> +#define AR_CLASS(x...) x
> +#define M_CLASS(x...)
> +#endif
> +
> #ifdef CONFIG_THUMB2_KERNEL
>
> #if __GNUC__ < 4
>
next prev parent reply other threads:[~2015-03-25 0:13 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-12-17 8:56 [PATCH v6] ARM: zImage: add support for ARMv7-M Uwe Kleine-König
2014-12-20 13:33 ` Stefan Agner
2014-12-20 19:12 ` Ezequiel Garcia
2014-12-20 22:48 ` Stefan Agner
2014-12-20 23:28 ` Ezequiel Garcia
2014-12-29 12:02 ` Ezequiel Garcia
2014-12-21 10:25 ` Uwe Kleine-König
2014-12-27 22:53 ` Stefan Agner
2015-03-25 0:13 ` Chanwoo Choi [this message]
2015-03-25 7:47 ` Uwe Kleine-König
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=5511FDA8.5060108@samsung.com \
--to=cw00.choi@samsung.com \
--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 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.