Commit e7d5d76c authored by Laurent Vivier's avatar Laurent Vivier Committed by Avi Kivity

KVM: Remove kvm_{read,write}_guest()

... in favor of the more general emulator_{read,write}_*.
Signed-off-by: default avatarLaurent Vivier <Laurent.Vivier@bull.net>
Signed-off-by: default avatarAvi Kivity <avi@qumranet.com>
parent cebff02b
...@@ -561,15 +561,14 @@ void kvm_load_guest_fpu(struct kvm_vcpu *vcpu); ...@@ -561,15 +561,14 @@ void kvm_load_guest_fpu(struct kvm_vcpu *vcpu);
void kvm_put_guest_fpu(struct kvm_vcpu *vcpu); void kvm_put_guest_fpu(struct kvm_vcpu *vcpu);
void kvm_flush_remote_tlbs(struct kvm *kvm); void kvm_flush_remote_tlbs(struct kvm *kvm);
int kvm_read_guest(struct kvm_vcpu *vcpu, int emulator_read_std(unsigned long addr,
gva_t addr, void *val,
unsigned long size, unsigned int bytes,
void *dest); struct kvm_vcpu *vcpu);
int emulator_write_emulated(unsigned long addr,
int kvm_write_guest(struct kvm_vcpu *vcpu, const void *val,
gva_t addr, unsigned int bytes,
unsigned long size, struct kvm_vcpu *vcpu);
void *data);
unsigned long segment_base(u16 selector); unsigned long segment_base(u16 selector);
......
...@@ -146,74 +146,6 @@ static inline int valid_vcpu(int n) ...@@ -146,74 +146,6 @@ static inline int valid_vcpu(int n)
return likely(n >= 0 && n < KVM_MAX_VCPUS); return likely(n >= 0 && n < KVM_MAX_VCPUS);
} }
int kvm_read_guest(struct kvm_vcpu *vcpu, gva_t addr, unsigned long size,
void *dest)
{
unsigned char *host_buf = dest;
unsigned long req_size = size;
while (size) {
hpa_t paddr;
unsigned now;
unsigned offset;
hva_t guest_buf;
paddr = gva_to_hpa(vcpu, addr);
if (is_error_hpa(paddr))
break;
guest_buf = (hva_t)kmap_atomic(
pfn_to_page(paddr >> PAGE_SHIFT),
KM_USER0);
offset = addr & ~PAGE_MASK;
guest_buf |= offset;
now = min(size, PAGE_SIZE - offset);
memcpy(host_buf, (void*)guest_buf, now);
host_buf += now;
addr += now;
size -= now;
kunmap_atomic((void *)(guest_buf & PAGE_MASK), KM_USER0);
}
return req_size - size;
}
EXPORT_SYMBOL_GPL(kvm_read_guest);
int kvm_write_guest(struct kvm_vcpu *vcpu, gva_t addr, unsigned long size,
void *data)
{
unsigned char *host_buf = data;
unsigned long req_size = size;
while (size) {
hpa_t paddr;
unsigned now;
unsigned offset;
hva_t guest_buf;
gfn_t gfn;
paddr = gva_to_hpa(vcpu, addr);
if (is_error_hpa(paddr))
break;
gfn = vcpu->mmu.gva_to_gpa(vcpu, addr) >> PAGE_SHIFT;
mark_page_dirty(vcpu->kvm, gfn);
guest_buf = (hva_t)kmap_atomic(
pfn_to_page(paddr >> PAGE_SHIFT), KM_USER0);
offset = addr & ~PAGE_MASK;
guest_buf |= offset;
now = min(size, PAGE_SIZE - offset);
memcpy((void*)guest_buf, host_buf, now);
host_buf += now;
addr += now;
size -= now;
kunmap_atomic((void *)(guest_buf & PAGE_MASK), KM_USER0);
}
return req_size - size;
}
EXPORT_SYMBOL_GPL(kvm_write_guest);
void kvm_load_guest_fpu(struct kvm_vcpu *vcpu) void kvm_load_guest_fpu(struct kvm_vcpu *vcpu)
{ {
if (!vcpu->fpu_active || vcpu->guest_fpu_loaded) if (!vcpu->fpu_active || vcpu->guest_fpu_loaded)
...@@ -1017,7 +949,7 @@ void mark_page_dirty(struct kvm *kvm, gfn_t gfn) ...@@ -1017,7 +949,7 @@ void mark_page_dirty(struct kvm *kvm, gfn_t gfn)
} }
} }
static int emulator_read_std(unsigned long addr, int emulator_read_std(unsigned long addr,
void *val, void *val,
unsigned int bytes, unsigned int bytes,
struct kvm_vcpu *vcpu) struct kvm_vcpu *vcpu)
...@@ -1051,6 +983,7 @@ static int emulator_read_std(unsigned long addr, ...@@ -1051,6 +983,7 @@ static int emulator_read_std(unsigned long addr,
return X86EMUL_CONTINUE; return X86EMUL_CONTINUE;
} }
EXPORT_SYMBOL_GPL(emulator_read_std);
static int emulator_write_std(unsigned long addr, static int emulator_write_std(unsigned long addr,
const void *val, const void *val,
...@@ -1169,7 +1102,7 @@ static int emulator_write_emulated_onepage(unsigned long addr, ...@@ -1169,7 +1102,7 @@ static int emulator_write_emulated_onepage(unsigned long addr,
return X86EMUL_CONTINUE; return X86EMUL_CONTINUE;
} }
static int emulator_write_emulated(unsigned long addr, int emulator_write_emulated(unsigned long addr,
const void *val, const void *val,
unsigned int bytes, unsigned int bytes,
struct kvm_vcpu *vcpu) struct kvm_vcpu *vcpu)
...@@ -1188,6 +1121,7 @@ static int emulator_write_emulated(unsigned long addr, ...@@ -1188,6 +1121,7 @@ static int emulator_write_emulated(unsigned long addr,
} }
return emulator_write_emulated_onepage(addr, val, bytes, vcpu); return emulator_write_emulated_onepage(addr, val, bytes, vcpu);
} }
EXPORT_SYMBOL_GPL(emulator_write_emulated);
static int emulator_cmpxchg_emulated(unsigned long addr, static int emulator_cmpxchg_emulated(unsigned long addr,
const void *old, const void *old,
......
...@@ -1019,7 +1019,8 @@ static int io_get_override(struct vcpu_svm *svm, ...@@ -1019,7 +1019,8 @@ static int io_get_override(struct vcpu_svm *svm,
svm->vmcb->control.exit_info_2, svm->vmcb->control.exit_info_2,
ins_length); ins_length);
if (kvm_read_guest(&svm->vcpu, rip, ins_length, inst) != ins_length) if (emulator_read_std(rip, inst, ins_length, &svm->vcpu)
!= X86EMUL_CONTINUE)
/* #PF */ /* #PF */
return 0; return 0;
......
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
*/ */
#include "kvm.h" #include "kvm.h"
#include "x86_emulate.h"
#include "vmx.h" #include "vmx.h"
#include "segment_descriptor.h" #include "segment_descriptor.h"
...@@ -1553,8 +1554,8 @@ static void inject_rmode_irq(struct kvm_vcpu *vcpu, int irq) ...@@ -1553,8 +1554,8 @@ static void inject_rmode_irq(struct kvm_vcpu *vcpu, int irq)
return; return;
} }
if (kvm_read_guest(vcpu, irq * sizeof(ent), sizeof(ent), &ent) != if (emulator_read_std(irq * sizeof(ent), &ent, sizeof(ent), vcpu) !=
sizeof(ent)) { X86EMUL_CONTINUE) {
vcpu_printf(vcpu, "%s: read guest err\n", __FUNCTION__); vcpu_printf(vcpu, "%s: read guest err\n", __FUNCTION__);
return; return;
} }
...@@ -1564,9 +1565,9 @@ static void inject_rmode_irq(struct kvm_vcpu *vcpu, int irq) ...@@ -1564,9 +1565,9 @@ static void inject_rmode_irq(struct kvm_vcpu *vcpu, int irq)
ip = vmcs_readl(GUEST_RIP); ip = vmcs_readl(GUEST_RIP);
if (kvm_write_guest(vcpu, ss_base + sp - 2, 2, &flags) != 2 || if (emulator_write_emulated(ss_base + sp - 2, &flags, 2, vcpu) != X86EMUL_CONTINUE ||
kvm_write_guest(vcpu, ss_base + sp - 4, 2, &cs) != 2 || emulator_write_emulated(ss_base + sp - 4, &cs, 2, vcpu) != X86EMUL_CONTINUE ||
kvm_write_guest(vcpu, ss_base + sp - 6, 2, &ip) != 2) { emulator_write_emulated(ss_base + sp - 6, &ip, 2, vcpu) != X86EMUL_CONTINUE) {
vcpu_printf(vcpu, "%s: write guest err\n", __FUNCTION__); vcpu_printf(vcpu, "%s: write guest err\n", __FUNCTION__);
return; return;
} }
...@@ -1767,7 +1768,7 @@ static int get_io_count(struct kvm_vcpu *vcpu, unsigned long *count) ...@@ -1767,7 +1768,7 @@ static int get_io_count(struct kvm_vcpu *vcpu, unsigned long *count)
u64 inst; u64 inst;
gva_t rip; gva_t rip;
int countr_size; int countr_size;
int i, n; int i;
if ((vmcs_readl(GUEST_RFLAGS) & X86_EFLAGS_VM)) { if ((vmcs_readl(GUEST_RFLAGS) & X86_EFLAGS_VM)) {
countr_size = 2; countr_size = 2;
...@@ -1782,9 +1783,11 @@ static int get_io_count(struct kvm_vcpu *vcpu, unsigned long *count) ...@@ -1782,9 +1783,11 @@ static int get_io_count(struct kvm_vcpu *vcpu, unsigned long *count)
if (countr_size != 8) if (countr_size != 8)
rip += vmcs_readl(GUEST_CS_BASE); rip += vmcs_readl(GUEST_CS_BASE);
n = kvm_read_guest(vcpu, rip, sizeof(inst), &inst); if (emulator_read_std(rip, &inst, sizeof(inst), vcpu) !=
X86EMUL_CONTINUE)
return 0;
for (i = 0; i < n; i++) { for (i = 0; i < sizeof(inst); i++) {
switch (((u8*)&inst)[i]) { switch (((u8*)&inst)[i]) {
case 0xf0: case 0xf0:
case 0xf2: case 0xf2:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment