memory: Provide memory_region_init_rom()

Provide a new helper function memory_region_init_rom() for memory
regions which are read-only (and unlike those created by
memory_region_init_rom_device() don't have special behaviour
for writes). This has the same behaviour as calling
memory_region_init_ram() and then memory_region_set_readonly()
(which is what we do today in boards with pure ROMs) but is a
more easily discoverable API for the purpose.

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Message-id: 1467122287-24974-2-git-send-email-peter.maydell@linaro.org
This commit is contained in:
Peter Maydell 2016-07-04 13:06:35 +01:00
parent f5666418c4
commit a1777f7f64
3 changed files with 41 additions and 2 deletions

View File

@ -41,8 +41,13 @@ MemoryRegion):
MemoryRegionOps structure describing the callbacks. MemoryRegionOps structure describing the callbacks.
- ROM: a ROM memory region works like RAM for reads (directly accessing - ROM: a ROM memory region works like RAM for reads (directly accessing
a region of host memory), but like MMIO for writes (invoking a callback). a region of host memory), and forbids writes. You initialize these with
You initialize these with memory_region_init_rom_device(). memory_region_init_rom().
- ROM device: a ROM device memory region works like RAM for reads
(directly accessing a region of host memory), but like MMIO for
writes (invoking a callback). You initialize these with
memory_region_init_rom_device().
- IOMMU region: an IOMMU region translates addresses of accesses made to it - IOMMU region: an IOMMU region translates addresses of accesses made to it
and forwards them to some other target memory region. As the name suggests, and forwards them to some other target memory region. As the name suggests,

View File

@ -444,6 +444,25 @@ void memory_region_init_alias(MemoryRegion *mr,
hwaddr offset, hwaddr offset,
uint64_t size); uint64_t size);
/**
* memory_region_init_rom: Initialize a ROM memory region.
*
* This has the same effect as calling memory_region_init_ram()
* and then marking the resulting region read-only with
* memory_region_set_readonly().
*
* @mr: the #MemoryRegion to be initialized.
* @owner: the object that tracks the region's reference count
* @name: the name of the region.
* @size: size of the region.
* @errp: pointer to Error*, to store an error if it happens.
*/
void memory_region_init_rom(MemoryRegion *mr,
struct Object *owner,
const char *name,
uint64_t size,
Error **errp);
/** /**
* memory_region_init_rom_device: Initialize a ROM memory region. Writes are * memory_region_init_rom_device: Initialize a ROM memory region. Writes are
* handled via callbacks. * handled via callbacks.

View File

@ -1376,6 +1376,21 @@ void memory_region_init_alias(MemoryRegion *mr,
mr->alias_offset = offset; mr->alias_offset = offset;
} }
void memory_region_init_rom(MemoryRegion *mr,
struct Object *owner,
const char *name,
uint64_t size,
Error **errp)
{
memory_region_init(mr, owner, name, size);
mr->ram = true;
mr->readonly = true;
mr->terminates = true;
mr->destructor = memory_region_destructor_ram;
mr->ram_block = qemu_ram_alloc(size, mr, errp);
mr->dirty_log_mask = tcg_enabled() ? (1 << DIRTY_MEMORY_CODE) : 0;
}
void memory_region_init_rom_device(MemoryRegion *mr, void memory_region_init_rom_device(MemoryRegion *mr,
Object *owner, Object *owner,
const MemoryRegionOps *ops, const MemoryRegionOps *ops,