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". > 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