Lines Matching defs:s
46 static void pic_lock(struct kvm_pic *s)
47 __acquires(&s->lock)
49 spin_lock(&s->lock);
52 static void pic_unlock(struct kvm_pic *s)
53 __releases(&s->lock)
55 bool wakeup = s->wakeup_needed;
59 s->wakeup_needed = false;
61 spin_unlock(&s->lock);
64 kvm_for_each_vcpu(i, vcpu, s->kvm) {
74 static void pic_clear_isr(struct kvm_kpic_state *s, int irq)
76 s->isr &= ~(1 << irq);
77 if (s != &s->pics_state->pics[0])
85 pic_unlock(s->pics_state);
86 kvm_notify_acked_irq(s->pics_state->kvm, SELECT_PIC(irq), irq);
87 pic_lock(s->pics_state);
93 static inline int pic_set_irq1(struct kvm_kpic_state *s, int irq, int level)
97 if (s->elcr & mask) /* level triggered */
99 ret = !(s->irr & mask);
100 s->irr |= mask;
101 s->last_irr |= mask;
103 s->irr &= ~mask;
104 s->last_irr &= ~mask;
108 if ((s->last_irr & mask) == 0) {
109 ret = !(s->irr & mask);
110 s->irr |= mask;
112 s->last_irr |= mask;
114 s->last_irr &= ~mask;
116 return (s->imr & mask) ? -1 : ret;
123 static inline int get_priority(struct kvm_kpic_state *s, int mask)
129 while ((mask & (1 << ((priority + s->priority_add) & 7))) == 0)
137 static int pic_get_irq(struct kvm_kpic_state *s)
141 mask = s->irr & ~s->imr;
142 priority = get_priority(s, mask);
150 mask = s->isr;
151 if (s->special_fully_nested_mode && s == &s->pics_state->pics[0])
153 cur_priority = get_priority(s, mask);
158 return (priority + s->priority_add) & 7;
167 static void pic_update_irq(struct kvm_pic *s)
171 irq2 = pic_get_irq(&s->pics[1]);
176 pic_set_irq1(&s->pics[0], 2, 1);
177 pic_set_irq1(&s->pics[0], 2, 0);
179 irq = pic_get_irq(&s->pics[0]);
180 pic_irq_request(s->kvm, irq >= 0);
183 void kvm_pic_update_irq(struct kvm_pic *s)
185 pic_lock(s);
186 pic_update_irq(s);
187 pic_unlock(s);
193 struct kvm_pic *s = kvm->arch.vpic;
199 pic_lock(s);
200 irq_level = __kvm_irq_line_state(&s->irq_states[irq],
202 ret = pic_set_irq1(&s->pics[irq >> 3], irq & 7, irq_level);
203 pic_update_irq(s);
204 trace_kvm_pic_set_irq(irq >> 3, irq & 7, s->pics[irq >> 3].elcr,
205 s->pics[irq >> 3].imr, ret == 0);
206 pic_unlock(s);
214 static inline void pic_intack(struct kvm_kpic_state *s, int irq)
216 s->isr |= 1 << irq;
220 if (!(s->elcr & (1 << irq)))
221 s->irr &= ~(1 << irq);
223 if (s->auto_eoi) {
224 if (s->rotate_on_auto_eoi)
225 s->priority_add = (irq + 1) & 7;
226 pic_clear_isr(s, irq);
234 struct kvm_pic *s = kvm->arch.vpic;
236 s->output = 0;
238 pic_lock(s);
239 irq = pic_get_irq(&s->pics[0]);
241 pic_intack(&s->pics[0], irq);
243 irq2 = pic_get_irq(&s->pics[1]);
245 pic_intack(&s->pics[1], irq2);
251 intno = s->pics[1].irq_base + irq2;
253 intno = s->pics[0].irq_base + irq;
259 intno = s->pics[0].irq_base + irq;
261 pic_update_irq(s);
262 pic_unlock(s);
267 static void kvm_pic_reset(struct kvm_kpic_state *s)
272 u8 edge_irr = s->irr & ~s->elcr;
275 s->last_irr = 0;
276 s->irr &= s->elcr;
277 s->imr = 0;
278 s->priority_add = 0;
279 s->special_mask = 0;
280 s->read_reg_select = 0;
281 if (!s->init4) {
282 s->special_fully_nested_mode = 0;
283 s->auto_eoi = 0;
285 s->init_state = 1;
287 kvm_for_each_vcpu(i, vcpu, s->pics_state->kvm)
299 pic_clear_isr(s, irq);
304 struct kvm_kpic_state *s = opaque;
310 s->init4 = val & 1;
316 kvm_pic_reset(s);
319 s->poll = 1;
321 s->read_reg_select = val & 1;
323 s->special_mask = (val >> 5) & 1;
329 s->rotate_on_auto_eoi = cmd >> 2;
333 priority = get_priority(s, s->isr);
335 irq = (priority + s->priority_add) & 7;
337 s->priority_add = (irq + 1) & 7;
338 pic_clear_isr(s, irq);
339 pic_update_irq(s->pics_state);
344 pic_clear_isr(s, irq);
345 pic_update_irq(s->pics_state);
348 s->priority_add = (val + 1) & 7;
349 pic_update_irq(s->pics_state);
353 s->priority_add = (irq + 1) & 7;
354 pic_clear_isr(s, irq);
355 pic_update_irq(s->pics_state);
362 switch (s->init_state) {
364 u8 imr_diff = s->imr ^ val,
365 off = (s == &s->pics_state->pics[0]) ? 0 : 8;
366 s->imr = val;
370 s->pics_state->kvm,
373 !!(s->imr & (1 << irq)));
374 pic_update_irq(s->pics_state);
378 s->irq_base = val & 0xf8;
379 s->init_state = 2;
382 if (s->init4)
383 s->init_state = 3;
385 s->init_state = 0;
388 s->special_fully_nested_mode = (val >> 4) & 1;
389 s->auto_eoi = (val >> 1) & 1;
390 s->init_state = 0;
395 static u32 pic_poll_read(struct kvm_kpic_state *s, u32 addr1)
399 ret = pic_get_irq(s);
402 s->pics_state->pics[0].isr &= ~(1 << 2);
403 s->pics_state->pics[0].irr &= ~(1 << 2);
405 s->irr &= ~(1 << ret);
406 pic_clear_isr(s, ret);
408 pic_update_irq(s->pics_state);
409 /* Bit 7 is 1, means there's an interrupt */
412 /* Bit 7 is 0, means there's no interrupt */
414 pic_update_irq(s->pics_state);
422 struct kvm_kpic_state *s = opaque;
425 if (s->poll) {
426 ret = pic_poll_read(s, addr);
427 s->poll = 0;
430 if (s->read_reg_select)
431 ret = s->isr;
433 ret = s->irr;
435 ret = s->imr;
441 struct kvm_kpic_state *s = opaque;
442 s->elcr = val & s->elcr_mask;
447 struct kvm_kpic_state *s = opaque;
448 return s->elcr;
451 static int picdev_write(struct kvm_pic *s,
463 pic_lock(s);
464 pic_ioport_write(&s->pics[0], addr, data);
465 pic_unlock(s);
469 pic_lock(s);
470 pic_ioport_write(&s->pics[1], addr, data);
471 pic_unlock(s);
475 pic_lock(s);
476 elcr_ioport_write(&s->pics[addr & 1], data);
477 pic_unlock(s);
485 static int picdev_read(struct kvm_pic *s,
500 pic_lock(s);
501 *data = pic_ioport_read(&s->pics[addr >> 7], addr);
502 pic_unlock(s);
506 pic_lock(s);
507 *data = elcr_ioport_read(&s->pics[addr & 1]);
508 pic_unlock(s);
563 struct kvm_pic *s = kvm->arch.vpic;
565 if (!s->output && level)
566 s->wakeup_needed = true;
567 s->output = level;
587 struct kvm_pic *s;
590 s = kzalloc(sizeof(struct kvm_pic), GFP_KERNEL_ACCOUNT);
591 if (!s)
593 spin_lock_init(&s->lock);
594 s->kvm = kvm;
595 s->pics[0].elcr_mask = 0xf8;
596 s->pics[1].elcr_mask = 0xde;
597 s->pics[0].pics_state = s;
598 s->pics[1].pics_state = s;
603 kvm_iodevice_init(&s->dev_master, &picdev_master_ops);
604 kvm_iodevice_init(&s->dev_slave, &picdev_slave_ops);
605 kvm_iodevice_init(&s->dev_elcr, &picdev_elcr_ops);
608 &s->dev_master);
612 ret = kvm_io_bus_register_dev(kvm, KVM_PIO_BUS, 0xa0, 2, &s->dev_slave);
616 ret = kvm_io_bus_register_dev(kvm, KVM_PIO_BUS, 0x4d0, 2, &s->dev_elcr);
622 kvm->arch.vpic = s;
627 kvm_io_bus_unregister_dev(kvm, KVM_PIO_BUS, &s->dev_slave);
630 kvm_io_bus_unregister_dev(kvm, KVM_PIO_BUS, &s->dev_master);
635 kfree(s);