diff --git a/hw/sh_intc.c b/hw/sh_intc.c index 7cd1fad..2369e8b 100644 --- a/hw/sh_intc.c +++ b/hw/sh_intc.c @@ -367,6 +367,10 @@ static void sh_intc_register_source(struct intc_desc *desc, for (k = 0; k < ARRAY_SIZE(mr->enum_ids); k++) { if (mr->enum_ids[k] == source) { s->enable_max++; + // Account for the fact that mask registers are + // zero by default, and therefore don't mask + // an interrupt by default. + s->enable_count++; break; } } @@ -431,6 +435,7 @@ void sh_intc_register_sources(struct intc_desc *desc, child = sh_intc_source(desc, gr->enum_ids[k]); child->enable_max += s->enable_max; + child->enable_count += s->enable_count; } /* Chain sources within each group via source->next_enum_id, @@ -537,3 +542,18 @@ void sh_intc_init_irl_priorities(struct intc_source *s) s->priority = priority-- *2; assert(priority == 0); } + +void sh_intc_debug_lockup (struct intc_desc *desc) +{ + int i; + for (i = 0; i < desc->nr_sources; i++) + { + struct intc_source *source = desc->sources + i; + + if (source->asserted && !source->pending) + { + printf ("source %d (%x) asserted, not pending, e = %d/%d\n", + i, source->vect, source->enable_count, source->enable_max); + } + } +}