diff options
Diffstat (limited to 'drivers/kvm/kvm_main.c')
-rw-r--r-- | drivers/kvm/kvm_main.c | 58 |
1 files changed, 30 insertions, 28 deletions
diff --git a/drivers/kvm/kvm_main.c b/drivers/kvm/kvm_main.c index 9ea9277014aa..a1983d2d5b8f 100644 --- a/drivers/kvm/kvm_main.c +++ b/drivers/kvm/kvm_main.c | |||
@@ -104,7 +104,7 @@ static struct dentry *debugfs_dir; | |||
104 | #define EFER_RESERVED_BITS 0xfffffffffffff2fe | 104 | #define EFER_RESERVED_BITS 0xfffffffffffff2fe |
105 | 105 | ||
106 | #ifdef CONFIG_X86_64 | 106 | #ifdef CONFIG_X86_64 |
107 | // LDT or TSS descriptor in the GDT. 16 bytes. | 107 | /* LDT or TSS descriptor in the GDT. 16 bytes. */ |
108 | struct segment_descriptor_64 { | 108 | struct segment_descriptor_64 { |
109 | struct segment_descriptor s; | 109 | struct segment_descriptor s; |
110 | u32 base_higher; | 110 | u32 base_higher; |
@@ -121,27 +121,27 @@ unsigned long segment_base(u16 selector) | |||
121 | struct descriptor_table gdt; | 121 | struct descriptor_table gdt; |
122 | struct segment_descriptor *d; | 122 | struct segment_descriptor *d; |
123 | unsigned long table_base; | 123 | unsigned long table_base; |
124 | typedef unsigned long ul; | ||
125 | unsigned long v; | 124 | unsigned long v; |
126 | 125 | ||
127 | if (selector == 0) | 126 | if (selector == 0) |
128 | return 0; | 127 | return 0; |
129 | 128 | ||
130 | asm ("sgdt %0" : "=m"(gdt)); | 129 | asm("sgdt %0" : "=m"(gdt)); |
131 | table_base = gdt.base; | 130 | table_base = gdt.base; |
132 | 131 | ||
133 | if (selector & 4) { /* from ldt */ | 132 | if (selector & 4) { /* from ldt */ |
134 | u16 ldt_selector; | 133 | u16 ldt_selector; |
135 | 134 | ||
136 | asm ("sldt %0" : "=g"(ldt_selector)); | 135 | asm("sldt %0" : "=g"(ldt_selector)); |
137 | table_base = segment_base(ldt_selector); | 136 | table_base = segment_base(ldt_selector); |
138 | } | 137 | } |
139 | d = (struct segment_descriptor *)(table_base + (selector & ~7)); | 138 | d = (struct segment_descriptor *)(table_base + (selector & ~7)); |
140 | v = d->base_low | ((ul)d->base_mid << 16) | ((ul)d->base_high << 24); | 139 | v = d->base_low | ((unsigned long)d->base_mid << 16) | |
140 | ((unsigned long)d->base_high << 24); | ||
141 | #ifdef CONFIG_X86_64 | 141 | #ifdef CONFIG_X86_64 |
142 | if (d->system == 0 | 142 | if (d->system == 0 && (d->type == 2 || d->type == 9 || d->type == 11)) |
143 | && (d->type == 2 || d->type == 9 || d->type == 11)) | 143 | v |= ((unsigned long) \ |
144 | v |= ((ul)((struct segment_descriptor_64 *)d)->base_higher) << 32; | 144 | ((struct segment_descriptor_64 *)d)->base_higher) << 32; |
145 | #endif | 145 | #endif |
146 | return v; | 146 | return v; |
147 | } | 147 | } |
@@ -721,7 +721,7 @@ static int kvm_vm_ioctl_set_memory_region(struct kvm *kvm, | |||
721 | if (!new.phys_mem) | 721 | if (!new.phys_mem) |
722 | goto out_unlock; | 722 | goto out_unlock; |
723 | 723 | ||
724 | new.rmap = vmalloc(npages * sizeof(struct page*)); | 724 | new.rmap = vmalloc(npages * sizeof(struct page *)); |
725 | 725 | ||
726 | if (!new.rmap) | 726 | if (!new.rmap) |
727 | goto out_unlock; | 727 | goto out_unlock; |
@@ -904,17 +904,17 @@ static int kvm_vm_ioctl_get_irqchip(struct kvm *kvm, struct kvm_irqchip *chip) | |||
904 | r = 0; | 904 | r = 0; |
905 | switch (chip->chip_id) { | 905 | switch (chip->chip_id) { |
906 | case KVM_IRQCHIP_PIC_MASTER: | 906 | case KVM_IRQCHIP_PIC_MASTER: |
907 | memcpy (&chip->chip.pic, | 907 | memcpy(&chip->chip.pic, |
908 | &pic_irqchip(kvm)->pics[0], | 908 | &pic_irqchip(kvm)->pics[0], |
909 | sizeof(struct kvm_pic_state)); | 909 | sizeof(struct kvm_pic_state)); |
910 | break; | 910 | break; |
911 | case KVM_IRQCHIP_PIC_SLAVE: | 911 | case KVM_IRQCHIP_PIC_SLAVE: |
912 | memcpy (&chip->chip.pic, | 912 | memcpy(&chip->chip.pic, |
913 | &pic_irqchip(kvm)->pics[1], | 913 | &pic_irqchip(kvm)->pics[1], |
914 | sizeof(struct kvm_pic_state)); | 914 | sizeof(struct kvm_pic_state)); |
915 | break; | 915 | break; |
916 | case KVM_IRQCHIP_IOAPIC: | 916 | case KVM_IRQCHIP_IOAPIC: |
917 | memcpy (&chip->chip.ioapic, | 917 | memcpy(&chip->chip.ioapic, |
918 | ioapic_irqchip(kvm), | 918 | ioapic_irqchip(kvm), |
919 | sizeof(struct kvm_ioapic_state)); | 919 | sizeof(struct kvm_ioapic_state)); |
920 | break; | 920 | break; |
@@ -932,17 +932,17 @@ static int kvm_vm_ioctl_set_irqchip(struct kvm *kvm, struct kvm_irqchip *chip) | |||
932 | r = 0; | 932 | r = 0; |
933 | switch (chip->chip_id) { | 933 | switch (chip->chip_id) { |
934 | case KVM_IRQCHIP_PIC_MASTER: | 934 | case KVM_IRQCHIP_PIC_MASTER: |
935 | memcpy (&pic_irqchip(kvm)->pics[0], | 935 | memcpy(&pic_irqchip(kvm)->pics[0], |
936 | &chip->chip.pic, | 936 | &chip->chip.pic, |
937 | sizeof(struct kvm_pic_state)); | 937 | sizeof(struct kvm_pic_state)); |
938 | break; | 938 | break; |
939 | case KVM_IRQCHIP_PIC_SLAVE: | 939 | case KVM_IRQCHIP_PIC_SLAVE: |
940 | memcpy (&pic_irqchip(kvm)->pics[1], | 940 | memcpy(&pic_irqchip(kvm)->pics[1], |
941 | &chip->chip.pic, | 941 | &chip->chip.pic, |
942 | sizeof(struct kvm_pic_state)); | 942 | sizeof(struct kvm_pic_state)); |
943 | break; | 943 | break; |
944 | case KVM_IRQCHIP_IOAPIC: | 944 | case KVM_IRQCHIP_IOAPIC: |
945 | memcpy (ioapic_irqchip(kvm), | 945 | memcpy(ioapic_irqchip(kvm), |
946 | &chip->chip.ioapic, | 946 | &chip->chip.ioapic, |
947 | sizeof(struct kvm_ioapic_state)); | 947 | sizeof(struct kvm_ioapic_state)); |
948 | break; | 948 | break; |
@@ -1341,7 +1341,7 @@ int emulate_clts(struct kvm_vcpu *vcpu) | |||
1341 | return X86EMUL_CONTINUE; | 1341 | return X86EMUL_CONTINUE; |
1342 | } | 1342 | } |
1343 | 1343 | ||
1344 | int emulator_get_dr(struct x86_emulate_ctxt* ctxt, int dr, unsigned long *dest) | 1344 | int emulator_get_dr(struct x86_emulate_ctxt *ctxt, int dr, unsigned long *dest) |
1345 | { | 1345 | { |
1346 | struct kvm_vcpu *vcpu = ctxt->vcpu; | 1346 | struct kvm_vcpu *vcpu = ctxt->vcpu; |
1347 | 1347 | ||
@@ -1934,7 +1934,7 @@ static void pio_string_write(struct kvm_io_device *pio_dev, | |||
1934 | mutex_unlock(&vcpu->kvm->lock); | 1934 | mutex_unlock(&vcpu->kvm->lock); |
1935 | } | 1935 | } |
1936 | 1936 | ||
1937 | int kvm_emulate_pio (struct kvm_vcpu *vcpu, struct kvm_run *run, int in, | 1937 | int kvm_emulate_pio(struct kvm_vcpu *vcpu, struct kvm_run *run, int in, |
1938 | int size, unsigned port) | 1938 | int size, unsigned port) |
1939 | { | 1939 | { |
1940 | struct kvm_io_device *pio_dev; | 1940 | struct kvm_io_device *pio_dev; |
@@ -2089,7 +2089,7 @@ static int __vcpu_run(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run) | |||
2089 | int r; | 2089 | int r; |
2090 | 2090 | ||
2091 | if (unlikely(vcpu->mp_state == VCPU_MP_STATE_SIPI_RECEIVED)) { | 2091 | if (unlikely(vcpu->mp_state == VCPU_MP_STATE_SIPI_RECEIVED)) { |
2092 | printk("vcpu %d received sipi with vector # %x\n", | 2092 | pr_debug("vcpu %d received sipi with vector # %x\n", |
2093 | vcpu->vcpu_id, vcpu->sipi_vector); | 2093 | vcpu->vcpu_id, vcpu->sipi_vector); |
2094 | kvm_lapic_reset(vcpu); | 2094 | kvm_lapic_reset(vcpu); |
2095 | kvm_x86_ops->vcpu_reset(vcpu); | 2095 | kvm_x86_ops->vcpu_reset(vcpu); |
@@ -2363,7 +2363,8 @@ static int kvm_vcpu_ioctl_get_sregs(struct kvm_vcpu *vcpu, | |||
2363 | sizeof sregs->interrupt_bitmap); | 2363 | sizeof sregs->interrupt_bitmap); |
2364 | pending_vec = kvm_x86_ops->get_irq(vcpu); | 2364 | pending_vec = kvm_x86_ops->get_irq(vcpu); |
2365 | if (pending_vec >= 0) | 2365 | if (pending_vec >= 0) |
2366 | set_bit(pending_vec, (unsigned long *)sregs->interrupt_bitmap); | 2366 | set_bit(pending_vec, |
2367 | (unsigned long *)sregs->interrupt_bitmap); | ||
2367 | } else | 2368 | } else |
2368 | memcpy(sregs->interrupt_bitmap, vcpu->irq_pending, | 2369 | memcpy(sregs->interrupt_bitmap, vcpu->irq_pending, |
2369 | sizeof sregs->interrupt_bitmap); | 2370 | sizeof sregs->interrupt_bitmap); |
@@ -2436,7 +2437,8 @@ static int kvm_vcpu_ioctl_set_sregs(struct kvm_vcpu *vcpu, | |||
2436 | /* Only pending external irq is handled here */ | 2437 | /* Only pending external irq is handled here */ |
2437 | if (pending_vec < max_bits) { | 2438 | if (pending_vec < max_bits) { |
2438 | kvm_x86_ops->set_irq(vcpu, pending_vec); | 2439 | kvm_x86_ops->set_irq(vcpu, pending_vec); |
2439 | printk("Set back pending irq %d\n", pending_vec); | 2440 | pr_debug("Set back pending irq %d\n", |
2441 | pending_vec); | ||
2440 | } | 2442 | } |
2441 | } | 2443 | } |
2442 | 2444 | ||
@@ -3155,8 +3157,7 @@ static long kvm_vm_ioctl(struct file *filp, | |||
3155 | kvm->vpic = NULL; | 3157 | kvm->vpic = NULL; |
3156 | goto out; | 3158 | goto out; |
3157 | } | 3159 | } |
3158 | } | 3160 | } else |
3159 | else | ||
3160 | goto out; | 3161 | goto out; |
3161 | break; | 3162 | break; |
3162 | case KVM_IRQ_LINE: { | 3163 | case KVM_IRQ_LINE: { |
@@ -3448,7 +3449,7 @@ static int kvm_cpu_hotplug(struct notifier_block *notifier, unsigned long val, | |||
3448 | } | 3449 | } |
3449 | 3450 | ||
3450 | static int kvm_reboot(struct notifier_block *notifier, unsigned long val, | 3451 | static int kvm_reboot(struct notifier_block *notifier, unsigned long val, |
3451 | void *v) | 3452 | void *v) |
3452 | { | 3453 | { |
3453 | if (val == SYS_RESTART) { | 3454 | if (val == SYS_RESTART) { |
3454 | /* | 3455 | /* |
@@ -3655,7 +3656,7 @@ int kvm_init_x86(struct kvm_x86_ops *ops, unsigned int vcpu_size, | |||
3655 | 3656 | ||
3656 | r = misc_register(&kvm_dev); | 3657 | r = misc_register(&kvm_dev); |
3657 | if (r) { | 3658 | if (r) { |
3658 | printk (KERN_ERR "kvm: misc device register failed\n"); | 3659 | printk(KERN_ERR "kvm: misc device register failed\n"); |
3659 | goto out_free; | 3660 | goto out_free; |
3660 | } | 3661 | } |
3661 | 3662 | ||
@@ -3683,6 +3684,7 @@ out: | |||
3683 | kvm_x86_ops = NULL; | 3684 | kvm_x86_ops = NULL; |
3684 | return r; | 3685 | return r; |
3685 | } | 3686 | } |
3687 | EXPORT_SYMBOL_GPL(kvm_init_x86); | ||
3686 | 3688 | ||
3687 | void kvm_exit_x86(void) | 3689 | void kvm_exit_x86(void) |
3688 | { | 3690 | { |
@@ -3696,6 +3698,7 @@ void kvm_exit_x86(void) | |||
3696 | kvm_x86_ops->hardware_unsetup(); | 3698 | kvm_x86_ops->hardware_unsetup(); |
3697 | kvm_x86_ops = NULL; | 3699 | kvm_x86_ops = NULL; |
3698 | } | 3700 | } |
3701 | EXPORT_SYMBOL_GPL(kvm_exit_x86); | ||
3699 | 3702 | ||
3700 | static __init int kvm_init(void) | 3703 | static __init int kvm_init(void) |
3701 | { | 3704 | { |
@@ -3710,7 +3713,9 @@ static __init int kvm_init(void) | |||
3710 | 3713 | ||
3711 | kvm_init_msr_list(); | 3714 | kvm_init_msr_list(); |
3712 | 3715 | ||
3713 | if ((bad_page = alloc_page(GFP_KERNEL)) == NULL) { | 3716 | bad_page = alloc_page(GFP_KERNEL); |
3717 | |||
3718 | if (bad_page == NULL) { | ||
3714 | r = -ENOMEM; | 3719 | r = -ENOMEM; |
3715 | goto out; | 3720 | goto out; |
3716 | } | 3721 | } |
@@ -3736,6 +3741,3 @@ static __exit void kvm_exit(void) | |||
3736 | 3741 | ||
3737 | module_init(kvm_init) | 3742 | module_init(kvm_init) |
3738 | module_exit(kvm_exit) | 3743 | module_exit(kvm_exit) |
3739 | |||
3740 | EXPORT_SYMBOL_GPL(kvm_init_x86); | ||
3741 | EXPORT_SYMBOL_GPL(kvm_exit_x86); | ||