Eduardo Habkost <ehabk...@redhat.com> writes: > On Thu, Oct 04, 2012 at 08:46:46AM -0500, Anthony Liguori wrote: >> Eduardo Habkost <ehabk...@redhat.com> writes: >> >> > We can make it a child of a generic "machine" class later, but right now >> > a "PC" class is needed to allow global-properties to control some >> > details of CPU creation on the PC code. >> > >> > Signed-off-by: Eduardo Habkost <ehabk...@redhat.com> >> > --- >> > hw/pc.c | 18 ++++++++++++++++++ >> > hw/pc.h | 6 ++++++ >> > 2 files changed, 24 insertions(+) >> > >> > diff --git a/hw/pc.c b/hw/pc.c >> > index 7e7e0e2..9b68282 100644 >> > --- a/hw/pc.c >> > +++ b/hw/pc.c >> > @@ -550,6 +550,24 @@ static void bochs_bios_write(void *opaque, uint32_t >> > addr, uint32_t val) >> > } >> > } >> > >> > +typedef struct PC { >> > + DeviceState parent_obj; >> > +} PC; >> >> So the general problem with this approach is that it strays from >> modeling hardware. > > True, it's not modelling hardware. It's controlling the behavior of the > QEMU code that set APIC IDs, because we need to keep the old behavior on > old machine-types. > >> >> I guess I'm confused why we're not just adding an apic_id property to >> the CPU objects and setting that via the normal QOM accessors. >> >> Wouldn't that solve the problem? >> > > It wouldn't solve the problem (although it can make the code look > better). > > The problem is not setting the APIC ID, is controlling the code that > generates the APIC IDs. I don't care too much where that code would live > (it could be inside cpu.c or helper.c), but it still needs a flag where > old machine-types tell it "please keep the old behavior for > compatibility".
Can you just add a flag to pc_init1 and set the apic_id property according to that flag? Then you simply add a pc_init_post_1_3 and pc_init_pre_1_3 that calls pc_init1 with the appropriate flag value. Regards, Anthony Liguori > > >> Regards, >> >> Anthony Liguori >> >> > + >> > +static const TypeInfo pc_type_info = { >> > + .name = TYPE_PC_MACHINE, >> > + .parent = TYPE_DEVICE, >> > + .instance_size = sizeof(PC), >> > + .class_size = sizeof(DeviceClass), >> > +}; >> > + >> > +static void pc_register_type(void) >> > +{ >> > + type_register_static(&pc_type_info); >> > +} >> > + >> > +type_init(pc_register_type); >> > + >> > int e820_add_entry(uint64_t address, uint64_t length, uint32_t type) >> > { >> > int index = le32_to_cpu(e820_table.count); >> > diff --git a/hw/pc.h b/hw/pc.h >> > index e4db071..77e898f 100644 >> > --- a/hw/pc.h >> > +++ b/hw/pc.h >> > @@ -102,6 +102,12 @@ void i8042_setup_a20_line(ISADevice *dev, qemu_irq >> > *a20_out); >> > /* pc.c */ >> > extern int fd_bootchk; >> > >> > +#define TYPE_PC_MACHINE "PC" >> > +#define PC(obj) \ >> > + OBJECT_CHECK(PC, (obj), TYPE_PC_MACHINE) >> > +struct PC; >> > +typedef struct PC PC; >> > + >> > void pc_register_ferr_irq(qemu_irq irq); >> > void pc_acpi_smi_interrupt(void *opaque, int irq, int level); >> > >> > -- >> > 1.7.11.4 > > -- > Eduardo