On Tue, 18 Oct 2016 12:14:43 -0200 Eduardo Habkost <ehabk...@redhat.com> wrote:
> On Tue, Oct 18, 2016 at 04:01:56PM +0200, Igor Mammedov wrote: > > On Tue, 18 Oct 2016 10:59:17 -0200 > > Eduardo Habkost <ehabk...@redhat.com> wrote: > > > > > On Tue, Oct 18, 2016 at 02:36:10PM +0200, Igor Mammedov wrote: > > > > 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. > > > > > > > > > > I agree to make them static properties as follow-up patch. This > > > way, if the change breaks anything we can revert only that patch. > > Static property won't work here as it should show APIC ID > > depending on current CPU mode. > > My suggestion is to _not_ show a different ID depending on the > current mode, to keep it simple. We can just have > "initial-apic-id" and "id" properties. > > But, anyway, I didn't mean to suggest static properties > specifically. Where I say "static property" above, please read > "simple property that returns just a simple struct field and > don't need custom getter/setter code". That means either using a > static property (in case we still want it to be writeable, which > I doubt) or using object_property_add_uint*_ptr(). > > > > > I could make it readonly property on respin, > > and set apic.id/initial_apic_id directly from CPU. > > Change would be > > - apic_common_set_id() > > + apic_common::set_apic_id() callback > > It won't get us less LOC, more likely it will take even more > > code to do so. > > As it's in this patch, it's at least consistent in a way > > values are get/set. And effectively it's readonly due to check: > > Don't worry about doing it on the respin. I'm OK with keeping the > current version by now, and change it in a follow-up patch. > > > > > + if (dev->realized) { > > + qdev_prop_set_after_realize(dev, name, errp); > > + return; > > + } > > > > as external user can see only realized apic device. > > That's true. But we could avoid all the extra getter/setter code > if we just use a static property or a read-only > object_property_add_uint*_ptr() property. > > (All I say above are suggestions for a follow-up patch. I'm OK > with keeping the existing behavior like you do in this patch, to > keep this series simple.) Ok, I'll respin this patch as is and think/try the way you are suggesting in follow up.