From: Igor Mammedov <imammedo@redhat.com>
To: Igor Mammedov <imammedo@redhat.com>
Cc: aliguori@us.ibm.com, ehabkost@redhat.com,
claudio.fontana@huawei.com, qemu-devel@nongnu.org,
aderumier@odiso.com, lcapitulino@redhat.com,
jfrei@linux.vnet.ibm.com, yang.z.zhang@intel.com,
pbonzini@redhat.com, afaerber@suse.de, lig.fnst@cn.fujitsu.com,
rth@twiddle.net
Subject: Re: [Qemu-devel] [PATCH 19/22] target-i386: move APIC to ICC bus
Date: Tue, 9 Apr 2013 14:47:03 +0200 [thread overview]
Message-ID: <20130409144703.0beb4f39@nial.usersys.redhat.com> (raw)
In-Reply-To: <1365172636-28628-21-git-send-email-imammedo@redhat.com>
On Fri, 5 Apr 2013 16:37:12 +0200
Igor Mammedov <imammedo@redhat.com> wrote:
> ... to allow it to be hotplugged
>
> * map APIC's mmio at board level if it is present
>
> Signed-off-by: Igor Mammedov <imammedo@redhat.com>
> ---
> hw/apic_common.c | 17 ++++++++++++-----
> hw/apic_internal.h | 6 +++---
> hw/i386/kvmvapic.c | 1 +
> hw/i386/pc.c | 18 +++++++++++++++---
> hw/icc_bus.c | 6 ++++++
> hw/icc_bus.h | 2 +-
> target-i386/cpu.c | 16 +++-------------
> 7 files changed, 41 insertions(+), 25 deletions(-)
>
> diff --git a/hw/apic_common.c b/hw/apic_common.c
> index 3798509..b2e84e6 100644
> --- a/hw/apic_common.c
> +++ b/hw/apic_common.c
> @@ -21,6 +21,8 @@
> #include "hw/apic_internal.h"
> #include "trace.h"
> #include "sysemu/kvm.h"
> +#include "qdev.h"
> +#include "hw/sysbus.h"
>
> static int apic_irq_delivered;
> bool apic_report_tpr_access;
> @@ -282,12 +284,14 @@ static int apic_load_old(QEMUFile *f, void *opaque,
> int version_id) return 0;
> }
>
> -static int apic_init_common(SysBusDevice *dev)
> +static int apic_init_common(ICCDevice *dev)
> {
> APICCommonState *s = APIC_COMMON(dev);
> + DeviceState *d = DEVICE(dev);
> APICCommonClass *info;
> static DeviceState *vapic;
> static int apic_no;
> + static bool mmio_registered;
>
> if (apic_no >= MAX_APICS) {
> return -1;
> @@ -296,8 +300,11 @@ static int apic_init_common(SysBusDevice *dev)
>
> info = APIC_COMMON_GET_CLASS(s);
> info->init(s);
> -
> - sysbus_init_mmio(dev, &s->io_memory);
> + if (!mmio_registered) {
> + MemoryRegion *as = ICC_BUS(d->parent_bus)->apic_address_space;
> + memory_region_add_subregion(as, 0, &s->io_memory);
> + mmio_registered = true;
> + }
>
> /* Note: We need at least 1M to map the VAPIC option ROM */
> if (!vapic && s->vapic_control & VAPIC_ENABLE_MASK &&
> @@ -375,7 +382,7 @@ static Property apic_properties_common[] = {
>
> static void apic_common_class_init(ObjectClass *klass, void *data)
> {
> - SysBusDeviceClass *sc = SYS_BUS_DEVICE_CLASS(klass);
> + ICCDeviceClass *sc = ICC_DEVICE_CLASS(klass);
> DeviceClass *dc = DEVICE_CLASS(klass);
>
> dc->vmsd = &vmstate_apic_common;
> @@ -387,7 +394,7 @@ static void apic_common_class_init(ObjectClass *klass,
> void *data)
> static const TypeInfo apic_common_type = {
> .name = TYPE_APIC_COMMON,
> - .parent = TYPE_SYS_BUS_DEVICE,
> + .parent = TYPE_ICC_DEVICE,
> .instance_size = sizeof(APICCommonState),
> .class_size = sizeof(APICCommonClass),
> .class_init = apic_common_class_init,
> diff --git a/hw/apic_internal.h b/hw/apic_internal.h
> index aac6290..172fc91 100644
> --- a/hw/apic_internal.h
> +++ b/hw/apic_internal.h
> @@ -21,7 +21,7 @@
> #define QEMU_APIC_INTERNAL_H
>
> #include "exec/memory.h"
> -#include "hw/sysbus.h"
> +#include "hw/icc_bus.h"
> #include "qemu/timer.h"
>
> /* APIC Local Vector Table */
> @@ -78,7 +78,7 @@ typedef struct APICCommonState APICCommonState;
>
> typedef struct APICCommonClass
> {
> - SysBusDeviceClass parent_class;
> + ICCDeviceClass parent_class;
>
> void (*init)(APICCommonState *s);
> void (*set_base)(APICCommonState *s, uint64_t val);
> @@ -92,7 +92,7 @@ typedef struct APICCommonClass
> } APICCommonClass;
>
> struct APICCommonState {
> - SysBusDevice busdev;
> + ICCDevice busdev;
>
> MemoryRegion io_memory;
> X86CPU *cpu;
> diff --git a/hw/i386/kvmvapic.c b/hw/i386/kvmvapic.c
> index c4be882..81e0a75 100644
> --- a/hw/i386/kvmvapic.c
> +++ b/hw/i386/kvmvapic.c
> @@ -12,6 +12,7 @@
> #include "sysemu/cpus.h"
> #include "sysemu/kvm.h"
> #include "hw/apic_internal.h"
> +#include "hw/sysbus.h"
>
> #define VAPIC_IO_PORT 0x7e
>
> diff --git a/hw/i386/pc.c b/hw/i386/pc.c
> index fbc0bcf..5c0dd4f 100644
> --- a/hw/i386/pc.c
> +++ b/hw/i386/pc.c
> @@ -869,13 +869,13 @@ void pc_acpi_smi_interrupt(void *opaque, int irq, int
> level) }
> }
>
> -static void pc_new_cpu(const char *cpu_model, int64_t apic_id, Error
> **errp) +static X86CPU *pc_new_cpu(const char *cpu_model, int64_t apic_id,
> Error **errp) {
> X86CPU *cpu;
>
> cpu = cpu_x86_create(cpu_model, errp);
> if (!cpu) {
> - return;
> + return cpu;
> }
>
> object_property_set_int(OBJECT(cpu), apic_id, "apic-id", errp);
> @@ -884,14 +884,18 @@ static void pc_new_cpu(const char *cpu_model, int64_t
> apic_id, Error **errp) if (error_is_set(errp)) {
> if (cpu != NULL) {
> object_unref(OBJECT(cpu));
> + cpu = NULL;
> }
> }
> + return cpu;
> }
>
> void pc_cpus_init(const char *cpu_model)
> {
> int i;
> + X86CPU *cpu;
> Error *error = NULL;
> + SysBusDevice *ib;
>
> /* init CPUs */
> if (cpu_model == NULL) {
> @@ -902,14 +906,22 @@ void pc_cpus_init(const char *cpu_model)
> #endif
> }
>
> + ib = SYS_BUS_DEVICE(object_resolve_path_type("icc-bridge",
> + TYPE_ICC_BRIDGE, NULL));
> +
> for (i = 0; i < smp_cpus; i++) {
> - pc_new_cpu(cpu_model, x86_cpu_apic_id_from_index(i), &error);
> + cpu = pc_new_cpu(cpu_model, x86_cpu_apic_id_from_index(i), &error);
> if (error) {
> fprintf(stderr, "%s\n", error_get_pretty(error));
> error_free(error);
> exit(1);
> }
> }
> +
> + /* map APIC MMIO area if CPU has it */
> + if (cpu->env.apic_state) {
> + sysbus_mmio_map_overlap(ib, 0, APIC_DEFAULT_ADDRESS, 0x1000);
> + }
> }
>
> void pc_acpi_init(const char *default_dsdt)
> diff --git a/hw/icc_bus.c b/hw/icc_bus.c
> index fc8d892..bfe2a30 100644
> --- a/hw/icc_bus.c
> +++ b/hw/icc_bus.c
> @@ -60,6 +60,7 @@ static const TypeInfo icc_device_info = {
> typedef struct ICCBridgeState {
> SysBusDevice busdev;
> MemoryRegion ioapic_container;
> + MemoryRegion apic_container;
> } ICCBridgeState;
> #define ICC_BRIGDE(obj) OBJECT_CHECK(ICCBridgeState, (obj),
> TYPE_ICC_BRIDGE)
> @@ -92,6 +93,11 @@ static void icc_bridge_initfn(Object *obj)
> memory_region_init(&s->ioapic_container, "icc-ioapic-container",
> 0x1000); sysbus_init_mmio(sb, &s->ioapic_container);
> ibus->ioapic_address_space = &s->ioapic_container;
> +
> + memory_region_init(&s->apic_container, "icc-apic-container",
> + APIC_SPACE_SIZE);
> + sysbus_init_mmio(sb, &s->apic_container);
> + ibus->apic_address_space = &s->apic_container;
> }
>
> static const TypeInfo icc_bridge_info = {
> diff --git a/hw/icc_bus.h b/hw/icc_bus.h
> index b8e2032..a3d9e0a 100644
> --- a/hw/icc_bus.h
> +++ b/hw/icc_bus.h
> @@ -28,6 +28,7 @@
> typedef struct ICCBus {
> BusState qbus;
> MemoryRegion *ioapic_address_space;
> + MemoryRegion *apic_address_space;
> } ICCBus;
> #define ICC_BUS(obj) OBJECT_CHECK(ICCBus, (obj), TYPE_ICC_BUS)
>
> @@ -50,4 +51,3 @@ typedef struct ICCDeviceClass {
>
> #endif /* CONFIG_USER_ONLY */
> #endif
> -
> diff --git a/target-i386/cpu.c b/target-i386/cpu.c
> index 2b3c1f3..32f7aea 100644
> --- a/target-i386/cpu.c
> +++ b/target-i386/cpu.c
> @@ -41,10 +41,10 @@
> #endif
>
> #include "sysemu/sysemu.h"
> +#include "hw/qdev-properties.h"
> #include "hw/icc_bus.h"
> #ifndef CONFIG_USER_ONLY
> #include "hw/xen.h"
> -#include "hw/sysbus.h"
> #include "hw/apic_internal.h"
> #endif
>
> @@ -2104,6 +2104,7 @@ static void mce_init(X86CPU *cpu)
> static void x86_cpu_apic_create(X86CPU *cpu, Error **errp)
> {
> CPUX86State *env = &cpu->env;
> + DeviceState *dev = DEVICE(cpu);
> APICCommonState *apic;
> const char *apic_type = "apic";
>
> @@ -2113,7 +2114,7 @@ static void x86_cpu_apic_create(X86CPU *cpu, Error
> **errp) apic_type = "xen-apic";
> }
>
> - env->apic_state = qdev_try_create(NULL, apic_type);
> + env->apic_state = qdev_try_create(dev->parent_bus, apic_type);
> if (env->apic_state == NULL) {
> error_setg(errp, "APIC device '%s' could not be created",
> apic_type); return;
> @@ -2130,7 +2131,6 @@ static void x86_cpu_apic_create(X86CPU *cpu, Error
> **errp) static void x86_cpu_apic_realize(X86CPU *cpu, Error **errp)
> {
> CPUX86State *env = &cpu->env;
> - static int apic_mapped;
>
> if (env->apic_state == NULL) {
> return;
> @@ -2141,16 +2141,6 @@ static void x86_cpu_apic_realize(X86CPU *cpu, Error
> **errp) object_get_typename(OBJECT(env->apic_state)));
> return;
> }
> -
> - /* XXX: mapping more APICs at the same memory location */
> - if (apic_mapped == 0) {
> - /* NOTE: the APIC is directly connected to the CPU - it is not
> - on the global memory bus. */
> - /* XXX: what if the base changes? */
> - sysbus_mmio_map_overlap(SYS_BUS_DEVICE(env->apic_state), 0,
> - APIC_DEFAULT_ADDRESS, 0x1000);
> - apic_mapped = 1;
> - }
> }
> #else
> static void x86_cpu_apic_realize(X86CPU *cpu, Error **errp)
Ignore this patch, pls.
"[PATCH 18/22] target-i386: move APIC to ICC bus" is the correct one.
next prev parent reply other threads:[~2013-04-09 12:47 UTC|newest]
Thread overview: 77+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-04-05 14:36 [Qemu-devel] [PATCH 00/22 v2] target-i386: CPU hot-add with cpu-add QMP command Igor Mammedov
2013-04-05 14:36 ` [Qemu-devel] [PATCH 01/22] target-i386: consolidate error propagation in x86_cpu_realizefn() Igor Mammedov
2013-04-09 17:42 ` Andreas Färber
2013-04-05 14:36 ` [Qemu-devel] [PATCH 02/22] target-i386: split APIC creation from initialization " Igor Mammedov
2013-04-08 2:26 ` li guang
2013-04-08 18:16 ` Eduardo Habkost
2013-04-09 18:52 ` Andreas Färber
2013-04-05 14:36 ` [Qemu-devel] [PATCH 03/22] target-i386: split out CPU creation and features parsing into cpu_x86_create() Igor Mammedov
2013-04-08 18:30 ` Eduardo Habkost
2013-04-09 10:30 ` Paolo Bonzini
2013-04-09 10:33 ` Igor Mammedov
2013-04-09 14:02 ` Andreas Färber
2013-04-05 14:36 ` [Qemu-devel] [PATCH 04/22] cpu: Pass CPUState to *cpu_synchronize_post*() Igor Mammedov
2013-04-08 19:38 ` Eduardo Habkost
2013-04-05 14:36 ` [Qemu-devel] [PATCH 05/22] cpu: call cpu_synchronize_post_init() from CPUClass.realize() if hotplugged Igor Mammedov
2013-04-08 19:45 ` Eduardo Habkost
2013-04-09 10:13 ` Igor Mammedov
2013-04-09 11:17 ` Paolo Bonzini
2013-04-09 11:15 ` Paolo Bonzini
2013-04-05 14:36 ` [Qemu-devel] [PATCH 06/22] cpu: introduce CPUClass.resume() method Igor Mammedov
2013-04-08 2:27 ` li guang
2013-04-08 20:13 ` Eduardo Habkost
2013-04-09 10:26 ` Igor Mammedov
2013-04-09 13:21 ` Andreas Färber
2013-04-09 11:20 ` Paolo Bonzini
2013-04-10 12:57 ` Igor Mammedov
2013-04-05 14:36 ` [Qemu-devel] [PATCH 07/22] target-i386: kvmvapic: replace FROM_SYSBUS() with QOM type cast Igor Mammedov
2013-04-10 17:54 ` Andreas Färber
2013-04-05 14:37 ` [Qemu-devel] [PATCH 08/22] target-i386: ioapic: " Igor Mammedov
2013-04-08 2:13 ` li guang
2013-04-08 11:32 ` Igor Mammedov
2013-04-09 11:36 ` Paolo Bonzini
2013-04-10 0:21 ` li guang
2013-04-10 8:06 ` Paolo Bonzini
2013-04-10 16:12 ` Igor Mammedov
2013-04-10 18:12 ` Andreas Färber
2013-04-10 17:58 ` Andreas Färber
2013-04-05 14:37 ` [Qemu-devel] [PATCH 09/22] introduce CPU hot-plug notifier Igor Mammedov
2013-04-09 11:23 ` Paolo Bonzini
2013-04-05 14:37 ` [Qemu-devel] [PATCH 10/22] rtc: update rtc_cmos on CPU hot-plug Igor Mammedov
2013-04-05 14:37 ` [Qemu-devel] [PATCH 11/22] cpu: introduce get_firmware_id() method and override it for target-i386 Igor Mammedov
2013-04-08 2:02 ` li guang
2013-04-08 11:41 ` Igor Mammedov
2013-04-05 14:37 ` [Qemu-devel] [PATCH 12/22] cpu: add helper cpu_exists(), to check if CPU with specified id exists Igor Mammedov
2013-04-09 11:25 ` Paolo Bonzini
2013-04-05 14:37 ` [Qemu-devel] [PATCH 13/22] acpi_piix4: add infrastructure to send CPU hot-plug GPE to guest Igor Mammedov
2013-04-08 2:24 ` li guang
2013-04-08 11:47 ` Igor Mammedov
2013-04-05 14:37 ` [Qemu-devel] [PATCH 14/22] target-i386: introduce apic-id property Igor Mammedov
2013-04-09 11:26 ` Paolo Bonzini
2013-04-05 14:37 ` [Qemu-devel] [PATCH 15/22] introduce ICC bus/device/bridge Igor Mammedov
2013-04-05 14:37 ` [Qemu-devel] [PATCH 16/22] target-i386: cpu: attach ICC bus to CPU on its creation Igor Mammedov
2013-04-05 14:37 ` [Qemu-devel] [PATCH 17/22] target-i386: replace MSI_SPACE_SIZE with APIC_SPACE_SIZE Igor Mammedov
2013-04-05 14:37 ` [Qemu-devel] [PATCH 18/22] target-i386: move APIC to ICC bus Igor Mammedov
2013-04-05 16:15 ` Eduardo Habkost
2013-04-05 22:23 ` Igor Mammedov
2013-04-05 22:31 ` Igor Mammedov
2013-04-09 11:29 ` Paolo Bonzini
2013-04-05 14:37 ` [Qemu-devel] [PATCH 18/22] target-i386: move IOAPIC " Igor Mammedov
2013-04-09 11:33 ` Paolo Bonzini
2013-04-09 12:51 ` Igor Mammedov
2013-04-05 14:37 ` [Qemu-devel] [PATCH 19/22] target-i386: move APIC " Igor Mammedov
2013-04-09 12:47 ` Igor Mammedov [this message]
2013-04-05 14:37 ` [Qemu-devel] [PATCH 19/22] target-i386: move IOAPIC " Igor Mammedov
2013-04-05 14:37 ` [Qemu-devel] [PATCH 20/22] qdev: set device's parent before calling realize() down inheritance chain Igor Mammedov
2013-04-09 11:34 ` Paolo Bonzini
2013-04-05 14:37 ` [Qemu-devel] [PATCH 21/22] target-i386: expose all possible CPUs as /machine/icc-bridge/cpu[0..N] links Igor Mammedov
2013-04-05 14:37 ` [Qemu-devel] [PATCH 22/22] add cpu-add qmp command and implement CPU hot-add for target-i386 Igor Mammedov
2013-04-05 17:10 ` Eduardo Habkost
2013-04-05 17:24 ` Eduardo Habkost
2013-04-11 15:17 ` Igor Mammedov
2013-04-11 15:49 ` Eduardo Habkost
2013-04-09 20:19 ` Igor Mammedov
2013-04-09 20:46 ` Eduardo Habkost
2013-04-09 21:05 ` Igor Mammedov
2013-04-11 15:12 ` Eduardo Habkost
2013-04-11 15:37 ` Igor Mammedov
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20130409144703.0beb4f39@nial.usersys.redhat.com \
--to=imammedo@redhat.com \
--cc=aderumier@odiso.com \
--cc=afaerber@suse.de \
--cc=aliguori@us.ibm.com \
--cc=claudio.fontana@huawei.com \
--cc=ehabkost@redhat.com \
--cc=jfrei@linux.vnet.ibm.com \
--cc=lcapitulino@redhat.com \
--cc=lig.fnst@cn.fujitsu.com \
--cc=pbonzini@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=rth@twiddle.net \
--cc=yang.z.zhang@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.