Skip site navigation (1)Skip section navigation (2)
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>