Revert "memory: Drop FlatRange.romd_mode"
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>
This commit is contained in:
		
							parent
							
								
									d6550e9ed2
								
							
						
					
					
						commit
						b138e654a0
					
				
							
								
								
									
										4
									
								
								memory.c
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								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. */ | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Paolo Bonzini
						Paolo Bonzini