Loading arch/x86/kvm/vmx.c +25 −34 Original line number Diff line number Diff line Loading @@ -111,9 +111,9 @@ static DEFINE_PER_CPU(struct vmcs *, vmxarea); static DEFINE_PER_CPU(struct vmcs *, current_vmcs); static DEFINE_PER_CPU(struct list_head, vcpus_on_cpu); static struct page *vmx_io_bitmap_a; static struct page *vmx_io_bitmap_b; static struct page *vmx_msr_bitmap; static unsigned long *vmx_io_bitmap_a; static unsigned long *vmx_io_bitmap_b; static unsigned long *vmx_msr_bitmap; static DECLARE_BITMAP(vmx_vpid_bitmap, VMX_NR_VPIDS); static DEFINE_SPINLOCK(vmx_vpid_lock); Loading Loading @@ -2082,9 +2082,9 @@ static void allocate_vpid(struct vcpu_vmx *vmx) spin_unlock(&vmx_vpid_lock); } static void vmx_disable_intercept_for_msr(struct page *msr_bitmap, u32 msr) static void vmx_disable_intercept_for_msr(unsigned long *msr_bitmap, u32 msr) { void *va; int f = sizeof(unsigned long); if (!cpu_has_vmx_msr_bitmap()) return; Loading @@ -2094,16 +2094,14 @@ static void vmx_disable_intercept_for_msr(struct page *msr_bitmap, u32 msr) * have the write-low and read-high bitmap offsets the wrong way round. * We can control MSRs 0x00000000-0x00001fff and 0xc0000000-0xc0001fff. */ va = kmap(msr_bitmap); if (msr <= 0x1fff) { __clear_bit(msr, va + 0x000); /* read-low */ __clear_bit(msr, va + 0x800); /* write-low */ __clear_bit(msr, msr_bitmap + 0x000 / f); /* read-low */ __clear_bit(msr, msr_bitmap + 0x800 / f); /* write-low */ } else if ((msr >= 0xc0000000) && (msr <= 0xc0001fff)) { msr &= 0x1fff; __clear_bit(msr, va + 0x400); /* read-high */ __clear_bit(msr, va + 0xc00); /* write-high */ __clear_bit(msr, msr_bitmap + 0x400 / f); /* read-high */ __clear_bit(msr, msr_bitmap + 0xc00 / f); /* write-high */ } kunmap(msr_bitmap); } /* Loading @@ -2121,11 +2119,11 @@ static int vmx_vcpu_setup(struct vcpu_vmx *vmx) u32 exec_control; /* I/O */ vmcs_write64(IO_BITMAP_A, page_to_phys(vmx_io_bitmap_a)); vmcs_write64(IO_BITMAP_B, page_to_phys(vmx_io_bitmap_b)); vmcs_write64(IO_BITMAP_A, __pa(vmx_io_bitmap_a)); vmcs_write64(IO_BITMAP_B, __pa(vmx_io_bitmap_b)); if (cpu_has_vmx_msr_bitmap()) vmcs_write64(MSR_BITMAP, page_to_phys(vmx_msr_bitmap)); vmcs_write64(MSR_BITMAP, __pa(vmx_msr_bitmap)); vmcs_write64(VMCS_LINK_POINTER, -1ull); /* 22.3.1.5 */ Loading Loading @@ -3695,20 +3693,19 @@ static struct kvm_x86_ops vmx_x86_ops = { static int __init vmx_init(void) { void *va; int r; vmx_io_bitmap_a = alloc_page(GFP_KERNEL | __GFP_HIGHMEM); vmx_io_bitmap_a = (unsigned long *)__get_free_page(GFP_KERNEL); if (!vmx_io_bitmap_a) return -ENOMEM; vmx_io_bitmap_b = alloc_page(GFP_KERNEL | __GFP_HIGHMEM); vmx_io_bitmap_b = (unsigned long *)__get_free_page(GFP_KERNEL); if (!vmx_io_bitmap_b) { r = -ENOMEM; goto out; } vmx_msr_bitmap = alloc_page(GFP_KERNEL | __GFP_HIGHMEM); vmx_msr_bitmap = (unsigned long *)__get_free_page(GFP_KERNEL); if (!vmx_msr_bitmap) { r = -ENOMEM; goto out1; Loading @@ -3718,18 +3715,12 @@ static int __init vmx_init(void) * Allow direct access to the PC debug port (it is often used for I/O * delays, but the vmexits simply slow things down). */ va = kmap(vmx_io_bitmap_a); memset(va, 0xff, PAGE_SIZE); clear_bit(0x80, va); kunmap(vmx_io_bitmap_a); memset(vmx_io_bitmap_a, 0xff, PAGE_SIZE); clear_bit(0x80, vmx_io_bitmap_a); va = kmap(vmx_io_bitmap_b); memset(va, 0xff, PAGE_SIZE); kunmap(vmx_io_bitmap_b); memset(vmx_io_bitmap_b, 0xff, PAGE_SIZE); va = kmap(vmx_msr_bitmap); memset(va, 0xff, PAGE_SIZE); kunmap(vmx_msr_bitmap); memset(vmx_msr_bitmap, 0xff, PAGE_SIZE); set_bit(0, vmx_vpid_bitmap); /* 0 is reserved for host */ Loading Loading @@ -3762,19 +3753,19 @@ static int __init vmx_init(void) return 0; out2: __free_page(vmx_msr_bitmap); free_page((unsigned long)vmx_msr_bitmap); out1: __free_page(vmx_io_bitmap_b); free_page((unsigned long)vmx_io_bitmap_b); out: __free_page(vmx_io_bitmap_a); free_page((unsigned long)vmx_io_bitmap_a); return r; } static void __exit vmx_exit(void) { __free_page(vmx_msr_bitmap); __free_page(vmx_io_bitmap_b); __free_page(vmx_io_bitmap_a); free_page((unsigned long)vmx_msr_bitmap); free_page((unsigned long)vmx_io_bitmap_b); free_page((unsigned long)vmx_io_bitmap_a); kvm_exit(); } Loading Loading
arch/x86/kvm/vmx.c +25 −34 Original line number Diff line number Diff line Loading @@ -111,9 +111,9 @@ static DEFINE_PER_CPU(struct vmcs *, vmxarea); static DEFINE_PER_CPU(struct vmcs *, current_vmcs); static DEFINE_PER_CPU(struct list_head, vcpus_on_cpu); static struct page *vmx_io_bitmap_a; static struct page *vmx_io_bitmap_b; static struct page *vmx_msr_bitmap; static unsigned long *vmx_io_bitmap_a; static unsigned long *vmx_io_bitmap_b; static unsigned long *vmx_msr_bitmap; static DECLARE_BITMAP(vmx_vpid_bitmap, VMX_NR_VPIDS); static DEFINE_SPINLOCK(vmx_vpid_lock); Loading Loading @@ -2082,9 +2082,9 @@ static void allocate_vpid(struct vcpu_vmx *vmx) spin_unlock(&vmx_vpid_lock); } static void vmx_disable_intercept_for_msr(struct page *msr_bitmap, u32 msr) static void vmx_disable_intercept_for_msr(unsigned long *msr_bitmap, u32 msr) { void *va; int f = sizeof(unsigned long); if (!cpu_has_vmx_msr_bitmap()) return; Loading @@ -2094,16 +2094,14 @@ static void vmx_disable_intercept_for_msr(struct page *msr_bitmap, u32 msr) * have the write-low and read-high bitmap offsets the wrong way round. * We can control MSRs 0x00000000-0x00001fff and 0xc0000000-0xc0001fff. */ va = kmap(msr_bitmap); if (msr <= 0x1fff) { __clear_bit(msr, va + 0x000); /* read-low */ __clear_bit(msr, va + 0x800); /* write-low */ __clear_bit(msr, msr_bitmap + 0x000 / f); /* read-low */ __clear_bit(msr, msr_bitmap + 0x800 / f); /* write-low */ } else if ((msr >= 0xc0000000) && (msr <= 0xc0001fff)) { msr &= 0x1fff; __clear_bit(msr, va + 0x400); /* read-high */ __clear_bit(msr, va + 0xc00); /* write-high */ __clear_bit(msr, msr_bitmap + 0x400 / f); /* read-high */ __clear_bit(msr, msr_bitmap + 0xc00 / f); /* write-high */ } kunmap(msr_bitmap); } /* Loading @@ -2121,11 +2119,11 @@ static int vmx_vcpu_setup(struct vcpu_vmx *vmx) u32 exec_control; /* I/O */ vmcs_write64(IO_BITMAP_A, page_to_phys(vmx_io_bitmap_a)); vmcs_write64(IO_BITMAP_B, page_to_phys(vmx_io_bitmap_b)); vmcs_write64(IO_BITMAP_A, __pa(vmx_io_bitmap_a)); vmcs_write64(IO_BITMAP_B, __pa(vmx_io_bitmap_b)); if (cpu_has_vmx_msr_bitmap()) vmcs_write64(MSR_BITMAP, page_to_phys(vmx_msr_bitmap)); vmcs_write64(MSR_BITMAP, __pa(vmx_msr_bitmap)); vmcs_write64(VMCS_LINK_POINTER, -1ull); /* 22.3.1.5 */ Loading Loading @@ -3695,20 +3693,19 @@ static struct kvm_x86_ops vmx_x86_ops = { static int __init vmx_init(void) { void *va; int r; vmx_io_bitmap_a = alloc_page(GFP_KERNEL | __GFP_HIGHMEM); vmx_io_bitmap_a = (unsigned long *)__get_free_page(GFP_KERNEL); if (!vmx_io_bitmap_a) return -ENOMEM; vmx_io_bitmap_b = alloc_page(GFP_KERNEL | __GFP_HIGHMEM); vmx_io_bitmap_b = (unsigned long *)__get_free_page(GFP_KERNEL); if (!vmx_io_bitmap_b) { r = -ENOMEM; goto out; } vmx_msr_bitmap = alloc_page(GFP_KERNEL | __GFP_HIGHMEM); vmx_msr_bitmap = (unsigned long *)__get_free_page(GFP_KERNEL); if (!vmx_msr_bitmap) { r = -ENOMEM; goto out1; Loading @@ -3718,18 +3715,12 @@ static int __init vmx_init(void) * Allow direct access to the PC debug port (it is often used for I/O * delays, but the vmexits simply slow things down). */ va = kmap(vmx_io_bitmap_a); memset(va, 0xff, PAGE_SIZE); clear_bit(0x80, va); kunmap(vmx_io_bitmap_a); memset(vmx_io_bitmap_a, 0xff, PAGE_SIZE); clear_bit(0x80, vmx_io_bitmap_a); va = kmap(vmx_io_bitmap_b); memset(va, 0xff, PAGE_SIZE); kunmap(vmx_io_bitmap_b); memset(vmx_io_bitmap_b, 0xff, PAGE_SIZE); va = kmap(vmx_msr_bitmap); memset(va, 0xff, PAGE_SIZE); kunmap(vmx_msr_bitmap); memset(vmx_msr_bitmap, 0xff, PAGE_SIZE); set_bit(0, vmx_vpid_bitmap); /* 0 is reserved for host */ Loading Loading @@ -3762,19 +3753,19 @@ static int __init vmx_init(void) return 0; out2: __free_page(vmx_msr_bitmap); free_page((unsigned long)vmx_msr_bitmap); out1: __free_page(vmx_io_bitmap_b); free_page((unsigned long)vmx_io_bitmap_b); out: __free_page(vmx_io_bitmap_a); free_page((unsigned long)vmx_io_bitmap_a); return r; } static void __exit vmx_exit(void) { __free_page(vmx_msr_bitmap); __free_page(vmx_io_bitmap_b); __free_page(vmx_io_bitmap_a); free_page((unsigned long)vmx_msr_bitmap); free_page((unsigned long)vmx_io_bitmap_b); free_page((unsigned long)vmx_io_bitmap_a); kvm_exit(); } Loading