[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH 1/4] arm: disable distributor delivery on boot CPU only



At 14:45 +0100 on 06 Aug (1344264356), Ian Campbell wrote:
> From 6440d1868cb03573ebacf5eb3cfc69f4f6abdf15 Mon Sep 17 00:00:00 2001
> From: Ian Campbell <ian.campbell@xxxxxxxxxx>
> Date: Mon, 6 Aug 2012 09:40:59 +0000
> Subject: [PATCH] arm: disable distributor delivery on boot CPU only
> 
> The secondary processors do not call enter_hyp_mode until the boot CPU
> has brought most of the system up, including enabling delivery via the
> distributor. This means that bringing up secondary CPUs unexpectedly
> disables the GICD again, meaning we get no further interrupts on any
> CPU.
> 
> For completeness also disable the GICC (CPU interface) on all CPUs
> too.
> 
> Signed-off-by: Ian Campbell <ian.campbell@xxxxxxxxxx>

Acked-by: Tim Deegan <tim@xxxxxxx>

> ---
>  xen/arch/arm/mode_switch.S |   23 +++++++++++++++++------
>  1 files changed, 17 insertions(+), 6 deletions(-)
> 
> diff --git a/xen/arch/arm/mode_switch.S b/xen/arch/arm/mode_switch.S
> index f5549d7..acbd523 100644
> --- a/xen/arch/arm/mode_switch.S
> +++ b/xen/arch/arm/mode_switch.S
> @@ -23,6 +23,8 @@
>  
>  /* Get up a CPU into Hyp mode.  Clobbers r0-r3.
>   *
> + * Expects r12 == CPU number
> + *
>   * This code is specific to the VE model, and not intended to be used
>   * on production systems.  As such it's a bit hackier than the main
>   * boot code in head.S.  In future it will be replaced by better
> @@ -46,19 +48,28 @@ enter_hyp_mode:
>       mcr   CP32(r0, CNTFRQ)
>       ldr   r0, =0x40c00           /* SMP, c11, c10 in non-secure mode */
>       mcr   CP32(r0, NSACR)
> -     /* Continuing ugliness: Set up the GIC so NS state owns interrupts */
>       mov   r0, #GIC_BASE_ADDRESS
>       add   r0, r0, #GIC_DR_OFFSET
> +     /* Disable the GIC distributor, on the boot CPU only */
>       mov   r1, #0
> -     str   r1, [r0]               /* Disable delivery in the distributor */
> +     teq   r12, #0                /* Is this the boot CPU? */
> +     streq r1, [r0]
> +     /* Continuing ugliness: Set up the GIC so NS state owns interrupts,
> +      * The first 32 interrupts (SGIs & PPIs) must be configured on all
> +      * CPUs while the remainder are SPIs and only need to be done one, on
> +      * the boot CPU. */
>       add   r0, r0, #0x80          /* GICD_IGROUP0 */
>       mov   r2, #0xffffffff        /* All interrupts to group 1 */
> -     str   r2, [r0]
> -     str   r2, [r0, #4]
> -     str   r2, [r0, #8]
> -     /* Must drop priority mask below 0x80 before entering NS state */
> +     teq   r12, #0                /* Boot CPU? */
> +     str   r2, [r0]               /* Interrupts  0-31 (SGI & PPI) */
> +     streq r2, [r0, #4]           /* Interrupts 32-63 (SPI) */
> +     streq r2, [r0, #8]           /* Interrupts 64-95 (SPI) */
> +     /* Disable the GIC CPU interface on all processors */
>       mov   r0, #GIC_BASE_ADDRESS
>       add   r0, r0, #GIC_CR_OFFSET
> +     mov   r1, #0
> +     str   r1, [r0]               
> +     /* Must drop priority mask below 0x80 before entering NS state */
>       ldr   r1, =0xff
>       str   r1, [r0, #0x4]         /* -> GICC_PMR */
>       /* Reset a few config registers */

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.