Loading hw/intc/slavio_intctl.c +35 −0 Original line number Diff line number Diff line Loading @@ -26,6 +26,7 @@ #include "hw/sparc/sun4m.h" #include "monitor/monitor.h" #include "hw/sysbus.h" #include "hw/intc/intc.h" #include "trace.h" //#define DEBUG_IRQ_COUNT Loading Loading @@ -418,6 +419,31 @@ static void slavio_intctl_reset(DeviceState *d) slavio_check_interrupts(s, 0); } #ifdef DEBUG_IRQ_COUNT static bool slavio_intctl_get_statistics(InterruptStatsProvider *obj, uint64_t **irq_counts, unsigned int *nb_irqs) { SLAVIO_INTCTLState *s = SLAVIO_INTCTL(obj); *irq_counts = s->irq_count; *nb_irqs = ARRAY_SIZE(s->irq_count); return true; } #endif static void slavio_intctl_print_info(InterruptStatsProvider *obj, Monitor *mon) { SLAVIO_INTCTLState *s = SLAVIO_INTCTL(obj); int i; for (i = 0; i < MAX_CPUS; i++) { monitor_printf(mon, "per-cpu %d: pending 0x%08x\n", i, s->slaves[i].intreg_pending); } monitor_printf(mon, "master: pending 0x%08x, disabled 0x%08x\n", s->intregm_pending, s->intregm_disabled); } static void slavio_intctl_init(Object *obj) { DeviceState *dev = DEVICE(obj); Loading Loading @@ -449,9 +475,14 @@ static void slavio_intctl_init(Object *obj) static void slavio_intctl_class_init(ObjectClass *klass, void *data) { DeviceClass *dc = DEVICE_CLASS(klass); InterruptStatsProviderClass *ic = INTERRUPT_STATS_PROVIDER_CLASS(klass); dc->reset = slavio_intctl_reset; dc->vmsd = &vmstate_intctl; #ifdef DEBUG_IRQ_COUNT ic->get_statistics = slavio_intctl_get_statistics; #endif ic->print_info = slavio_intctl_print_info; } static const TypeInfo slavio_intctl_info = { Loading @@ -460,6 +491,10 @@ static const TypeInfo slavio_intctl_info = { .instance_size = sizeof(SLAVIO_INTCTLState), .instance_init = slavio_intctl_init, .class_init = slavio_intctl_class_init, .interfaces = (InterfaceInfo[]) { { TYPE_INTERRUPT_STATS_PROVIDER }, { } }, }; static void slavio_intctl_register_types(void) Loading Loading
hw/intc/slavio_intctl.c +35 −0 Original line number Diff line number Diff line Loading @@ -26,6 +26,7 @@ #include "hw/sparc/sun4m.h" #include "monitor/monitor.h" #include "hw/sysbus.h" #include "hw/intc/intc.h" #include "trace.h" //#define DEBUG_IRQ_COUNT Loading Loading @@ -418,6 +419,31 @@ static void slavio_intctl_reset(DeviceState *d) slavio_check_interrupts(s, 0); } #ifdef DEBUG_IRQ_COUNT static bool slavio_intctl_get_statistics(InterruptStatsProvider *obj, uint64_t **irq_counts, unsigned int *nb_irqs) { SLAVIO_INTCTLState *s = SLAVIO_INTCTL(obj); *irq_counts = s->irq_count; *nb_irqs = ARRAY_SIZE(s->irq_count); return true; } #endif static void slavio_intctl_print_info(InterruptStatsProvider *obj, Monitor *mon) { SLAVIO_INTCTLState *s = SLAVIO_INTCTL(obj); int i; for (i = 0; i < MAX_CPUS; i++) { monitor_printf(mon, "per-cpu %d: pending 0x%08x\n", i, s->slaves[i].intreg_pending); } monitor_printf(mon, "master: pending 0x%08x, disabled 0x%08x\n", s->intregm_pending, s->intregm_disabled); } static void slavio_intctl_init(Object *obj) { DeviceState *dev = DEVICE(obj); Loading Loading @@ -449,9 +475,14 @@ static void slavio_intctl_init(Object *obj) static void slavio_intctl_class_init(ObjectClass *klass, void *data) { DeviceClass *dc = DEVICE_CLASS(klass); InterruptStatsProviderClass *ic = INTERRUPT_STATS_PROVIDER_CLASS(klass); dc->reset = slavio_intctl_reset; dc->vmsd = &vmstate_intctl; #ifdef DEBUG_IRQ_COUNT ic->get_statistics = slavio_intctl_get_statistics; #endif ic->print_info = slavio_intctl_print_info; } static const TypeInfo slavio_intctl_info = { Loading @@ -460,6 +491,10 @@ static const TypeInfo slavio_intctl_info = { .instance_size = sizeof(SLAVIO_INTCTLState), .instance_init = slavio_intctl_init, .class_init = slavio_intctl_class_init, .interfaces = (InterfaceInfo[]) { { TYPE_INTERRUPT_STATS_PROVIDER }, { } }, }; static void slavio_intctl_register_types(void) Loading