Annotation of qemu/hw/kvm/ioapic.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * KVM in-kernel IOPIC support
                      3:  *
                      4:  * Copyright (c) 2011 Siemens AG
                      5:  *
                      6:  * Authors:
                      7:  *  Jan Kiszka          <[email protected]>
                      8:  *
                      9:  * This work is licensed under the terms of the GNU GPL version 2.
                     10:  * See the COPYING file in the top-level directory.
                     11:  */
                     12: 
                     13: #include "hw/pc.h"
                     14: #include "hw/ioapic_internal.h"
                     15: #include "hw/apic_internal.h"
                     16: #include "kvm.h"
                     17: 
                     18: typedef struct KVMIOAPICState KVMIOAPICState;
                     19: 
                     20: struct KVMIOAPICState {
                     21:     IOAPICCommonState ioapic;
                     22:     uint32_t kvm_gsi_base;
                     23: };
                     24: 
                     25: static void kvm_ioapic_get(IOAPICCommonState *s)
                     26: {
                     27:     struct kvm_irqchip chip;
                     28:     struct kvm_ioapic_state *kioapic;
                     29:     int ret, i;
                     30: 
                     31:     chip.chip_id = KVM_IRQCHIP_IOAPIC;
                     32:     ret = kvm_vm_ioctl(kvm_state, KVM_GET_IRQCHIP, &chip);
                     33:     if (ret < 0) {
                     34:         fprintf(stderr, "KVM_GET_IRQCHIP failed: %s\n", strerror(ret));
                     35:         abort();
                     36:     }
                     37: 
                     38:     kioapic = &chip.chip.ioapic;
                     39: 
                     40:     s->id = kioapic->id;
                     41:     s->ioregsel = kioapic->ioregsel;
                     42:     s->irr = kioapic->irr;
                     43:     for (i = 0; i < IOAPIC_NUM_PINS; i++) {
                     44:         s->ioredtbl[i] = kioapic->redirtbl[i].bits;
                     45:     }
                     46: }
                     47: 
                     48: static void kvm_ioapic_put(IOAPICCommonState *s)
                     49: {
                     50:     struct kvm_irqchip chip;
                     51:     struct kvm_ioapic_state *kioapic;
                     52:     int ret, i;
                     53: 
                     54:     chip.chip_id = KVM_IRQCHIP_IOAPIC;
                     55:     kioapic = &chip.chip.ioapic;
                     56: 
                     57:     kioapic->id = s->id;
                     58:     kioapic->ioregsel = s->ioregsel;
                     59:     kioapic->base_address = s->busdev.mmio[0].addr;
                     60:     kioapic->irr = s->irr;
                     61:     for (i = 0; i < IOAPIC_NUM_PINS; i++) {
                     62:         kioapic->redirtbl[i].bits = s->ioredtbl[i];
                     63:     }
                     64: 
                     65:     ret = kvm_vm_ioctl(kvm_state, KVM_SET_IRQCHIP, &chip);
                     66:     if (ret < 0) {
                     67:         fprintf(stderr, "KVM_GET_IRQCHIP failed: %s\n", strerror(ret));
                     68:         abort();
                     69:     }
                     70: }
                     71: 
                     72: static void kvm_ioapic_reset(DeviceState *dev)
                     73: {
                     74:     IOAPICCommonState *s = DO_UPCAST(IOAPICCommonState, busdev.qdev, dev);
                     75: 
                     76:     ioapic_reset_common(dev);
                     77:     kvm_ioapic_put(s);
                     78: }
                     79: 
                     80: static void kvm_ioapic_set_irq(void *opaque, int irq, int level)
                     81: {
                     82:     KVMIOAPICState *s = opaque;
                     83:     int delivered;
                     84: 
                     85:     delivered = kvm_irqchip_set_irq(kvm_state, s->kvm_gsi_base + irq, level);
                     86:     apic_report_irq_delivered(delivered);
                     87: }
                     88: 
                     89: static void kvm_ioapic_init(IOAPICCommonState *s, int instance_no)
                     90: {
                     91:     memory_region_init_reservation(&s->io_memory, "kvm-ioapic", 0x1000);
                     92: 
                     93:     qdev_init_gpio_in(&s->busdev.qdev, kvm_ioapic_set_irq, IOAPIC_NUM_PINS);
                     94: }
                     95: 
                     96: static Property kvm_ioapic_properties[] = {
                     97:     DEFINE_PROP_UINT32("gsi_base", KVMIOAPICState, kvm_gsi_base, 0),
                     98:     DEFINE_PROP_END_OF_LIST()
                     99: };
                    100: 
                    101: static void kvm_ioapic_class_init(ObjectClass *klass, void *data)
                    102: {
                    103:     IOAPICCommonClass *k = IOAPIC_COMMON_CLASS(klass);
                    104:     DeviceClass *dc = DEVICE_CLASS(klass);
                    105: 
                    106:     k->init      = kvm_ioapic_init;
                    107:     k->pre_save  = kvm_ioapic_get;
                    108:     k->post_load = kvm_ioapic_put;
                    109:     dc->reset    = kvm_ioapic_reset;
                    110:     dc->props    = kvm_ioapic_properties;
                    111: }
                    112: 
                    113: static TypeInfo kvm_ioapic_info = {
                    114:     .name  = "kvm-ioapic",
                    115:     .parent = TYPE_IOAPIC_COMMON,
                    116:     .instance_size = sizeof(KVMIOAPICState),
                    117:     .class_init = kvm_ioapic_class_init,
                    118: };
                    119: 
                    120: static void kvm_ioapic_register_types(void)
                    121: {
                    122:     type_register_static(&kvm_ioapic_info);
                    123: }
                    124: 
                    125: type_init(kvm_ioapic_register_types)

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.