xref: /netbsd-src/sys/external/bsd/acpica/dist/tests/misc/badcode.asl (revision 32aedd46ba9b89d4255d55ab94ed85be9105337f)
128c506b8Sjruoho/*
228c506b8Sjruoho * badcode.asl
328c506b8Sjruoho *
428c506b8Sjruoho * This file contains examples of the extended error checking and
528c506b8Sjruoho * typechecking capabilities of the iASL compiler. Other ASL compilers
628c506b8Sjruoho * may ignore these errors completely. Note - this is not an exhaustive
728c506b8Sjruoho * list of errors detected by iASL, it shows many of the errors that
828c506b8Sjruoho * are not detected by other ASL compilers.
928c506b8Sjruoho *
1028c506b8Sjruoho * To compile, use:
1128c506b8Sjruoho * iasl badcode.asl
12ff4a156dSchristos *
13ff4a156dSchristos * Output:
14*32aedd46Schristos * Compilation complete. 45 Errors, 28 Warnings, 11 Remarks, 14 Optimizations
15ff4a156dSchristos *
1628c506b8Sjruoho */
1728c506b8SjruohoDefinitionBlock ("badcode.aml", "DSDT", 1, "Intel", "Example", 0x00000001)
1828c506b8Sjruoho{
1928c506b8Sjruoho    Name (INT1, 0)
2028c506b8Sjruoho    Name (BUF1, Buffer() {0,1,2,3})
2128c506b8Sjruoho    Event (EVT1)
2228c506b8Sjruoho
2328c506b8Sjruoho    // Invalid SyncLevel in Mutex declaration
2428c506b8Sjruoho
2528c506b8Sjruoho    Mutex (MTX1, 32)
2628c506b8Sjruoho
2728c506b8Sjruoho    // Integer beyond the table integer size (32 bits)
2828c506b8Sjruoho
2928c506b8Sjruoho    Name (BIG, 0x1234567887654321)
3028c506b8Sjruoho
3128c506b8Sjruoho    // CPackage length does not match initializer list length
3228c506b8Sjruoho
3328c506b8Sjruoho    Name (PKG1, Package(5) {0,1})
3428c506b8Sjruoho
3528c506b8Sjruoho    // Inadvertent use of single backslash in a string
3628c506b8Sjruoho
3728c506b8Sjruoho    Name (PATH, Buffer() {"\_SB_.PCI2._CRS"})
3828c506b8Sjruoho
3928c506b8Sjruoho    // Invalid hex escape sequence
4028c506b8Sjruoho
4128c506b8Sjruoho    Name (ESC1, "abcdefg\x00hijklmn")
4228c506b8Sjruoho
4328c506b8Sjruoho    // Field access beyond region bounds
4428c506b8Sjruoho
4528c506b8Sjruoho    OperationRegion (OPR1, SystemMemory, 0x2000, 6)
4628c506b8Sjruoho    Field (OPR1, DWordAcc, NoLock, Preserve)
4728c506b8Sjruoho    {
4828c506b8Sjruoho        Offset (4),
4928c506b8Sjruoho        FLD1, 8
5028c506b8Sjruoho    }
5128c506b8Sjruoho
5228c506b8Sjruoho    // Some address spaces support only ByteAcc or BufferAcc
5328c506b8Sjruoho
5428c506b8Sjruoho    OperationRegion (OPR2, EmbeddedControl, 0x4000, 8)
5528c506b8Sjruoho    Field (OPR2, DWordAcc, NoLock, Preserve)
5628c506b8Sjruoho    {
5728c506b8Sjruoho        FLD2, 8
5828c506b8Sjruoho    }
5928c506b8Sjruoho    OperationRegion (OPR3, SMBus, 0x8000, 16)
6028c506b8Sjruoho    Field (OPR3, WordAcc, NoLock, Preserve)
6128c506b8Sjruoho    {
6228c506b8Sjruoho        FLD3, 8
6328c506b8Sjruoho    }
6428c506b8Sjruoho
6528c506b8Sjruoho    // Invalid SyncLevel in method declaration
6628c506b8Sjruoho
6728c506b8Sjruoho    Method (MTH1, 0, NotSerialized, 32)
6828c506b8Sjruoho    {
6928c506b8Sjruoho        // Invalid arguments and uninitialized locals
7028c506b8Sjruoho
7128c506b8Sjruoho        Store (Arg3, Local0)
7228c506b8Sjruoho        Store (Local1, Local2)
7328c506b8Sjruoho
7428c506b8Sjruoho        // Parameter typechecking (MTX1 is invalid type)
7528c506b8Sjruoho
7628c506b8Sjruoho        Subtract (MTX1, 4, Local3)
7728c506b8Sjruoho
7828c506b8Sjruoho        // Various invalid parameters
7928c506b8Sjruoho
8028c506b8Sjruoho        CreateField (BUF1, 0, Subtract (4, 4), FLD1)
8128c506b8Sjruoho
8228c506b8Sjruoho        // Unchecked mutex and event timeouts
8328c506b8Sjruoho
8428c506b8Sjruoho        Acquire (MTX1, 100)
8528c506b8Sjruoho        Wait (EVT1, 1)
8628c506b8Sjruoho
8728c506b8Sjruoho        // Result from operation is not used - statement has no effect
8828c506b8Sjruoho
8928c506b8Sjruoho        Add (INT1, 8)
9028c506b8Sjruoho
9128c506b8Sjruoho        // Unreachable code
9228c506b8Sjruoho
9328c506b8Sjruoho        Return (0)
9428c506b8Sjruoho        Store (5, INT1)
9528c506b8Sjruoho    }
9628c506b8Sjruoho
9728c506b8Sjruoho    Method (MTH2)
9828c506b8Sjruoho    {
9928c506b8Sjruoho        // Switch with no Case statements
10028c506b8Sjruoho
10128c506b8Sjruoho        Switch (ToInteger (INT1))
10228c506b8Sjruoho        {
10328c506b8Sjruoho            Default
10428c506b8Sjruoho            {
10528c506b8Sjruoho            }
10628c506b8Sjruoho        }
10728c506b8Sjruoho
10828c506b8Sjruoho        if (LEqual (INT1, 0))
10928c506b8Sjruoho        {
11028c506b8Sjruoho            Return (INT1)
11128c506b8Sjruoho        }
11228c506b8Sjruoho
11328c506b8Sjruoho        // Fallthrough exit path does not return a value
11428c506b8Sjruoho    }
11528c506b8Sjruoho
11628c506b8Sjruoho    Method (MTH3)
11728c506b8Sjruoho    {
11828c506b8Sjruoho        // Method MTH2 above does not always return a value
11928c506b8Sjruoho
12028c506b8Sjruoho        Store (MTH2 (), Local0)
12128c506b8Sjruoho    }
12228c506b8Sjruoho
123a8e4c046Sjruoho    // Method MTH4 does not explicitly return a value
124a8e4c046Sjruoho
125ff4a156dSchristos    Method (MTH4) {}
126a8e4c046Sjruoho    Method (MTH5) {Store (MTH4(), Local0)}
127a8e4c046Sjruoho
128124f4c82Sjruoho    // Invalid _HID values
12928c506b8Sjruoho
130124f4c82Sjruoho    Device (H1)
131124f4c82Sjruoho    {
132124f4c82Sjruoho        Name (_HID, "*PNP0C0A")     // Illegal leading asterisk
133124f4c82Sjruoho    }
134124f4c82Sjruoho    Device (H2)
135124f4c82Sjruoho    {
136124f4c82Sjruoho        Name (_HID, "PNP")          // Too short, must be 7 or 8 chars
137124f4c82Sjruoho    }
138124f4c82Sjruoho    Device (H3)
139124f4c82Sjruoho    {
140124f4c82Sjruoho        Name (_HID, "MYDEVICE01")   // Too long, must be 7 or 8 chars
141124f4c82Sjruoho    }
142124f4c82Sjruoho    Device (H4)
143124f4c82Sjruoho    {
144124f4c82Sjruoho        Name (_HID, "acpi0001")     // non-hex chars must be uppercase
145124f4c82Sjruoho    }
146124f4c82Sjruoho    Device (H5)
147124f4c82Sjruoho    {
148124f4c82Sjruoho        Name (_HID, "PNP-123")      // HID must be alphanumeric
149124f4c82Sjruoho    }
150124f4c82Sjruoho    Device (H6)
151124f4c82Sjruoho    {
152124f4c82Sjruoho        Name (_HID, "")             // Illegal Null HID
153124f4c82Sjruoho        Name (_CID, "")             // Illegal Null CID
154124f4c82Sjruoho    }
15528c506b8Sjruoho
15628c506b8Sjruoho    // Predefined Name typechecking
15728c506b8Sjruoho
15828c506b8Sjruoho    Name (_PRW, 4)
15928c506b8Sjruoho    Name (_FDI, Buffer () {0})
16028c506b8Sjruoho
16128c506b8Sjruoho    // Predefined Name argument count validation
16228c506b8Sjruoho    // and return value validation
16328c506b8Sjruoho
16428c506b8Sjruoho    Method (_OSC, 5)
16528c506b8Sjruoho    {
16628c506b8Sjruoho    }
16728c506b8Sjruoho
16828c506b8Sjruoho    // Predefined Names that must be implemented as control methods
16928c506b8Sjruoho
17028c506b8Sjruoho    Name (_L01, 1)
17128c506b8Sjruoho    Name (_E02, 2)
17228c506b8Sjruoho    Name (_Q03, 3)
17328c506b8Sjruoho    Name (_ON,  0)
17428c506b8Sjruoho    Name (_INI, 1)
17528c506b8Sjruoho    Name (_PTP, 2)
17628c506b8Sjruoho
177124f4c82Sjruoho    // GPE methods that cause type collision (L vs. E)
178124f4c82Sjruoho
179124f4c82Sjruoho    Scope (\_GPE)
180124f4c82Sjruoho    {
181124f4c82Sjruoho        Method (_L1D)
182124f4c82Sjruoho        {
183124f4c82Sjruoho        }
184124f4c82Sjruoho        Method (_E1D)
185124f4c82Sjruoho        {
186124f4c82Sjruoho        }
187124f4c82Sjruoho    }
188124f4c82Sjruoho
189124f4c82Sjruoho    // Predefined names that should not have a return value
190124f4c82Sjruoho
191124f4c82Sjruoho    Method (_FDM, 1)
192124f4c82Sjruoho    {
193124f4c82Sjruoho        Return (Buffer(1){0x33})
194124f4c82Sjruoho    }
195124f4c82Sjruoho    Method (_Q22)
196124f4c82Sjruoho    {
197124f4c82Sjruoho        Return ("Unexpected Return Value")
198124f4c82Sjruoho    }
199124f4c82Sjruoho
200a8e4c046Sjruoho    // _REG must have a corresponding Operation Region declaration
201a8e4c046Sjruoho    // within the same scope
202a8e4c046Sjruoho
203a8e4c046Sjruoho    Device (EC)
204a8e4c046Sjruoho    {
205a8e4c046Sjruoho        Method (_REG, 2)
206a8e4c046Sjruoho        {
207a8e4c046Sjruoho        }
208a8e4c046Sjruoho    }
209a8e4c046Sjruoho
21028c506b8Sjruoho    /*
21128c506b8Sjruoho     * Resource Descriptor error checking
21228c506b8Sjruoho     */
21328c506b8Sjruoho    Name (RSC1, ResourceTemplate ()
21428c506b8Sjruoho    {
21528c506b8Sjruoho        // Illegal nested StartDependent macros
21628c506b8Sjruoho
21728c506b8Sjruoho        StartDependentFn (0, 0)
21828c506b8Sjruoho        {
21928c506b8Sjruoho            StartDependentFn (0, 0)
22028c506b8Sjruoho            {
22128c506b8Sjruoho            }
22228c506b8Sjruoho        }
22328c506b8Sjruoho
22428c506b8Sjruoho        // Missing EndDependentFn macro
22528c506b8Sjruoho    })
22628c506b8Sjruoho
22728c506b8Sjruoho    Name (RSC2, ResourceTemplate ()
22828c506b8Sjruoho    {
22928c506b8Sjruoho        // AddressMin is larger than AddressMax
23028c506b8Sjruoho        IO (Decode16,
23128c506b8Sjruoho            0x07D0,             // Range Minimum
23228c506b8Sjruoho            0x03E8,             // Range Maximum
23328c506b8Sjruoho            0x01,               // Alignment
23428c506b8Sjruoho            0x20,               // Length
23528c506b8Sjruoho            )
23628c506b8Sjruoho
23728c506b8Sjruoho        // Length larger than Min/Max window size
23828c506b8Sjruoho        Memory32 (ReadOnly,
23928c506b8Sjruoho            0x00001000,         // Range Minimum
24028c506b8Sjruoho            0x00002000,         // Range Maximum
24128c506b8Sjruoho            0x00000004,         // Alignment
24228c506b8Sjruoho            0x00002000,         // Length
24328c506b8Sjruoho            )
24428c506b8Sjruoho
24528c506b8Sjruoho        // Min and Max not multiples of alignment value
24628c506b8Sjruoho        Memory32 (ReadOnly,
24728c506b8Sjruoho            0x00001001,         // Range Minimum
24828c506b8Sjruoho            0x00002002,         // Range Maximum
24928c506b8Sjruoho            0x00000004,         // Alignment
25028c506b8Sjruoho            0x00000200,         // Length
25128c506b8Sjruoho            )
25228c506b8Sjruoho
25328c506b8Sjruoho        // 10-bit ISA I/O address has a max of 0x3FF
25428c506b8Sjruoho        FixedIO (
25528c506b8Sjruoho            0xFFFF,             // Address
25628c506b8Sjruoho            0x20,               // Length
25728c506b8Sjruoho            )
25828c506b8Sjruoho
25928c506b8Sjruoho        // Invalid AccessSize parameter
26028c506b8Sjruoho        Register (SystemIO,
26128c506b8Sjruoho            0x08,               // Bit Width
26228c506b8Sjruoho            0x00,               // Bit Offset
26328c506b8Sjruoho            0x0000000000000100, // Address
26428c506b8Sjruoho            0x05                // Access Size
26528c506b8Sjruoho            )
26628c506b8Sjruoho
26728c506b8Sjruoho        // Invalid ResourceType (0xB0)
26828c506b8Sjruoho        QWordSpace (0xB0, ResourceConsumer, PosDecode, MinFixed, MaxFixed, 0xA5,
26928c506b8Sjruoho            0x0000,             // Granularity
27028c506b8Sjruoho            0xA000,             // Range Minimum
27128c506b8Sjruoho            0xBFFF,             // Range Maximum
27228c506b8Sjruoho            0x0000,             // Translation Offset
27328c506b8Sjruoho            0x2000,             // Length
27428c506b8Sjruoho            ,, )
27528c506b8Sjruoho
27628c506b8Sjruoho        // AddressMin is larger than AddressMax
27728c506b8Sjruoho        WordIO (ResourceProducer, MinFixed, MaxFixed, PosDecode, EntireRange,
27828c506b8Sjruoho            0x0000,             // Granularity
27928c506b8Sjruoho            0x0200,             // Range Minimum
28028c506b8Sjruoho            0x0100,             // Range Maximum
28128c506b8Sjruoho            0x0000,             // Translation Offset
28228c506b8Sjruoho            0x0100,             // Length
28328c506b8Sjruoho            ,, , TypeStatic)
28428c506b8Sjruoho
28528c506b8Sjruoho        // Length larger than Min/Max window size
28628c506b8Sjruoho        DWordSpace (0xC3, ResourceConsumer, PosDecode, MinFixed, MaxFixed, 0xA5,
28728c506b8Sjruoho            0x00000000,         // Granularity
28828c506b8Sjruoho            0x000C8000,         // Range Minimum
28928c506b8Sjruoho            0x000C9000,         // Range Maximum
29028c506b8Sjruoho            0x00000000,         // Translation Offset
29128c506b8Sjruoho            0x00001002,         // Length
29228c506b8Sjruoho            ,, )
29328c506b8Sjruoho
29428c506b8Sjruoho        // Granularity must be (power-of-two -1)
29528c506b8Sjruoho        DWordMemory (ResourceProducer, PosDecode, MinFixed, MaxNotFixed, NonCacheable, ReadWrite,
29628c506b8Sjruoho            0x00000010,
29728c506b8Sjruoho            0x40000000,
29828c506b8Sjruoho            0xFED9FFFF,
29928c506b8Sjruoho            0x00000000,
30028c506b8Sjruoho            0xBECA0000)
30128c506b8Sjruoho
30228c506b8Sjruoho        // Address Min (with zero length) not on granularity boundary
30328c506b8Sjruoho        QWordIO (ResourceProducer, MinFixed, MaxNotFixed, PosDecode, EntireRange,
30428c506b8Sjruoho            0x0000000000000003, // Granularity
30528c506b8Sjruoho            0x0000000000000B02, // Range Minimum
30628c506b8Sjruoho            0x0000000000000C00, // Range Maximum
30728c506b8Sjruoho            0x0000000000000000, // Translation Offset
30828c506b8Sjruoho            0x0000000000000000, // Length
30928c506b8Sjruoho            ,, , TypeStatic)
31028c506b8Sjruoho
31128c506b8Sjruoho        // Address Max (with zero length) not on (granularity boundary -1)
31228c506b8Sjruoho        QWordMemory (ResourceProducer, PosDecode, MinNotFixed, MaxFixed, Cacheable, ReadWrite,
31328c506b8Sjruoho            0x0000000000000001, // Granularity
31428c506b8Sjruoho            0x0000000000100000, // Range Minimum
31528c506b8Sjruoho            0x00000000002FFFFE, // Range Maximum
31628c506b8Sjruoho            0x0000000000000000, // Translation Offset
31728c506b8Sjruoho            0x0000000000000000, // Length
31828c506b8Sjruoho            ,, , AddressRangeMemory, TypeStatic)
31928c506b8Sjruoho
32028c506b8Sjruoho        // Invalid combination: zero length, both Min and Max are fixed
32128c506b8Sjruoho        DWordIO (ResourceProducer, MinFixed, MaxFixed, PosDecode, EntireRange,
32228c506b8Sjruoho            0x00000000,         // Granularity
32328c506b8Sjruoho            0x000C8000,         // Range Minimum
32428c506b8Sjruoho            0x000C8FFF,         // Range Maximum
32528c506b8Sjruoho            0x00000000,         // Translation Offset
32628c506b8Sjruoho            0x00000000,         // Length
32728c506b8Sjruoho            ,, )
32828c506b8Sjruoho
32928c506b8Sjruoho        // Invalid combination: non-zero length, Min Fixed, Max not fixed
33028c506b8Sjruoho        DWordIO (ResourceProducer, MinFixed, MaxNotFixed, PosDecode, EntireRange,
33128c506b8Sjruoho            0x00000001,         // Granularity
33228c506b8Sjruoho            0x000C8000,         // Range Minimum
33328c506b8Sjruoho            0x000C8FFF,         // Range Maximum
33428c506b8Sjruoho            0x00000000,         // Translation Offset
33528c506b8Sjruoho            0x00000100,         // Length
33628c506b8Sjruoho            ,, )
33728c506b8Sjruoho
33828c506b8Sjruoho        // Invalid combination: non-zero length, Min not Fixed, Max fixed
33928c506b8Sjruoho        DWordIO (ResourceProducer, MinNotFixed, MaxFixed, PosDecode, EntireRange,
34028c506b8Sjruoho            0x00000001,         // Granularity
34128c506b8Sjruoho            0x000C8000,         // Range Minimum
34228c506b8Sjruoho            0x000C8FFF,         // Range Maximum
34328c506b8Sjruoho            0x00000000,         // Translation Offset
34428c506b8Sjruoho            0x00000200,         // Length
34528c506b8Sjruoho            ,, )
34628c506b8Sjruoho
34728c506b8Sjruoho        // Granularity must be zero if non-zero length, min/max fixed
34828c506b8Sjruoho        DWordIO (ResourceProducer, MinFixed, MaxFixed, PosDecode, EntireRange,
34928c506b8Sjruoho            0x0000000F,         // Granularity
35028c506b8Sjruoho            0x000C8000,         // Range Minimum
35128c506b8Sjruoho            0x000C8FFF,         // Range Maximum
35228c506b8Sjruoho            0x00000000,         // Translation Offset
35328c506b8Sjruoho            0x00001000,         // Length
35428c506b8Sjruoho            ,, )
35528c506b8Sjruoho
356124f4c82Sjruoho        // Null descriptor (intended to be modified at runtime) must
357124f4c82Sjruoho        // have a resource tag (to allow it to be modified at runtime)
358124f4c82Sjruoho        DWordIO (ResourceProducer, MinFixed, MaxFixed, PosDecode, EntireRange,
359124f4c82Sjruoho            0x00000000,         // Granularity
360124f4c82Sjruoho            0x00000000,         // Range Minimum
361124f4c82Sjruoho            0x00000000,         // Range Maximum
362124f4c82Sjruoho            0x00000000,         // Translation Offset
363124f4c82Sjruoho            0x00000000,         // Length
364124f4c82Sjruoho            ,, )
365124f4c82Sjruoho
36628c506b8Sjruoho        // Missing StartDependentFn macro
36728c506b8Sjruoho
36828c506b8Sjruoho        EndDependentFn ()
36928c506b8Sjruoho    })
370ff4a156dSchristos
371ff4a156dSchristos    // Test descriptor for CreateXxxxField operators in REM1 below
372ff4a156dSchristos
373ff4a156dSchristos    Name (RSC3, ResourceTemplate ()
374ff4a156dSchristos    {
375ff4a156dSchristos        DWordIO (ResourceProducer, MinFixed, MaxFixed, PosDecode, EntireRange,
376ff4a156dSchristos            0x00000000,         // Granularity
377ff4a156dSchristos            0x000C8000,         // Range Minimum
378ff4a156dSchristos            0x000C8FFF,         // Range Maximum
379ff4a156dSchristos            0x00000000,         // Translation Offset
380ff4a156dSchristos            0x00001000,         // Length
381ff4a156dSchristos            ,, DWI1)
382ff4a156dSchristos    })
383ff4a156dSchristos
384ff4a156dSchristos    Method (REM1)
385ff4a156dSchristos    {
386ff4a156dSchristos        // Tagged resource field larger than field being created
387ff4a156dSchristos
388ff4a156dSchristos        CreateWordField (RSC3, \DWI1._LEN, LEN)
389ff4a156dSchristos        CreateByteField (RSC3, \DWI1._MIN, MIN)
390ff4a156dSchristos        CreateBitField (RSC3, \DWI1._RNG, RNG1)
391ff4a156dSchristos
392ff4a156dSchristos        // Tagged resource field smaller than field being created
393ff4a156dSchristos
394ff4a156dSchristos        CreateQWordField (RSC3, \DWI1._MAX, MAX)
395ff4a156dSchristos        CreateBitField (RSC3, \DWI1._GRA, GRA)
396ff4a156dSchristos        CreateField (RSC3, \DWI1._MIF, 5, MIF)
397ff4a156dSchristos        CreateField (RSC3, \DWI1._RNG, 3, RNG2)
398ff4a156dSchristos    }
399c72da027Schristos
400c72da027Schristos    Method (L100)
401c72da027Schristos    {
402c72da027Schristos        /* Method Local is set but never used */
403c72da027Schristos
404c72da027Schristos        Store (40, Local0)
405c72da027Schristos    }
40628c506b8Sjruoho}
407