qemu-devel
[Top][All Lists]
Advanced

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

Re: [Qemu-devel] [PATCH] exec-obsolete: fix length handling


From: Avi Kivity
Subject: Re: [Qemu-devel] [PATCH] exec-obsolete: fix length handling
Date: Sun, 29 Jan 2012 16:21:25 +0200
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:9.0) Gecko/20111222 Thunderbird/9.0

On 01/29/2012 03:39 PM, Blue Swirl wrote:
> >> >> +++ b/exec-obsolete.h
> >> >> @@ -81,11 +81,10 @@ static inline void
> >> >> cpu_physical_memory_set_dirty_range(ram_addr_t start,
> >> >>                                                         int dirty_flags)
> >> >>  {
> >> >>      uint8_t *p;
> >> >> -    ram_addr_t addr, end;
> >> >> +    ram_addr_t cur;
> >> >>
> >> >> -    end = start + length;
> >> >>      p = ram_list.phys_dirty + (start >> TARGET_PAGE_BITS);
> >> >> -    for (addr = start; addr <= end; addr += TARGET_PAGE_SIZE) {
> >> >> +    for (cur = 0; cur < length; cur += TARGET_PAGE_SIZE) {
> >> >>          *p++ |= dirty_flags;
> >> >>      }
> >> >
> >> > I think this is still wrong - if length == 2 it will iterate once, but
> >> > we need two iterations if start == 0xfff.
> >>
> >> Yes, tricky. We could do something like
> >> for (cur = start & TARGET_PAGE_MASK; cur < length; cur += 
> >> TARGET_PAGE_SIZE) {
> >> but I'll send a new patch with just s/<=/</.
> >
> > That's broken too.
>
> Because length should be adjusted by -1?

0xfff/2 breaks.

More generally, you can't have a loop that just looks at length, since
0/2 wants one iteration, and 0xfff/2 wants two.

>
> > I have:
> >
> >     uint8_t *p;
> >     ram_addr_t addr, end;
> >
> > -    end = start + length;
> > +    end = (start + length - 1) | (TARGET_PAGE_SIZE - 1);
>
> Why  | (TARGET_PAGE_SIZE - 1), for length == 1? 

Yes.  More generally, I wanted something that is easily understood -
start/end addresses without trickery, given all the broken patches for
fixing this.

> TARGET_PAGE_ALIGN()
> could be useful here.

True, I'll respin.

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




reply via email to

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