From patchwork Mon Mar 23 17:32:01 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Andreas_F=C3=A4rber?= X-Patchwork-Id: 453572 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 1D94214016B for ; Tue, 24 Mar 2015 04:34:45 +1100 (AEDT) Received: from localhost ([::1]:57351 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Ya6FP-0005wI-C2 for incoming@patchwork.ozlabs.org; Mon, 23 Mar 2015 13:34:43 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:58329) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Ya6D1-0001hI-U3 for qemu-devel@nongnu.org; Mon, 23 Mar 2015 13:32:23 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Ya6Cu-0005O5-5e for qemu-devel@nongnu.org; Mon, 23 Mar 2015 13:32:14 -0400 Received: from cantor2.suse.de ([195.135.220.15]:52959 helo=mx2.suse.de) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Ya6Ct-0005Ni-T9 for qemu-devel@nongnu.org; Mon, 23 Mar 2015 13:32:08 -0400 X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 65E07ADC3; Mon, 23 Mar 2015 17:32:07 +0000 (UTC) From: =?UTF-8?q?Andreas=20F=C3=A4rber?= To: qemu-devel@nongnu.org Date: Mon, 23 Mar 2015 18:32:01 +0100 Message-Id: <1427131923-4670-3-git-send-email-afaerber@suse.de> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1427131923-4670-1-git-send-email-afaerber@suse.de> References: <1427131923-4670-1-git-send-email-afaerber@suse.de> MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x (no timestamps) [generic] X-Received-From: 195.135.220.15 Cc: Paolo Bonzini , "Michael S. Tsirkin" , =?UTF-8?q?Andreas=20F=C3=A4rber?= , Richard Henderson Subject: [Qemu-devel] [PATCH RFC 2/4] target-i386: Prepare CPU socket/core abstraction 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 Short of generic recursive device realization, realize cores and threads recursively. Signed-off-by: Andreas Färber --- hw/i386/Makefile.objs | 1 + hw/i386/cpu-core.c | 45 ++++++++++++++++++++++++++++++++++++++++++++ hw/i386/cpu-socket.c | 45 ++++++++++++++++++++++++++++++++++++++++++++ include/hw/i386/cpu-core.h | 26 +++++++++++++++++++++++++ include/hw/i386/cpu-socket.h | 29 ++++++++++++++++++++++++++++ 5 files changed, 146 insertions(+) create mode 100644 hw/i386/cpu-core.c create mode 100644 hw/i386/cpu-socket.c create mode 100644 include/hw/i386/cpu-core.h create mode 100644 include/hw/i386/cpu-socket.h diff --git a/hw/i386/Makefile.objs b/hw/i386/Makefile.objs index e058a39..9f76424 100644 --- a/hw/i386/Makefile.objs +++ b/hw/i386/Makefile.objs @@ -1,5 +1,6 @@ obj-$(CONFIG_KVM) += kvm/ obj-y += multiboot.o smbios.o +obj-y += cpu-socket.o cpu-core.o obj-y += pc.o pc_piix.o pc_q35.o obj-y += pc_sysfw.o obj-y += intel_iommu.o diff --git a/hw/i386/cpu-core.c b/hw/i386/cpu-core.c new file mode 100644 index 0000000..d579025 --- /dev/null +++ b/hw/i386/cpu-core.c @@ -0,0 +1,45 @@ +/* + * x86 CPU core abstraction + * + * Copyright (c) 2015 SUSE Linux GmbH + */ + +#include "hw/i386/cpu-core.h" + +static int x86_cpu_core_realize_child(Object *child, void *opaque) +{ + Error **errp = opaque; + Error *local_err = NULL; + + object_property_set_bool(child, true, "realized", &local_err); + error_propagate(errp, local_err); + + return local_err != NULL ? 1 : 0; +} + +static void x86_cpu_core_realize(DeviceState *dev, Error **errp) +{ + /* XXX generic */ + object_child_foreach(OBJECT(dev), x86_cpu_core_realize_child, errp); +} + +static void x86_cpu_core_class_init(ObjectClass *oc, void *data) +{ + DeviceClass *dc = DEVICE_CLASS(oc); + + dc->realize = x86_cpu_core_realize; +} + +static const TypeInfo x86_cpu_core_type_info = { + .name = TYPE_X86_CPU_CORE, + .parent = TYPE_DEVICE, + .instance_size = sizeof(X86CPUCore), + .class_init = x86_cpu_core_class_init, +}; + +static void x86_cpu_core_register_types(void) +{ + type_register_static(&x86_cpu_core_type_info); +} + +type_init(x86_cpu_core_register_types) diff --git a/hw/i386/cpu-socket.c b/hw/i386/cpu-socket.c new file mode 100644 index 0000000..dc27400 --- /dev/null +++ b/hw/i386/cpu-socket.c @@ -0,0 +1,45 @@ +/* + * x86 CPU socket abstraction + * + * Copyright (c) 2015 SUSE Linux GmbH + */ + +#include "hw/i386/cpu-socket.h" + +static int x86_cpu_socket_realize_child(Object *child, void *opaque) +{ + Error **errp = opaque; + Error *local_err = NULL; + + object_property_set_bool(child, true, "realized", &local_err); + error_propagate(errp, local_err); + + return local_err != NULL ? 1 : 0; +} + +static void x86_cpu_socket_realize(DeviceState *dev, Error **errp) +{ + /* XXX generic */ + object_child_foreach(OBJECT(dev), x86_cpu_socket_realize_child, errp); +} + +static void x86_cpu_socket_class_init(ObjectClass *oc, void *data) +{ + DeviceClass *dc = DEVICE_CLASS(oc); + + dc->realize = x86_cpu_socket_realize; +} + +static const TypeInfo x86_cpu_socket_type_info = { + .name = TYPE_X86_CPU_SOCKET, + .parent = TYPE_CPU_SOCKET, + .instance_size = sizeof(X86CPUSocket), + .class_init = x86_cpu_socket_class_init, +}; + +static void x86_cpu_socket_register_types(void) +{ + type_register_static(&x86_cpu_socket_type_info); +} + +type_init(x86_cpu_socket_register_types) diff --git a/include/hw/i386/cpu-core.h b/include/hw/i386/cpu-core.h new file mode 100644 index 0000000..be78f95 --- /dev/null +++ b/include/hw/i386/cpu-core.h @@ -0,0 +1,26 @@ +/* + * x86 CPU core abstraction + * + * Copyright (c) 2015 SUSE Linux GmbH + */ +#ifndef HW_I386_CPU_CORE_H +#define HW_I386_CPU_CORE_H + +#include "hw/qdev.h" + +#ifdef TARGET_X86_64 +#define TYPE_X86_CPU_CORE "x86_64-cpu-core" +#else +#define TYPE_X86_CPU_CORE "i386-cpu-core" +#endif + +#define X86_CPU_CORE(obj) \ + OBJECT_CHECK(X86CPUCore, (obj), TYPE_X86_CPU_CORE) + +typedef struct X86CPUCore { + /*< private >*/ + DeviceState parent_obj; + /*< public >*/ +} X86CPUCore; + +#endif diff --git a/include/hw/i386/cpu-socket.h b/include/hw/i386/cpu-socket.h new file mode 100644 index 0000000..9fb3ef8 --- /dev/null +++ b/include/hw/i386/cpu-socket.h @@ -0,0 +1,29 @@ +/* + * x86 CPU socket abstraction + * + * Copyright (c) 2015 SUSE Linux GmbH + */ +#ifndef HW_I386_CPU_SOCKET_H +#define HW_I386_CPU_SOCKET_H + +#include "hw/cpu/socket.h" +#include "cpu-core.h" + +#ifdef TARGET_X86_64 +#define TYPE_X86_CPU_SOCKET "x86_64-cpu-socket" +#else +#define TYPE_X86_CPU_SOCKET "i386-cpu-socket" +#endif + +#define X86_CPU_SOCKET(obj) \ + OBJECT_CHECK(X86CPUSocket, (obj), TYPE_X86_CPU_SOCKET) + +typedef struct X86CPUSocket { + /*< private >*/ + DeviceState parent_obj; + /*< public >*/ + + X86CPUCore core[0]; +} X86CPUSocket; + +#endif