MacBookPro 5,1

Lin Ming ming.m.lin at intel.com
Fri Oct 22 05:23:02 UTC 2010


On Fri, 2010-10-22 at 10:39 +0800, Lin Ming wrote:
> On Fri, 2010-10-22 at 04:57 +0800, Hans Petter Selasky wrote:

> > Here is the relevant output. First note, the buffer length is 512 and 
> > (uint8_t)512 = 0, so I modified the code to print out the 512 bytes.
> > 
> > 
> > Passed in resource buffer length=512
> > Buffer start
> > 0f 00 00 00 40 00 00 00 01 00 01 01 01 17 01 00 38 b0 17 03 00 ff ff ff 11 00 
> > 00 00 11 00 00 00 12 00 00 00 13 00 00 00 14 00 00 00 15 00 00 00 16 00 00 00 
> > 17 00 00 0
> > 0 00 00 00 00 00 00 00 00 07 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 07 
> > 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
> > 00 00 00 00
> >  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
> > 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
> > 00 00 00 
> > 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
> > 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
> > 00 00 00 0
> > 0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
> > 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
> > 00 00 00 00
> >  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
> > 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
> > 00 00 00 
> > 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
> > 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
> > 00 00 00 0
> > 0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
> > 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
> > 00 00 00 00
> >  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
> > 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
> > 00 00 00 
> > 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
> > Buffer end
> 
> Unfortunately, I can't reproduce it in the simulator(acpiexec).

Hans,

This bug seems really strange.

As above resource buffer you got, it's interpreted as below

[00] Extended IRQ Resource
                       Type : ResourceConsumer
                 Triggering : Level
                   Polarity : ActiveLow
                    Sharing : Shared
      Resource Source Index : 17
            Resource Source : [NULL NAMESTRING]
            Interrupt Count : 01
                    Dword00 : 00000011

[01] EndTag Resource

[NULL NAMESTRING] actually means empty string with size 1 (1 byte for
NULL terminator).

You wrote:
> It appears that when a string is present in the extended interrupt
> descriptor (6.4.3.6, ACPIspec30.pdf), then this is not handled
> correctly, meaning that the precomputed buffer space when encoding to
> AML, is incorrect and that data is written beyond the destination
> buffer!

But for above resources, AcpiRsCreateAmlResources->AcpiRsGetAmlLength
returns 13, which is the precomputed size for the AML buffer and it's
correct.

I'm lost now.
Would you please try this patch to double check if the fault is really
caused by the string in the extended interrupt descriptor?

Tell us if it boots OK or not with this patch.
Thanks.

diff --git a/source/components/resources/rsxface.c b/source/components/resources/rsxface.c
index 2a019d1..17b88e2 100644
--- a/source/components/resources/rsxface.c
+++ b/source/components/resources/rsxface.c
@@ -394,6 +394,7 @@ AcpiSetCurrentResources (
 {
     ACPI_STATUS             Status;
     ACPI_NAMESPACE_NODE     *Node;
+    ACPI_RESOURCE           *Res;
 
 
     ACPI_FUNCTION_TRACE (AcpiSetCurrentResources);
@@ -416,6 +417,15 @@ AcpiSetCurrentResources (
         return_ACPI_STATUS (Status);
     }
 
+    Res = (ACPI_RESOURCE *) InBuffer->Pointer;
+    if (Res->Type == ACPI_RESOURCE_TYPE_EXTENDED_IRQ)
+    {
+        /* DEBUG: clear the string to see if it's the root cause */
+
+        Res->Data.ExtendedIrq.ResourceSource.StringPtr = NULL;
+        Res->Data.ExtendedIrq.ResourceSource.StringLength = 0;
+    }
+
     Status = AcpiRsSetSrsMethodData (Node, InBuffer);
     return_ACPI_STATUS (Status);
 }




More information about the freebsd-acpi mailing list