62
62
#define GIC_TEST_MODEL(irq) s->irq_state[irq].model
63
63
#define GIC_SET_LEVEL(irq, cm) s->irq_state[irq].level = (cm)
64
64
#define GIC_CLEAR_LEVEL(irq, cm) s->irq_state[irq].level &= ~(cm)
65
#define GIC_TEST_LEVEL(irq, cm) ((s->irq_state[irq].level & (cm)) != 0)
65
#define GIC_TEST_LEVEL(irq, cm) (s->irq_state[irq].level & (cm)) != 0
66
66
#define GIC_SET_TRIGGER(irq) s->irq_state[irq].trigger = 1
67
67
#define GIC_CLEAR_TRIGGER(irq) s->irq_state[irq].trigger = 0
68
68
#define GIC_TEST_TRIGGER(irq) s->irq_state[irq].trigger
653
static void gic_save(QEMUFile *f, void *opaque)
655
gic_state *s = (gic_state *)opaque;
659
qemu_put_be32(f, s->enabled);
660
for (i = 0; i < NCPU; i++) {
661
qemu_put_be32(f, s->cpu_enabled[i]);
663
qemu_put_be32(f, s->irq_target[i]);
665
for (j = 0; j < 32; j++)
666
qemu_put_be32(f, s->priority1[j][i]);
667
for (j = 0; j < GIC_NIRQ; j++)
668
qemu_put_be32(f, s->last_active[j][i]);
669
qemu_put_be32(f, s->priority_mask[i]);
670
qemu_put_be32(f, s->running_irq[i]);
671
qemu_put_be32(f, s->running_priority[i]);
672
qemu_put_be32(f, s->current_pending[i]);
674
for (i = 0; i < GIC_NIRQ - 32; i++) {
675
qemu_put_be32(f, s->priority2[i]);
677
for (i = 0; i < GIC_NIRQ; i++) {
678
qemu_put_byte(f, s->irq_state[i].enabled);
679
qemu_put_byte(f, s->irq_state[i].pending);
680
qemu_put_byte(f, s->irq_state[i].active);
681
qemu_put_byte(f, s->irq_state[i].level);
682
qemu_put_byte(f, s->irq_state[i].model);
683
qemu_put_byte(f, s->irq_state[i].trigger);
687
static int gic_load(QEMUFile *f, void *opaque, int version_id)
689
gic_state *s = (gic_state *)opaque;
696
s->enabled = qemu_get_be32(f);
697
for (i = 0; i < NCPU; i++) {
698
s->cpu_enabled[i] = qemu_get_be32(f);
700
s->irq_target[i] = qemu_get_be32(f);
702
for (j = 0; j < 32; j++)
703
s->priority1[j][i] = qemu_get_be32(f);
704
for (j = 0; j < GIC_NIRQ; j++)
705
s->last_active[j][i] = qemu_get_be32(f);
706
s->priority_mask[i] = qemu_get_be32(f);
707
s->running_irq[i] = qemu_get_be32(f);
708
s->running_priority[i] = qemu_get_be32(f);
709
s->current_pending[i] = qemu_get_be32(f);
711
for (i = 0; i < GIC_NIRQ - 32; i++) {
712
s->priority2[i] = qemu_get_be32(f);
714
for (i = 0; i < GIC_NIRQ; i++) {
715
s->irq_state[i].enabled = qemu_get_byte(f);
716
s->irq_state[i].pending = qemu_get_byte(f);
717
s->irq_state[i].active = qemu_get_byte(f);
718
s->irq_state[i].level = qemu_get_byte(f);
719
s->irq_state[i].model = qemu_get_byte(f);
720
s->irq_state[i].trigger = qemu_get_byte(f);
726
653
static gic_state *gic_init(uint32_t base, qemu_irq *parent_irq)