On Tue, 18 Oct 2016 08:56:28 -0200
Eduardo Habkost <ehabk...@redhat.com> 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 <imamm...@redhat.com>
> > ---
> > 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
> >   
> 


Reply via email to