[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH v3 06/13] pc: apic_common: extend APIC ID proper
From: |
Igor Mammedov |
Subject: |
Re: [Qemu-devel] [PATCH v3 06/13] pc: apic_common: extend APIC ID property to 32bit |
Date: |
Tue, 18 Oct 2016 14:36:10 +0200 |
On Tue, 18 Oct 2016 08:56:28 -0200
Eduardo Habkost <address@hidden> wrote:
> On Thu, Oct 13, 2016 at 11:52:40AM +0200, Igor Mammedov wrote:
> > ACPI ID is 32 bit wide on CPUs with x2APIC support.
> > Extend 'id' property to support it.
> >
> > Signed-off-by: Igor Mammedov <address@hidden>
> > ---
> > v3:
> > keep original behaviour where 'id' is readonly after
> > object is realized (pbonzini)
> > ---
> [...]
> > diff --git a/hw/intc/apic_common.c b/hw/intc/apic_common.c
> > index 8d01c9c..30f2af0 100644
> > --- a/hw/intc/apic_common.c
> > +++ b/hw/intc/apic_common.c
> > @@ -428,7 +429,6 @@ static const VMStateDescription vmstate_apic_common = {
> > };
> >
> > static Property apic_properties_common[] = {
> > - DEFINE_PROP_UINT8("id", APICCommonState, id, -1),
> > DEFINE_PROP_UINT8("version", APICCommonState, version, 0x14),
> > DEFINE_PROP_BIT("vapic", APICCommonState, vapic_control,
> > VAPIC_ENABLE_BIT,
> > true),
> > @@ -437,6 +437,49 @@ static Property apic_properties_common[] = {
> > DEFINE_PROP_END_OF_LIST(),
> > };
> >
> > +static void apic_common_get_id(Object *obj, Visitor *v, const char *name,
> > + void *opaque, Error **errp)
> > +{
> > + APICCommonState *s = APIC_COMMON(obj);
> > + int64_t value;
> > +
> > + value = s->apicbase & MSR_IA32_APICBASE_EXTD ? s->initial_apic_id :
> > s->id;
> > + visit_type_int(v, name, &value, errp);
> > +}
>
> Who exactly is going to read this property and require this logic
> to be in the property getter?
As it's set/read only from CPU we don't actually have to expose it
as property.
However, I've kept it as read/write property because it has already
been this way and been exposed to external users as some magic property.
Not sure is anyone cares.
> Do we really need to expose this to the outside as a magic
> property that changes depending on hardware state? Returning
> initial_apic_id sounds much simpler.
Well that's what it is now, so I've kept current behavior.
If we decide to change property behavior or drop it altogether
I can do it on top.
>
> > +
> > +static void apic_common_set_id(Object *obj, Visitor *v, const char *name,
> > + void *opaque, Error **errp)
> > +{
> > + APICCommonState *s = APIC_COMMON(obj);
> > + DeviceState *dev = DEVICE(obj);
> > + Error *local_err = NULL;
> > + int64_t value;
> > +
> > + if (dev->realized) {
> > + qdev_prop_set_after_realize(dev, name, errp);
> > + return;
> > + }
> > +
> > + visit_type_int(v, name, &value, &local_err);
> > + if (local_err) {
> > + error_propagate(errp, local_err);
> > + return;
> > + }
> > +
> > + s->initial_apic_id = value;
> > + s->id = (uint8_t)value;
>
> Do we really need to change s->id here too? Won't it be set
> automatically to initial_apic_id on reset?
it will after following patch,
[PATCH v3 07/13] pc: apic_common: restore APIC ID to initial ID on reset
but I'd prefer to set it here as well to make consistent and clear
where it comes from.
> I'm asking this because making it read/write only initial_apic_id
> would make it easier to eventually convert the property to a
> field-based getter/setter API (maybe even keep it using the
> static property system).
If we don't care about keeping current behavior then I can make
it static property like it used to be.
> Or, even better: do we really need a writeable property named
> "id" at all? Is there any valid use case for the user to set it
> directly?
if user does it, it likely would make VM unsable,
I don't see a way for user to dot it though as he/she is going to
see APIC object only in realized state where it's forbidden to
change property.
> We could make the code that creates the APIC set
> apic->initial_apic_id directly (or use a clearer
> "initial-apic-id" property name).
So we probably fine with making it readonly (still not static
but a bit less code in this patch) and set apic_id directly
by calling new callback.
apic_common::set_apic_id(uint32_t new_apic_id){
this->id = this->initial_apic_id = new_apic_id;
}
> > +}
> > +
> > +static void apic_common_initfn(Object *obj)
> > +{
> > + APICCommonState *s = APIC_COMMON(obj);
> > +
> > + s->id = s->initial_apic_id = -1;
> > + object_property_add(obj, "id", "int",
> > + apic_common_get_id,
> > + apic_common_set_id, NULL, NULL, NULL);
>
> If you are going to add new properties, please register them
> using object_class_property_add*().
Sure, will fix.
>
> > +}
> > +
> > static void apic_common_class_init(ObjectClass *klass, void *data)
> > {
> > DeviceClass *dc = DEVICE_CLASS(klass);
> > @@ -456,6 +499,7 @@ static const TypeInfo apic_common_type = {
> > .name = TYPE_APIC_COMMON,
> > .parent = TYPE_DEVICE,
> > .instance_size = sizeof(APICCommonState),
> > + .instance_init = apic_common_initfn,
> > .class_size = sizeof(APICCommonClass),
> > .class_init = apic_common_class_init,
> > .abstract = true,
> > diff --git a/target-i386/cpu.c b/target-i386/cpu.c
> > index 13505ab..b4b4342 100644
> > --- a/target-i386/cpu.c
> > +++ b/target-i386/cpu.c
> > @@ -2872,7 +2872,7 @@ static void x86_cpu_apic_create(X86CPU *cpu, Error
> > **errp)
> > OBJECT(cpu->apic_state), &error_abort);
> > object_unref(OBJECT(cpu->apic_state));
> >
> > - qdev_prop_set_uint8(cpu->apic_state, "id", cpu->apic_id);
> > + qdev_prop_set_uint32(cpu->apic_state, "id", cpu->apic_id);
> > /* TODO: convert to link<> */
> > apic = APIC_COMMON(cpu->apic_state);
> > apic->cpu = cpu;
> > --
> > 2.7.4
> >
>
[Qemu-devel] [PATCH v3 06/13] pc: apic_common: extend APIC ID property to 32bit, Igor Mammedov, 2016/10/13
[Qemu-devel] [PATCH v3 07/13] pc: apic_common: restore APIC ID to initial ID on reset, Igor Mammedov, 2016/10/13
[Qemu-devel] [PATCH v3 08/13] pc: apic_common: reset APIC ID to initial ID when switching into x2APIC mode, Igor Mammedov, 2016/10/13
[Qemu-devel] [PATCH v3 09/13] pc: kvm_apic: pass APIC ID depending on xAPIC/x2APIC mode, Igor Mammedov, 2016/10/13