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 ---