i386/93963: [panic] [patch] ACPI Panic with some ACPI 2.0 PC &
cannot boot
Masayuki FUKUI
fukui.FreeBSD at fanet.net
Tue Feb 28 17:20:05 PST 2006
>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:
More information about the freebsd-i386
mailing list