qemu-devel
[Top][All Lists]
Advanced

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

Re: [Qemu-devel] [seabios PATCH 1/2] acpi: set I/O APIC ID to 0 by defau


From: Eduardo Habkost
Subject: Re: [Qemu-devel] [seabios PATCH 1/2] acpi: set I/O APIC ID to 0 by default
Date: Fri, 20 Jul 2012 13:22:43 -0300
User-agent: Mutt/1.5.21 (2010-09-15)

On Fri, Jul 20, 2012 at 12:18:59AM +0300, Gleb Natapov wrote:
> On Thu, Jul 19, 2012 at 05:52:41PM -0300, Eduardo Habkost wrote:
> > When resetting an I/O APIC, its ID is set to 0, so set it to 0 on the
> > MADT table too.
> > 
> Actually BIOS needs to configure ioapic id to a uniqe value. This does
> not really matter for KVM though.

Where does this requirement comes from? I am guessing it matters only
when the I/O APIC is directly connected to the APIC bus (according to
Intel SDM, that's the case only for old Pentium and P6 CPUs)[1].

Anyway, even if some hardware has this unique-ID requirement, today
Seabios does not fulfill it, leaving the I/O APIC ID as 0. The patch at
least makes the MADT table match reality.


[1] I have checked 3 different machines, and all machines I have looked
have an I/O APIC ID that conflicts with an existing Local APIC ID, on
the ACPI MADT table.

Some iasl dumps may be found online by googling for:
 "Subtable Type : 01" "I/O Apic ID"

I looked at 5 or 6 matches, and almost every one have an I/O APIC ID
conflicting with a Local APIC ID.

> 
> > Signed-off-by: Eduardo Habkost <address@hidden>
> > ---
> >  src/acpi.c   |    2 +-
> >  src/config.h |    2 ++
> >  2 files changed, 3 insertions(+), 1 deletion(-)
> > 
> > diff --git a/src/acpi.c b/src/acpi.c
> > index 55e4607..3f55de9 100644
> > --- a/src/acpi.c
> > +++ b/src/acpi.c
> > @@ -335,7 +335,7 @@ build_madt(void)
> >      struct madt_io_apic *io_apic = (void*)apic;
> >      io_apic->type = APIC_IO;
> >      io_apic->length = sizeof(*io_apic);
> > -    io_apic->io_apic_id = CountCPUs;
> > +    io_apic->io_apic_id = BUILD_IOAPIC_ID;
> >      io_apic->address = cpu_to_le32(BUILD_IOAPIC_ADDR);
> >      io_apic->interrupt = cpu_to_le32(0);
> >  
> > diff --git a/src/config.h b/src/config.h
> > index 3a70867..878c691 100644
> > --- a/src/config.h
> > +++ b/src/config.h
> > @@ -52,9 +52,11 @@
> >  #define BUILD_PCIMEM64_END        0x10000000000ULL
> >  
> >  #define BUILD_IOAPIC_ADDR         0xfec00000
> > +#define BUILD_IOAPIC_ID           0
> >  #define BUILD_HPET_ADDRESS        0xfed00000
> >  #define BUILD_APIC_ADDR           0xfee00000
> >  
> > +
> >  // Important real-mode segments
> >  #define SEG_IVT      0x0000
> >  #define SEG_BDA      0x0040
> > -- 
> > 1.7.10.4
> 
> --
>                       Gleb.
> 

-- 
Eduardo



reply via email to

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