29 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
32 #include <linux/slab.h>
33 #include <linux/bitops.h>
36 #include <linux/kvm_host.h>
39 #define pr_pic_unimpl(fmt, ...) \
40 pr_err_ratelimited("pic: " fmt, ## __VA_ARGS__)
53 bool wakeup = s->wakeup_needed;
54 struct kvm_vcpu *vcpu;
57 s->wakeup_needed =
false;
59 spin_unlock(&s->lock);
62 kvm_for_each_vcpu(i, vcpu, s->kvm) {
64 kvm_make_request(KVM_REQ_EVENT, vcpu);
74 s->
isr &= ~(1 << irq);
97 ret = !(s->
irr & mask);
107 ret = !(s->
irr & mask);
114 return (s->
imr & mask) ? -1 : ret;
127 while ((mask & (1 << ((priority + s->
priority_add) & 7))) == 0)
137 int mask, cur_priority, priority;
152 if (priority < cur_priority)
195 irq_level = __kvm_irq_line_state(&s->
irq_states[irq],
196 irq_source_id, level);
199 trace_kvm_pic_set_irq(irq >> 3, irq & 7, s->
pics[irq >> 3].
elcr,
200 s->
pics[irq >> 3].
imr, ret == 0);
212 __clear_bit(irq_source_id, &s->
irq_states[i]);
225 if (!(s->
elcr & (1 << irq)))
226 s->
irr &= ~(1 << irq);
238 int irq, irq2, intno;
276 struct kvm_vcpu *vcpu;
277 u8 edge_irr = s->
irr & ~s->
elcr;
303 if (edge_irr & (1 << irq))
310 int priority, cmd, irq;
320 "level sensitive irq not supported");
322 }
else if (val & 0x08) {
369 u8 imr_diff = s->
imr ^ val,
373 if (imr_diff & (1 << irq))
378 !!(s->
imr & (1 << irq)));
410 s->
irr &= ~(1 << ret);
412 if (addr1 >> 7 || ret != 2)
457 gpa_t addr,
int len,
const void *val)
459 unsigned char data = *(
unsigned char *)val;
491 gpa_t addr,
int len,
void *val)
493 unsigned char *data = (
unsigned char *)val;
522 gpa_t addr,
int len,
const void *val)
529 gpa_t addr,
int len,
void *val)
536 gpa_t addr,
int len,
const void *val)
543 gpa_t addr,
int len,
void *val)
550 gpa_t addr,
int len,
const void *val)
557 gpa_t addr,
int len,
void *val)
595 s = kzalloc(
sizeof(
struct kvm_pic), GFP_KERNEL_ACCOUNT);
598 spin_lock_init(&s->
lock);
611 mutex_lock(&
kvm->slots_lock);
625 mutex_unlock(&
kvm->slots_lock);
638 mutex_unlock(&
kvm->slots_lock);
652 mutex_lock(&
kvm->slots_lock);
656 mutex_unlock(&
kvm->slots_lock);
658 kvm->arch.vpic = NULL;
static int picdev_read(struct kvm_pic *s, gpa_t addr, int len, void *val)
int kvm_pic_set_irq(struct kvm_pic *s, int irq, int irq_source_id, int level)
static void pic_intack(struct kvm_kpic_state *s, int irq)
static int picdev_elcr_write(struct kvm_vcpu *vcpu, struct kvm_io_device *dev, gpa_t addr, int len, const void *val)
static void pic_unlock(struct kvm_pic *s) __releases(&s -> lock)
static void kvm_pic_reset(struct kvm_kpic_state *s)
static void elcr_ioport_write(void *opaque, u32 val)
static void pic_ioport_write(void *opaque, u32 addr, u32 val)
#define pr_pic_unimpl(fmt,...)
static int pic_get_irq(struct kvm_kpic_state *s)
void kvm_pic_destroy(struct kvm *kvm)
void kvm_pic_clear_all(struct kvm_pic *s, int irq_source_id)
static int picdev_slave_write(struct kvm_vcpu *vcpu, struct kvm_io_device *dev, gpa_t addr, int len, const void *val)
void kvm_pic_update_irq(struct kvm_pic *s)
static int picdev_slave_read(struct kvm_vcpu *vcpu, struct kvm_io_device *dev, gpa_t addr, int len, void *val)
int kvm_pic_read_irq(struct kvm *kvm)
static void pic_clear_isr(struct kvm_kpic_state *s, int irq)
static void pic_irq_request(struct kvm *kvm, int level)
static int pic_set_irq1(struct kvm_kpic_state *s, int irq, int level)
static const struct kvm_io_device_ops picdev_elcr_ops
static int picdev_elcr_read(struct kvm_vcpu *vcpu, struct kvm_io_device *dev, gpa_t addr, int len, void *val)
static u32 pic_ioport_read(void *opaque, u32 addr)
static const struct kvm_io_device_ops picdev_master_ops
static void pic_lock(struct kvm_pic *s) __acquires(&s -> lock)
int kvm_pic_init(struct kvm *kvm)
static int picdev_master_read(struct kvm_vcpu *vcpu, struct kvm_io_device *dev, gpa_t addr, int len, void *val)
static int picdev_write(struct kvm_pic *s, gpa_t addr, int len, const void *val)
static u32 pic_poll_read(struct kvm_kpic_state *s, u32 addr1)
static int get_priority(struct kvm_kpic_state *s, int mask)
static int picdev_master_write(struct kvm_vcpu *vcpu, struct kvm_io_device *dev, gpa_t addr, int len, const void *val)
static void pic_update_irq(struct kvm_pic *s)
static u32 elcr_ioport_read(void *opaque)
static const struct kvm_io_device_ops picdev_slave_ops
static void kvm_iodevice_init(struct kvm_io_device *dev, const struct kvm_io_device_ops *ops)
void kvm_fire_mask_notifiers(struct kvm *kvm, unsigned irqchip, unsigned pin, bool mask)
int kvm_io_bus_register_dev(struct kvm *kvm, enum kvm_bus bus_idx, gpa_t addr, int len, struct kvm_io_device *dev)
int kvm_io_bus_unregister_dev(struct kvm *kvm, enum kvm_bus bus_idx, struct kvm_io_device *dev)
void kvm_vcpu_kick(struct kvm_vcpu *vcpu)
int kvm_apic_accept_pic_intr(struct kvm_vcpu *vcpu)
int(* read)(struct kvm_vcpu *vcpu, struct kvm_io_device *this, gpa_t addr, int len, void *val)
struct kvm_pic * pics_state
u8 special_fully_nested_mode
struct kvm_kpic_state pics[2]
struct kvm_io_device dev_master
struct kvm_io_device dev_elcr
struct kvm_io_device dev_slave
unsigned long irq_states[PIC_NUM_PINS]