|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 1/4] 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.
It's not clear that the distributor actually needs to be disabled to
modify the group registers but it seems reasonable that the bringup
code should make sure the GICD is disabled even if not doing the
transition to hyp mode, so move this to the main flow of head.S and
only do it on the boot processor.
For completeness also disable the GICC (CPU interface) on all CPUs
too.
Signed-off-by: Ian Campbell <ian.campbell@xxxxxxxxxx>
---
xen/arch/arm/head.S | 14 ++++++++++++++
xen/arch/arm/mode_switch.S | 14 +++++++++-----
2 files changed, 23 insertions(+), 5 deletions(-)
diff --git a/xen/arch/arm/head.S b/xen/arch/arm/head.S
index cdbe011..a69bf72 100644
--- a/xen/arch/arm/head.S
+++ b/xen/arch/arm/head.S
@@ -67,6 +67,12 @@ start:
add r8, r10 /* r8 := paddr(DTB) */
#endif
+ /* Disable interrupt delivery at the GIC's CPU interface */
+ mov r0, #GIC_BASE_ADDRESS
+ add r0, r0, #GIC_CR_OFFSET
+ mov r1, #0
+ str r1, [r0]
+
/* Are we the boot CPU? */
mov r12, #0 /* r12 := CPU ID */
mrc CP32(r0, MPIDR)
@@ -85,8 +91,16 @@ start:
ldr r1, [r0] /* Which CPU is being booted? */
teq r1, r12 /* Is it us? */
bne 1b
+ b secondary_cpu
boot_cpu:
+ /* Setup which only needs to be done once, on the boot CPU */
+ mov r0, #GIC_BASE_ADDRESS
+ add r0, r0, #GIC_DR_OFFSET
+ mov r1, #0
+ str r1, [r0] /* Disable delivery in the distributor */
+
+secondary_cpu:
#ifdef EARLY_UART_ADDRESS
ldr r11, =EARLY_UART_ADDRESS /* r11 := UART base address */
teq r12, #0 /* CPU 0 sets up the UART too */
diff --git a/xen/arch/arm/mode_switch.S b/xen/arch/arm/mode_switch.S
index f5549d7..9211d26 100644
--- a/xen/arch/arm/mode_switch.S
+++ b/xen/arch/arm/mode_switch.S
@@ -49,13 +49,17 @@ enter_hyp_mode:
/* Continuing ugliness: Set up the GIC so NS state owns interrupts */
mov r0, #GIC_BASE_ADDRESS
add r0, r0, #GIC_DR_OFFSET
- mov r1, #0
- str r1, [r0] /* Disable delivery in the distributor */
add r0, r0, #0x80 /* GICD_IGROUP0 */
- mov r2, #0xffffffff /* All interrupts to group 1 */
+ mov r2, #0xffffffff /* Interrupts 0-31 (SGI&PPI) to group 1 */
+ /* The remaining interrupts are Shared Periphal Interrupts and so
+ * need reconfiguring only once, on the boot CPU */
str r2, [r0]
- str r2, [r0, #4]
- str r2, [r0, #8]
+ teq r12, #0
+ bne skip_spi
+ str r2, [r0, #4] /* Interrupts 32-63 (SPI) to group 1 */
+ str r2, [r0, #8] /* Interrupts 64-95 (SPI) to group 1 */
+skip_spi:
+
/* Must drop priority mask below 0x80 before entering NS state */
mov r0, #GIC_BASE_ADDRESS
add r0, r0, #GIC_CR_OFFSET
--
1.7.9.1
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |