[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