Date: Tue, 02 Oct 2001 16:56:44 -0700 From: Mike Smith <msmith@freebsd.org> To: Mitsuru IWASAKI <iwasaki@jp.FreeBSD.org> Cc: sobomax@FreeBSD.org, ache@nagual.pp.ru, current@FreeBSD.org, acpi-jp@jp.FreeBSD.org Subject: Re: ACPI: problem with fdc resource allocation Message-ID: <200110022356.f92Nuit03147@mass.dis.org> In-Reply-To: Your message of "Tue, 02 Oct 2001 11:10:45 %2B0900." <20011002.111045.78762705.iwasaki@jp.FreeBSD.org>
next in thread | previous in thread | raw e-mail | index | archive | help
This just isn't going to work. The _CRS data stream stops at byte 0x17, and these extra items are simply mis-aimed. The 0x19 should really be 0x11, and the 0x1c should really be 0x14, ie. this is a BIOS bug, and should be reported to the vendor. (It should also have failed the Microsoft ACPI validation suite...) The correct action should probably be to silently discard the write operations outside of a defined buffer, and return Zeroes or Ones for a read outside a buffer. > 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 si > ze 192 (bits) > > PsExecute: method failed - \_SB_.PCI0.ISA_.FDC0._CRS (0x8098fa8) > > Execution of \_SB_.PCI0.ISA_.FDC0._CRS failed with status AE_AML_BUFFER_LIM > IT > > 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; > } > > -- ... every activity meets with opposition, everyone who acts has his rivals and unfortunately opponents also. But not because people want to be opponents, rather because the tasks and relationships force people to take different points of view. [Dr. Fritz Todt] V I C T O R Y N O T V E N G E A N C E To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-current" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200110022356.f92Nuit03147>