Annotation of qemu/hw/kvm/i8259.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * KVM in-kernel PIC (i8259) 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: #include "hw/i8259_internal.h"
        !            13: #include "hw/apic_internal.h"
        !            14: #include "kvm.h"
        !            15: 
        !            16: static void kvm_pic_get(PICCommonState *s)
        !            17: {
        !            18:     struct kvm_irqchip chip;
        !            19:     struct kvm_pic_state *kpic;
        !            20:     int ret;
        !            21: 
        !            22:     chip.chip_id = s->master ? KVM_IRQCHIP_PIC_MASTER : KVM_IRQCHIP_PIC_SLAVE;
        !            23:     ret = kvm_vm_ioctl(kvm_state, KVM_GET_IRQCHIP, &chip);
        !            24:     if (ret < 0) {
        !            25:         fprintf(stderr, "KVM_GET_IRQCHIP failed: %s\n", strerror(ret));
        !            26:         abort();
        !            27:     }
        !            28: 
        !            29:     kpic = &chip.chip.pic;
        !            30: 
        !            31:     s->last_irr = kpic->last_irr;
        !            32:     s->irr = kpic->irr;
        !            33:     s->imr = kpic->imr;
        !            34:     s->isr = kpic->isr;
        !            35:     s->priority_add = kpic->priority_add;
        !            36:     s->irq_base = kpic->irq_base;
        !            37:     s->read_reg_select = kpic->read_reg_select;
        !            38:     s->poll = kpic->poll;
        !            39:     s->special_mask = kpic->special_mask;
        !            40:     s->init_state = kpic->init_state;
        !            41:     s->auto_eoi = kpic->auto_eoi;
        !            42:     s->rotate_on_auto_eoi = kpic->rotate_on_auto_eoi;
        !            43:     s->special_fully_nested_mode = kpic->special_fully_nested_mode;
        !            44:     s->init4 = kpic->init4;
        !            45:     s->elcr = kpic->elcr;
        !            46:     s->elcr_mask = kpic->elcr_mask;
        !            47: }
        !            48: 
        !            49: static void kvm_pic_put(PICCommonState *s)
        !            50: {
        !            51:     struct kvm_irqchip chip;
        !            52:     struct kvm_pic_state *kpic;
        !            53:     int ret;
        !            54: 
        !            55:     chip.chip_id = s->master ? KVM_IRQCHIP_PIC_MASTER : KVM_IRQCHIP_PIC_SLAVE;
        !            56: 
        !            57:     kpic = &chip.chip.pic;
        !            58: 
        !            59:     kpic->last_irr = s->last_irr;
        !            60:     kpic->irr = s->irr;
        !            61:     kpic->imr = s->imr;
        !            62:     kpic->isr = s->isr;
        !            63:     kpic->priority_add = s->priority_add;
        !            64:     kpic->irq_base = s->irq_base;
        !            65:     kpic->read_reg_select = s->read_reg_select;
        !            66:     kpic->poll = s->poll;
        !            67:     kpic->special_mask = s->special_mask;
        !            68:     kpic->init_state = s->init_state;
        !            69:     kpic->auto_eoi = s->auto_eoi;
        !            70:     kpic->rotate_on_auto_eoi = s->rotate_on_auto_eoi;
        !            71:     kpic->special_fully_nested_mode = s->special_fully_nested_mode;
        !            72:     kpic->init4 = s->init4;
        !            73:     kpic->elcr = s->elcr;
        !            74:     kpic->elcr_mask = s->elcr_mask;
        !            75: 
        !            76:     ret = kvm_vm_ioctl(kvm_state, KVM_SET_IRQCHIP, &chip);
        !            77:     if (ret < 0) {
        !            78:         fprintf(stderr, "KVM_GET_IRQCHIP failed: %s\n", strerror(ret));
        !            79:         abort();
        !            80:     }
        !            81: }
        !            82: 
        !            83: static void kvm_pic_reset(DeviceState *dev)
        !            84: {
        !            85:     PICCommonState *s = DO_UPCAST(PICCommonState, dev.qdev, dev);
        !            86: 
        !            87:     s->elcr = 0;
        !            88:     pic_reset_common(s);
        !            89: 
        !            90:     kvm_pic_put(s);
        !            91: }
        !            92: 
        !            93: static void kvm_pic_set_irq(void *opaque, int irq, int level)
        !            94: {
        !            95:     int delivered;
        !            96: 
        !            97:     delivered = kvm_irqchip_set_irq(kvm_state, irq, level);
        !            98:     apic_report_irq_delivered(delivered);
        !            99: }
        !           100: 
        !           101: static void kvm_pic_init(PICCommonState *s)
        !           102: {
        !           103:     memory_region_init_reservation(&s->base_io, "kvm-pic", 2);
        !           104:     memory_region_init_reservation(&s->elcr_io, "kvm-elcr", 1);
        !           105: }
        !           106: 
        !           107: qemu_irq *kvm_i8259_init(ISABus *bus)
        !           108: {
        !           109:     i8259_init_chip("kvm-i8259", bus, true);
        !           110:     i8259_init_chip("kvm-i8259", bus, false);
        !           111: 
        !           112:     return qemu_allocate_irqs(kvm_pic_set_irq, NULL, ISA_NUM_IRQS);
        !           113: }
        !           114: 
        !           115: static void kvm_i8259_class_init(ObjectClass *klass, void *data)
        !           116: {
        !           117:     PICCommonClass *k = PIC_COMMON_CLASS(klass);
        !           118:     DeviceClass *dc = DEVICE_CLASS(klass);
        !           119: 
        !           120:     dc->reset     = kvm_pic_reset;
        !           121:     k->init       = kvm_pic_init;
        !           122:     k->pre_save   = kvm_pic_get;
        !           123:     k->post_load  = kvm_pic_put;
        !           124: }
        !           125: 
        !           126: static TypeInfo kvm_i8259_info = {
        !           127:     .name  = "kvm-i8259",
        !           128:     .parent = TYPE_PIC_COMMON,
        !           129:     .instance_size = sizeof(PICCommonState),
        !           130:     .class_init = kvm_i8259_class_init,
        !           131: };
        !           132: 
        !           133: static void kvm_pic_register_types(void)
        !           134: {
        !           135:     type_register_static(&kvm_i8259_info);
        !           136: }
        !           137: 
        !           138: type_init(kvm_pic_register_types)

unix.superglobalmegacorp.com

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