From 70fedd76d9fe4900651f3360725fb511a19d03d5 Mon Sep 17 00:00:00 2001 From: Alex Williamson Date: Wed, 14 Jul 2010 13:36:49 -0600 Subject: kvm: Don't walk memory_size == 0 slots in kvm_client_migration_log If we've unregistered a memory area, we should avoid calling qemu_get_ram_ptr() on the left over phys_offset cruft in the slot array. Now that we support removing ramblocks, the phys_offset ram_addr_t can go away and cause a lookup fault and abort. Signed-off-by: Alex Williamson Signed-off-by: Marcelo Tosatti --- kvm-all.c | 3 +++ 1 file changed, 3 insertions(+) (limited to 'kvm-all.c') diff --git a/kvm-all.c b/kvm-all.c index 7635f2f894..736c516862 100644 --- a/kvm-all.c +++ b/kvm-all.c @@ -274,6 +274,9 @@ static int kvm_set_migration_log(int enable) for (i = 0; i < ARRAY_SIZE(s->slots); i++) { mem = &s->slots[i]; + if (!mem->memory_size) { + continue; + } if (!!(mem->flags & KVM_MEM_LOG_DIRTY_PAGES) == enable) { continue; } -- cgit v1.2.3-55-g7522 From 14542fea73f294b2a195a8e17c5a0dd15f60640e Mon Sep 17 00:00:00 2001 From: Gleb Natapov Date: Wed, 28 Jul 2010 18:13:23 +0300 Subject: kvm: remove guest triggerable abort() This abort() condition is easily triggerable by a guest if it configures pci bar with unaligned address that overlaps main memory. Signed-off-by: Gleb Natapov Signed-off-by: Marcelo Tosatti --- kvm-all.c | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) (limited to 'kvm-all.c') diff --git a/kvm-all.c b/kvm-all.c index 736c516862..85f2e5868f 100644 --- a/kvm-all.c +++ b/kvm-all.c @@ -432,18 +432,10 @@ static void kvm_set_phys_mem(target_phys_addr_t start_addr, KVMSlot *mem, old; int err; - if (start_addr & ~TARGET_PAGE_MASK) { - if (flags >= IO_MEM_UNASSIGNED) { - if (!kvm_lookup_overlapping_slot(s, start_addr, - start_addr + size)) { - return; - } - fprintf(stderr, "Unaligned split of a KVM memory slot\n"); - } else { - fprintf(stderr, "Only page-aligned memory slots supported\n"); - } - abort(); - } + /* kvm works in page size chunks, but the function may be called + with sub-page size and unaligned start address. */ + size = TARGET_PAGE_ALIGN(size); + start_addr = TARGET_PAGE_ALIGN(start_addr); /* KVM does not support read-only slots */ phys_offset &= ~IO_MEM_ROM; -- cgit v1.2.3-55-g7522