aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/kvm/x86.c
diff options
context:
space:
mode:
authorGleb Natapov <gleb@redhat.com>2010-04-13 03:21:56 -0400
committerAvi Kivity <avi@redhat.com>2010-05-17 05:17:43 -0400
commit8f6abd06f521112a0a3bc906df273fa3ce0a9387 (patch)
tree5f7c453b6cfeed776c6387d78a516dbd37c8ab0c /arch/x86/kvm/x86.c
parent660c22c425cbe14badfb3b0a0206862577701ab7 (diff)
KVM: x86: get rid of mmu_only parameter in emulator_write_emulated()
We can call kvm_mmu_pte_write() directly from emulator_cmpxchg_emulated() instead of passing mmu_only down to emulator_write_emulated_onepage() and call it there. Signed-off-by: Gleb Natapov <gleb@redhat.com> Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
Diffstat (limited to 'arch/x86/kvm/x86.c')
-rw-r--r--arch/x86/kvm/x86.c36
1 files changed, 11 insertions, 25 deletions
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
index 09dccac2df7e..40991527f54a 100644
--- a/arch/x86/kvm/x86.c
+++ b/arch/x86/kvm/x86.c
@@ -3322,8 +3322,7 @@ int emulator_write_phys(struct kvm_vcpu *vcpu, gpa_t gpa,
3322static int emulator_write_emulated_onepage(unsigned long addr, 3322static int emulator_write_emulated_onepage(unsigned long addr,
3323 const void *val, 3323 const void *val,
3324 unsigned int bytes, 3324 unsigned int bytes,
3325 struct kvm_vcpu *vcpu, 3325 struct kvm_vcpu *vcpu)
3326 bool mmu_only)
3327{ 3326{
3328 gpa_t gpa; 3327 gpa_t gpa;
3329 u32 error_code; 3328 u32 error_code;
@@ -3339,10 +3338,6 @@ static int emulator_write_emulated_onepage(unsigned long addr,
3339 if ((gpa & PAGE_MASK) == APIC_DEFAULT_PHYS_BASE) 3338 if ((gpa & PAGE_MASK) == APIC_DEFAULT_PHYS_BASE)
3340 goto mmio; 3339 goto mmio;
3341 3340
3342 if (mmu_only) {
3343 kvm_mmu_pte_write(vcpu, gpa, val, bytes, 1);
3344 return X86EMUL_CONTINUE;
3345 }
3346 if (emulator_write_phys(vcpu, gpa, val, bytes)) 3341 if (emulator_write_phys(vcpu, gpa, val, bytes))
3347 return X86EMUL_CONTINUE; 3342 return X86EMUL_CONTINUE;
3348 3343
@@ -3363,35 +3358,24 @@ mmio:
3363 return X86EMUL_CONTINUE; 3358 return X86EMUL_CONTINUE;
3364} 3359}
3365 3360
3366int __emulator_write_emulated(unsigned long addr, 3361int emulator_write_emulated(unsigned long addr,
3367 const void *val, 3362 const void *val,
3368 unsigned int bytes, 3363 unsigned int bytes,
3369 struct kvm_vcpu *vcpu, 3364 struct kvm_vcpu *vcpu)
3370 bool mmu_only)
3371{ 3365{
3372 /* Crossing a page boundary? */ 3366 /* Crossing a page boundary? */
3373 if (((addr + bytes - 1) ^ addr) & PAGE_MASK) { 3367 if (((addr + bytes - 1) ^ addr) & PAGE_MASK) {
3374 int rc, now; 3368 int rc, now;
3375 3369
3376 now = -addr & ~PAGE_MASK; 3370 now = -addr & ~PAGE_MASK;
3377 rc = emulator_write_emulated_onepage(addr, val, now, vcpu, 3371 rc = emulator_write_emulated_onepage(addr, val, now, vcpu);
3378 mmu_only);
3379 if (rc != X86EMUL_CONTINUE) 3372 if (rc != X86EMUL_CONTINUE)
3380 return rc; 3373 return rc;
3381 addr += now; 3374 addr += now;
3382 val += now; 3375 val += now;
3383 bytes -= now; 3376 bytes -= now;
3384 } 3377 }
3385 return emulator_write_emulated_onepage(addr, val, bytes, vcpu, 3378 return emulator_write_emulated_onepage(addr, val, bytes, vcpu);
3386 mmu_only);
3387}
3388
3389int emulator_write_emulated(unsigned long addr,
3390 const void *val,
3391 unsigned int bytes,
3392 struct kvm_vcpu *vcpu)
3393{
3394 return __emulator_write_emulated(addr, val, bytes, vcpu, false);
3395} 3379}
3396EXPORT_SYMBOL_GPL(emulator_write_emulated); 3380EXPORT_SYMBOL_GPL(emulator_write_emulated);
3397 3381
@@ -3455,7 +3439,9 @@ static int emulator_cmpxchg_emulated(unsigned long addr,
3455 if (!exchanged) 3439 if (!exchanged)
3456 return X86EMUL_CMPXCHG_FAILED; 3440 return X86EMUL_CMPXCHG_FAILED;
3457 3441
3458 return __emulator_write_emulated(addr, new, bytes, vcpu, true); 3442 kvm_mmu_pte_write(vcpu, gpa, new, bytes, 1);
3443
3444 return X86EMUL_CONTINUE;
3459 3445
3460emul_write: 3446emul_write:
3461 printk_once(KERN_WARNING "kvm: emulating exchange as write\n"); 3447 printk_once(KERN_WARNING "kvm: emulating exchange as write\n");
@@ -4165,7 +4151,7 @@ int kvm_fix_hypercall(struct kvm_vcpu *vcpu)
4165 4151
4166 kvm_x86_ops->patch_hypercall(vcpu, instruction); 4152 kvm_x86_ops->patch_hypercall(vcpu, instruction);
4167 4153
4168 return __emulator_write_emulated(rip, instruction, 3, vcpu, false); 4154 return emulator_write_emulated(rip, instruction, 3, vcpu);
4169} 4155}
4170 4156
4171void realmode_lgdt(struct kvm_vcpu *vcpu, u16 limit, unsigned long base) 4157void realmode_lgdt(struct kvm_vcpu *vcpu, u16 limit, unsigned long base)