Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 197667
b: refs/heads/master
c: 4a5f48f
h: refs/heads/master
i:
  197665: 6e1fad2
  197663: 43bb52c
v: v3
  • Loading branch information
Avi Kivity committed May 17, 2010
1 parent 0d11670 commit e647dd2
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 7 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: daea3e73cb4ac971bee97f333ae027861d00fc0b
refs/heads/master: 4a5f48f666ccc4ffdbc54241d9cab06806ed7922
30 changes: 24 additions & 6 deletions trunk/arch/x86/kvm/x86.c
Original file line number Diff line number Diff line change
Expand Up @@ -3234,7 +3234,8 @@ int emulator_write_phys(struct kvm_vcpu *vcpu, gpa_t gpa,
static int emulator_write_emulated_onepage(unsigned long addr,
const void *val,
unsigned int bytes,
struct kvm_vcpu *vcpu)
struct kvm_vcpu *vcpu,
bool mmu_only)
{
gpa_t gpa;
u32 error_code;
Expand All @@ -3250,6 +3251,10 @@ static int emulator_write_emulated_onepage(unsigned long addr,
if ((gpa & PAGE_MASK) == APIC_DEFAULT_PHYS_BASE)
goto mmio;

if (mmu_only) {
kvm_mmu_pte_write(vcpu, gpa, val, bytes, 1);
return X86EMUL_CONTINUE;
}
if (emulator_write_phys(vcpu, gpa, val, bytes))
return X86EMUL_CONTINUE;

Expand All @@ -3270,24 +3275,35 @@ static int emulator_write_emulated_onepage(unsigned long addr,
return X86EMUL_CONTINUE;
}

int emulator_write_emulated(unsigned long addr,
int __emulator_write_emulated(unsigned long addr,
const void *val,
unsigned int bytes,
struct kvm_vcpu *vcpu)
struct kvm_vcpu *vcpu,
bool mmu_only)
{
/* Crossing a page boundary? */
if (((addr + bytes - 1) ^ addr) & PAGE_MASK) {
int rc, now;

now = -addr & ~PAGE_MASK;
rc = emulator_write_emulated_onepage(addr, val, now, vcpu);
rc = emulator_write_emulated_onepage(addr, val, now, vcpu,
mmu_only);
if (rc != X86EMUL_CONTINUE)
return rc;
addr += now;
val += now;
bytes -= now;
}
return emulator_write_emulated_onepage(addr, val, bytes, vcpu);
return emulator_write_emulated_onepage(addr, val, bytes, vcpu,
mmu_only);
}

int emulator_write_emulated(unsigned long addr,
const void *val,
unsigned int bytes,
struct kvm_vcpu *vcpu)
{
return __emulator_write_emulated(addr, val, bytes, vcpu, false);
}
EXPORT_SYMBOL_GPL(emulator_write_emulated);

Expand Down Expand Up @@ -3351,6 +3367,8 @@ static int emulator_cmpxchg_emulated(unsigned long addr,
if (!exchanged)
return X86EMUL_CMPXCHG_FAILED;

return __emulator_write_emulated(addr, new, bytes, vcpu, true);

emul_write:
printk_once(KERN_WARNING "kvm: emulating exchange as write\n");

Expand Down Expand Up @@ -4005,7 +4023,7 @@ int kvm_fix_hypercall(struct kvm_vcpu *vcpu)

kvm_x86_ops->patch_hypercall(vcpu, instruction);

return emulator_write_emulated(rip, instruction, 3, vcpu);
return __emulator_write_emulated(rip, instruction, 3, vcpu, false);
}

static u64 mk_cr_64(u64 curr_cr, u32 new_val)
Expand Down

0 comments on commit e647dd2

Please sign in to comment.