On Wed, Dec 17, 2008 at 02:56:05PM -0600, Anthony Liguori wrote: > Glauber Costa wrote: >> This patch introduces a kvm version of cpu_physical_memory_rw. >> The main motivation is to bypass tcg version, which contains >> tcg-specific code, as well as data structures not used by kvm, >> such as l1_phys_map. >> >> In this patch, I'm using a runtime selection of which function >> to call, but the mid-term goal is to use function pointers in >> a way very close to which QEMUAccel used to be. >> >> Signed-off-by: Glauber Costa <[email protected]> >> --- >> exec.c | 13 +++++++++++-- >> kvm-all.c | 39 +++++++++++++++++++++++++++++++++++---- >> kvm.h | 2 ++ >> 3 files changed, 48 insertions(+), 6 deletions(-) >> >> diff --git a/exec.c b/exec.c >> index 04eadfe..d5c88b1 100644 >> --- a/exec.c >> +++ b/exec.c >> @@ -2938,8 +2938,8 @@ int cpu_physical_memory_do_io(target_phys_addr_t addr, >> uint8_t *buf, int l, int >> >> + >> +void kvm_cpu_physical_memory_rw(target_phys_addr_t addr, uint8_t *buf, >> + int len, int is_write) >> +{ >> + KVMSlot *mem; >> + KVMState *s = kvm_state; >> + int l; >> + >> + mem = kvm_lookup_slot(s, addr); >> + if (!mem) >> + return; >> + >> + if ((mem->phys_offset & ~TARGET_PAGE_MASK) >= TLB_MMIO) { >> + l = 0; >> + while (len > l) >> + l += cpu_physical_memory_do_io(addr + l, buf + l, len - l, >> is_write, mem->phys_offset); >> + } else { >> + uint8_t *uaddr = phys_ram_base + mem->phys_offset + (addr - >> mem->start_addr); >> + if (!is_write) >> + memcpy(buf, uaddr, len); >> + else >> + memcpy(uaddr, buf, len); >> + } >> +} >> > > I think this is a bit optimistic. It assumes addr..len fits entirely > within a slot. That's not necessarily the case though. I think you > should probably limit len to whatever is left in the slot, then if > necessary, (tail) recursively call kvm_cpu_physical_memory_rw. It makes sense.
-- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
