xref: /qemu/backends/hostmem.c (revision 58f4662c6c98a9fd05519745661177792d7aeede)
11f070489SIgor Mammedov /*
21f070489SIgor Mammedov  * QEMU Host Memory Backend
31f070489SIgor Mammedov  *
41f070489SIgor Mammedov  * Copyright (C) 2013-2014 Red Hat Inc
51f070489SIgor Mammedov  *
61f070489SIgor Mammedov  * Authors:
71f070489SIgor Mammedov  *   Igor Mammedov <imammedo@redhat.com>
81f070489SIgor Mammedov  *
91f070489SIgor Mammedov  * This work is licensed under the terms of the GNU GPL, version 2 or later.
101f070489SIgor Mammedov  * See the COPYING file in the top-level directory.
111f070489SIgor Mammedov  */
121f070489SIgor Mammedov #include "sysemu/hostmem.h"
131f070489SIgor Mammedov #include "sysemu/sysemu.h"
141f070489SIgor Mammedov #include "qapi/visitor.h"
151f070489SIgor Mammedov #include "qapi/qmp/qerror.h"
161f070489SIgor Mammedov #include "qemu/config-file.h"
171f070489SIgor Mammedov #include "qom/object_interfaces.h"
181f070489SIgor Mammedov 
191f070489SIgor Mammedov static void
20*58f4662cSHu Tao host_memory_backend_get_size(Object *obj, Visitor *v, void *opaque,
211f070489SIgor Mammedov                              const char *name, Error **errp)
221f070489SIgor Mammedov {
231f070489SIgor Mammedov     HostMemoryBackend *backend = MEMORY_BACKEND(obj);
241f070489SIgor Mammedov     uint64_t value = backend->size;
251f070489SIgor Mammedov 
261f070489SIgor Mammedov     visit_type_size(v, &value, name, errp);
271f070489SIgor Mammedov }
281f070489SIgor Mammedov 
291f070489SIgor Mammedov static void
30*58f4662cSHu Tao host_memory_backend_set_size(Object *obj, Visitor *v, void *opaque,
311f070489SIgor Mammedov                              const char *name, Error **errp)
321f070489SIgor Mammedov {
331f070489SIgor Mammedov     HostMemoryBackend *backend = MEMORY_BACKEND(obj);
341f070489SIgor Mammedov     Error *local_err = NULL;
351f070489SIgor Mammedov     uint64_t value;
361f070489SIgor Mammedov 
371f070489SIgor Mammedov     if (memory_region_size(&backend->mr)) {
381f070489SIgor Mammedov         error_setg(&local_err, "cannot change property value");
391f070489SIgor Mammedov         goto out;
401f070489SIgor Mammedov     }
411f070489SIgor Mammedov 
421f070489SIgor Mammedov     visit_type_size(v, &value, name, &local_err);
431f070489SIgor Mammedov     if (local_err) {
441f070489SIgor Mammedov         goto out;
451f070489SIgor Mammedov     }
461f070489SIgor Mammedov     if (!value) {
471f070489SIgor Mammedov         error_setg(&local_err, "Property '%s.%s' doesn't take value '%"
481f070489SIgor Mammedov                    PRIu64 "'", object_get_typename(obj), name, value);
491f070489SIgor Mammedov         goto out;
501f070489SIgor Mammedov     }
511f070489SIgor Mammedov     backend->size = value;
521f070489SIgor Mammedov out:
531f070489SIgor Mammedov     error_propagate(errp, local_err);
541f070489SIgor Mammedov }
551f070489SIgor Mammedov 
56*58f4662cSHu Tao static void host_memory_backend_init(Object *obj)
571f070489SIgor Mammedov {
581f070489SIgor Mammedov     object_property_add(obj, "size", "int",
59*58f4662cSHu Tao                         host_memory_backend_get_size,
60*58f4662cSHu Tao                         host_memory_backend_set_size, NULL, NULL, NULL);
611f070489SIgor Mammedov }
621f070489SIgor Mammedov 
63*58f4662cSHu Tao static void host_memory_backend_finalize(Object *obj)
641f070489SIgor Mammedov {
651f070489SIgor Mammedov     HostMemoryBackend *backend = MEMORY_BACKEND(obj);
661f070489SIgor Mammedov 
671f070489SIgor Mammedov     if (memory_region_size(&backend->mr)) {
681f070489SIgor Mammedov         memory_region_destroy(&backend->mr);
691f070489SIgor Mammedov     }
701f070489SIgor Mammedov }
711f070489SIgor Mammedov 
721f070489SIgor Mammedov MemoryRegion *
731f070489SIgor Mammedov host_memory_backend_get_memory(HostMemoryBackend *backend, Error **errp)
741f070489SIgor Mammedov {
751f070489SIgor Mammedov     return memory_region_size(&backend->mr) ? &backend->mr : NULL;
761f070489SIgor Mammedov }
771f070489SIgor Mammedov 
78*58f4662cSHu Tao static const TypeInfo host_memory_backend_info = {
791f070489SIgor Mammedov     .name = TYPE_MEMORY_BACKEND,
801f070489SIgor Mammedov     .parent = TYPE_OBJECT,
811f070489SIgor Mammedov     .abstract = true,
821f070489SIgor Mammedov     .class_size = sizeof(HostMemoryBackendClass),
831f070489SIgor Mammedov     .instance_size = sizeof(HostMemoryBackend),
84*58f4662cSHu Tao     .instance_init = host_memory_backend_init,
85*58f4662cSHu Tao     .instance_finalize = host_memory_backend_finalize,
861f070489SIgor Mammedov     .interfaces = (InterfaceInfo[]) {
871f070489SIgor Mammedov         { TYPE_USER_CREATABLE },
881f070489SIgor Mammedov         { }
891f070489SIgor Mammedov     }
901f070489SIgor Mammedov };
911f070489SIgor Mammedov 
921f070489SIgor Mammedov static void register_types(void)
931f070489SIgor Mammedov {
94*58f4662cSHu Tao     type_register_static(&host_memory_backend_info);
951f070489SIgor Mammedov }
961f070489SIgor Mammedov 
971f070489SIgor Mammedov type_init(register_types);
98