All of lore.kernel.org
 help / color / mirror / Atom feed
* Re: [Qemu-devel] [PATCH v3] apic: bump emulated lapic version to 0x14 on pc machines >= 2.1
       [not found] ` <536152A0.6010104@suse.de>
@ 2014-05-01 17:22   ` Gabriel L. Somlo
  2014-05-01 18:52     ` Alexander Graf
  0 siblings, 1 reply; 6+ messages in thread
From: Gabriel L. Somlo @ 2014-05-01 17:22 UTC (permalink / raw)
  To: Alexander Graf; +Cc: pbonzini, qemu-devel, afaerber, mst

On Wed, Apr 30, 2014 at 09:44:32PM +0200, Alexander Graf wrote:
> >diff --git a/hw/intc/apic.c b/hw/intc/apic.c
> >index 2f40cba..4480bc4 100644
> >--- a/hw/intc/apic.c
> >+++ b/hw/intc/apic.c
> >@@ -32,6 +32,8 @@
> >  #define SYNC_TO_VAPIC                   0x2
> >  #define SYNC_ISR_IRR_TO_VAPIC           0x4
> >+uint8_t apic_version = 0x14;
> 
> Is there any way to make this a qdev/qom device property rather than
> a global?

If there is, and anyone with a better understanding of qom/qdev
has an example I could follow, that would be much appreciated!

As far as I could comprehend it since I started looking at it last
night, the apic_class_init() functions run before pci_init() in
pc_[q35|piix].c knows which machine type we have, but the
apic_realize() functions (which appear to be the actual apic
"constructors") run after that.

The obvious alternative to having one global apic version would be
to add a field to APICCommonClass or APICCommonState, and then somehow
modify the default (set in apic_class_init()) from pci_init()
according to the machine version; After that, each apic may refer to
its private data member "version" when needed.

So, is qom/qdev basically boiling down to a set of macros that can
translate something like "qom_set_property(apic_instance, version, 0x14);"
into "apic_instance.version = 0x14;" ?

I'll keep digging, but in case anyone more experienced can tell us
why this WON'T work, I'd appreciate being put out of my misery and
allowed to go back to using the global :) :)

Thanks,
--Gabriel

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [Qemu-devel] [PATCH v3] apic: bump emulated lapic version to 0x14 on pc machines >= 2.1
  2014-05-01 17:22   ` [Qemu-devel] [PATCH v3] apic: bump emulated lapic version to 0x14 on pc machines >= 2.1 Gabriel L. Somlo
@ 2014-05-01 18:52     ` Alexander Graf
  2014-05-01 21:43       ` Don Slutz
  0 siblings, 1 reply; 6+ messages in thread
From: Alexander Graf @ 2014-05-01 18:52 UTC (permalink / raw)
  To: Gabriel L. Somlo; +Cc: pbonzini, qemu-devel, afaerber, mst


On 01.05.14 19:22, Gabriel L. Somlo wrote:
> On Wed, Apr 30, 2014 at 09:44:32PM +0200, Alexander Graf wrote:
>>> diff --git a/hw/intc/apic.c b/hw/intc/apic.c
>>> index 2f40cba..4480bc4 100644
>>> --- a/hw/intc/apic.c
>>> +++ b/hw/intc/apic.c
>>> @@ -32,6 +32,8 @@
>>>   #define SYNC_TO_VAPIC                   0x2
>>>   #define SYNC_ISR_IRR_TO_VAPIC           0x4
>>> +uint8_t apic_version = 0x14;
>> Is there any way to make this a qdev/qom device property rather than
>> a global?
> If there is, and anyone with a better understanding of qom/qdev
> has an example I could follow, that would be much appreciated!
>
> As far as I could comprehend it since I started looking at it last
> night, the apic_class_init() functions run before pci_init() in
> pc_[q35|piix].c knows which machine type we have, but the
> apic_realize() functions (which appear to be the actual apic
> "constructors") run after that.
>
> The obvious alternative to having one global apic version would be
> to add a field to APICCommonClass or APICCommonState, and then somehow
> modify the default (set in apic_class_init()) from pci_init()
> according to the machine version; After that, each apic may refer to
> its private data member "version" when needed.
>
> So, is qom/qdev basically boiling down to a set of macros that can
> translate something like "qom_set_property(apic_instance, version, 0x14);"
> into "apic_instance.version = 0x14;" ?

With qdev we basically had an array of constructor parameters in the 
qdev definition. You could set these from the outside between create and 
init, basically:

   dev = dev_create()
   set_prop(dev, "foo", bar);
   dev_init(dev)

which semantically translated to

   dev = new dev(foo = bar);

The way to do this with QOM is similar, but I keep forgetting the 
details. I'm sure you'll easily find out :).


Alex

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [Qemu-devel] [PATCH v3] apic: bump emulated lapic version to 0x14 on pc machines >= 2.1
  2014-05-01 18:52     ` Alexander Graf
@ 2014-05-01 21:43       ` Don Slutz
  2014-05-02 14:23         ` Gabriel L. Somlo
  0 siblings, 1 reply; 6+ messages in thread
From: Don Slutz @ 2014-05-01 21:43 UTC (permalink / raw)
  To: Alexander Graf, Gabriel L. Somlo; +Cc: pbonzini, mst, qemu-devel, afaerber

On 05/01/14 14:52, Alexander Graf wrote:
>
> On 01.05.14 19:22, Gabriel L. Somlo wrote:
>> On Wed, Apr 30, 2014 at 09:44:32PM +0200, Alexander Graf wrote:
>>>> diff --git a/hw/intc/apic.c b/hw/intc/apic.c
>>>> index 2f40cba..4480bc4 100644
>>>> --- a/hw/intc/apic.c
>>>> +++ b/hw/intc/apic.c
>>>> @@ -32,6 +32,8 @@
>>>>   #define SYNC_TO_VAPIC                   0x2
>>>>   #define SYNC_ISR_IRR_TO_VAPIC           0x4
>>>> +uint8_t apic_version = 0x14;
>>> Is there any way to make this a qdev/qom device property rather than
>>> a global?
>> If there is, and anyone with a better understanding of qom/qdev
>> has an example I could follow, that would be much appreciated!
>>
>> As far as I could comprehend it since I started looking at it last
>> night, the apic_class_init() functions run before pci_init() in
>> pc_[q35|piix].c knows which machine type we have, but the
>> apic_realize() functions (which appear to be the actual apic
>> "constructors") run after that.
>>
>> The obvious alternative to having one global apic version would be
>> to add a field to APICCommonClass or APICCommonState, and then somehow
>> modify the default (set in apic_class_init()) from pci_init()
>> according to the machine version; After that, each apic may refer to
>> its private data member "version" when needed.
>>
>> So, is qom/qdev basically boiling down to a set of macros that can
>> translate something like "qom_set_property(apic_instance, version, 0x14);"
>> into "apic_instance.version = 0x14;" ?
>
> With qdev we basically had an array of constructor parameters in the qdev definition. You could set these from the outside between create and init, basically:
>
>   dev = dev_create()
>   set_prop(dev, "foo", bar);
>   dev_init(dev)
>
> which semantically translated to
>
>   dev = new dev(foo = bar);
>
> The way to do this with QOM is similar, but I keep forgetting the details. I'm sure you'll easily find out :).
>
>

It looks like

http://permalink.gmane.org/gmane.comp.emulators.qemu/268337

(which is a reply to a change I am working on that is in the same place)

Hope this helps.
     -Don Slutz

> Alex
>
>

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [Qemu-devel] [PATCH v3] apic: bump emulated lapic version to 0x14 on pc machines >= 2.1
  2014-05-01 21:43       ` Don Slutz
@ 2014-05-02 14:23         ` Gabriel L. Somlo
  2014-05-02 14:26           ` Paolo Bonzini
  0 siblings, 1 reply; 6+ messages in thread
From: Gabriel L. Somlo @ 2014-05-02 14:23 UTC (permalink / raw)
  To: Don Slutz; +Cc: pbonzini, mst, Alexander Graf, afaerber, qemu-devel

On Thu, May 01, 2014 at 05:43:23PM -0400, Don Slutz wrote:
> On 05/01/14 14:52, Alexander Graf wrote:
> >With qdev we basically had an array of constructor parameters in the qdev definition. You could set these from the outside between create and init, basically:
> >
> >  dev = dev_create()
> >  set_prop(dev, "foo", bar);
> >  dev_init(dev)
> >
> >which semantically translated to
> >
> >  dev = new dev(foo = bar);
> >
> >The way to do this with QOM is similar, but I keep forgetting the details. I'm sure you'll easily find out :).
> >
> >
> 
> It looks like
> 
> http://permalink.gmane.org/gmane.comp.emulators.qemu/268337

So, after a bit more digging, it appears qdev would be the more
appropriate fit:

diff --git a/hw/intc/apic_common.c b/hw/intc/apic_common.c
index 7ecce2d..9cb418f 100644
--- a/hw/intc/apic_common.c
+++ b/hw/intc/apic_common.c
@@ -380,6 +380,7 @@ static const VMStateDescription vmstate_apic_common = {
 
 static Property apic_properties_common[] = {
     DEFINE_PROP_UINT8("id", APICCommonState, id, -1),
+    DEFINE_PROP_UINT32("version", APICCommonState, version, 0x14),
     DEFINE_PROP_BIT("vapic", APICCommonState, vapic_control, VAPIC_ENABLE_BIT,
                     true),
     DEFINE_PROP_END_OF_LIST(),
diff --git a/include/hw/i386/apic_internal.h b/include/hw/i386/apic_internal.h
index 70542a6..0ac1462 100644
--- a/include/hw/i386/apic_internal.h
+++ b/include/hw/i386/apic_internal.h
@@ -98,6 +98,7 @@ struct APICCommonState {
     X86CPU *cpu;
     uint32_t apicbase;
     uint8_t id;
+    uint32_t version;
     uint8_t arb_id;
     uint8_t tpr;
     uint32_t spurious_vec;
diff --git a/hw/intc/apic.c b/hw/intc/apic.c
index 2f40cba..ef19e55 100644
--- a/hw/intc/apic.c
+++ b/hw/intc/apic.c
@@ -675,7 +675,7 @@ static uint32_t apic_mem_readl(void *opaque, hwaddr addr)
         val = s->id << 24;
         break;
     case 0x03: /* version */
-        val = 0x11 | ((APIC_LVT_NB - 1) << 16); /* version 0x11 */
+        val = s->version | ((APIC_LVT_NB - 1) << 16);
         break;
     case 0x08:
         apic_sync_vapic(s, SYNC_FROM_VAPIC);

However, at this point we hit a (IMHO, huge) snag (using pc_q35.c as
an example, pc_piix.c would have the exact same issue).

Modifying the "version" property on an apic using
object_property_set_uint32() would require its "APICCommonState *",
which doesn't exist before pc_q35_init() calls pc_cpus_init(), and
results in an error (modifying property on already realized apic) after
pc_cpus_init() completes.

I could pass the "bool soft_apic_compat" value from pc_q35_init()
all the way down into the bowels of target-i386/cpu.c, but many of
those calls are also made from cpu hotplug, and things get complicated
really fast. More complicated than just setting a global apic version...

I'm not sure the timing of the various constructors works out in a way
that would allow us to avoid a global variable :(

Did I miss anything ? Is there a way to override the default for all
apics, which I set in DEFINE_PROP_UINT32, *before* anything gets
initialized/realized/constructed/whatever ? :)

Thanks,
--Gabriel

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [Qemu-devel] [PATCH v3] apic: bump emulated lapic version to 0x14 on pc machines >= 2.1
  2014-05-02 14:23         ` Gabriel L. Somlo
@ 2014-05-02 14:26           ` Paolo Bonzini
  2014-05-02 17:13             ` Gabriel L. Somlo
  0 siblings, 1 reply; 6+ messages in thread
From: Paolo Bonzini @ 2014-05-02 14:26 UTC (permalink / raw)
  To: Gabriel L. Somlo, Don Slutz; +Cc: mst, Alexander Graf, afaerber, qemu-devel

Il 02/05/2014 16:23, Gabriel L. Somlo ha scritto:
>
> Did I miss anything ? Is there a way to override the default for all
> apics, which I set in DEFINE_PROP_UINT32, *before* anything gets
> initialized/realized/constructed/whatever ? :)

Yes, there is. :)  It's compat_props.  You can set 0x14 in the default, 
and 0x11 for 2.0 and earlier.

Paolo

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [Qemu-devel] [PATCH v3] apic: bump emulated lapic version to 0x14 on pc machines >= 2.1
  2014-05-02 14:26           ` Paolo Bonzini
@ 2014-05-02 17:13             ` Gabriel L. Somlo
  0 siblings, 0 replies; 6+ messages in thread
From: Gabriel L. Somlo @ 2014-05-02 17:13 UTC (permalink / raw)
  To: Paolo Bonzini; +Cc: afaerber, mst, Alexander Graf, Don Slutz, qemu-devel

On Fri, May 02, 2014 at 04:26:41PM +0200, Paolo Bonzini wrote:
> Il 02/05/2014 16:23, Gabriel L. Somlo ha scritto:
> >
> >Did I miss anything ? Is there a way to override the default for all
> >apics, which I set in DEFINE_PROP_UINT32, *before* anything gets
> >initialized/realized/constructed/whatever ? :)
> 
> Yes, there is. :)  It's compat_props.  You can set 0x14 in the
> default, and 0x11 for 2.0 and earlier.

Aaah, thank you !!! :) So, the patch below should do the trick.

One more question before I generate a formal v4: would you prefer
I split it into two parts, one which adds blank PC[_Q35]_COMPAT_2_0
compat_props to pc_piix/pc_q35 (and which has to go in after
http://lists.nongnu.org/archive/html/qemu-devel/2014-04/msg04728.html,
and a separate one adding DEFINE_PROP_UINT32("version") to the apic
and an actual payload for PC_COMPAT_2_0 ? Or leave it as one single patch ?

Thanks,
--Gabriel


diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c
index 5b3594b..7c672d7 100644
--- a/hw/i386/pc_piix.c
+++ b/hw/i386/pc_piix.c
@@ -415,6 +415,10 @@ static QEMUMachine pc_i440fx_machine_v2_0 = {
     PC_I440FX_2_0_MACHINE_OPTIONS,
     .name = "pc-i440fx-2.0",
     .init = pc_init_pci_2_0,
+    .compat_props = (GlobalProperty[]) {
+        PC_COMPAT_2_0,
+        { /* end of list */ }
+    },
 };
 
 #define PC_I440FX_1_7_MACHINE_OPTIONS PC_I440FX_MACHINE_OPTIONS
diff --git a/hw/i386/pc_q35.c b/hw/i386/pc_q35.c
index 5b48231..1fe2213 100644
--- a/hw/i386/pc_q35.c
+++ b/hw/i386/pc_q35.c
@@ -328,6 +328,10 @@ static QEMUMachine pc_q35_machine_v2_0 = {
     PC_Q35_2_0_MACHINE_OPTIONS,
     .name = "pc-q35-2.0",
     .init = pc_q35_init_2_0,
+    .compat_props = (GlobalProperty[]) {
+        PC_Q35_COMPAT_2_0,
+        { /* end of list */ }
+    },
 };
 
 #define PC_Q35_1_7_MACHINE_OPTIONS PC_Q35_MACHINE_OPTIONS
diff --git a/hw/intc/apic.c b/hw/intc/apic.c
index 2f40cba..ef19e55 100644
--- a/hw/intc/apic.c
+++ b/hw/intc/apic.c
@@ -675,7 +675,7 @@ static uint32_t apic_mem_readl(void *opaque, hwaddr addr)
         val = s->id << 24;
         break;
     case 0x03: /* version */
-        val = 0x11 | ((APIC_LVT_NB - 1) << 16); /* version 0x11 */
+        val = s->version | ((APIC_LVT_NB - 1) << 16);
         break;
     case 0x08:
         apic_sync_vapic(s, SYNC_FROM_VAPIC);
diff --git a/hw/intc/apic_common.c b/hw/intc/apic_common.c
index 7ecce2d..9cb418f 100644
--- a/hw/intc/apic_common.c
+++ b/hw/intc/apic_common.c
@@ -380,6 +380,7 @@ static const VMStateDescription vmstate_apic_common = {
 
 static Property apic_properties_common[] = {
     DEFINE_PROP_UINT8("id", APICCommonState, id, -1),
+    DEFINE_PROP_UINT32("version", APICCommonState, version, 0x14),
     DEFINE_PROP_BIT("vapic", APICCommonState, vapic_control, VAPIC_ENABLE_BIT,
                     true),
     DEFINE_PROP_END_OF_LIST(),
diff --git a/include/hw/i386/apic_internal.h b/include/hw/i386/apic_internal.h
index 70542a6..0ac1462 100644
--- a/include/hw/i386/apic_internal.h
+++ b/include/hw/i386/apic_internal.h
@@ -98,6 +98,7 @@ struct APICCommonState {
     X86CPU *cpu;
     uint32_t apicbase;
     uint8_t id;
+    uint32_t version;
     uint8_t arb_id;
     uint8_t tpr;
     uint32_t spurious_vec;
diff --git a/include/hw/i386/pc.h b/include/hw/i386/pc.h
index 9f26e14..32a7687 100644
--- a/include/hw/i386/pc.h
+++ b/include/hw/i386/pc.h
@@ -242,8 +242,12 @@ int e820_add_entry(uint64_t, uint64_t, uint32_t);
 int e820_get_num_entries(void);
 bool e820_get_entry(int, uint32_t, uint64_t *, uint64_t *);
 
+#define PC_Q35_COMPAT_2_0 \
+        PC_COMPAT_2_0
+
 #define PC_Q35_COMPAT_1_7 \
         PC_COMPAT_1_7, \
+        PC_Q35_COMPAT_2_0, \
         {\
             .driver   = "hpet",\
             .property = HPET_INTCAP,\
@@ -262,7 +266,15 @@ bool e820_get_entry(int, uint32_t, uint64_t *, uint64_t *);
         PC_COMPAT_1_4, \
         PC_Q35_COMPAT_1_5
 
+#define PC_COMPAT_2_0 \
+        {\
+            .driver   = "apic",\
+            .property = "version",\
+            .value    = stringify(0x11),\
+        }
+
 #define PC_COMPAT_1_7 \
+        PC_COMPAT_2_0, \
         {\
             .driver   = TYPE_USB_DEVICE,\
             .property = "msos-desc",\

^ permalink raw reply related	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2014-05-02 17:13 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
     [not found] <20140430194108.GB16023@ERROL.INI.CMU.EDU>
     [not found] ` <536152A0.6010104@suse.de>
2014-05-01 17:22   ` [Qemu-devel] [PATCH v3] apic: bump emulated lapic version to 0x14 on pc machines >= 2.1 Gabriel L. Somlo
2014-05-01 18:52     ` Alexander Graf
2014-05-01 21:43       ` Don Slutz
2014-05-02 14:23         ` Gabriel L. Somlo
2014-05-02 14:26           ` Paolo Bonzini
2014-05-02 17:13             ` Gabriel L. Somlo

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.