Date: Tue, 02 Oct 2001 11:10:45 +0900 (JST) From: Mitsuru IWASAKI <iwasaki@jp.FreeBSD.org> To: sobomax@FreeBSD.org Cc: ache@nagual.pp.ru, msmith@FreeBSD.org, current@FreeBSD.org, acpi-jp@jp.FreeBSD.org Subject: Re: ACPI: problem with fdc resource allocation Message-ID: <20011002.111045.78762705.iwasaki@jp.FreeBSD.org> In-Reply-To: <20011002.023158.71143343.iwasaki@jp.FreeBSD.org> References: <20011002.005340.74695085.iwasaki@jp.FreeBSD.org> <3BB89FA1.DD75D31C@FreeBSD.org> <20011002.023158.71143343.iwasaki@jp.FreeBSD.org>
index | next in thread | previous in thread | raw e-mail
Hi, I've just made a workaround for this. Intel folks, could you review
it as always?
> The problem is here, right?
> > can't fetch resources for \\_SB_.PCI0.ISA_.FDC0 - AE_AML_BUFFER_LIMIT
>
> I'm sure _SB_.PCI0.ISA_.FDC0._CRS (Current Resource Settings) have some
> problems (not sure in BIOS or ACPICA yet). I could reproduce the problem
> which you reported. Trace attached in this mail.
[snip]
> dsopcode-0677 [09] DsEvalBufferFieldOpera: Field size 208 exceeds Buffer size 192 (bits)
> PsExecute: method failed - \_SB_.PCI0.ISA_.FDC0._CRS (0x8098fa8)
> Execution of \_SB_.PCI0.ISA_.FDC0._CRS failed with status AE_AML_BUFFER_LIMIT
This method is like this;
Method(_CRS) {
Name(BUF0, Buffer(0x18) {0x47, 0x1, 0xf2, 0x3, 0xf2, 0x3,
0x0, 0x4, 0x47, 0x1, 0xf7, 0x3, 0xf7, 0x3, 0x0,
0x1, 0x22, 0x40, 0x0, 0x2a, 0x4, 0x0, 0x79, 0x0 })
CreateByteField(BUF0, 0x2, IOLO)
CreateByteField(BUF0, 0x3, IOHI)
CreateByteField(BUF0, 0x4, IORL)
CreateByteField(BUF0, 0x5, IORH)
CreateByteField(BUF0, 0x19, IRQL)
CreateByteField(BUF0, 0x1c, DMAV)
Return(BUF0)
}
The problem is that this AML is trying to create a field at exceeded
position (0x19) of the Buffer (size is 0x18).
I couldn't find how AML interprepter treat this in ACPI Spec. so I'm
not sure wether AWRDACPI violates the Spec. or ACPICA can have a workaround
for this.
Anyway, I made a patch to reallocate a large enough buffer for the
requested operation.
Thanks
Index: dsopcode.c
===================================================================
RCS file: /home/ncvs/src/sys/contrib/dev/acpica/dsopcode.c,v
retrieving revision 1.1.1.10
diff -u -r1.1.1.10 dsopcode.c
--- dsopcode.c 7 Sep 2001 01:22:24 -0000 1.1.1.10
+++ dsopcode.c 1 Oct 2001 18:58:41 -0000
@@ -615,11 +615,24 @@
if ((BitOffset + BitCount) >
(8 * (UINT32) SrcDesc->Buffer.Length))
{
+ UINT32 Length;
+ UINT8 *Pointer;
+
ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
"Field size %d exceeds Buffer size %d (bits)\n",
BitOffset + BitCount, 8 * (UINT32) SrcDesc->Buffer.Length));
- Status = AE_AML_BUFFER_LIMIT;
- goto Cleanup;
+ Length = ((BitOffset + BitCount) / 8) +
+ (((BitOffset + BitCount) % 8) ? 1 : 0);
+ Pointer = ACPI_MEM_CALLOCATE (Length);
+ if (!Pointer)
+ {
+ Status = AE_NO_MEMORY;
+ goto Cleanup;
+ }
+ MEMCPY (Pointer, SrcDesc->Buffer.Pointer, SrcDesc->Buffer.Length);
+ ACPI_MEM_FREE (SrcDesc->Buffer.Pointer);
+ SrcDesc->Buffer.Pointer = Pointer;
+ SrcDesc->Buffer.Length = Length;
}
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-current" in the body of the message
help
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20011002.111045.78762705.iwasaki>
