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) }
} }