mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-07-27 04:13:53 -06:00
hostmem-file: add offset option
Add an option for hostmem-file to start the memory object at an offset into the target file. This is useful if multiple memory objects reside inside the same target file, such as a device node. In particular, it's useful to map guest memory directly into /dev/mem for experimentation. To make this work consistently, also fix up all places in QEMU that expect fd offsets to be 0. Signed-off-by: Alexander Graf <graf@amazon.com> Message-Id: <20230403221421.60877-1-graf@amazon.com> Acked-by: Markus Armbruster <armbru@redhat.com> Acked-by: Peter Xu <peterx@redhat.com> Reviewed-by: David Hildenbrand <david@redhat.com> Signed-off-by: David Hildenbrand <david@redhat.com>
This commit is contained in:
parent
886c0453cb
commit
4b870dc4d0
9 changed files with 69 additions and 9 deletions
|
@ -27,6 +27,7 @@ struct HostMemoryBackendFile {
|
|||
|
||||
char *mem_path;
|
||||
uint64_t align;
|
||||
uint64_t offset;
|
||||
bool discard_data;
|
||||
bool is_pmem;
|
||||
bool readonly;
|
||||
|
@ -58,7 +59,8 @@ file_backend_memory_alloc(HostMemoryBackend *backend, Error **errp)
|
|||
ram_flags |= fb->is_pmem ? RAM_PMEM : 0;
|
||||
memory_region_init_ram_from_file(&backend->mr, OBJECT(backend), name,
|
||||
backend->size, fb->align, ram_flags,
|
||||
fb->mem_path, fb->readonly, errp);
|
||||
fb->mem_path, fb->offset, fb->readonly,
|
||||
errp);
|
||||
g_free(name);
|
||||
#endif
|
||||
}
|
||||
|
@ -125,6 +127,36 @@ static void file_memory_backend_set_align(Object *o, Visitor *v,
|
|||
fb->align = val;
|
||||
}
|
||||
|
||||
static void file_memory_backend_get_offset(Object *o, Visitor *v,
|
||||
const char *name, void *opaque,
|
||||
Error **errp)
|
||||
{
|
||||
HostMemoryBackendFile *fb = MEMORY_BACKEND_FILE(o);
|
||||
uint64_t val = fb->offset;
|
||||
|
||||
visit_type_size(v, name, &val, errp);
|
||||
}
|
||||
|
||||
static void file_memory_backend_set_offset(Object *o, Visitor *v,
|
||||
const char *name, void *opaque,
|
||||
Error **errp)
|
||||
{
|
||||
HostMemoryBackend *backend = MEMORY_BACKEND(o);
|
||||
HostMemoryBackendFile *fb = MEMORY_BACKEND_FILE(o);
|
||||
uint64_t val;
|
||||
|
||||
if (host_memory_backend_mr_inited(backend)) {
|
||||
error_setg(errp, "cannot change property '%s' of %s", name,
|
||||
object_get_typename(o));
|
||||
return;
|
||||
}
|
||||
|
||||
if (!visit_type_size(v, name, &val, errp)) {
|
||||
return;
|
||||
}
|
||||
fb->offset = val;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_LIBPMEM
|
||||
static bool file_memory_backend_get_pmem(Object *o, Error **errp)
|
||||
{
|
||||
|
@ -197,6 +229,12 @@ file_backend_class_init(ObjectClass *oc, void *data)
|
|||
file_memory_backend_get_align,
|
||||
file_memory_backend_set_align,
|
||||
NULL, NULL);
|
||||
object_class_property_add(oc, "offset", "int",
|
||||
file_memory_backend_get_offset,
|
||||
file_memory_backend_set_offset,
|
||||
NULL, NULL);
|
||||
object_class_property_set_description(oc, "offset",
|
||||
"Offset into the target file (ex: 1G)");
|
||||
#ifdef CONFIG_LIBPMEM
|
||||
object_class_property_add_bool(oc, "pmem",
|
||||
file_memory_backend_get_pmem, file_memory_backend_set_pmem);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue