@@ -1764,8 +1764,9 @@ void qemu_init_vcpu(CPUState *cpu)
/* If the target cpu hasn't set up any address spaces itself,
* give it the default one.
*/
- AddressSpace *as = address_space_init_shareable(cpu->memory,
- "cpu-memory");
+ AddressSpace *as =
+ address_space_init_shareable(MEMORY_REGION(cpu->memory),
+ "cpu-memory");
cpu->num_ases = 1;
cpu_address_space_init(cpu, as, 0);
}
@@ -27,6 +27,7 @@
#include "exec/target_page.h"
#include "tcg.h"
#include "hw/qdev-core.h"
+#include "hw/qdev-properties.h"
#if !defined(CONFIG_USER_ONLY)
#include "hw/boards.h"
#include "hw/xen/xen.h"
@@ -730,6 +731,19 @@ void cpu_exec_unrealizefn(CPUState *cpu)
}
}
+Property cpu_common_props[] = {
+#ifndef CONFIG_USER_ONLY
+ /* Create a memory property for softmmu CPU object,
+ * so users can wire up its memory. (This can't go in qom/cpu.c
+ * because that file is compiled only once for both user-mode
+ * and system builds.) The default if no link is set up is to use
+ * the system address space.
+ */
+ DEFINE_PROP_LINK("memory", CPUState, memory, TYPE_MEMORY_REGION),
+#endif
+ DEFINE_PROP_END_OF_LIST(),
+};
+
void cpu_exec_initfn(CPUState *cpu)
{
cpu->as = NULL;
@@ -737,20 +751,8 @@ void cpu_exec_initfn(CPUState *cpu)
#ifndef CONFIG_USER_ONLY
cpu->thread_id = qemu_get_thread_id();
-
- /* This is a softmmu CPU object, so create a property for it
- * so users can wire up its memory. (This can't go in qom/cpu.c
- * because that file is compiled only once for both user-mode
- * and system builds.) The default if no link is set up is to use
- * the system address space.
- */
- object_property_add_link(OBJECT(cpu), "memory", TYPE_MEMORY_REGION,
- (Object **)&cpu->memory,
- qdev_prop_allow_set_link_before_realize,
- OBJ_PROP_LINK_UNREF_ON_RELEASE,
- &error_abort);
- cpu->memory = system_memory;
- object_ref(OBJECT(cpu->memory));
+ cpu->memory = OBJECT(system_memory);
+ object_ref(cpu->memory);
#endif
}
@@ -342,7 +342,8 @@ struct CPUState {
CPUAddressSpace *cpu_ases;
int num_ases;
AddressSpace *as;
- MemoryRegion *memory;
+ /* Memory region pointer to be filled by link property */
+ Object *memory;
void *env_ptr; /* CPUArchState */
@@ -1010,6 +1011,7 @@ AddressSpace *cpu_get_address_space(CPUState *cpu, int asidx);
void QEMU_NORETURN cpu_abort(CPUState *cpu, const char *fmt, ...)
GCC_FMT_ATTR(2, 3);
+extern Property cpu_common_props[];
void cpu_exec_initfn(CPUState *cpu);
void cpu_exec_realizefn(CPUState *cpu, Error **errp);
void cpu_exec_unrealizefn(CPUState *cpu);
@@ -446,6 +446,7 @@ static void cpu_class_init(ObjectClass *klass, void *data)
set_bit(DEVICE_CATEGORY_CPU, dc->categories);
dc->realize = cpu_common_realizefn;
dc->unrealize = cpu_common_unrealizefn;
+ dc->props = cpu_common_props;
/*
* Reason: CPUs still need special care by board code: wiring up
* IRQs, adding reset handlers, halting non-first CPUs, ...
@@ -817,14 +817,14 @@ static void arm_cpu_realizefn(DeviceState *dev, Error **errp)
AddressSpace *as;
if (!cpu->secure_memory) {
- cpu->secure_memory = cs->memory;
+ cpu->secure_memory = MEMORY_REGION(cs->memory);
}
- as = address_space_init_shareable(cpu->secure_memory,
+ as = address_space_init_shareable(MEMORY_REGION(cpu->secure_memory),
"cpu-secure-memory");
cpu_address_space_init(cs, as, ARMASIdx_S);
}
cpu_address_space_init(cs,
- address_space_init_shareable(cs->memory,
+ address_space_init_shareable(MEMORY_REGION(cs->memory),
"cpu-memory"),
ARMASIdx_NS);
#endif
@@ -3615,8 +3615,9 @@ static void x86_cpu_realizefn(DeviceState *dev, Error **errp)
#ifndef CONFIG_USER_ONLY
if (tcg_enabled()) {
- AddressSpace *as_normal = address_space_init_shareable(cs->memory,
- "cpu-memory");
+ AddressSpace *as_normal =
+ address_space_init_shareable(MEMORY_REGION(cs->memory),
+ "cpu-memory");
AddressSpace *as_smm = g_new(AddressSpace, 1);
cpu->cpu_as_mem = g_new(MemoryRegion, 1);
Signed-off-by: Fam Zheng <famz@redhat.com> --- cpus.c | 5 +++-- exec.c | 30 ++++++++++++++++-------------- include/qom/cpu.h | 4 +++- qom/cpu.c | 1 + target/arm/cpu.c | 6 +++--- target/i386/cpu.c | 5 +++-- 6 files changed, 29 insertions(+), 22 deletions(-)