5d9a9a6170
If memory-backend-{file,ram} has a size that's not aligned to underlying page size it is not only wasteful, but also may lead to hard to debug behaviour. For instance, in case memory-backend-file and hugepages, madvise() and mbind() fail. Rightfully so, page is the smallest unit they can work with. And even though an error is reported, the root cause it not very clear: qemu-system-x86_64: Couldn't set property 'dump' on 'memory-backend-file': Invalid argument After this commit: qemu-system-x86_64: backend 'memory-backend-file' memory size must be multiple of 2 MiB Signed-off-by: Michal Privoznik <mprivozn@redhat.com> Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org> Tested-by: Mario Casquero <mcasquer@redhat.com> Message-ID: <b5b9f9c6bba07879fb43f3c6f496c69867ae3716.1717584048.git.mprivozn@redhat.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
81 lines
2.0 KiB
C
81 lines
2.0 KiB
C
/*
|
|
* QEMU host SGX EPC memory backend
|
|
*
|
|
* Copyright (C) 2019 Intel Corporation
|
|
*
|
|
* Authors:
|
|
* Sean Christopherson <sean.j.christopherson@intel.com>
|
|
*
|
|
* This work is licensed under the terms of the GNU GPL, version 2 or later.
|
|
* See the COPYING file in the top-level directory.
|
|
*/
|
|
|
|
#include "qemu/osdep.h"
|
|
#include <sys/ioctl.h>
|
|
#include "qom/object_interfaces.h"
|
|
#include "qapi/error.h"
|
|
#include "sysemu/hostmem.h"
|
|
#include "hw/i386/hostmem-epc.h"
|
|
|
|
static bool
|
|
sgx_epc_backend_memory_alloc(HostMemoryBackend *backend, Error **errp)
|
|
{
|
|
g_autofree char *name = NULL;
|
|
uint32_t ram_flags;
|
|
int fd;
|
|
|
|
if (!backend->size) {
|
|
error_setg(errp, "can't create backend with size 0");
|
|
return false;
|
|
}
|
|
|
|
fd = qemu_open_old("/dev/sgx_vepc", O_RDWR);
|
|
if (fd < 0) {
|
|
error_setg_errno(errp, errno,
|
|
"failed to open /dev/sgx_vepc to alloc SGX EPC");
|
|
return false;
|
|
}
|
|
|
|
backend->aligned = true;
|
|
name = object_get_canonical_path(OBJECT(backend));
|
|
ram_flags = (backend->share ? RAM_SHARED : 0) | RAM_PROTECTED;
|
|
return memory_region_init_ram_from_fd(&backend->mr, OBJECT(backend), name,
|
|
backend->size, ram_flags, fd, 0, errp);
|
|
}
|
|
|
|
static void sgx_epc_backend_instance_init(Object *obj)
|
|
{
|
|
HostMemoryBackend *m = MEMORY_BACKEND(obj);
|
|
|
|
m->share = true;
|
|
m->merge = false;
|
|
m->dump = false;
|
|
}
|
|
|
|
static void sgx_epc_backend_class_init(ObjectClass *oc, void *data)
|
|
{
|
|
HostMemoryBackendClass *bc = MEMORY_BACKEND_CLASS(oc);
|
|
|
|
bc->alloc = sgx_epc_backend_memory_alloc;
|
|
}
|
|
|
|
static const TypeInfo sgx_epc_backed_info = {
|
|
.name = TYPE_MEMORY_BACKEND_EPC,
|
|
.parent = TYPE_MEMORY_BACKEND,
|
|
.instance_init = sgx_epc_backend_instance_init,
|
|
.class_init = sgx_epc_backend_class_init,
|
|
.instance_size = sizeof(HostMemoryBackendEpc),
|
|
};
|
|
|
|
static void register_types(void)
|
|
{
|
|
int fd = qemu_open_old("/dev/sgx_vepc", O_RDWR);
|
|
if (fd >= 0) {
|
|
close(fd);
|
|
|
|
type_register_static(&sgx_epc_backed_info);
|
|
}
|
|
}
|
|
|
|
type_init(register_types);
|