From: Igor Mitsyanko <i.mitsyanko@gmail.com>
To: Peter Maydell <peter.maydell@linaro.org>
Cc: Igor Mitsyanko <i.mitsyanko@samsung.com>,
Mark Langsdorf <mark.langsdorf@calxeda.com>,
Evgeny Voevodin <e.voevodin@samsung.com>,
patches@linaro.org, Marc Zyngier <marc.zyngier@arm.com>,
qemu-devel@nongnu.org, Dmitry Solodkiy <d.solodkiy@samsung.com>,
Maksim Kozlov <m.kozlov@samsung.com>,
kvmarm@lists.cs.columbia.edu
Subject: Re: [Qemu-devel] [PATCH 1/3] hw/arm_boot, exynos4210, highbank: Fix secondary boot GIC init
Date: Sun, 02 Dec 2012 01:27:21 +0400 [thread overview]
Message-ID: <50BA7639.3070202@gmail.com> (raw)
In-Reply-To: <1354208577-8935-2-git-send-email-peter.maydell@linaro.org>
On 11/29/2012 9:02 PM, Peter Maydell wrote:
> Fix the code in the secondary CPU boot stubs so that it correctly
> initialises the GIC rather than relying on bugs or implementation
> dependent aspects of the QEMU GIC implementation:
> * set the GIC_PMR.Priority field to all-ones, so that all
> interrupts are passed through. The default of all-zeroes
> means all interrupts are masked, and QEMU only booted because
> of a bug in the priority masking in our GIC implementation.
> * add a barrier after GIC setup and before WFI to ensure that
> GIC config is complete before we go into a possible low power
> state. This isn't needed with the software GIC model but could
> be required when using KVM and executing this code on the
> real hardware CPU.
>
> Note that of the three secondary stub implementations, only
> the common generic one needs to support both v6 and v7 DSB
> encodings; highbank and exynos4210 will always be v7 CPUs.
>
> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
> ---
> hw/arm_boot.c | 17 ++++++++++++++---
> hw/exynos4210.c | 10 +++++++---
> hw/highbank.c | 7 +++++--
> 3 files changed, 26 insertions(+), 8 deletions(-)
>
Reviewed-by: Igor Mitsyanko <i.mitsyanko@samsung.com>
> diff --git a/hw/arm_boot.c b/hw/arm_boot.c
> index 92e2cab..ec3b8d5 100644
> --- a/hw/arm_boot.c
> +++ b/hw/arm_boot.c
> @@ -44,11 +44,17 @@ static uint32_t bootloader[] = {
> * for an interprocessor interrupt and polling a configurable
> * location for the kernel secondary CPU entry point.
> */
> +#define DSB_INSN 0xf57ff04f
> +#define CP15_DSB_INSN 0xee070f9a /* mcr cp15, 0, r0, c7, c10, 4 */
> +
> static uint32_t smpboot[] = {
> - 0xe59f201c, /* ldr r2, gic_cpu_if */
> - 0xe59f001c, /* ldr r0, startaddr */
> + 0xe59f2028, /* ldr r2, gic_cpu_if */
> + 0xe59f0028, /* ldr r0, startaddr */
> 0xe3a01001, /* mov r1, #1 */
> - 0xe5821000, /* str r1, [r2] */
> + 0xe5821000, /* str r1, [r2] - set GICC_CTLR.Enable */
> + 0xe3a010ff, /* mov r1, #0xff */
> + 0xe5821004, /* str r1, [r2, 4] - set GIC_PMR.Priority to 0xff */
> + DSB_INSN, /* dsb */
> 0xe320f003, /* wfi */
> 0xe5901000, /* ldr r1, [r0] */
> 0xe1110001, /* tst r1, r1 */
> @@ -65,6 +71,11 @@ static void default_write_secondary(ARMCPU *cpu,
> smpboot[ARRAY_SIZE(smpboot) - 1] = info->smp_bootreg_addr;
> smpboot[ARRAY_SIZE(smpboot) - 2] = info->gic_cpu_if_addr;
> for (n = 0; n < ARRAY_SIZE(smpboot); n++) {
> + /* Replace DSB with the pre-v7 DSB if necessary. */
> + if (!arm_feature(&cpu->env, ARM_FEATURE_V7) &&
> + smpboot[n] == DSB_INSN) {
> + smpboot[n] = CP15_DSB_INSN;
> + }
> smpboot[n] = tswap32(smpboot[n]);
> }
> rom_add_blob_fixed("smpboot", smpboot, sizeof(smpboot),
> diff --git a/hw/exynos4210.c b/hw/exynos4210.c
> index 00d4db8..22148cd 100644
> --- a/hw/exynos4210.c
> +++ b/hw/exynos4210.c
> @@ -80,12 +80,16 @@ void exynos4210_write_secondary(ARMCPU *cpu,
> {
> int n;
> uint32_t smpboot[] = {
> - 0xe59f3024, /* ldr r3, External gic_cpu_if */
> - 0xe59f2024, /* ldr r2, Internal gic_cpu_if */
> - 0xe59f0024, /* ldr r0, startaddr */
> + 0xe59f3034, /* ldr r3, External gic_cpu_if */
> + 0xe59f2034, /* ldr r2, Internal gic_cpu_if */
> + 0xe59f0034, /* ldr r0, startaddr */
> 0xe3a01001, /* mov r1, #1 */
> 0xe5821000, /* str r1, [r2] */
> 0xe5831000, /* str r1, [r3] */
> + 0xe3a010ff, /* mov r1, #0xff */
> + 0xe5821004, /* str r1, [r2, #4] */
> + 0xe5831004, /* str r1, [r3, #4] */
> + 0xf57ff04f, /* dsb */
> 0xe320f003, /* wfi */
> 0xe5901000, /* ldr r1, [r0] */
> 0xe1110001, /* tst r1, r1 */
> diff --git a/hw/highbank.c b/hw/highbank.c
> index afbb005..447e57d 100644
> --- a/hw/highbank.c
> +++ b/hw/highbank.c
> @@ -44,9 +44,12 @@ static void hb_write_secondary(ARMCPU *cpu, const struct arm_boot_info *info)
> 0xe210000f, /* ands r0, r0, #0x0f */
> 0xe3a03040, /* mov r3, #0x40 - jump address is 0x40 + 0x10 * core id */
> 0xe0830200, /* add r0, r3, r0, lsl #4 */
> - 0xe59f2018, /* ldr r2, privbase */
> + 0xe59f2024, /* ldr r2, privbase */
> 0xe3a01001, /* mov r1, #1 */
> - 0xe5821100, /* str r1, [r2, #256] */
> + 0xe5821100, /* str r1, [r2, #256] - set GICC_CTLR.Enable */
> + 0xe3a010ff, /* mov r1, #0xff */
> + 0xe5821104, /* str r1, [r2, #260] - set GICC_PMR.Priority to 0xff */
> + 0xf57ff04f, /* dsb */
> 0xe320f003, /* wfi */
> 0xe5901000, /* ldr r1, [r0] */
> 0xe1110001, /* tst r1, r1 */
>
next prev parent reply other threads:[~2012-12-01 21:27 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-11-29 17:02 [Qemu-devel] [PATCH 0/3] ARM: fix secondary boot GIC init, GIC bugs Peter Maydell
2012-11-29 17:02 ` [Qemu-devel] [PATCH 1/3] hw/arm_boot, exynos4210, highbank: Fix secondary boot GIC init Peter Maydell
2012-12-01 21:27 ` Igor Mitsyanko [this message]
2012-11-29 17:02 ` [Qemu-devel] [PATCH 2/3] hw/arm_gic: Fix comparison with priority mask register Peter Maydell
2012-12-01 15:50 ` [Qemu-devel] [kvmarm] " Christoffer Dall
2012-12-01 21:27 ` [Qemu-devel] " Igor Mitsyanko
2012-11-29 17:02 ` [Qemu-devel] [PATCH 3/3] hw/arm_gic_common: Correct GICC_PMR reset value for newer GICs Peter Maydell
2012-12-01 21:27 ` Igor Mitsyanko
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=50BA7639.3070202@gmail.com \
--to=i.mitsyanko@gmail.com \
--cc=d.solodkiy@samsung.com \
--cc=e.voevodin@samsung.com \
--cc=i.mitsyanko@samsung.com \
--cc=kvmarm@lists.cs.columbia.edu \
--cc=m.kozlov@samsung.com \
--cc=marc.zyngier@arm.com \
--cc=mark.langsdorf@calxeda.com \
--cc=patches@linaro.org \
--cc=peter.maydell@linaro.org \
--cc=qemu-devel@nongnu.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).