From 5fd2087a1b7b3075828de741d76188441ee35bc8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20F=C3=A4rber?= Date: Mon, 2 Apr 2012 23:20:08 +0200 Subject: target-i386: QOM'ify CPU MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Embed CPUX86State as first member of X86CPU. Distinguish between "x86_64-cpu" and "i386-cpu". Drop cpu_x86_close() in favor of calling object_delete() directly. For now let CPUClass::reset() call cpu_state_reset(). Signed-off-by: Andreas Färber --- target-i386/cpu-qom.h | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++ target-i386/cpu.c | 37 +++++++++++++++++++++++++ target-i386/cpu.h | 3 ++- target-i386/helper.c | 11 +++----- 4 files changed, 118 insertions(+), 8 deletions(-) create mode 100644 target-i386/cpu-qom.h (limited to 'target-i386') diff --git a/target-i386/cpu-qom.h b/target-i386/cpu-qom.h new file mode 100644 index 0000000..40635c4 --- /dev/null +++ b/target-i386/cpu-qom.h @@ -0,0 +1,75 @@ +/* + * QEMU x86 CPU + * + * Copyright (c) 2012 SUSE LINUX Products GmbH + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, see + * + */ +#ifndef QEMU_I386_CPU_QOM_H +#define QEMU_I386_CPU_QOM_H + +#include "qemu/cpu.h" +#include "cpu.h" + +#ifdef TARGET_X86_64 +#define TYPE_X86_CPU "x86_64-cpu" +#else +#define TYPE_X86_CPU "i386-cpu" +#endif + +#define X86_CPU_CLASS(klass) \ + OBJECT_CLASS_CHECK(X86CPUClass, (klass), TYPE_X86_CPU) +#define X86_CPU(obj) \ + OBJECT_CHECK(X86CPU, (obj), TYPE_X86_CPU) +#define X86_CPU_GET_CLASS(obj) \ + OBJECT_GET_CLASS(X86CPUClass, (obj), TYPE_X86_CPU) + +/** + * X86CPUClass: + * @parent_reset: The parent class' reset handler. + * + * An x86 CPU model or family. + */ +typedef struct X86CPUClass { + /*< private >*/ + CPUClass parent_class; + /*< public >*/ + + void (*parent_reset)(CPUState *cpu); +} X86CPUClass; + +/** + * X86CPU: + * @env: #CPUX86State + * + * An x86 CPU. + */ +typedef struct X86CPU { + /*< private >*/ + CPUState parent_obj; + /*< public >*/ + + CPUX86State env; +} X86CPU; + +static inline X86CPU *x86_env_get_cpu(CPUX86State *env) +{ + return X86_CPU(container_of(env, X86CPU, env)); +} + +#define ENV_GET_CPU(e) CPU(x86_env_get_cpu(e)) + + +#endif diff --git a/target-i386/cpu.c b/target-i386/cpu.c index 465ea15..36790da 100644 --- a/target-i386/cpu.c +++ b/target-i386/cpu.c @@ -1367,3 +1367,40 @@ void cpu_x86_cpuid(CPUX86State *env, uint32_t index, uint32_t count, break; } } + +/* CPUClass::reset() */ +static void x86_cpu_reset(CPUState *s) +{ + X86CPU *cpu = X86_CPU(s); + X86CPUClass *xcc = X86_CPU_GET_CLASS(cpu); + CPUX86State *env = &cpu->env; + + xcc->parent_reset(s); + + cpu_state_reset(env); +} + +static void x86_cpu_common_class_init(ObjectClass *oc, void *data) +{ + X86CPUClass *xcc = X86_CPU_CLASS(oc); + CPUClass *cc = CPU_CLASS(oc); + + xcc->parent_reset = cc->reset; + cc->reset = x86_cpu_reset; +} + +static const TypeInfo x86_cpu_type_info = { + .name = TYPE_X86_CPU, + .parent = TYPE_CPU, + .instance_size = sizeof(X86CPU), + .abstract = false, + .class_size = sizeof(X86CPUClass), + .class_init = x86_cpu_common_class_init, +}; + +static void x86_cpu_register_types(void) +{ + type_register_static(&x86_cpu_type_info); +} + +type_init(x86_cpu_register_types) diff --git a/target-i386/cpu.h b/target-i386/cpu.h index a1ed3e7..4bb4592 100644 --- a/target-i386/cpu.h +++ b/target-i386/cpu.h @@ -783,9 +783,10 @@ typedef struct CPUX86State { TPRAccess tpr_access_type; } CPUX86State; +#include "cpu-qom.h" + CPUX86State *cpu_x86_init(const char *cpu_model); int cpu_x86_exec(CPUX86State *s); -void cpu_x86_close(CPUX86State *s); void x86_cpu_list (FILE *f, fprintf_function cpu_fprintf, const char *optarg); void x86_cpudef_setup(void); int cpu_x86_support_mca_broadcast(CPUX86State *env); diff --git a/target-i386/helper.c b/target-i386/helper.c index 83122bf..fb87975 100644 --- a/target-i386/helper.c +++ b/target-i386/helper.c @@ -101,11 +101,6 @@ void cpu_state_reset(CPUX86State *env) cpu_watchpoint_remove_all(env, BP_CPU); } -void cpu_x86_close(CPUX86State *env) -{ - g_free(env); -} - static void cpu_x86_version(CPUX86State *env, int *family, int *model) { int cpuver = env->cpuid_version; @@ -1248,10 +1243,12 @@ int cpu_x86_get_descr_debug(CPUX86State *env, unsigned int selector, CPUX86State *cpu_x86_init(const char *cpu_model) { + X86CPU *cpu; CPUX86State *env; static int inited; - env = g_malloc0(sizeof(CPUX86State)); + cpu = X86_CPU(object_new(TYPE_X86_CPU)); + env = &cpu->env; cpu_exec_init(env); env->cpu_model_str = cpu_model; @@ -1265,7 +1262,7 @@ CPUX86State *cpu_x86_init(const char *cpu_model) #endif } if (cpu_x86_register(env, cpu_model) < 0) { - cpu_x86_close(env); + object_delete(OBJECT(cpu)); return NULL; } env->cpuid_apic_id = env->cpu_index; -- cgit v1.1