x86.c (afbcf7ab8d1bc8c2d04792f6d9e786e0adeb328d) | x86.c (18863bdd60f895f3b3ba16b15e8331aee781e8ec) |
---|---|
1/* 2 * Kernel-based Virtual Machine driver for Linux 3 * 4 * derived from drivers/kvm/kvm_main.c 5 * 6 * Copyright (C) 2006 Qumranet, Inc. 7 * Copyright (C) 2008 Qumranet, Inc. 8 * Copyright IBM Corporation, 2008 --- 23 unchanged lines hidden (view full) --- 32#include <linux/fs.h> 33#include <linux/vmalloc.h> 34#include <linux/module.h> 35#include <linux/mman.h> 36#include <linux/highmem.h> 37#include <linux/iommu.h> 38#include <linux/intel-iommu.h> 39#include <linux/cpufreq.h> | 1/* 2 * Kernel-based Virtual Machine driver for Linux 3 * 4 * derived from drivers/kvm/kvm_main.c 5 * 6 * Copyright (C) 2006 Qumranet, Inc. 7 * Copyright (C) 2008 Qumranet, Inc. 8 * Copyright IBM Corporation, 2008 --- 23 unchanged lines hidden (view full) --- 32#include <linux/fs.h> 33#include <linux/vmalloc.h> 34#include <linux/module.h> 35#include <linux/mman.h> 36#include <linux/highmem.h> 37#include <linux/iommu.h> 38#include <linux/intel-iommu.h> 39#include <linux/cpufreq.h> |
40#include <linux/user-return-notifier.h> |
|
40#include <trace/events/kvm.h> 41#undef TRACE_INCLUDE_FILE 42#define CREATE_TRACE_POINTS 43#include "trace.h" 44 45#include <asm/uaccess.h> 46#include <asm/msr.h> 47#include <asm/desc.h> --- 34 unchanged lines hidden (view full) --- 82 struct kvm_cpuid_entry2 __user *entries); 83 84struct kvm_x86_ops *kvm_x86_ops; 85EXPORT_SYMBOL_GPL(kvm_x86_ops); 86 87int ignore_msrs = 0; 88module_param_named(ignore_msrs, ignore_msrs, bool, S_IRUGO | S_IWUSR); 89 | 41#include <trace/events/kvm.h> 42#undef TRACE_INCLUDE_FILE 43#define CREATE_TRACE_POINTS 44#include "trace.h" 45 46#include <asm/uaccess.h> 47#include <asm/msr.h> 48#include <asm/desc.h> --- 34 unchanged lines hidden (view full) --- 83 struct kvm_cpuid_entry2 __user *entries); 84 85struct kvm_x86_ops *kvm_x86_ops; 86EXPORT_SYMBOL_GPL(kvm_x86_ops); 87 88int ignore_msrs = 0; 89module_param_named(ignore_msrs, ignore_msrs, bool, S_IRUGO | S_IWUSR); 90 |
91#define KVM_NR_SHARED_MSRS 16 92 93struct kvm_shared_msrs_global { 94 int nr; 95 struct kvm_shared_msr { 96 u32 msr; 97 u64 value; 98 } msrs[KVM_NR_SHARED_MSRS]; 99}; 100 101struct kvm_shared_msrs { 102 struct user_return_notifier urn; 103 bool registered; 104 u64 current_value[KVM_NR_SHARED_MSRS]; 105}; 106 107static struct kvm_shared_msrs_global __read_mostly shared_msrs_global; 108static DEFINE_PER_CPU(struct kvm_shared_msrs, shared_msrs); 109 |
|
90struct kvm_stats_debugfs_item debugfs_entries[] = { 91 { "pf_fixed", VCPU_STAT(pf_fixed) }, 92 { "pf_guest", VCPU_STAT(pf_guest) }, 93 { "tlb_flush", VCPU_STAT(tlb_flush) }, 94 { "invlpg", VCPU_STAT(invlpg) }, 95 { "exits", VCPU_STAT(exits) }, 96 { "io_exits", VCPU_STAT(io_exits) }, 97 { "mmio_exits", VCPU_STAT(mmio_exits) }, --- 20 unchanged lines hidden (view full) --- 118 { "mmu_recycled", VM_STAT(mmu_recycled) }, 119 { "mmu_cache_miss", VM_STAT(mmu_cache_miss) }, 120 { "mmu_unsync", VM_STAT(mmu_unsync) }, 121 { "remote_tlb_flush", VM_STAT(remote_tlb_flush) }, 122 { "largepages", VM_STAT(lpages) }, 123 { NULL } 124}; 125 | 110struct kvm_stats_debugfs_item debugfs_entries[] = { 111 { "pf_fixed", VCPU_STAT(pf_fixed) }, 112 { "pf_guest", VCPU_STAT(pf_guest) }, 113 { "tlb_flush", VCPU_STAT(tlb_flush) }, 114 { "invlpg", VCPU_STAT(invlpg) }, 115 { "exits", VCPU_STAT(exits) }, 116 { "io_exits", VCPU_STAT(io_exits) }, 117 { "mmio_exits", VCPU_STAT(mmio_exits) }, --- 20 unchanged lines hidden (view full) --- 138 { "mmu_recycled", VM_STAT(mmu_recycled) }, 139 { "mmu_cache_miss", VM_STAT(mmu_cache_miss) }, 140 { "mmu_unsync", VM_STAT(mmu_unsync) }, 141 { "remote_tlb_flush", VM_STAT(remote_tlb_flush) }, 142 { "largepages", VM_STAT(lpages) }, 143 { NULL } 144}; 145 |
146static void kvm_on_user_return(struct user_return_notifier *urn) 147{ 148 unsigned slot; 149 struct kvm_shared_msr *global; 150 struct kvm_shared_msrs *locals 151 = container_of(urn, struct kvm_shared_msrs, urn); 152 153 for (slot = 0; slot < shared_msrs_global.nr; ++slot) { 154 global = &shared_msrs_global.msrs[slot]; 155 if (global->value != locals->current_value[slot]) { 156 wrmsrl(global->msr, global->value); 157 locals->current_value[slot] = global->value; 158 } 159 } 160 locals->registered = false; 161 user_return_notifier_unregister(urn); 162} 163 164void kvm_define_shared_msr(unsigned slot, u32 msr) 165{ 166 int cpu; 167 u64 value; 168 169 if (slot >= shared_msrs_global.nr) 170 shared_msrs_global.nr = slot + 1; 171 shared_msrs_global.msrs[slot].msr = msr; 172 rdmsrl_safe(msr, &value); 173 shared_msrs_global.msrs[slot].value = value; 174 for_each_online_cpu(cpu) 175 per_cpu(shared_msrs, cpu).current_value[slot] = value; 176} 177EXPORT_SYMBOL_GPL(kvm_define_shared_msr); 178 179static void kvm_shared_msr_cpu_online(void) 180{ 181 unsigned i; 182 struct kvm_shared_msrs *locals = &__get_cpu_var(shared_msrs); 183 184 for (i = 0; i < shared_msrs_global.nr; ++i) 185 locals->current_value[i] = shared_msrs_global.msrs[i].value; 186} 187 188void kvm_set_shared_msr(unsigned slot, u64 value) 189{ 190 struct kvm_shared_msrs *smsr = &__get_cpu_var(shared_msrs); 191 192 if (value == smsr->current_value[slot]) 193 return; 194 smsr->current_value[slot] = value; 195 wrmsrl(shared_msrs_global.msrs[slot].msr, value); 196 if (!smsr->registered) { 197 smsr->urn.on_user_return = kvm_on_user_return; 198 user_return_notifier_register(&smsr->urn); 199 smsr->registered = true; 200 } 201} 202EXPORT_SYMBOL_GPL(kvm_set_shared_msr); 203 |
|
126unsigned long segment_base(u16 selector) 127{ 128 struct descriptor_table gdt; 129 struct desc_struct *d; 130 unsigned long table_base; 131 unsigned long v; 132 133 if (selector == 0) --- 4676 unchanged lines hidden (view full) --- 4810 /* 4811 * Since this may be called from a hotplug notifcation, 4812 * we can't get the CPU frequency directly. 4813 */ 4814 if (!boot_cpu_has(X86_FEATURE_CONSTANT_TSC)) { 4815 int cpu = raw_smp_processor_id(); 4816 per_cpu(cpu_tsc_khz, cpu) = 0; 4817 } | 204unsigned long segment_base(u16 selector) 205{ 206 struct descriptor_table gdt; 207 struct desc_struct *d; 208 unsigned long table_base; 209 unsigned long v; 210 211 if (selector == 0) --- 4676 unchanged lines hidden (view full) --- 4888 /* 4889 * Since this may be called from a hotplug notifcation, 4890 * we can't get the CPU frequency directly. 4891 */ 4892 if (!boot_cpu_has(X86_FEATURE_CONSTANT_TSC)) { 4893 int cpu = raw_smp_processor_id(); 4894 per_cpu(cpu_tsc_khz, cpu) = 0; 4895 } |
4896 4897 kvm_shared_msr_cpu_online(); 4898 |
|
4818 return kvm_x86_ops->hardware_enable(garbage); 4819} 4820 4821void kvm_arch_hardware_disable(void *garbage) 4822{ 4823 kvm_x86_ops->hardware_disable(garbage); 4824} 4825 --- 268 unchanged lines hidden --- | 4899 return kvm_x86_ops->hardware_enable(garbage); 4900} 4901 4902void kvm_arch_hardware_disable(void *garbage) 4903{ 4904 kvm_x86_ops->hardware_disable(garbage); 4905} 4906 --- 268 unchanged lines hidden --- |