Commit ca0225a5 authored by Achin Gupta's avatar Achin Gupta
Browse files

Fix reporting of interrupt ID in ARM GIC driver

The ARM GIC driver treats the entire contents of the GICC_HPPIR as the interrupt
ID instead of just bits[9:0]. This could result in an SGI being treated as a
Group 1 interrupt on a GICv2 system.

This patch introduces a mask to retrieve only the ID from a read of GICC_HPPIR,
GICC_IAR and similar registers. The value read from these registers is masked
with this constant prior to use as an interrupt ID.

Fixes ARM-software/tf-issues#306

Change-Id: Ie3885157de33b71df9781a41f6ef015a30c4608d
parent 5717aae1
...@@ -401,7 +401,7 @@ uint32_t arm_gic_get_pending_interrupt_type(void) ...@@ -401,7 +401,7 @@ uint32_t arm_gic_get_pending_interrupt_type(void)
uint32_t id; uint32_t id;
assert(g_gicc_base); assert(g_gicc_base);
id = gicc_read_hppir(g_gicc_base); id = gicc_read_hppir(g_gicc_base) & INT_ID_MASK;
/* Assume that all secure interrupts are S-EL1 interrupts */ /* Assume that all secure interrupts are S-EL1 interrupts */
if (id < 1022) if (id < 1022)
...@@ -423,7 +423,7 @@ uint32_t arm_gic_get_pending_interrupt_id(void) ...@@ -423,7 +423,7 @@ uint32_t arm_gic_get_pending_interrupt_id(void)
uint32_t id; uint32_t id;
assert(g_gicc_base); assert(g_gicc_base);
id = gicc_read_hppir(g_gicc_base); id = gicc_read_hppir(g_gicc_base) & INT_ID_MASK;
if (id < 1022) if (id < 1022)
return id; return id;
...@@ -435,7 +435,7 @@ uint32_t arm_gic_get_pending_interrupt_id(void) ...@@ -435,7 +435,7 @@ uint32_t arm_gic_get_pending_interrupt_id(void)
* Find out which non-secure interrupt it is under the assumption that * Find out which non-secure interrupt it is under the assumption that
* the GICC_CTLR.AckCtl bit is 0. * the GICC_CTLR.AckCtl bit is 0.
*/ */
return gicc_read_ahppir(g_gicc_base); return gicc_read_ahppir(g_gicc_base) & INT_ID_MASK;
} }
/******************************************************************************* /*******************************************************************************
......
...@@ -99,6 +99,9 @@ ...@@ -99,6 +99,9 @@
#define GICC_DIR 0x1000 #define GICC_DIR 0x1000
#define GICC_PRIODROP GICC_EOIR #define GICC_PRIODROP GICC_EOIR
/* Common CPU Interface definitions */
#define INT_ID_MASK 0x3ff
/* GICC_CTLR bit definitions */ /* GICC_CTLR bit definitions */
#define EOI_MODE_NS (1 << 10) #define EOI_MODE_NS (1 << 10)
#define EOI_MODE_S (1 << 9) #define EOI_MODE_S (1 << 9)
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment