Date: Wed, 1 Mar 2006 01:13:00 GMT From: Masayuki FUKUI <fukui.FreeBSD@fanet.net> To: freebsd-gnats-submit@FreeBSD.org Subject: i386/93963: [panic] [patch] ACPI Panic with some ACPI 2.0 PC & cannot boot Message-ID: <200603010113.k211D0bL024392@www.freebsd.org> Resent-Message-ID: <200603010120.k211K4YQ008977@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
>Number: 93963 >Category: i386 >Synopsis: [panic] [patch] ACPI Panic with some ACPI 2.0 PC & cannot boot >Confidential: no >Severity: critical >Priority: high >Responsible: freebsd-i386 >State: open >Quarter: >Keywords: >Date-Required: >Class: sw-bug >Submitter-Id: current-users >Arrival-Date: Wed Mar 01 01:20:04 GMT 2006 >Closed-Date: >Last-Modified: >Originator: Masayuki FUKUI >Release: FreeBSD 5.4-RELEASE-p10 >Organization: >Environment: PC: Fujitsu-Siemens Celsius N440 [Pentium4 670 (3.8GHz) / 3GB Memory] OS: FreeBSD 6.1-BETA1 / FreeBSD 5.5-BETA1 / FreeBSD 5.4-RELEASE-p10 >Description: FreeBSD cannot be booted with some ACPI 2.0 PC. The kernel panic occurs with the initialization of ACPI. Cause: In some ACPI 2.0 PC, XSDT is NULL. (RSDT is available.) Therefore, FreeBSD traces XSDT (is NULL) and falls into the panic. >How-To-Repeat: Trt to boot FreeBSD 6.1-BETA1 (ACPI enable) on Fujitsu-Siemens Celsius N440. >Fix: I don't know how to fix rightly. But I rebuild 5.4-RELEASE-p10 kernel with following patch, and it works fine. I hope for fixing the probrem as soon as possible. --- sys/contrib/dev/acpica/tbconvrt.c.orig Sun Dec 19 13:06:14 2004 +++ sys/contrib/dev/acpica/tbconvrt.c Wed Feb 8 22:48:21 2006 @@ -149,7 +149,7 @@ ACPI_FUNCTION_ENTRY (); - if (RSDP->Revision < 2) + if (RSDP->Revision < 2 || !RSDP->XsdtPhysicalAddress) { PointerSize = sizeof (UINT32); } @@ -214,7 +214,7 @@ for (i = 0; i < AcpiGbl_RsdtTableCount; i++) { - if (AcpiGbl_RSDP->Revision < 2) + if (AcpiGbl_RSDP->Revision < 2 || !AcpiGbl_RSDP->XsdtPhysicalAddress) { ACPI_STORE_ADDRESS (NewTable->TableOffsetEntry[i], (ACPI_CAST_PTR (RSDT_DESCRIPTOR_REV1, TableInfo->Pointer))->TableOffsetEntry[i]); @@ -637,7 +637,7 @@ AcpiGbl_CommonFACS.GlobalLock = &(AcpiGbl_FACS->GlobalLock); - if ((AcpiGbl_RSDP->Revision < 2) || + if ((AcpiGbl_RSDP->Revision < 2) || (!AcpiGbl_RSDP->XsdtPhysicalAddress) || (AcpiGbl_FACS->Length < 32) || (!(ACPI_GET_ADDRESS (AcpiGbl_FACS->XFirmwareWakingVector)))) { --- sys/contrib/dev/acpica/tbrsdt.c.orig Sun Dec 19 13:06:14 2004 +++ sys/contrib/dev/acpica/tbrsdt.c Wed Feb 8 23:33:27 2006 @@ -259,7 +259,7 @@ * For RSDP revision 0 or 1, we use the RSDT. * For RSDP revision 2 (and above), we use the XSDT */ - if (AcpiGbl_RSDP->Revision < 2) + if (AcpiGbl_RSDP->Revision < 2 || !AcpiGbl_RSDP->XsdtPhysicalAddress) { OutAddress->Pointer.Value = AcpiGbl_RSDP->RsdtPhysicalAddress; } @@ -296,7 +296,7 @@ * For RSDP revision 0 or 1, we use the RSDT. * For RSDP revision 2 and above, we use the XSDT */ - if (AcpiGbl_RSDP->Revision < 2) + if (AcpiGbl_RSDP->Revision < 2 || !AcpiGbl_RSDP->XsdtPhysicalAddress) { NoMatch = ACPI_STRNCMP ((char *) TablePtr, RSDT_SIG, sizeof (RSDT_SIG) -1); @@ -320,7 +320,7 @@ AcpiGbl_RSDP->RsdtPhysicalAddress, (void *) (ACPI_NATIVE_UINT) AcpiGbl_RSDP->RsdtPhysicalAddress)); - if (AcpiGbl_RSDP->Revision < 2) + if (AcpiGbl_RSDP->Revision < 2 || !AcpiGbl_RSDP->XsdtPhysicalAddress) { ACPI_REPORT_ERROR (("Looking for RSDT (RSDP->Rev < 2)\n")) } --- sys/contrib/dev/acpica/tbxfroot.c.orig Sun Dec 19 13:06:14 2004 +++ sys/contrib/dev/acpica/tbxfroot.c Wed Feb 8 22:47:32 2006 @@ -362,7 +362,7 @@ { /* Get the next table pointer, handle RSDT vs. XSDT */ - if (AcpiGbl_RSDP->Revision < 2) + if (AcpiGbl_RSDP->Revision < 2 || !AcpiGbl_RSDP->XsdtPhysicalAddress) { Address.Pointer.Value = (ACPI_CAST_PTR ( RSDT_DESCRIPTOR, RsdtInfo->Pointer))->TableOffsetEntry[i]; @@ -514,7 +514,7 @@ /* Signature matches, check the appropriate checksum */ - if (((RSDP_DESCRIPTOR *) MemRover)->Revision < 2) + if (((RSDP_DESCRIPTOR *) MemRover)->Revision < 2 || !(((RSDP_DESCRIPTOR *) MemRover)->XsdtPhysicalAddress)) { /* ACPI version 1.0 */ --- sys/i386/acpica/madt.c.orig Mon Feb 28 06:28:18 2005 +++ sys/i386/acpica/madt.c Wed Feb 8 23:30:14 2006 @@ -223,7 +223,7 @@ * We map the XSDT and RSDT at page 1 in the crashdump area. * Page 0 is used to map in the headers of candidate ACPI tables. */ - if (rsdp->Revision >= 2) { + if (rsdp->Revision >= 2 && rsdp->XsdtPhysicalAddress) { /* * AcpiOsGetRootPointer only verifies the checksum for * the version 1.0 portion of the RSDP. Version 2.0 has >Release-Note: >Audit-Trail: >Unformatted:
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200603010113.k211D0bL024392>