qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [RFC 01/18] pc: create "PC" device class


From: Eduardo Habkost
Subject: Re: [Qemu-devel] [RFC 01/18] pc: create "PC" device class
Date: Thu, 4 Oct 2012 12:57:50 -0300
User-agent: Mutt/1.5.21 (2010-09-15)

On Thu, Oct 04, 2012 at 09:29:57AM -0500, Anthony Liguori wrote:
> Eduardo Habkost <address@hidden> writes:
> 
> > On Thu, Oct 04, 2012 at 08:46:46AM -0500, Anthony Liguori wrote:
> >> Eduardo Habkost <address@hidden> 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 <address@hidden>
> >> > ---
> >> >  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.

I wish I was told this 6 months ago! I thought we wanted to avoid that
and wanted to start using global properties instead of making the list
of pc_init1() parameters grow.

if that's acceptable then, yes, we could fix the bug without having to
deal with class and object modelling.


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

-- 
Eduardo



reply via email to

[Prev in Thread] Current Thread [Next in Thread]