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