Message ID | 1464343604-517-3-git-send-email-pbonzini@redhat.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On 05/27/16 12:06, Paolo Bonzini wrote: > This reverts commit 5b5660adf1fdb61db14ec681b10463b8cba633f1, > as it breaks the UEFI guest firmware (known as ArmVirtPkg or AAVMF) > running in the "virt" machine type of "qemu-system-aarch64": > > Contrary to the commit message, (a->mr == b->mr) does *not* imply > that (a->romd_mode == b->romd_mode): the pflash device model calls > memory_region_rom_device_set_romd() -- for switching between the above > modes --, and that function changes mr->romd_mode but the current > AddressSpaceDispatch's FlatRange keeps the old value. Therefore > region_del/region_add are not called on the KVM MemoryListener. > > Reported-by: Drew Jones <drjones@redhat.com> > Tested-by: Drew Jones <drjones@redhat.com> > Analyzed-by: Laszlo Ersek <lersek@redhat.com> > Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> > --- > memory.c | 4 ++++ > 1 file changed, 4 insertions(+) > > diff --git a/memory.c b/memory.c > index 4e3cda8..0f52522 100644 > --- a/memory.c > +++ b/memory.c > @@ -227,6 +227,7 @@ struct FlatRange { > hwaddr offset_in_region; > AddrRange addr; > uint8_t dirty_log_mask; > + bool romd_mode; > bool readonly; > }; > > @@ -251,6 +252,7 @@ static bool flatrange_equal(FlatRange *a, FlatRange *b) > return a->mr == b->mr > && addrrange_equal(a->addr, b->addr) > && a->offset_in_region == b->offset_in_region > + && a->romd_mode == b->romd_mode > && a->readonly == b->readonly; > } > > @@ -310,6 +312,7 @@ static bool can_merge(FlatRange *r1, FlatRange *r2) > r1->addr.size), > int128_make64(r2->offset_in_region)) > && r1->dirty_log_mask == r2->dirty_log_mask > + && r1->romd_mode == r2->romd_mode > && r1->readonly == r2->readonly; > } > > @@ -663,6 +666,7 @@ static void render_memory_region(FlatView *view, > > fr.mr = mr; > fr.dirty_log_mask = memory_region_get_dirty_log_mask(mr); > + fr.romd_mode = mr->romd_mode; > fr.readonly = readonly; > > /* Render the region itself into any gaps left by the current view. */ > Thank you! Also for composing a succinct commit message (with new bits that I didn't polish in my email). Cheers, Laszlo
diff --git a/memory.c b/memory.c index 4e3cda8..0f52522 100644 --- a/memory.c +++ b/memory.c @@ -227,6 +227,7 @@ struct FlatRange { hwaddr offset_in_region; AddrRange addr; uint8_t dirty_log_mask; + bool romd_mode; bool readonly; }; @@ -251,6 +252,7 @@ static bool flatrange_equal(FlatRange *a, FlatRange *b) return a->mr == b->mr && addrrange_equal(a->addr, b->addr) && a->offset_in_region == b->offset_in_region + && a->romd_mode == b->romd_mode && a->readonly == b->readonly; } @@ -310,6 +312,7 @@ static bool can_merge(FlatRange *r1, FlatRange *r2) r1->addr.size), int128_make64(r2->offset_in_region)) && r1->dirty_log_mask == r2->dirty_log_mask + && r1->romd_mode == r2->romd_mode && r1->readonly == r2->readonly; } @@ -663,6 +666,7 @@ static void render_memory_region(FlatView *view, fr.mr = mr; fr.dirty_log_mask = memory_region_get_dirty_log_mask(mr); + fr.romd_mode = mr->romd_mode; fr.readonly = readonly; /* Render the region itself into any gaps left by the current view. */