qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH] arm64: 64K pages and > 1024MB guest


From: Peter Maydell
Subject: Re: [Qemu-devel] [PATCH] arm64: 64K pages and > 1024MB guest
Date: Fri, 1 Aug 2014 12:28:05 +0100

On 23 July 2014 21:09, Joel Schopp <address@hidden> 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 <address@hidden>
> Signed-off-by: Joel Schopp <address@hidden>
> ---
>  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



reply via email to

[Prev in Thread] Current Thread [Next in Thread]