Hi,
I am a user of qemu. I found that in qemu2.0.0-rc0 the gic model was
updated. However, it seems loss ability to bind irqs to any specified core when
the board includes multiple cortex-a9 cores. The problematic codes maybe locate
at hw/intc/arm_gic.c:
50 void gic_update(GICState *s)
...
68 for (irq = 0; irq < s->num_irq; irq++) {
69 if (GIC_TEST_ENABLED(irq, cm) && gic_test_pending(s, irq, cm)) {
70 if (GIC_GET_PRIORITY(irq, cpu) < best_prio) {
71 best_prio = GIC_GET_PRIORITY(irq, cpu);
72 best_irq = irq;
73 }
74 }
75 }
...
gic_test_pending checks if the pending bits of an irq are set. I think the
pending bits reflect core bindings according to the func "gic_set_irq". But in
the following codes:
115 static void gic_set_irq_generic(GICState *s, int irq, int level,
116 int cm, int target)
117 {
118 if (level) {
119 GIC_SET_LEVEL(irq, cm);
120 DPRINTF("Set %d pending mask %x\n", irq, target);
121 if (GIC_TEST_EDGE_TRIGGER(irq)) {
122 GIC_SET_PENDING(irq, target);
123 }
124 } else {
125 GIC_CLEAR_LEVEL(irq, cm);
126 }
127 }
if level trigger the core target parameter of the irq is ignored and its
pending bits will not be set. So how does the core target parameter make its
affect?
I regard it as a bug because in previous version (1.5), our kernel and gic work
well.
Would anyone consider about this question?
thanks
Xiaodong Zhu