Revision 23e39294 hw/arm_gic.c

b/hw/arm_gic.c
650 650
#endif
651 651
}
652 652

  
653
static void gic_save(QEMUFile *f, void *opaque)
654
{
655
    gic_state *s = (gic_state *)opaque;
656
    int i;
657
    int j;
658

  
659
    qemu_put_be32(f, s->enabled);
660
    for (i = 0; i < NCPU; i++) {
661
        qemu_put_be32(f, s->cpu_enabled[i]);
662
#ifndef NVIC
663
        qemu_put_be32(f, s->irq_target[i]);
664
#endif
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]);
673
    }
674
    for (i = 0; i < GIC_NIRQ - 32; i++) {
675
        qemu_put_be32(f, s->priority2[i]);
676
    }
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);
684
    }
685
}
686

  
687
static int gic_load(QEMUFile *f, void *opaque, int version_id)
688
{
689
    gic_state *s = (gic_state *)opaque;
690
    int i;
691
    int j;
692

  
693
    if (version_id != 1)
694
        return -EINVAL;
695

  
696
    s->enabled = qemu_get_be32(f);
697
    for (i = 0; i < NCPU; i++) {
698
        s->cpu_enabled[i] = qemu_get_be32(f);
699
#ifndef NVIC
700
        s->irq_target[i] = qemu_get_be32(f);
701
#endif
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);
710
    }
711
    for (i = 0; i < GIC_NIRQ - 32; i++) {
712
        s->priority2[i] = qemu_get_be32(f);
713
    }
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);
721
    }
722

  
723
    return 0;
724
}
725

  
653 726
static gic_state *gic_init(uint32_t base, qemu_irq *parent_irq)
654 727
{
655 728
    gic_state *s;
......
669 742
                                 iomemtype);
670 743
    s->base = base;
671 744
    gic_reset(s);
745
    register_savevm("arm_gic", -1, 1, gic_save, gic_load, s);
672 746
    return s;
673 747
}

Also available in: Unified diff