git://ftp.safe.ca
/
safe
/
jmp
/
linux-2.6
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
KVM: Activate Virtualization On Demand
[safe/jmp/linux-2.6]
/
arch
/
x86
/
kvm
/
svm.c
diff --git
a/arch/x86/kvm/svm.c
b/arch/x86/kvm/svm.c
index
f54c4f9
..
59fe4d5
100644
(file)
--- a/
arch/x86/kvm/svm.c
+++ b/
arch/x86/kvm/svm.c
@@
-316,7
+316,7
@@
static void svm_hardware_disable(void *garbage)
cpu_svm_disable();
}
cpu_svm_disable();
}
-static
void
svm_hardware_enable(void *garbage)
+static
int
svm_hardware_enable(void *garbage)
{
struct svm_cpu_data *svm_data;
{
struct svm_cpu_data *svm_data;
@@
-325,16
+325,20
@@
static void svm_hardware_enable(void *garbage)
struct desc_struct *gdt;
int me = raw_smp_processor_id();
struct desc_struct *gdt;
int me = raw_smp_processor_id();
+ rdmsrl(MSR_EFER, efer);
+ if (efer & EFER_SVME)
+ return -EBUSY;
+
if (!has_svm()) {
printk(KERN_ERR "svm_cpu_init: err EOPNOTSUPP on %d\n", me);
if (!has_svm()) {
printk(KERN_ERR "svm_cpu_init: err EOPNOTSUPP on %d\n", me);
- return;
+ return
-EINVAL
;
}
svm_data = per_cpu(svm_data, me);
if (!svm_data) {
printk(KERN_ERR "svm_cpu_init: svm_data is NULL on %d\n",
me);
}
svm_data = per_cpu(svm_data, me);
if (!svm_data) {
printk(KERN_ERR "svm_cpu_init: svm_data is NULL on %d\n",
me);
- return;
+ return
-EINVAL
;
}
svm_data->asid_generation = 1;
}
svm_data->asid_generation = 1;
@@
-345,11
+349,12
@@
static void svm_hardware_enable(void *garbage)
gdt = (struct desc_struct *)gdt_descr.base;
svm_data->tss_desc = (struct kvm_ldttss_desc *)(gdt + GDT_ENTRY_TSS);
gdt = (struct desc_struct *)gdt_descr.base;
svm_data->tss_desc = (struct kvm_ldttss_desc *)(gdt + GDT_ENTRY_TSS);
- rdmsrl(MSR_EFER, efer);
wrmsrl(MSR_EFER, efer | EFER_SVME);
wrmsrl(MSR_VM_HSAVE_PA,
page_to_pfn(svm_data->save_area) << PAGE_SHIFT);
wrmsrl(MSR_EFER, efer | EFER_SVME);
wrmsrl(MSR_VM_HSAVE_PA,
page_to_pfn(svm_data->save_area) << PAGE_SHIFT);
+
+ return 0;
}
static void svm_cpu_uninit(int cpu)
}
static void svm_cpu_uninit(int cpu)