Al Stone 69fdad
/*
Al Stone 69fdad
 * badcode.asl
Al Stone 69fdad
 *
Al Stone 69fdad
 * This file contains examples of the extended error checking and
Al Stone 69fdad
 * typechecking capabilities of the iASL compiler. Other ASL compilers
Al Stone 69fdad
 * may ignore these errors completely. Note - this is not an exhaustive
Al Stone 69fdad
 * list of errors detected by iASL, it shows many of the errors that
Al Stone 69fdad
 * are not detected by other ASL compilers.
Al Stone 69fdad
 *
Al Stone 69fdad
 * To compile, use:
Al Stone 69fdad
 * iasl badcode.asl
Al Stone 69fdad
 *
Al Stone 69fdad
 * Output:
Al Stone 69fdad
 * Compilation complete. 45 Errors, 22 Warnings, 3 Remarks, 16 Optimizations
Al Stone 69fdad
 *
Al Stone 69fdad
 */
Al Stone 69fdad
DefinitionBlock ("badcode.aml", "DSDT", 1, "Intel", "Example", 0x00000001)
Al Stone 69fdad
{
Al Stone 69fdad
    Name (INT1, 0)
Al Stone 69fdad
    Name (BUF1, Buffer() {0,1,2,3})
Al Stone 69fdad
    Event (EVT1)
Al Stone 69fdad
Al Stone 69fdad
    // Invalid SyncLevel in Mutex declaration
Al Stone 69fdad
Al Stone 69fdad
    Mutex (MTX1, 32)
Al Stone 69fdad
Al Stone 69fdad
    // Integer beyond the table integer size (32 bits)
Al Stone 69fdad
Al Stone 69fdad
    Name (BIG, 0x1234567887654321)
Al Stone 69fdad
Al Stone 69fdad
    // CPackage length does not match initializer list length
Al Stone 69fdad
Al Stone 69fdad
    Name (PKG1, Package(5) {0,1})
Al Stone 69fdad
Al Stone 69fdad
    // Inadvertent use of single backslash in a string
Al Stone 69fdad
Al Stone 69fdad
    Name (PATH, Buffer() {"\_SB_.PCI2._CRS"})
Al Stone 69fdad
Al Stone 69fdad
    // Invalid hex escape sequence
Al Stone 69fdad
Al Stone 69fdad
    Name (ESC1, "abcdefg\x00hijklmn")
Al Stone 69fdad
Al Stone 69fdad
    // Field access beyond region bounds
Al Stone 69fdad
Al Stone 69fdad
    OperationRegion (OPR1, SystemMemory, 0x2000, 6)
Al Stone 69fdad
    Field (OPR1, DWordAcc, NoLock, Preserve)
Al Stone 69fdad
    {
Al Stone 69fdad
        Offset (4),
Al Stone 69fdad
        FLD1, 8
Al Stone 69fdad
    }
Al Stone 69fdad
Al Stone 69fdad
    // Some address spaces support only ByteAcc or BufferAcc
Al Stone 69fdad
Al Stone 69fdad
    OperationRegion (OPR2, EmbeddedControl, 0x4000, 8)
Al Stone 69fdad
    Field (OPR2, DWordAcc, NoLock, Preserve)
Al Stone 69fdad
    {
Al Stone 69fdad
        FLD2, 8
Al Stone 69fdad
    }
Al Stone 69fdad
    OperationRegion (OPR3, SMBus, 0x8000, 16)
Al Stone 69fdad
    Field (OPR3, WordAcc, NoLock, Preserve)
Al Stone 69fdad
    {
Al Stone 69fdad
        FLD3, 8
Al Stone 69fdad
    }
Al Stone 69fdad
Al Stone 69fdad
    // Invalid SyncLevel in method declaration
Al Stone 69fdad
Al Stone 69fdad
    Method (MTH1, 0, NotSerialized, 32)
Al Stone 69fdad
    {
Al Stone 69fdad
        // Invalid arguments and uninitialized locals
Al Stone 69fdad
Al Stone 69fdad
        Store (Arg3, Local0)
Al Stone 69fdad
        Store (Local1, Local2)
Al Stone 69fdad
Al Stone 69fdad
        // Parameter typechecking (MTX1 is invalid type)
Al Stone 69fdad
Al Stone 69fdad
        Subtract (MTX1, 4, Local3)
Al Stone 69fdad
Al Stone 69fdad
        // Various invalid parameters
Al Stone 69fdad
Al Stone 69fdad
        CreateField (BUF1, 0, Subtract (4, 4), FLD1)
Al Stone 69fdad
Al Stone 69fdad
        // Unchecked mutex and event timeouts
Al Stone 69fdad
Al Stone 69fdad
        Acquire (MTX1, 100)
Al Stone 69fdad
        Wait (EVT1, 1)
Al Stone 69fdad
Al Stone 69fdad
        // Result from operation is not used - statement has no effect
Al Stone 69fdad
Al Stone 69fdad
        Add (INT1, 8)
Al Stone 69fdad
Al Stone 69fdad
        // Unreachable code
Al Stone 69fdad
Al Stone 69fdad
        Return (0)
Al Stone 69fdad
        Store (5, INT1)
Al Stone 69fdad
    }
Al Stone 69fdad
Al Stone 69fdad
    Method (MTH2)
Al Stone 69fdad
    {
Al Stone 69fdad
        // Switch with no Case statements
Al Stone 69fdad
Al Stone 69fdad
        Switch (ToInteger (INT1))
Al Stone 69fdad
        {
Al Stone 69fdad
            Default
Al Stone 69fdad
            {
Al Stone 69fdad
            }
Al Stone 69fdad
        }
Al Stone 69fdad
Al Stone 69fdad
        if (LEqual (INT1, 0))
Al Stone 69fdad
        {
Al Stone 69fdad
            Return (INT1)
Al Stone 69fdad
        }
Al Stone 69fdad
Al Stone 69fdad
        // Fallthrough exit path does not return a value
Al Stone 69fdad
    }
Al Stone 69fdad
Al Stone 69fdad
    Method (MTH3)
Al Stone 69fdad
    {
Al Stone 69fdad
        // Method MTH2 above does not always return a value
Al Stone 69fdad
Al Stone 69fdad
        Store (MTH2 (), Local0)
Al Stone 69fdad
    }
Al Stone 69fdad
Al Stone 69fdad
    // Method MTH4 does not explicitly return a value
Al Stone 69fdad
Al Stone 69fdad
    Method (MTH4) {}
Al Stone 69fdad
    Method (MTH5) {Store (MTH4(), Local0)}
Al Stone 69fdad
Al Stone 69fdad
    // Invalid _HID values
Al Stone 69fdad
Al Stone 69fdad
    Device (H1)
Al Stone 69fdad
    {
Al Stone 69fdad
        Name (_HID, "*PNP0C0A")     // Illegal leading asterisk
Al Stone 69fdad
    }
Al Stone 69fdad
    Device (H2)
Al Stone 69fdad
    {
Al Stone 69fdad
        Name (_HID, "PNP")          // Too short, must be 7 or 8 chars
Al Stone 69fdad
    }
Al Stone 69fdad
    Device (H3)
Al Stone 69fdad
    {
Al Stone 69fdad
        Name (_HID, "MYDEVICE01")   // Too long, must be 7 or 8 chars
Al Stone 69fdad
    }
Al Stone 69fdad
    Device (H4)
Al Stone 69fdad
    {
Al Stone 69fdad
        Name (_HID, "acpi0001")     // non-hex chars must be uppercase
Al Stone 69fdad
    }
Al Stone 69fdad
    Device (H5)
Al Stone 69fdad
    {
Al Stone 69fdad
        Name (_HID, "PNP-123")      // HID must be alphanumeric
Al Stone 69fdad
    }
Al Stone 69fdad
    Device (H6)
Al Stone 69fdad
    {
Al Stone 69fdad
        Name (_HID, "")             // Illegal Null HID
Al Stone 69fdad
        Name (_CID, "")             // Illegal Null CID
Al Stone 69fdad
    }
Al Stone 69fdad
Al Stone 69fdad
    // Predefined Name typechecking
Al Stone 69fdad
Al Stone 69fdad
    Name (_PRW, 4)
Al Stone 69fdad
    Name (_FDI, Buffer () {0})
Al Stone 69fdad
Al Stone 69fdad
    // Predefined Name argument count validation
Al Stone 69fdad
    // and return value validation
Al Stone 69fdad
Al Stone 69fdad
    Method (_OSC, 5)
Al Stone 69fdad
    {
Al Stone 69fdad
    }
Al Stone 69fdad
Al Stone 69fdad
    // Predefined Names that must be implemented as control methods
Al Stone 69fdad
Al Stone 69fdad
    Name (_L01, 1)
Al Stone 69fdad
    Name (_E02, 2)
Al Stone 69fdad
    Name (_Q03, 3)
Al Stone 69fdad
    Name (_ON,  0)
Al Stone 69fdad
    Name (_INI, 1)
Al Stone 69fdad
    Name (_PTP, 2)
Al Stone 69fdad
Al Stone 69fdad
    // GPE methods that cause type collision (L vs. E)
Al Stone 69fdad
Al Stone 69fdad
    Scope (\_GPE)
Al Stone 69fdad
    {
Al Stone 69fdad
        Method (_L1D)
Al Stone 69fdad
        {
Al Stone 69fdad
        }
Al Stone 69fdad
        Method (_E1D)
Al Stone 69fdad
        {
Al Stone 69fdad
        }
Al Stone 69fdad
    }
Al Stone 69fdad
Al Stone 69fdad
    // Predefined names that should not have a return value
Al Stone 69fdad
Al Stone 69fdad
    Method (_FDM, 1)
Al Stone 69fdad
    {
Al Stone 69fdad
        Return (Buffer(1){0x33})
Al Stone 69fdad
    }
Al Stone 69fdad
    Method (_Q22)
Al Stone 69fdad
    {
Al Stone 69fdad
        Return ("Unexpected Return Value")
Al Stone 69fdad
    }
Al Stone 69fdad
Al Stone 69fdad
    // _REG must have a corresponding Operation Region declaration
Al Stone 69fdad
    // within the same scope
Al Stone 69fdad
Al Stone 69fdad
    Device (EC)
Al Stone 69fdad
    {
Al Stone 69fdad
        Method (_REG, 2)
Al Stone 69fdad
        {
Al Stone 69fdad
        }
Al Stone 69fdad
    }
Al Stone 69fdad
Al Stone 69fdad
    /*
Al Stone 69fdad
     * Resource Descriptor error checking
Al Stone 69fdad
     */
Al Stone 69fdad
    Name (RSC1, ResourceTemplate ()
Al Stone 69fdad
    {
Al Stone 69fdad
        // Illegal nested StartDependent macros
Al Stone 69fdad
Al Stone 69fdad
        StartDependentFn (0, 0)
Al Stone 69fdad
        {
Al Stone 69fdad
            StartDependentFn (0, 0)
Al Stone 69fdad
            {
Al Stone 69fdad
            }
Al Stone 69fdad
        }
Al Stone 69fdad
Al Stone 69fdad
        // Missing EndDependentFn macro
Al Stone 69fdad
    })
Al Stone 69fdad
Al Stone 69fdad
    Name (RSC2, ResourceTemplate ()
Al Stone 69fdad
    {
Al Stone 69fdad
        // AddressMin is larger than AddressMax
Al Stone 69fdad
        IO (Decode16,
Al Stone 69fdad
            0x07D0,             // Range Minimum
Al Stone 69fdad
            0x03E8,             // Range Maximum
Al Stone 69fdad
            0x01,               // Alignment
Al Stone 69fdad
            0x20,               // Length
Al Stone 69fdad
            )
Al Stone 69fdad
Al Stone 69fdad
        // Length larger than Min/Max window size
Al Stone 69fdad
        Memory32 (ReadOnly,
Al Stone 69fdad
            0x00001000,         // Range Minimum
Al Stone 69fdad
            0x00002000,         // Range Maximum
Al Stone 69fdad
            0x00000004,         // Alignment
Al Stone 69fdad
            0x00002000,         // Length
Al Stone 69fdad
            )
Al Stone 69fdad
Al Stone 69fdad
        // Min and Max not multiples of alignment value
Al Stone 69fdad
        Memory32 (ReadOnly,
Al Stone 69fdad
            0x00001001,         // Range Minimum
Al Stone 69fdad
            0x00002002,         // Range Maximum
Al Stone 69fdad
            0x00000004,         // Alignment
Al Stone 69fdad
            0x00000200,         // Length
Al Stone 69fdad
            )
Al Stone 69fdad
Al Stone 69fdad
        // 10-bit ISA I/O address has a max of 0x3FF
Al Stone 69fdad
        FixedIO (
Al Stone 69fdad
            0xFFFF,             // Address
Al Stone 69fdad
            0x20,               // Length
Al Stone 69fdad
            )
Al Stone 69fdad
Al Stone 69fdad
        // Invalid AccessSize parameter
Al Stone 69fdad
        Register (SystemIO,
Al Stone 69fdad
            0x08,               // Bit Width
Al Stone 69fdad
            0x00,               // Bit Offset
Al Stone 69fdad
            0x0000000000000100, // Address
Al Stone 69fdad
            0x05                // Access Size
Al Stone 69fdad
            )
Al Stone 69fdad
Al Stone 69fdad
        // Invalid ResourceType (0xB0)
Al Stone 69fdad
        QWordSpace (0xB0, ResourceConsumer, PosDecode, MinFixed, MaxFixed, 0xA5,
Al Stone 69fdad
            0x0000,             // Granularity
Al Stone 69fdad
            0xA000,             // Range Minimum
Al Stone 69fdad
            0xBFFF,             // Range Maximum
Al Stone 69fdad
            0x0000,             // Translation Offset
Al Stone 69fdad
            0x2000,             // Length
Al Stone 69fdad
            ,, )
Al Stone 69fdad
Al Stone 69fdad
        // AddressMin is larger than AddressMax
Al Stone 69fdad
        WordIO (ResourceProducer, MinFixed, MaxFixed, PosDecode, EntireRange,
Al Stone 69fdad
            0x0000,             // Granularity
Al Stone 69fdad
            0x0200,             // Range Minimum
Al Stone 69fdad
            0x0100,             // Range Maximum
Al Stone 69fdad
            0x0000,             // Translation Offset
Al Stone 69fdad
            0x0100,             // Length
Al Stone 69fdad
            ,, , TypeStatic)
Al Stone 69fdad
Al Stone 69fdad
        // Length larger than Min/Max window size
Al Stone 69fdad
        DWordSpace (0xC3, ResourceConsumer, PosDecode, MinFixed, MaxFixed, 0xA5,
Al Stone 69fdad
            0x00000000,         // Granularity
Al Stone 69fdad
            0x000C8000,         // Range Minimum
Al Stone 69fdad
            0x000C9000,         // Range Maximum
Al Stone 69fdad
            0x00000000,         // Translation Offset
Al Stone 69fdad
            0x00001002,         // Length
Al Stone 69fdad
            ,, )
Al Stone 69fdad
Al Stone 69fdad
        // Granularity must be (power-of-two -1)
Al Stone 69fdad
        DWordMemory (ResourceProducer, PosDecode, MinFixed, MaxNotFixed, NonCacheable, ReadWrite,
Al Stone 69fdad
            0x00000010,
Al Stone 69fdad
            0x40000000,
Al Stone 69fdad
            0xFED9FFFF,
Al Stone 69fdad
            0x00000000,
Al Stone 69fdad
            0xBECA0000)
Al Stone 69fdad
Al Stone 69fdad
        // Address Min (with zero length) not on granularity boundary
Al Stone 69fdad
        QWordIO (ResourceProducer, MinFixed, MaxNotFixed, PosDecode, EntireRange,
Al Stone 69fdad
            0x0000000000000003, // Granularity
Al Stone 69fdad
            0x0000000000000B02, // Range Minimum
Al Stone 69fdad
            0x0000000000000C00, // Range Maximum
Al Stone 69fdad
            0x0000000000000000, // Translation Offset
Al Stone 69fdad
            0x0000000000000000, // Length
Al Stone 69fdad
            ,, , TypeStatic)
Al Stone 69fdad
Al Stone 69fdad
        // Address Max (with zero length) not on (granularity boundary -1)
Al Stone 69fdad
        QWordMemory (ResourceProducer, PosDecode, MinNotFixed, MaxFixed, Cacheable, ReadWrite,
Al Stone 69fdad
            0x0000000000000001, // Granularity
Al Stone 69fdad
            0x0000000000100000, // Range Minimum
Al Stone 69fdad
            0x00000000002FFFFE, // Range Maximum
Al Stone 69fdad
            0x0000000000000000, // Translation Offset
Al Stone 69fdad
            0x0000000000000000, // Length
Al Stone 69fdad
            ,, , AddressRangeMemory, TypeStatic)
Al Stone 69fdad
Al Stone 69fdad
        // Invalid combination: zero length, both Min and Max are fixed
Al Stone 69fdad
        DWordIO (ResourceProducer, MinFixed, MaxFixed, PosDecode, EntireRange,
Al Stone 69fdad
            0x00000000,         // Granularity
Al Stone 69fdad
            0x000C8000,         // Range Minimum
Al Stone 69fdad
            0x000C8FFF,         // Range Maximum
Al Stone 69fdad
            0x00000000,         // Translation Offset
Al Stone 69fdad
            0x00000000,         // Length
Al Stone 69fdad
            ,, )
Al Stone 69fdad
Al Stone 69fdad
        // Invalid combination: non-zero length, Min Fixed, Max not fixed
Al Stone 69fdad
        DWordIO (ResourceProducer, MinFixed, MaxNotFixed, PosDecode, EntireRange,
Al Stone 69fdad
            0x00000001,         // Granularity
Al Stone 69fdad
            0x000C8000,         // Range Minimum
Al Stone 69fdad
            0x000C8FFF,         // Range Maximum
Al Stone 69fdad
            0x00000000,         // Translation Offset
Al Stone 69fdad
            0x00000100,         // Length
Al Stone 69fdad
            ,, )
Al Stone 69fdad
Al Stone 69fdad
        // Invalid combination: non-zero length, Min not Fixed, Max fixed
Al Stone 69fdad
        DWordIO (ResourceProducer, MinNotFixed, MaxFixed, PosDecode, EntireRange,
Al Stone 69fdad
            0x00000001,         // Granularity
Al Stone 69fdad
            0x000C8000,         // Range Minimum
Al Stone 69fdad
            0x000C8FFF,         // Range Maximum
Al Stone 69fdad
            0x00000000,         // Translation Offset
Al Stone 69fdad
            0x00000200,         // Length
Al Stone 69fdad
            ,, )
Al Stone 69fdad
Al Stone 69fdad
        // Granularity must be zero if non-zero length, min/max fixed
Al Stone 69fdad
        DWordIO (ResourceProducer, MinFixed, MaxFixed, PosDecode, EntireRange,
Al Stone 69fdad
            0x0000000F,         // Granularity
Al Stone 69fdad
            0x000C8000,         // Range Minimum
Al Stone 69fdad
            0x000C8FFF,         // Range Maximum
Al Stone 69fdad
            0x00000000,         // Translation Offset
Al Stone 69fdad
            0x00001000,         // Length
Al Stone 69fdad
            ,, )
Al Stone 69fdad
Al Stone 69fdad
        // Null descriptor (intended to be modified at runtime) must
Al Stone 69fdad
        // have a resource tag (to allow it to be modified at runtime)
Al Stone 69fdad
        DWordIO (ResourceProducer, MinFixed, MaxFixed, PosDecode, EntireRange,
Al Stone 69fdad
            0x00000000,         // Granularity
Al Stone 69fdad
            0x00000000,         // Range Minimum
Al Stone 69fdad
            0x00000000,         // Range Maximum
Al Stone 69fdad
            0x00000000,         // Translation Offset
Al Stone 69fdad
            0x00000000,         // Length
Al Stone 69fdad
            ,, )
Al Stone 69fdad
Al Stone 69fdad
        // Missing StartDependentFn macro
Al Stone 69fdad
Al Stone 69fdad
        EndDependentFn ()
Al Stone 69fdad
    })
Al Stone 69fdad
Al Stone 69fdad
    // Test descriptor for CreateXxxxField operators in REM1 below
Al Stone 69fdad
Al Stone 69fdad
    Name (RSC3, ResourceTemplate ()
Al Stone 69fdad
    {
Al Stone 69fdad
        DWordIO (ResourceProducer, MinFixed, MaxFixed, PosDecode, EntireRange,
Al Stone 69fdad
            0x00000000,         // Granularity
Al Stone 69fdad
            0x000C8000,         // Range Minimum
Al Stone 69fdad
            0x000C8FFF,         // Range Maximum
Al Stone 69fdad
            0x00000000,         // Translation Offset
Al Stone 69fdad
            0x00001000,         // Length
Al Stone 69fdad
            ,, DWI1)
Al Stone 69fdad
    })
Al Stone 69fdad
Al Stone 69fdad
    Method (REM1)
Al Stone 69fdad
    {
Al Stone 69fdad
        // Tagged resource field larger than field being created
Al Stone 69fdad
Al Stone 69fdad
        CreateWordField (RSC3, \DWI1._LEN, LEN)
Al Stone 69fdad
        CreateByteField (RSC3, \DWI1._MIN, MIN)
Al Stone 69fdad
        CreateBitField (RSC3, \DWI1._RNG, RNG1)
Al Stone 69fdad
Al Stone 69fdad
        // Tagged resource field smaller than field being created
Al Stone 69fdad
Al Stone 69fdad
        CreateQWordField (RSC3, \DWI1._MAX, MAX)
Al Stone 69fdad
        CreateBitField (RSC3, \DWI1._GRA, GRA)
Al Stone 69fdad
        CreateField (RSC3, \DWI1._MIF, 5, MIF)
Al Stone 69fdad
        CreateField (RSC3, \DWI1._RNG, 3, RNG2)
Al Stone 69fdad
    }
Al Stone 69fdad
Al Stone 69fdad
    Method (L100)
Al Stone 69fdad
    {
Al Stone 69fdad
        /* Method Local is set but never used */
Al Stone 69fdad
Al Stone 69fdad
        Store (40, Local0)
Al Stone 69fdad
    }
Al Stone 69fdad
}