Avi Kivity <a...@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 <aurel...@aurel32.net> > Signed-off-by: Avi Kivity <a...@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