* [PATCH 3/6] Consolidate the various functions that read and write guest memory
@ 2007-07-30 9:37 Laurent Vivier
0 siblings, 0 replies; only message in thread
From: Laurent Vivier @ 2007-07-30 9:37 UTC (permalink / raw)
To: kvm-devel
[-- Attachment #1.1.1: Type: text/plain, Size: 266 bytes --]
remove kvm_read_guest() and use emulator_read_std() instead.
Signed-off-by: Laurent Vivier <Laurent.Vivier-6ktuUTfB/bM@public.gmane.org>
--
------------- Laurent.Vivier-6ktuUTfB/bM@public.gmane.org --------------
"Software is hard" - Donald Knuth
[-- Attachment #1.1.2: remove-kvm_read_guest --]
[-- Type: text/plain, Size: 3999 bytes --]
Index: kvm/drivers/kvm/kvm.h
===================================================================
--- kvm.orig/drivers/kvm/kvm.h 2007-07-30 10:11:56.000000000 +0200
+++ kvm/drivers/kvm/kvm.h 2007-07-30 10:12:45.000000000 +0200
@@ -586,10 +586,10 @@
void kvm_put_guest_fpu(struct kvm_vcpu *vcpu);
void kvm_flush_remote_tlbs(struct kvm *kvm);
-int kvm_read_guest(struct kvm_vcpu *vcpu,
- gva_t addr,
- unsigned long size,
- void *dest);
+int emulator_read_std(unsigned long addr,
+ void *val,
+ unsigned int bytes,
+ struct kvm_vcpu *vcpu);
int kvm_write_guest(struct kvm_vcpu *vcpu,
gva_t addr,
Index: kvm/drivers/kvm/kvm_main.c
===================================================================
--- kvm.orig/drivers/kvm/kvm_main.c 2007-07-30 10:11:56.000000000 +0200
+++ kvm/drivers/kvm/kvm_main.c 2007-07-30 10:12:45.000000000 +0200
@@ -144,39 +144,6 @@
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)
{
@@ -972,7 +939,7 @@
}
}
-static int emulator_read_std(unsigned long addr,
+int emulator_read_std(unsigned long addr,
void *val,
unsigned int bytes,
struct kvm_vcpu *vcpu)
@@ -1006,6 +973,7 @@
return X86EMUL_CONTINUE;
}
+EXPORT_SYMBOL_GPL(emulator_read_std);
static int emulator_write_std(unsigned long addr,
const void *val,
Index: kvm/drivers/kvm/svm.c
===================================================================
--- kvm.orig/drivers/kvm/svm.c 2007-07-30 10:11:56.000000000 +0200
+++ kvm/drivers/kvm/svm.c 2007-07-30 10:12:45.000000000 +0200
@@ -986,7 +986,7 @@
vcpu->svm->vmcb->control.exit_info_2,
ins_length);
- if (kvm_read_guest(vcpu, rip, ins_length, inst) != ins_length)
+ if (emulator_read_std(rip, inst, ins_length, vcpu) != X86EMUL_CONTINUE)
/* #PF */
return 0;
Index: kvm/drivers/kvm/vmx.c
===================================================================
--- kvm.orig/drivers/kvm/vmx.c 2007-07-30 10:11:56.000000000 +0200
+++ kvm/drivers/kvm/vmx.c 2007-07-30 10:12:45.000000000 +0200
@@ -16,6 +16,7 @@
*/
#include "kvm.h"
+#include "x86_emulate.h"
#include "vmx.h"
#include "segment_descriptor.h"
@@ -1451,8 +1452,8 @@
return;
}
- if (kvm_read_guest(vcpu, irq * sizeof(ent), sizeof(ent), &ent) !=
- sizeof(ent)) {
+ if (emulator_read_std(irq * sizeof(ent), &ent, sizeof(ent), vcpu) !=
+ X86EMUL_CONTINUE) {
vcpu_printf(vcpu, "%s: read guest err\n", __FUNCTION__);
return;
}
@@ -1665,7 +1666,7 @@
u64 inst;
gva_t rip;
int countr_size;
- int i, n;
+ int i;
if ((vmcs_readl(GUEST_RFLAGS) & X86_EFLAGS_VM)) {
countr_size = 2;
@@ -1680,9 +1681,11 @@
if (countr_size != 8)
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]) {
case 0xf0:
case 0xf2:
[-- Attachment #1.2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 189 bytes --]
[-- Attachment #2: Type: text/plain, Size: 315 bytes --]
-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
[-- Attachment #3: Type: text/plain, Size: 186 bytes --]
_______________________________________________
kvm-devel mailing list
kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org
https://lists.sourceforge.net/lists/listinfo/kvm-devel
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2007-07-30 9:37 UTC | newest]
Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-07-30 9:37 [PATCH 3/6] Consolidate the various functions that read and write guest memory Laurent Vivier
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.