Message ID | 1351527756-13782-1-git-send-email-avi@redhat.com |
---|---|
State | New |
Headers | show |
Avi Kivity <avi@redhat.com> writes: > The memory core drops regions that are hidden by another region (for example, > during BAR sizing), but it doesn't do so correctly if the lower address of the > existing range is below the lower address of the new range. > > Example (qemu-system-mips -M malta -kernel vmlinux-2.6.32-5-4kc-malta > -append "console=ttyS0" -nographic -vga cirrus): > > Existing range: 10000000-107fffff > New range: 100a0000-100bffff > > Correct behaviour: drop new range > Incorrect behaviour: add new range > > Fix by taking this case into account (previously we only considered > equal lower boundaries). > > Tested-by: Aurelien Jarno <aurelien@aurel32.net> > Signed-off-by: Avi Kivity <avi@redhat.com> Applied. Thanks. Regards, Anthony Liguori > --- > memory.c | 12 ++++++------ > 1 file changed, 6 insertions(+), 6 deletions(-) > > diff --git a/memory.c b/memory.c > index 36bb9a5..243cb23 100644 > --- a/memory.c > +++ b/memory.c > @@ -539,12 +539,12 @@ static void render_memory_region(FlatView *view, > offset_in_region += int128_get64(now); > int128_subfrom(&remain, now); > } > - if (int128_eq(base, view->ranges[i].addr.start)) { > - now = int128_min(remain, view->ranges[i].addr.size); > - int128_addto(&base, now); > - offset_in_region += int128_get64(now); > - int128_subfrom(&remain, now); > - } > + now = int128_sub(int128_min(int128_add(base, remain), > + addrrange_end(view->ranges[i].addr)), > + base); > + int128_addto(&base, now); > + offset_in_region += int128_get64(now); > + int128_subfrom(&remain, now); > } > if (int128_nz(remain)) { > fr.mr = mr; > -- > 1.7.12
diff --git a/memory.c b/memory.c index 36bb9a5..243cb23 100644 --- a/memory.c +++ b/memory.c @@ -539,12 +539,12 @@ static void render_memory_region(FlatView *view, offset_in_region += int128_get64(now); int128_subfrom(&remain, now); } - if (int128_eq(base, view->ranges[i].addr.start)) { - now = int128_min(remain, view->ranges[i].addr.size); - int128_addto(&base, now); - offset_in_region += int128_get64(now); - int128_subfrom(&remain, now); - } + now = int128_sub(int128_min(int128_add(base, remain), + addrrange_end(view->ranges[i].addr)), + base); + int128_addto(&base, now); + offset_in_region += int128_get64(now); + int128_subfrom(&remain, now); } if (int128_nz(remain)) { fr.mr = mr;