Check for:
- uninitialized GIC interface addresses;
- non-page aligned GIC interface addresses.
Panic in both cases.
Also remove the code from GICH and GICC to handle non-page aligned
interfaces.
Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
diff --git a/xen/arch/arm/gic.c b/xen/arch/arm/gic.c
index 8efbeb3..2b29e7e 100644
--- a/xen/arch/arm/gic.c
+++ b/xen/arch/arm/gic.c
@@ -34,10 +34,8 @@
/* Access to the GIC Distributor registers through the fixmap */
#define GICD ((volatile uint32_t *) FIXMAP_ADDR(FIXMAP_GICD))
-#define GICC ((volatile uint32_t *) (FIXMAP_ADDR(FIXMAP_GICC1) \
- + ((uint32_t) gic.cbase & 0xfff)))
-#define GICH ((volatile uint32_t *) (FIXMAP_ADDR(FIXMAP_GICH) \
- + ((uint32_t) gic.hbase & 0xfff)))
+#define GICC ((volatile uint32_t *) FIXMAP_ADDR(FIXMAP_GICC1))
+#define GICH ((volatile uint32_t *) FIXMAP_ADDR(FIXMAP_GICH))
static void gic_restore_pending_irqs(struct vcpu *v);
/* Global state */
@@ -308,6 +306,23 @@ static void __cpuinit gic_hyp_disable(void)
/* Set up the GIC */
void __init gic_init(void)
{
+ if ( !early_info.gic.gic_dist_addr ||
+ !early_info.gic.gic_cpu_addr ||
+ !early_info.gic.gic_hyp_addr ||
+ !early_info.gic.gic_vcpu_addr )
+ panic("the physical address of one of the GIC interfaces is
missing:\n"
+ " gic_dist_addr=%"PRIpaddr"\n"
+ " gic_cpu_addr=%"PRIpaddr"\n"
+ " gic_hyp_addr=%"PRIpaddr"\n"
+ " gic_vcpu_addr=%"PRIpaddr"\n",
+ early_info.gic.gic_dist_addr, early_info.gic.gic_cpu_addr,
+ early_info.gic.gic_hyp_addr, early_info.gic.gic_vcpu_addr);
+ if ( (early_info.gic.gic_dist_addr & ~PAGE_MASK) ||
+ (early_info.gic.gic_cpu_addr & ~PAGE_MASK) ||
+ (early_info.gic.gic_hyp_addr & ~PAGE_MASK) ||
+ (early_info.gic.gic_vcpu_addr & ~PAGE_MASK) )
+ panic("error: GIC interfaces not page aligned.\n");
+
gic.dbase = early_info.gic.gic_dist_addr;
gic.cbase = early_info.gic.gic_cpu_addr;
gic.hbase = early_info.gic.gic_hyp_addr;
On Fri, 2012-11-30 at 12:38 +0000, Stefano Stabellini wrote:> Check for: > - uninitialized GIC interface addresses; > - non-page aligned GIC interface addresses. > > Panic in both cases. > Also remove the code from GICH and GICC to handle non-page aligned > interfaces. > > Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>Acked-by: Ian Campbell <ian.campbell@citrix.com> I tried to apply but I got rejects. I thought this came before "xen: get GIC addresses from DT", have I got it backwards?> / > @@ -308,6 +306,23 @@ static void __cpuinit gic_hyp_disable(void) > /* Set up the GIC */ > void __init gic_init(void) > { > + if ( !early_info.gic.gic_dist_addr || > + !early_info.gic.gic_cpu_addr || > + !early_info.gic.gic_hyp_addr || > + !early_info.gic.gic_vcpu_addr ) > + panic("the physical address of one of the GIC interfaces is missing:\n" > + " gic_dist_addr=%"PRIpaddr"\n" > + " gic_cpu_addr=%"PRIpaddr"\n" > + " gic_hyp_addr=%"PRIpaddr"\n" > + " gic_vcpu_addr=%"PRIpaddr"\n", > + early_info.gic.gic_dist_addr, early_info.gic.gic_cpu_addr, > + early_info.gic.gic_hyp_addr, early_info.gic.gic_vcpu_addr);Might be worth printing these out unconditionally as part of a message about initialising the GIC (which could include version, number of interrupts etc too). Useful in its own right but better than duplicating them in the next panic message too.> + if ( (early_info.gic.gic_dist_addr & ~PAGE_MASK) || > + (early_info.gic.gic_cpu_addr & ~PAGE_MASK) || > + (early_info.gic.gic_hyp_addr & ~PAGE_MASK) || > + (early_info.gic.gic_vcpu_addr & ~PAGE_MASK) ) > + panic("error: GIC interfaces not page aligned.\n");"error: " seems a bit redundant in a panic message ;-)> + > gic.dbase = early_info.gic.gic_dist_addr; > gic.cbase = early_info.gic.gic_cpu_addr; > gic.hbase = early_info.gic.gic_hyp_addr;