[SeaBIOS] iasl compiler/disassembler getting confused by Scope operator
Moore, Robert
robert.moore at intel.com
Tue Oct 8 08:19:20 CEST 2013
I am out this week, will take a look when I get back.
Bob
> -----Original Message-----
> From: Michael S. Tsirkin [mailto:mst at redhat.com]
> Sent: Monday, October 07, 2013 12:18 AM
> To: Moore, Robert
> Cc: Kevin O'Connor; Idwer Vollering; seabios at seabios.org; Tang, Feng;
> coreboot at coreboot.org
> Subject: iasl compiler/disassembler getting confused by Scope operator
>
> I observe the following issue with acpica-tools-20130823-2.fc19.i686:
> Compile a file, disassemble it then compile again, this fails because the
> Extern directives produced by disassembler confuse the compiler.
>
> Wiuld be nice if this was fixed disasseble then compile is a nice sanity-
> check tool.
> Thanks!
>
> --->
>
> Original:
>
>
> /*
> * Intel ACPI Component Architecture
> * AML Disassembler version 20130823-32 [Aug 28 2013]
> * Copyright (c) 2000 - 2013 Intel Corporation
> *
> * Disassembly of SSDT, Mon Oct 7 09:48:29 2013
> *
> * Original Table Header:
> * Signature "SSDT"
> * Length 0x00000FE0 (4064)
> * Revision 0x01
> * Checksum 0x9F
> * OEM ID "BOCHS "
> * OEM Table ID "BXPCSSDT"
> * OEM Revision 0x00000001 (1)
> * Compiler ID "BXPC"
> * Compiler Version 0x00000001 (1)
> */
> DefinitionBlock ("SSDT.aml", "SSDT", 1, "BOCHS ", "BXPCSSDT", 0x00000001)
> {
>
> External (_SB_.PCI0, DeviceObj)
> External (_SB_.PCI0.ISA_, DeviceObj)
> External (BNUM, FieldUnitObj)
> External (CPEJ, MethodObj) // 2 Arguments
> External (CPMA, MethodObj) // 1 Arguments
> External (CPST, MethodObj) // 1 Arguments
> External (PCEJ, MethodObj) // 2 Arguments
> External (PCID, FieldUnitObj)
> External (PCIU, FieldUnitObj)
>
> Scope (\)
> {
> Name (P0S, 0x80000000)
> Name (P0E, 0xFEBFFFFF)
> Name (P1V, 0x00)
> Name (P1S, Buffer (0x08)
> {
> 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
> })
> Name (P1E, Buffer (0x08)
> {
> 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
> })
> Name (P1L, Buffer (0x08)
> {
> 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
> })
> }
>
> Scope (\)
> {
> Name (_S3, Package (0x04) // _S3_: S3 System State
> {
> One,
> One,
> Zero,
> Zero
> })
> Name (_S4, Package (0x04) // _S4_: S4 System State
> {
> 0x02,
> 0x02,
> Zero,
> Zero
> })
> Name (_S5, Package (0x04) // _S5_: S5 System State
> {
> Zero,
> Zero,
> Zero,
> Zero
> })
> }
>
> Scope (\_SB.PCI0.ISA)
> {
> Device (PEVT)
> {
> Name (_HID, "QEMU0001") // _HID: Hardware ID
> Name (PEST, 0x0000)
> OperationRegion (PEOR, SystemIO, PEST, One)
> Field (PEOR, ByteAcc, NoLock, Preserve)
> {
> PEPT, 8
> }
>
> Method (_STA, 0, NotSerialized) // _STA: Status
> {
> Store (PEST, Local0)
> If (LEqual (Local0, Zero))
> {
> Return (Zero)
> }
> Else
> {
> Return (0x0F)
> }
> }
>
> Method (RDPT, 0, NotSerialized)
> {
> Store (PEPT, Local0)
> Return (Local0)
> }
>
> Method (WRPT, 1, NotSerialized)
> {
> Store (Arg0, PEPT)
> }
>
> Name (_CRS, ResourceTemplate () // _CRS: Current Resource
> Settings
> {
> IO (Decode16,
> 0x0000, // Range Minimum
> 0x0000, // Range Maximum
> 0x01, // Alignment
> 0x01, // Length
> _Y03)
> })
> CreateWordField (_CRS, \_SB.PCI0.ISA.PEVT._Y03._MIN, IOMN) //
> _MIN: Minimum Base Address
> CreateWordField (_CRS, \_SB.PCI0.ISA.PEVT._Y03._MAX, IOMX) //
> _MAX: Maximum Base Address
> Method (_INI, 0, NotSerialized) // _INI: Initialize
> {
> Store (PEST, IOMN)
> Store (PEST, IOMX)
> }
> }
> }
>
> Scope (_SB)
> {
> Scope (PCI0)
> {
> Name (BSEL, Zero)
> Device (S18)
> {
> Name (_SUN, 0x03) // _SUN: Slot User Number
> Name (_ADR, 0x00030000) // _ADR: Address
> Method (_EJ0, 1, NotSerialized) // _EJx: Eject Device
> {
> PCEJ (BSEL, _SUN)
> }
> }
>
> Method (DVNT, 2, NotSerialized)
> {
> If (And (Arg0, 0x08))
> {
> Notify (S18, Arg1)
> }
> }
>
> Method (PCNT, 0, NotSerialized)
> {
> Store (Zero, BNUM)
> DVNT (PCIU, One)
> DVNT (PCID, 0x03)
> ^S20.PCNT ()
> }
>
> Device (S20)
> {
> Name (_SUN, 0x04) // _SUN: Slot User Number
> Name (_ADR, 0x00040000) // _ADR: Address
> Name (BSEL, One)
> Method (PCNT, 0, NotSerialized)
> {
> Store (One, BNUM)
> }
> }
> }
> }
> }
>
>
> ---
>
> Compile with iasl foo.dsl
>
> Disassemble with iasl -d -e DSDT SSDT.aml (see DSDT.dsl at the end of the
> mail).
>
>
> /*
> * Intel ACPI Component Architecture
> * AML Disassembler version 20130823-32 [Aug 28 2013]
> * Copyright (c) 2000 - 2013 Intel Corporation
> *
> * Disassembly of SSDT.aml, Mon Oct 7 10:10:41 2013
> *
> * Original Table Header:
> * Signature "SSDT"
> * Length 0x00000207 (519)
> * Revision 0x01
> * Checksum 0xBF
> * OEM ID "BOCHS "
> * OEM Table ID "BXPCSSDT"
> * OEM Revision 0x00000001 (1)
> * Compiler ID "INTL"
> * Compiler Version 0x20130823 (538118179)
> */
> DefinitionBlock ("SSDT.aml", "SSDT", 1, "BOCHS ", "BXPCSSDT", 0x00000001)
> {
>
> External (_SB_.PCI0.ISA_, DeviceObj)
> External (BNUM, FieldUnitObj)
> External (PCEJ, MethodObj) // 2 Arguments
> External (PCI0, DeviceObj)
> External (PCID, FieldUnitObj)
> External (PCIU, FieldUnitObj)
>
> Scope (\)
> {
> Name (P0S, 0x80000000)
> Name (P0E, 0xFEBFFFFF)
> Name (P1V, Zero)
> Name (P1S, Buffer (0x08)
> {
> 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
> })
> Name (P1E, Buffer (0x08)
> {
> 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
> })
> Name (P1L, Buffer (0x08)
> {
> 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
> })
> }
>
> Scope (\)
> {
> Name (_S3, Package (0x04) // _S3_: S3 System State
> {
> One,
> One,
> Zero,
> Zero
> })
> Name (_S4, Package (0x04) // _S4_: S4 System State
> {
> 0x02,
> 0x02,
> Zero,
> Zero
> })
> Name (_S5, Package (0x04) // _S5_: S5 System State
> {
> Zero,
> Zero,
> Zero,
> Zero
> })
> }
>
> Scope (\_SB.PCI0.ISA)
> {
> Device (PEVT)
> {
> Name (_HID, "QEMU0001") // _HID: Hardware ID
> Name (PEST, Zero)
> OperationRegion (PEOR, SystemIO, PEST, One)
> Field (PEOR, ByteAcc, NoLock, Preserve)
> {
> PEPT, 8
> }
>
> Method (_STA, 0, NotSerialized) // _STA: Status
> {
> Store (PEST, Local0)
> If (LEqual (Local0, Zero))
> {
> Return (Zero)
> }
> Else
> {
> Return (0x0F)
> }
> }
>
> Method (RDPT, 0, NotSerialized)
> {
> Store (PEPT, Local0)
> Return (Local0)
> }
>
> Method (WRPT, 1, NotSerialized)
> {
> Store (Arg0, PEPT)
> }
>
> Name (_CRS, ResourceTemplate () // _CRS: Current Resource
> Settings
> {
> IO (Decode16,
> 0x0000, // Range Minimum
> 0x0000, // Range Maximum
> 0x01, // Alignment
> 0x01, // Length
> _Y00)
> })
> CreateWordField (_CRS, \_SB.PCI0.ISA.PEVT._Y00._MIN, IOMN) //
> _MIN: Minimum Base Address
> CreateWordField (_CRS, \_SB.PCI0.ISA.PEVT._Y00._MAX, IOMX) //
> _MAX: Maximum Base Address
> Method (_INI, 0, NotSerialized) // _INI: Initialize
> {
> Store (PEST, IOMN)
> Store (PEST, IOMX)
> }
> }
> }
>
> Scope (_SB)
> {
> Scope (PCI0)
> {
> Name (BSEL, Zero)
> Device (S18)
> {
> Name (_SUN, 0x03) // _SUN: Slot User Number
> Name (_ADR, 0x00030000) // _ADR: Address
> Method (_EJ0, 1, NotSerialized) // _EJx: Eject Device
> {
> PCEJ (BSEL, _SUN)
> }
> }
>
> Method (DVNT, 2, NotSerialized)
> {
> If (And (Arg0, 0x08))
> {
> Notify (S18, Arg1)
> }
> }
>
> Method (PCNT, 0, NotSerialized)
> {
> Store (Zero, BNUM)
> DVNT (PCIU, One)
> DVNT (PCID, 0x03)
> ^S20.PCNT ()
> }
>
> Device (S20)
> {
> Name (_SUN, 0x04) // _SUN: Slot User Number
> Name (_ADR, 0x00040000) // _ADR: Address
> Name (BSEL, One)
> Method (PCNT, 0, NotSerialized)
> {
> Store (One, BNUM)
> }
> }
> }
> }
> }
>
> <----
>
> Compilation error:
> Intel ACPI Component Architecture
> ASL Optimizing Compiler version 20130823-32 [Aug 28 2013] Copyright (c)
> 2000 - 2013 Intel Corporation
>
> SSDT.dsl 130: Scope (PCI0)
> Error 6117 - ^ Existing object has invalid type for
> Scope operator (PCI0 [Untyped])
>
>
>
> If you compane the original and the disassebled result, you see the issue:
>
>
> DefinitionBlock ("SSDT.aml", "SSDT", 1, "BOCHS ", "BXPCSSDT",
> 0x00000001)
> {
>
> - External (_SB_.PCI0, DeviceObj)
> External (_SB_.PCI0.ISA_, DeviceObj)
> External (BNUM, FieldUnitObj)
> External (CPEJ, MethodObj) // 2 Arguments
> External (CPMA, MethodObj) // 1 Arguments
> External (CPST, MethodObj) // 1 Arguments
> External (PCEJ, MethodObj) // 2 Arguments
> + External (PCI0, DeviceObj)
> External (PCID, FieldUnitObj)
> External (PCIU, FieldUnitObj)
>
>
> So External (_SB_.PCI0.ISA_, DeviceObj)
> implicitly defines PCI0 as an untyped object, Scope (PCI0) is then taken
> to refer to that (since it's in the correct namespace).
> Also, External (PCI0, DeviceObj) is produced in the wrong namespace.
>
>
> To reproduce you will need a DSDT (for disassembler), see DSDT.dsl below:
>
>
> /*
> * Intel ACPI Component Architecture
> * AML Disassembler version 20130823-32 [Aug 28 2013]
> * Copyright (c) 2000 - 2013 Intel Corporation
> *
> * Disassembly of DSDT, Mon Oct 7 09:58:06 2013
> *
> * Original Table Header:
> * Signature "DSDT"
> * Length 0x00001158 (4440)
> * Revision 0x01 **** 32-bit table (V1), no 64-bit math
> support
> * Checksum 0xC6
> * OEM ID "BXPC"
> * OEM Table ID "BXDSDT"
> * OEM Revision 0x00000001 (1)
> * Compiler ID "INTL"
> * Compiler Version 0x20130823 (538118179)
> */
> DefinitionBlock ("DSDT.aml", "DSDT", 1, "BXPC", "BXDSDT", 0x00000001) {
> External (_SB_.PCI0.PCNT, MethodObj)
> External (NTFY, MethodObj)
>
> External (CPON)
> External (P0E_, IntObj)
> External (P0S_, IntObj)
> External (P1E_, IntObj)
> External (P1L_, IntObj)
> External (P1S_, IntObj)
> External (P1V_)
>
> Scope (\)
> {
> OperationRegion (DBG, SystemIO, 0x0402, One)
> Field (DBG, ByteAcc, NoLock, Preserve)
> {
> DBGB, 8
> }
>
> Method (DBUG, 1, NotSerialized)
> {
> ToHexString (Arg0, Local0)
> ToBuffer (Local0, Local0)
> Subtract (SizeOf (Local0), One, Local1)
> Store (Zero, Local2)
> While (LLess (Local2, Local1))
> {
> Store (DerefOf (Index (Local0, Local2)), DBGB)
> Increment (Local2)
> }
>
> Store (0x0A, DBGB)
> }
> }
>
> Scope (_SB)
> {
> Device (PCI0)
> {
> Name (_HID, EisaId ("PNP0A03")) // _HID: Hardware ID
> Name (_ADR, Zero) // _ADR: Address
> Name (_UID, One) // _UID: Unique ID
> }
> }
>
> Scope (_SB.PCI0)
> {
> Device (ISA)
> {
> Name (_ADR, 0x00010000) // _ADR: Address
> OperationRegion (P40C, PCI_Config, 0x60, 0x04)
> Name (FDEN, One)
> }
> }
>
> Scope (_SB.PCI0)
> {
> OperationRegion (PCST, SystemIO, 0xAE00, 0x08)
> Field (PCST, DWordAcc, NoLock, WriteAsZeros)
> {
> PCIU, 32,
> PCID, 32
> }
>
> OperationRegion (SEJ, SystemIO, 0xAE08, 0x04)
> Field (SEJ, DWordAcc, NoLock, WriteAsZeros)
> {
> B0EJ, 32
> }
>
> OperationRegion (BNMR, SystemIO, 0xAE10, 0x04)
> Field (BNMR, DWordAcc, NoLock, WriteAsZeros)
> {
> BNUM, 32
> }
>
> Mutex (BLCK, 0x00)
> Method (PCEJ, 2, NotSerialized)
> {
> Acquire (BLCK, 0xFFFF)
> Store (Arg0, BNUM)
> Store (ShiftLeft (One, Arg1), B0EJ)
> Release (BLCK)
> Return (Zero)
> }
> }
>
> Scope (_GPE)
> {
> Name (_HID, "ACPI0006") // _HID: Hardware ID
> Method (_L00, 0, NotSerialized) // _Lxx: Level-Triggered GPE
> {
> }
>
> Method (_E01, 0, NotSerialized) // _Exx: Edge-Triggered GPE
> {
> Acquire (\_SB.PCI0.BLCK, 0xFFFF)
> \_SB.PCI0.PCNT ()
> Release (\_SB.PCI0.BLCK)
> }
>
> }
> }
>
More information about the SeaBIOS
mailing list