On Mon, Sep 29, 2008 at 2:29 PM, Glauber Costa <[EMAIL PROTECTED]> wrote: > On Sun, Sep 28, 2008 at 6:44 PM, Michael Malone > <[EMAIL PROTECTED]> wrote: >> 2) (this has been around for quite some time, I just haven't done anything >> about it) >> Even though I start up with -smp 2, windows only reads 1 cpu >> >> 3) When I run it using the --std-vga parameter, windows boots to just before >> it gets to the "welcome" screen and hangs. The output shows a multitude of >> "kvm: get_dirty_pages returned -2" Is this something to do with the kernel >> version I am using? I am using the standard Ubuntu Hardy Kernel > > No. It's a regression introduced in last version. It should work using > cirrus vga (can you confirm, please?) > > It happens because for the specific range std vga is relying the > memory will be, it do a cpu_register_physical_mem(). > When kvm tries to create a new piece of memory in this place, it's > marked as already existant. > > There are some quick hacks, but I'll be trying to work on a proper fix > in the following days.
This is a band aid, but proves the general idea. Can you confirm that it fixes the problem for you ? -- Glauber Costa. "Free as in Freedom" http://glommer.net "The less confident you are, the more serious you have to act."
diff --git a/libkvm/libkvm.c b/libkvm/libkvm.c index dfa63bb..6abb3b9 100644 --- a/libkvm/libkvm.c +++ b/libkvm/libkvm.c @@ -399,8 +399,7 @@ int kvm_create(kvm_context_t kvm, unsigned long phys_mem_bytes, void **vm_mem) return 0; } - -void *kvm_create_phys_mem(kvm_context_t kvm, unsigned long phys_start, +void *kvm_set_phys_mem(kvm_context_t kvm, unsigned long phys_start, unsigned long len, int log, int writable) { int r; @@ -441,6 +440,23 @@ void *kvm_create_phys_mem(kvm_context_t kvm, unsigned long phys_start, return ptr; } +void *kvm_create_phys_mem(kvm_context_t kvm, unsigned long phys_start, + unsigned long len, int log, int writable) +{ + int slot = get_container_slot(phys_start, len); + int flags = log ? KVM_MEM_LOG_DIRTY_PAGES : 0; + + if (slot == -1) { + return kvm_set_phys_mem(kvm, phys_start, len, log, writable); + } + if (slots[slot].flags == flags) { + return slots[slot].userspace_addr; + } else { + kvm_destroy_phys_mem(kvm, phys_start, len); + return kvm_set_phys_mem(kvm, phys_start, len, log, writable); + } +} + int kvm_register_phys_mem(kvm_context_t kvm, unsigned long phys_start, void *userspace_addr, unsigned long len, int log)