From mboxrd@z Thu Jan 1 00:00:00 1970 From: Laurent Vivier Subject: Re: FreeBSD image hangs during boot Date: Sat, 06 Oct 2007 10:38:33 +0200 Message-ID: <47074989.9080100@bull.net> References: <47022E7E.3030509@aurel32.net> <47063B31.6000001@bull.net> <20071005135122.GA17767@hall.aurel32.net> <47066153.2040406@qumranet.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Cc: kvm-devel , Aurelien Jarno To: Avi Kivity Return-path: In-Reply-To: <47066153.2040406-atKUWr5tajBWk0Htik3J/w@public.gmane.org> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: kvm-devel-bounces-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org Errors-To: kvm-devel-bounces-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org List-Id: kvm.vger.kernel.org Avi Kivity wrote: > Aurelien Jarno wrote: >> On Fri, Oct 05, 2007 at 03:25:05PM +0200, Laurent Vivier wrote: >> >>> Digging in the FreeBSD sources I found the origin of the problem: >>> >>> I added some ACPI traces: >>> >>> rsirq-0234 [13] RsIrqResource : Invalid interrupt polarity/trigger in >>> resource list, 10 >>> >>> Which is in /sys/contrib/dev/acpica/rsirq.c : >>> >>> >>> /* >>> * Check for HE, LL interrupts >>> */ >>> switch (Temp8 & 0x09) >>> { >>> case 0x01: /* HE */ >>> OutputStruct->Data.Irq.EdgeLevel = ACPI_EDGE_SENSITIVE; >>> OutputStruct->Data.Irq.ActiveHighLow = ACPI_ACTIVE_HIGH; >>> break; >>> >>> case 0x08: /* LL */ >>> OutputStruct->Data.Irq.EdgeLevel = ACPI_LEVEL_SENSITIVE; >>> OutputStruct->Data.Irq.ActiveHighLow = ACPI_ACTIVE_LOW; >>> break; >>> >>> default: >>> /* >>> * Only _LL and _HE polarity/trigger interrupts >>> * are allowed (ACPI spec, section "IRQ Format") >>> * so 0x00 and 0x09 are illegal. >>> */ >>> ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, >>> "Invalid interrupt polarity/trigger in resource list, %X\n", Tem >>> p8)); >>> return_ACPI_STATUS (AE_BAD_DATA); >>> } >>> >>> >> Good catch! >> >> >>> Conclusion, in kvm-userspace/bios/acpi-dsdt.dsl, if you have "ActiveHigh", you >>> must have "Edge" instead of "Level": >>> >>> - IRQ (Level, ActiveHigh, Shared) >>> + IRQ (Edge, ActiveHigh, Shared) >>> >>> But I found nothing in ACPI specification explaining the freeBSD behavior. >>> >>> >> >> It's actually described page 200 of the specifications (page 216 in >> ACPIspec30.pdf): >> >> Note: This descriptor is meant for describing interrupts that are connected to PIC-compatible >> interrupt controllers, which can only be programmed for Active-High-Edge-Triggered or Active- >> Low-Level-Triggered interrupts. Any other combination is illegal. The Extended Interrupt >> Descriptor can be used to describe other combinations. >> >> >> >>> Avi, if you think this anlysis is correct I can provide the patch changing >>> "Level" to "Edge"... >>> >>> >> It looks like the solution is either to describe the IRQ with an >> "Extended Interrupt Descriptor" or to change this value to one of the >> two allowed values. In the later case we have to make sure it is >> consistent with the way the PIC works. >> >> > > Edge-triggered means we can't share interrupt lines. Since we have only > two or three that limits the number of devices we can have. > > So I'd like to try moving to active low pci interrupts, and implementing > polarity in the qemu ioapic. It's probably closer to real hardware anyway. > Avi, I've two questions: - why, when you implemented the ioapic polarity bit in kvm (commit 0203e2d5d0d0cea6eed6e437d9456aad71135913, kvm_ioapic_set_irq()), you didn't implement it in qemu (in qemu/hw/apic.c ioapic_set_irq()) ? - why implementing polarity changes active level in ACPI ? Thanks, Laurent ------------------------------------------------------------------------- This SF.net email is sponsored by: Splunk Inc. Still grepping through log files to find problems? Stop. Now Search log events and configuration files using AJAX and a browser. Download your FREE copy of Splunk now >> http://get.splunk.com/