qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
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 */
>

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