diff mbox

[PULL,02/31] Revert "memory: Drop FlatRange.romd_mode"

Message ID 1464343604-517-3-git-send-email-pbonzini@redhat.com (mailing list archive)
State New, archived
Headers show

Commit Message

Paolo Bonzini May 27, 2016, 10:06 a.m. UTC
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(+)

Comments

Laszlo Ersek May 27, 2016, 10:51 a.m. UTC | #1
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 mbox

Patch

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. */