On 23 July 2014 21:09, Joel Schopp <joel.sch...@amd.com> wrote: > kvm_set_phys_mem doesn't work on arm64 with memory > 1GB. It exits with: > kvm_set_phys_mem: error registering slot: Invalid argument > > An example of the failing address and size are start_addr == 0x90011000 > and size=0xaffef000. As you can see both of these are 4K aligned, not > 64K aligned. > > At 1024MB or smaller qemu only makes one call to kvm_set_user_memory_region, > so the start_addr and size are aligned by accident and the bug doesn't happen. > > The following patch makes things work for me on an arm64 SOC. I also smoke > tested the patch on an x86-64 box and qemu seemed to still run fine there > with the patch applied. > > Cc: Peter Maydell <peter.mayd...@linaro.org> > Signed-off-by: Joel Schopp <joel.sch...@amd.com> > --- > kvm-all.c | 6 +++--- > 1 file changed, 3 insertions(+), 3 deletions(-) > > diff --git a/kvm-all.c b/kvm-all.c > index 1402f4f..1975862 100644 > --- a/kvm-all.c > +++ b/kvm-all.c > @@ -618,14 +618,14 @@ static void kvm_set_phys_mem(MemoryRegionSection > *section, bool add) > > /* kvm works in page size chunks, but the function may be called > with sub-page size and unaligned start address. */ > - delta = TARGET_PAGE_ALIGN(size) - size; > + delta = HOST_PAGE_ALIGN(start_addr) - start_addr; > if (delta > size) { > return; > } > start_addr += delta; > size -= delta; > - size &= TARGET_PAGE_MASK; > - if (!size || (start_addr & ~TARGET_PAGE_MASK)) { > + size &= qemu_host_page_mask; > + if (!size || (start_addr & ~qemu_host_page_mask)) { > return; > } > >
Paolo: can you review this? Do we also need to do something about the use of TARGET_PAGE_BITS in kvm_physical_sync_dirty_bitmap? Is it really OK to define PAGE_SIZE to TARGET_PAGE_SIZE (it's certainly really misleading and suggests the kernel headers could be more helpful). Basically I think kvm-all.c should almost certainly not be using any of the TARGET_PAGE_* constants anywhere. thanks -- PMM