mirror of
				https://github.com/qemu/qemu.git
				synced 2025-10-30 19:15:42 +00:00 
			
		
		
		
	 84969111e6
			
		
	
	
		84969111e6
		
	
	
	
	
		
			
			When a device creates a MemoryRegion without setting its ownership,
the MemoryRegion is added to the machine "/unattached" container in
the QOM tree.
Example with the Samsung SMDKC210 board:
  $ arm-softmmu/qemu-system-arm -M smdkc210 -S -monitor stdio
  (qemu) info qom-tree
  /machine (smdkc210-machine)
    /unattached (container)
      /io[0] (qemu:memory-region)
      /exynos4210.dram0[0] (qemu:memory-region)
      /exynos4210.irom[0] (qemu:memory-region)
      /exynos4210.iram[0] (qemu:memory-region)
      /exynos4210.chipid[0] (qemu:memory-region)
      ...
      /device[26] (exynos4210.uart)
        /exynos4210.uart[0] (qemu:memory-region)
    /soc (exynos4210)
      ^
       \__ [*]
The irom/iram/chipid regions should go under 'soc' at [*].
Add a semantic patch to let the device own the memory region.
Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
		
	
			
		
			
				
	
	
		
			160 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			160 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| /*
 | |
|   Usage:
 | |
| 
 | |
|     spatch \
 | |
|         --macro-file scripts/cocci-macro-file.h \
 | |
|         --sp-file scripts/coccinelle/memory-region-housekeeping.cocci \
 | |
|         --keep-comments \
 | |
|         --in-place \
 | |
|         --dir .
 | |
| 
 | |
| */
 | |
| 
 | |
| 
 | |
| // Replace memory_region_init_ram(readonly) by memory_region_init_rom()
 | |
| @@
 | |
| expression E1, E2, E3, E4, E5;
 | |
| symbol true;
 | |
| @@
 | |
| (
 | |
| - memory_region_init_ram(E1, E2, E3, E4, E5);
 | |
| + memory_region_init_rom(E1, E2, E3, E4, E5);
 | |
|   ... WHEN != E1
 | |
| - memory_region_set_readonly(E1, true);
 | |
| |
 | |
| - memory_region_init_ram_nomigrate(E1, E2, E3, E4, E5);
 | |
| + memory_region_init_rom_nomigrate(E1, E2, E3, E4, E5);
 | |
|   ... WHEN != E1
 | |
| - memory_region_set_readonly(E1, true);
 | |
| )
 | |
| 
 | |
| 
 | |
| @possible_memory_region_init_rom@
 | |
| expression E1, E2, E3, E4, E5;
 | |
| position p;
 | |
| @@
 | |
| (
 | |
|   memory_region_init_ram@p(E1, E2, E3, E4, E5);
 | |
|   ...
 | |
|   memory_region_set_readonly(E1, true);
 | |
| |
 | |
|   memory_region_init_ram_nomigrate@p(E1, E2, E3, E4, E5);
 | |
|   ...
 | |
|   memory_region_set_readonly(E1, true);
 | |
| )
 | |
| @script:python@
 | |
| p << possible_memory_region_init_rom.p;
 | |
| @@
 | |
| cocci.print_main("potential use of memory_region_init_rom*() in ", p)
 | |
| 
 | |
| 
 | |
| // Do not call memory_region_set_readonly() on ROM alias
 | |
| @@
 | |
| expression ROM, E1, E2, E3, E4;
 | |
| expression ALIAS, E5, E6, E7, E8;
 | |
| @@
 | |
| (
 | |
|   memory_region_init_rom(ROM, E1, E2, E3, E4);
 | |
| |
 | |
|   memory_region_init_rom_nomigrate(ROM, E1, E2, E3, E4);
 | |
| )
 | |
|   ...
 | |
|    memory_region_init_alias(ALIAS, E5, E6, ROM, E7, E8);
 | |
| -  memory_region_set_readonly(ALIAS, true);
 | |
| 
 | |
| 
 | |
| // Replace by-hand memory_region_init_ram_nomigrate/vmstate_register_ram
 | |
| // code sequences with use of the new memory_region_init_ram function.
 | |
| // Similarly for the _rom and _rom_device functions.
 | |
| // We don't try to replace sequences with a non-NULL owner, because
 | |
| // there are none in the tree that can be automatically converted
 | |
| // (and only a handful that can be manually converted).
 | |
| @@
 | |
| expression MR;
 | |
| expression NAME;
 | |
| expression SIZE;
 | |
| expression ERRP;
 | |
| @@
 | |
| -memory_region_init_ram_nomigrate(MR, NULL, NAME, SIZE, ERRP);
 | |
| +memory_region_init_ram(MR, NULL, NAME, SIZE, ERRP);
 | |
|  ...
 | |
| -vmstate_register_ram_global(MR);
 | |
| @@
 | |
| expression MR;
 | |
| expression NAME;
 | |
| expression SIZE;
 | |
| expression ERRP;
 | |
| @@
 | |
| -memory_region_init_rom_nomigrate(MR, NULL, NAME, SIZE, ERRP);
 | |
| +memory_region_init_rom(MR, NULL, NAME, SIZE, ERRP);
 | |
|  ...
 | |
| -vmstate_register_ram_global(MR);
 | |
| @@
 | |
| expression MR;
 | |
| expression OPS;
 | |
| expression OPAQUE;
 | |
| expression NAME;
 | |
| expression SIZE;
 | |
| expression ERRP;
 | |
| @@
 | |
| -memory_region_init_rom_device_nomigrate(MR, NULL, OPS, OPAQUE, NAME, SIZE, ERRP);
 | |
| +memory_region_init_rom_device(MR, NULL, OPS, OPAQUE, NAME, SIZE, ERRP);
 | |
|  ...
 | |
| -vmstate_register_ram_global(MR);
 | |
| 
 | |
| 
 | |
| // Device is owner
 | |
| @@
 | |
| typedef DeviceState;
 | |
| identifier device_fn, dev, obj;
 | |
| expression E1, E2, E3, E4, E5;
 | |
| @@
 | |
| static void device_fn(DeviceState *dev, ...)
 | |
| {
 | |
|   ...
 | |
|   Object *obj = OBJECT(dev);
 | |
|   <+...
 | |
| (
 | |
| - memory_region_init(E1, NULL, E2, E3);
 | |
| + memory_region_init(E1, obj, E2, E3);
 | |
| |
 | |
| - memory_region_init_io(E1, NULL, E2, E3, E4, E5);
 | |
| + memory_region_init_io(E1, obj, E2, E3, E4, E5);
 | |
| |
 | |
| - memory_region_init_alias(E1, NULL, E2, E3, E4, E5);
 | |
| + memory_region_init_alias(E1, obj, E2, E3, E4, E5);
 | |
| |
 | |
| - memory_region_init_rom(E1, NULL, E2, E3, E4);
 | |
| + memory_region_init_rom(E1, obj, E2, E3, E4);
 | |
| |
 | |
| - memory_region_init_ram_shared_nomigrate(E1, NULL, E2, E3, E4, E5);
 | |
| + memory_region_init_ram_shared_nomigrate(E1, obj, E2, E3, E4, E5);
 | |
| )
 | |
|   ...+>
 | |
| }
 | |
| @@
 | |
| identifier device_fn, dev;
 | |
| expression E1, E2, E3, E4, E5;
 | |
| @@
 | |
| static void device_fn(DeviceState *dev, ...)
 | |
| {
 | |
|   <+...
 | |
| (
 | |
| - memory_region_init(E1, NULL, E2, E3);
 | |
| + memory_region_init(E1, OBJECT(dev), E2, E3);
 | |
| |
 | |
| - memory_region_init_io(E1, NULL, E2, E3, E4, E5);
 | |
| + memory_region_init_io(E1, OBJECT(dev), E2, E3, E4, E5);
 | |
| |
 | |
| - memory_region_init_alias(E1, NULL, E2, E3, E4, E5);
 | |
| + memory_region_init_alias(E1, OBJECT(dev), E2, E3, E4, E5);
 | |
| |
 | |
| - memory_region_init_rom(E1, NULL, E2, E3, E4);
 | |
| + memory_region_init_rom(E1, OBJECT(dev), E2, E3, E4);
 | |
| |
 | |
| - memory_region_init_ram_shared_nomigrate(E1, NULL, E2, E3, E4, E5);
 | |
| + memory_region_init_ram_shared_nomigrate(E1, OBJECT(dev), E2, E3, E4, E5);
 | |
| )
 | |
|   ...+>
 | |
| }
 |