mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-04 08:13:54 -06:00
memory: add readonly support to memory_region_init_ram_from_file()
There is currently no way to open(O_RDONLY) and mmap(PROT_READ) when creating a memory region from a file. This functionality is needed since the underlying host file may not allow writing. Add a bool readonly argument to memory_region_init_ram_from_file() and the APIs it calls. Extend memory_region_init_ram_from_file() rather than introducing a memory_region_init_rom_from_file() API so that callers can easily make a choice between read/write and read-only at runtime without calling different APIs. No new RAMBlock flag is introduced for read-only because it's unclear whether RAMBlocks need to know that they are read-only. Pass a bool readonly argument instead. Both of these design decisions can be changed in the future. It just seemed like the simplest approach to me. Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com> Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com> Reviewed-by: Igor Mammedov <imammedo@redhat.com> Reviewed-by: Liam Merwick <liam.merwick@oracle.com> Acked-by: Michael S. Tsirkin <mst@redhat.com> Message-Id: <20210104171320.575838-2-stefanha@redhat.com> Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
This commit is contained in:
parent
74208cd252
commit
369d6dc4de
8 changed files with 31 additions and 17 deletions
|
@ -85,9 +85,11 @@ size_t qemu_mempath_getpagesize(const char *mem_path)
|
|||
void *qemu_ram_mmap(int fd,
|
||||
size_t size,
|
||||
size_t align,
|
||||
bool readonly,
|
||||
bool shared,
|
||||
bool is_pmem)
|
||||
{
|
||||
int prot;
|
||||
int flags;
|
||||
int map_sync_flags = 0;
|
||||
int guardfd;
|
||||
|
@ -146,8 +148,9 @@ void *qemu_ram_mmap(int fd,
|
|||
|
||||
offset = QEMU_ALIGN_UP((uintptr_t)guardptr, align) - (uintptr_t)guardptr;
|
||||
|
||||
ptr = mmap(guardptr + offset, size, PROT_READ | PROT_WRITE,
|
||||
flags | map_sync_flags, fd, 0);
|
||||
prot = PROT_READ | (readonly ? 0 : PROT_WRITE);
|
||||
|
||||
ptr = mmap(guardptr + offset, size, prot, flags | map_sync_flags, fd, 0);
|
||||
|
||||
if (ptr == MAP_FAILED && map_sync_flags) {
|
||||
if (errno == ENOTSUP) {
|
||||
|
@ -171,8 +174,7 @@ void *qemu_ram_mmap(int fd,
|
|||
* if map failed with MAP_SHARED_VALIDATE | MAP_SYNC,
|
||||
* we will remove these flags to handle compatibility.
|
||||
*/
|
||||
ptr = mmap(guardptr + offset, size, PROT_READ | PROT_WRITE,
|
||||
flags, fd, 0);
|
||||
ptr = mmap(guardptr + offset, size, prot, flags, fd, 0);
|
||||
}
|
||||
|
||||
if (ptr == MAP_FAILED) {
|
||||
|
|
|
@ -230,7 +230,7 @@ void *qemu_memalign(size_t alignment, size_t size)
|
|||
void *qemu_anon_ram_alloc(size_t size, uint64_t *alignment, bool shared)
|
||||
{
|
||||
size_t align = QEMU_VMALLOC_ALIGN;
|
||||
void *ptr = qemu_ram_mmap(-1, size, align, shared, false);
|
||||
void *ptr = qemu_ram_mmap(-1, size, align, false, shared, false);
|
||||
|
||||
if (ptr == MAP_FAILED) {
|
||||
return NULL;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue