[Top][All Lists]
[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