From patchwork Wed Dec 12 18:16:22 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Eduardo Habkost X-Patchwork-Id: 205598 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 869D52C0095 for ; Thu, 13 Dec 2012 05:15:18 +1100 (EST) Received: from localhost ([::1]:57555 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Tiqpw-0002Jh-GJ for incoming@patchwork.ozlabs.org; Wed, 12 Dec 2012 13:15:16 -0500 Received: from eggs.gnu.org ([208.118.235.92]:52352) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Tiqpb-0002CA-RE for qemu-devel@nongnu.org; Wed, 12 Dec 2012 13:15:01 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1TiqpV-00031B-MM for qemu-devel@nongnu.org; Wed, 12 Dec 2012 13:14:55 -0500 Received: from mx1.redhat.com ([209.132.183.28]:63688) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TiqpV-00030z-Dg for qemu-devel@nongnu.org; Wed, 12 Dec 2012 13:14:49 -0500 Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id qBCIEmPW020883 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 12 Dec 2012 13:14:48 -0500 Received: from blackpad.lan.raisama.net (vpn1-6-59.gru2.redhat.com [10.97.6.59]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id qBCIEmMq031217; Wed, 12 Dec 2012 13:14:48 -0500 Received: by blackpad.lan.raisama.net (Postfix, from userid 500) id B7B6C200A01; Wed, 12 Dec 2012 16:16:24 -0200 (BRST) From: Eduardo Habkost To: qemu-devel@nongnu.org Date: Wed, 12 Dec 2012 16:16:22 -0200 Message-Id: <1355336183-18858-2-git-send-email-ehabkost@redhat.com> In-Reply-To: <1355336183-18858-1-git-send-email-ehabkost@redhat.com> References: <1355336183-18858-1-git-send-email-ehabkost@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x X-Received-From: 209.132.183.28 Cc: Igor Mammedov , =?UTF-8?q?Andreas=20F=C3=A4rber?= Subject: [Qemu-devel] [PATCH 1/2] target-i386: move CPU object creation to cpu.c X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org As we will need to create the CPU object after splitting the CPU model string (because we're going to use different subclasses for each CPU model), move the CPU object creation to cpu_x86_register(), and at the same time rename cpu_x86_register() to cpu_x86_create(). This will also simplify the CPU creation code to a trivial cpu_x86_create()+cpu_x86_realize() sequence. This will be useful for code that have to set additional properties before cpu_x86_realize() is called (e.g. the PC CPU initialization code, that needs to set APIC IDs depending on the CPU cores/threads topology). Signed-off-by: Eduardo Habkost --- target-i386/cpu.c | 16 +++++++++++++--- target-i386/cpu.h | 2 +- target-i386/helper.c | 9 ++------- 3 files changed, 16 insertions(+), 11 deletions(-) diff --git a/target-i386/cpu.c b/target-i386/cpu.c index 3b9bbfe..b242bf1 100644 --- a/target-i386/cpu.c +++ b/target-i386/cpu.c @@ -1539,13 +1539,22 @@ static void filter_features_for_kvm(X86CPU *cpu) } #endif -int cpu_x86_register(X86CPU *cpu, const char *cpu_model) +/* Create and initialize a X86CPU object, based on the full CPU model string + * (that may include "+feature,-feature,feature=xxx" feature strings) + */ +X86CPU *cpu_x86_create(const char *cpu_model) { + X86CPU *cpu; + CPUX86State *env; x86_def_t def1, *def = &def1; Error *error = NULL; char *name, *features; gchar **model_pieces; + cpu = X86_CPU(object_new(TYPE_X86_CPU)); + env = &cpu->env; + env->cpu_model_str = cpu_model; + memset(def, 0, sizeof(*def)); model_pieces = g_strsplit(cpu_model, ",", 2); @@ -1578,10 +1587,11 @@ int cpu_x86_register(X86CPU *cpu, const char *cpu_model) } g_strfreev(model_pieces); - return 0; + return cpu; error: + object_delete(OBJECT(cpu)); g_strfreev(model_pieces); - return -1; + return NULL; } #if !defined(CONFIG_USER_ONLY) diff --git a/target-i386/cpu.h b/target-i386/cpu.h index 386c4f6..3ebaae9 100644 --- a/target-i386/cpu.h +++ b/target-i386/cpu.h @@ -980,7 +980,7 @@ int cpu_x86_signal_handler(int host_signum, void *pinfo, void cpu_x86_cpuid(CPUX86State *env, uint32_t index, uint32_t count, uint32_t *eax, uint32_t *ebx, uint32_t *ecx, uint32_t *edx); -int cpu_x86_register(X86CPU *cpu, const char *cpu_model); +X86CPU *cpu_x86_create(const char *cpu_model); void cpu_clear_apic_feature(CPUX86State *env); void host_cpuid(uint32_t function, uint32_t count, uint32_t *eax, uint32_t *ebx, uint32_t *ecx, uint32_t *edx); diff --git a/target-i386/helper.c b/target-i386/helper.c index bf206cf..23af4a8 100644 --- a/target-i386/helper.c +++ b/target-i386/helper.c @@ -1243,15 +1243,10 @@ int cpu_x86_get_descr_debug(CPUX86State *env, unsigned int selector, X86CPU *cpu_x86_init(const char *cpu_model) { X86CPU *cpu; - CPUX86State *env; Error *error = NULL; - cpu = X86_CPU(object_new(TYPE_X86_CPU)); - env = &cpu->env; - env->cpu_model_str = cpu_model; - - if (cpu_x86_register(cpu, cpu_model) < 0) { - object_delete(OBJECT(cpu)); + cpu = cpu_x86_create(cpu_model); + if (!cpu) { return NULL; }