Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 45265
b: refs/heads/master
c: da4a00f
h: refs/heads/master
i:
  45263: 13d95d3
v: v3
  • Loading branch information
Avi Kivity authored and Linus Torvalds committed Jan 6, 2007
1 parent 3d7d02f commit b0328b3
Show file tree
Hide file tree
Showing 4 changed files with 37 additions and 1 deletion.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 815af8d42ee3f844c0ceaf2104bd9c6a0bb1e26c
refs/heads/master: da4a00f002239f72b0d7d0eeaa3b60100e2b1438
3 changes: 3 additions & 0 deletions trunk/drivers/kvm/kvm.h
Original file line number Diff line number Diff line change
Expand Up @@ -448,6 +448,9 @@ int kvm_write_guest(struct kvm_vcpu *vcpu,

unsigned long segment_base(u16 selector);

void kvm_mmu_pre_write(struct kvm_vcpu *vcpu, gpa_t gpa, int bytes);
void kvm_mmu_post_write(struct kvm_vcpu *vcpu, gpa_t gpa, int bytes);

static inline struct page *_gfn_to_page(struct kvm *kvm, gfn_t gfn)
{
struct kvm_memory_slot *slot = gfn_to_memslot(kvm, gfn);
Expand Down
24 changes: 24 additions & 0 deletions trunk/drivers/kvm/kvm_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -877,6 +877,27 @@ static int emulator_read_emulated(unsigned long addr,
}
}

static int emulator_write_phys(struct kvm_vcpu *vcpu, gpa_t gpa,
unsigned long val, int bytes)
{
struct kvm_memory_slot *m;
struct page *page;
void *virt;

if (((gpa + bytes - 1) >> PAGE_SHIFT) != (gpa >> PAGE_SHIFT))
return 0;
m = gfn_to_memslot(vcpu->kvm, gpa >> PAGE_SHIFT);
if (!m)
return 0;
page = gfn_to_page(m, gpa >> PAGE_SHIFT);
kvm_mmu_pre_write(vcpu, gpa, bytes);
virt = kmap_atomic(page, KM_USER0);
memcpy(virt + offset_in_page(gpa), &val, bytes);
kunmap_atomic(virt, KM_USER0);
kvm_mmu_post_write(vcpu, gpa, bytes);
return 1;
}

static int emulator_write_emulated(unsigned long addr,
unsigned long val,
unsigned int bytes,
Expand All @@ -888,6 +909,9 @@ static int emulator_write_emulated(unsigned long addr,
if (gpa == UNMAPPED_GVA)
return X86EMUL_PROPAGATE_FAULT;

if (emulator_write_phys(vcpu, gpa, val, bytes))
return X86EMUL_CONTINUE;

vcpu->mmio_needed = 1;
vcpu->mmio_phys_addr = gpa;
vcpu->mmio_size = bytes;
Expand Down
9 changes: 9 additions & 0 deletions trunk/drivers/kvm/mmu.c
Original file line number Diff line number Diff line change
Expand Up @@ -956,6 +956,15 @@ int kvm_mmu_reset_context(struct kvm_vcpu *vcpu)
return init_kvm_mmu(vcpu);
}

void kvm_mmu_pre_write(struct kvm_vcpu *vcpu, gpa_t gpa, int bytes)
{
pgprintk("%s: gpa %llx bytes %d\n", __FUNCTION__, gpa, bytes);
}

void kvm_mmu_post_write(struct kvm_vcpu *vcpu, gpa_t gpa, int bytes)
{
}

static void free_mmu_pages(struct kvm_vcpu *vcpu)
{
while (!list_empty(&vcpu->free_pages)) {
Expand Down

0 comments on commit b0328b3

Please sign in to comment.