qemu-devel
[Top][All Lists]
Advanced

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

Re: [Qemu-devel] [PATCH] exec.c: Allow memory region start_addr and regi


From: Avi Kivity
Subject: Re: [Qemu-devel] [PATCH] exec.c: Allow memory region start_addr and region_offset to vary in low bits
Date: Mon, 05 Dec 2011 15:40:35 +0200
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:8.0) Gecko/20111115 Thunderbird/8.0

On 12/05/2011 01:01 PM, Peter Maydell wrote:
> Fix a long-standing deficiency of cpu_register_physical_memory_log()
> where the start address and region offset had to have the same low
> bits (otherwise the IO functions would be passed an incorrect address
> offset). This was most likely to bite when registering memory regions
> which started at a non-page-boundary.
>
> Signed-off-by: Peter Maydell <address@hidden>
> ---
> This is such a small change to correct this issue that I'm kind of
> suspicious of it :-)

Your instincts are correct, unfortunately.

> @@ -2677,7 +2674,11 @@ void 
> cpu_register_physical_memory_log(target_phys_addr_t start_addr,
>      if (phys_offset == IO_MEM_UNASSIGNED) {
>          region_offset = start_addr;
>      }
> -    region_offset &= TARGET_PAGE_MASK;
> +    /* Adjust the region offset to account for the start_addr possibly
> +     * not being page aligned, so we end up passing the IO functions
> +     * the true offset from the start of the region.
> +     */
> +    region_offset -= (start_addr & ~TARGET_PAGE_MASK);
>      size = (size + TARGET_PAGE_SIZE - 1) & TARGET_PAGE_MASK;
>      end_addr = start_addr + (target_phys_addr_t)size;
>  

region_offset is added to iotlb in tlb_set_page(), smashing the low bits
with your change.  It's safe in subpage, since that doesn't happen there.

-- 
error compiling committee.c: too many arguments to function




reply via email to

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