diff options
Diffstat (limited to 'arch/x86/kvm/i8259.c')
-rw-r--r-- | arch/x86/kvm/i8259.c | 25 |
1 files changed, 15 insertions, 10 deletions
diff --git a/arch/x86/kvm/i8259.c b/arch/x86/kvm/i8259.c index 4b7b73ce2098..f628234fbeca 100644 --- a/arch/x86/kvm/i8259.c +++ b/arch/x86/kvm/i8259.c | |||
@@ -3,7 +3,7 @@ | |||
3 | * | 3 | * |
4 | * Copyright (c) 2003-2004 Fabrice Bellard | 4 | * Copyright (c) 2003-2004 Fabrice Bellard |
5 | * Copyright (c) 2007 Intel Corporation | 5 | * Copyright (c) 2007 Intel Corporation |
6 | * Copyright 2009 Red Hat, Inc. and/or its affilates. | 6 | * Copyright 2009 Red Hat, Inc. and/or its affiliates. |
7 | * | 7 | * |
8 | * Permission is hereby granted, free of charge, to any person obtaining a copy | 8 | * Permission is hereby granted, free of charge, to any person obtaining a copy |
9 | * of this software and associated documentation files (the "Software"), to deal | 9 | * of this software and associated documentation files (the "Software"), to deal |
@@ -39,7 +39,7 @@ static void pic_irq_request(struct kvm *kvm, int level); | |||
39 | static void pic_lock(struct kvm_pic *s) | 39 | static void pic_lock(struct kvm_pic *s) |
40 | __acquires(&s->lock) | 40 | __acquires(&s->lock) |
41 | { | 41 | { |
42 | raw_spin_lock(&s->lock); | 42 | spin_lock(&s->lock); |
43 | } | 43 | } |
44 | 44 | ||
45 | static void pic_unlock(struct kvm_pic *s) | 45 | static void pic_unlock(struct kvm_pic *s) |
@@ -51,7 +51,7 @@ static void pic_unlock(struct kvm_pic *s) | |||
51 | 51 | ||
52 | s->wakeup_needed = false; | 52 | s->wakeup_needed = false; |
53 | 53 | ||
54 | raw_spin_unlock(&s->lock); | 54 | spin_unlock(&s->lock); |
55 | 55 | ||
56 | if (wakeup) { | 56 | if (wakeup) { |
57 | kvm_for_each_vcpu(i, vcpu, s->kvm) { | 57 | kvm_for_each_vcpu(i, vcpu, s->kvm) { |
@@ -67,6 +67,7 @@ static void pic_unlock(struct kvm_pic *s) | |||
67 | if (!found) | 67 | if (!found) |
68 | return; | 68 | return; |
69 | 69 | ||
70 | kvm_make_request(KVM_REQ_EVENT, found); | ||
70 | kvm_vcpu_kick(found); | 71 | kvm_vcpu_kick(found); |
71 | } | 72 | } |
72 | } | 73 | } |
@@ -308,13 +309,17 @@ static void pic_ioport_write(void *opaque, u32 addr, u32 val) | |||
308 | addr &= 1; | 309 | addr &= 1; |
309 | if (addr == 0) { | 310 | if (addr == 0) { |
310 | if (val & 0x10) { | 311 | if (val & 0x10) { |
311 | kvm_pic_reset(s); /* init */ | ||
312 | /* | ||
313 | * deassert a pending interrupt | ||
314 | */ | ||
315 | pic_irq_request(s->pics_state->kvm, 0); | ||
316 | s->init_state = 1; | ||
317 | s->init4 = val & 1; | 312 | s->init4 = val & 1; |
313 | s->last_irr = 0; | ||
314 | s->imr = 0; | ||
315 | s->priority_add = 0; | ||
316 | s->special_mask = 0; | ||
317 | s->read_reg_select = 0; | ||
318 | if (!s->init4) { | ||
319 | s->special_fully_nested_mode = 0; | ||
320 | s->auto_eoi = 0; | ||
321 | } | ||
322 | s->init_state = 1; | ||
318 | if (val & 0x02) | 323 | if (val & 0x02) |
319 | printk(KERN_ERR "single mode not supported"); | 324 | printk(KERN_ERR "single mode not supported"); |
320 | if (val & 0x08) | 325 | if (val & 0x08) |
@@ -564,7 +569,7 @@ struct kvm_pic *kvm_create_pic(struct kvm *kvm) | |||
564 | s = kzalloc(sizeof(struct kvm_pic), GFP_KERNEL); | 569 | s = kzalloc(sizeof(struct kvm_pic), GFP_KERNEL); |
565 | if (!s) | 570 | if (!s) |
566 | return NULL; | 571 | return NULL; |
567 | raw_spin_lock_init(&s->lock); | 572 | spin_lock_init(&s->lock); |
568 | s->kvm = kvm; | 573 | s->kvm = kvm; |
569 | s->pics[0].elcr_mask = 0xf8; | 574 | s->pics[0].elcr_mask = 0xf8; |
570 | s->pics[1].elcr_mask = 0xde; | 575 | s->pics[1].elcr_mask = 0xde; |