10d02842fSSascha Wildner/* 20d02842fSSascha Wildner * badcode.asl 30d02842fSSascha Wildner * 40d02842fSSascha Wildner * This file contains examples of the extended error checking and 50d02842fSSascha Wildner * typechecking capabilities of the iASL compiler. Other ASL compilers 60d02842fSSascha Wildner * may ignore these errors completely. Note - this is not an exhaustive 70d02842fSSascha Wildner * list of errors detected by iASL, it shows many of the errors that 80d02842fSSascha Wildner * are not detected by other ASL compilers. 90d02842fSSascha Wildner * 100d02842fSSascha Wildner * To compile, use: 110d02842fSSascha Wildner * iasl badcode.asl 120d02842fSSascha Wildner * 130d02842fSSascha Wildner * Output: 14*e5412f1eSSascha Wildner * Compilation complete. 45 Errors, 28 Warnings, 11 Remarks, 14 Optimizations 150d02842fSSascha Wildner * 160d02842fSSascha Wildner */ 170d02842fSSascha WildnerDefinitionBlock ("badcode.aml", "DSDT", 1, "Intel", "Example", 0x00000001) 180d02842fSSascha Wildner{ 190d02842fSSascha Wildner Name (INT1, 0) 200d02842fSSascha Wildner Name (BUF1, Buffer() {0,1,2,3}) 210d02842fSSascha Wildner Event (EVT1) 220d02842fSSascha Wildner 230d02842fSSascha Wildner // Invalid SyncLevel in Mutex declaration 240d02842fSSascha Wildner 250d02842fSSascha Wildner Mutex (MTX1, 32) 260d02842fSSascha Wildner 270d02842fSSascha Wildner // Integer beyond the table integer size (32 bits) 280d02842fSSascha Wildner 290d02842fSSascha Wildner Name (BIG, 0x1234567887654321) 300d02842fSSascha Wildner 310d02842fSSascha Wildner // CPackage length does not match initializer list length 320d02842fSSascha Wildner 330d02842fSSascha Wildner Name (PKG1, Package(5) {0,1}) 340d02842fSSascha Wildner 350d02842fSSascha Wildner // Inadvertent use of single backslash in a string 360d02842fSSascha Wildner 370d02842fSSascha Wildner Name (PATH, Buffer() {"\_SB_.PCI2._CRS"}) 380d02842fSSascha Wildner 390d02842fSSascha Wildner // Invalid hex escape sequence 400d02842fSSascha Wildner 410d02842fSSascha Wildner Name (ESC1, "abcdefg\x00hijklmn") 420d02842fSSascha Wildner 430d02842fSSascha Wildner // Field access beyond region bounds 440d02842fSSascha Wildner 450d02842fSSascha Wildner OperationRegion (OPR1, SystemMemory, 0x2000, 6) 460d02842fSSascha Wildner Field (OPR1, DWordAcc, NoLock, Preserve) 470d02842fSSascha Wildner { 480d02842fSSascha Wildner Offset (4), 490d02842fSSascha Wildner FLD1, 8 500d02842fSSascha Wildner } 510d02842fSSascha Wildner 520d02842fSSascha Wildner // Some address spaces support only ByteAcc or BufferAcc 530d02842fSSascha Wildner 540d02842fSSascha Wildner OperationRegion (OPR2, EmbeddedControl, 0x4000, 8) 550d02842fSSascha Wildner Field (OPR2, DWordAcc, NoLock, Preserve) 560d02842fSSascha Wildner { 570d02842fSSascha Wildner FLD2, 8 580d02842fSSascha Wildner } 590d02842fSSascha Wildner OperationRegion (OPR3, SMBus, 0x8000, 16) 600d02842fSSascha Wildner Field (OPR3, WordAcc, NoLock, Preserve) 610d02842fSSascha Wildner { 620d02842fSSascha Wildner FLD3, 8 630d02842fSSascha Wildner } 640d02842fSSascha Wildner 650d02842fSSascha Wildner // Invalid SyncLevel in method declaration 660d02842fSSascha Wildner 670d02842fSSascha Wildner Method (MTH1, 0, NotSerialized, 32) 680d02842fSSascha Wildner { 690d02842fSSascha Wildner // Invalid arguments and uninitialized locals 700d02842fSSascha Wildner 710d02842fSSascha Wildner Store (Arg3, Local0) 720d02842fSSascha Wildner Store (Local1, Local2) 730d02842fSSascha Wildner 740d02842fSSascha Wildner // Parameter typechecking (MTX1 is invalid type) 750d02842fSSascha Wildner 760d02842fSSascha Wildner Subtract (MTX1, 4, Local3) 770d02842fSSascha Wildner 780d02842fSSascha Wildner // Various invalid parameters 790d02842fSSascha Wildner 800d02842fSSascha Wildner CreateField (BUF1, 0, Subtract (4, 4), FLD1) 810d02842fSSascha Wildner 820d02842fSSascha Wildner // Unchecked mutex and event timeouts 830d02842fSSascha Wildner 840d02842fSSascha Wildner Acquire (MTX1, 100) 850d02842fSSascha Wildner Wait (EVT1, 1) 860d02842fSSascha Wildner 870d02842fSSascha Wildner // Result from operation is not used - statement has no effect 880d02842fSSascha Wildner 890d02842fSSascha Wildner Add (INT1, 8) 900d02842fSSascha Wildner 910d02842fSSascha Wildner // Unreachable code 920d02842fSSascha Wildner 930d02842fSSascha Wildner Return (0) 940d02842fSSascha Wildner Store (5, INT1) 950d02842fSSascha Wildner } 960d02842fSSascha Wildner 970d02842fSSascha Wildner Method (MTH2) 980d02842fSSascha Wildner { 990d02842fSSascha Wildner // Switch with no Case statements 1000d02842fSSascha Wildner 1010d02842fSSascha Wildner Switch (ToInteger (INT1)) 1020d02842fSSascha Wildner { 1030d02842fSSascha Wildner Default 1040d02842fSSascha Wildner { 1050d02842fSSascha Wildner } 1060d02842fSSascha Wildner } 1070d02842fSSascha Wildner 1080d02842fSSascha Wildner if (LEqual (INT1, 0)) 1090d02842fSSascha Wildner { 1100d02842fSSascha Wildner Return (INT1) 1110d02842fSSascha Wildner } 1120d02842fSSascha Wildner 1130d02842fSSascha Wildner // Fallthrough exit path does not return a value 1140d02842fSSascha Wildner } 1150d02842fSSascha Wildner 1160d02842fSSascha Wildner Method (MTH3) 1170d02842fSSascha Wildner { 1180d02842fSSascha Wildner // Method MTH2 above does not always return a value 1190d02842fSSascha Wildner 1200d02842fSSascha Wildner Store (MTH2 (), Local0) 1210d02842fSSascha Wildner } 1220d02842fSSascha Wildner 1230d02842fSSascha Wildner // Method MTH4 does not explicitly return a value 1240d02842fSSascha Wildner 1250d02842fSSascha Wildner Method (MTH4) {} 1260d02842fSSascha Wildner Method (MTH5) {Store (MTH4(), Local0)} 1270d02842fSSascha Wildner 1280d02842fSSascha Wildner // Invalid _HID values 1290d02842fSSascha Wildner 1300d02842fSSascha Wildner Device (H1) 1310d02842fSSascha Wildner { 1320d02842fSSascha Wildner Name (_HID, "*PNP0C0A") // Illegal leading asterisk 1330d02842fSSascha Wildner } 1340d02842fSSascha Wildner Device (H2) 1350d02842fSSascha Wildner { 1360d02842fSSascha Wildner Name (_HID, "PNP") // Too short, must be 7 or 8 chars 1370d02842fSSascha Wildner } 1380d02842fSSascha Wildner Device (H3) 1390d02842fSSascha Wildner { 1400d02842fSSascha Wildner Name (_HID, "MYDEVICE01") // Too long, must be 7 or 8 chars 1410d02842fSSascha Wildner } 1420d02842fSSascha Wildner Device (H4) 1430d02842fSSascha Wildner { 1440d02842fSSascha Wildner Name (_HID, "acpi0001") // non-hex chars must be uppercase 1450d02842fSSascha Wildner } 1460d02842fSSascha Wildner Device (H5) 1470d02842fSSascha Wildner { 1480d02842fSSascha Wildner Name (_HID, "PNP-123") // HID must be alphanumeric 1490d02842fSSascha Wildner } 1500d02842fSSascha Wildner Device (H6) 1510d02842fSSascha Wildner { 1520d02842fSSascha Wildner Name (_HID, "") // Illegal Null HID 1530d02842fSSascha Wildner Name (_CID, "") // Illegal Null CID 1540d02842fSSascha Wildner } 1550d02842fSSascha Wildner 1560d02842fSSascha Wildner // Predefined Name typechecking 1570d02842fSSascha Wildner 1580d02842fSSascha Wildner Name (_PRW, 4) 1590d02842fSSascha Wildner Name (_FDI, Buffer () {0}) 1600d02842fSSascha Wildner 1610d02842fSSascha Wildner // Predefined Name argument count validation 1620d02842fSSascha Wildner // and return value validation 1630d02842fSSascha Wildner 1640d02842fSSascha Wildner Method (_OSC, 5) 1650d02842fSSascha Wildner { 1660d02842fSSascha Wildner } 1670d02842fSSascha Wildner 1680d02842fSSascha Wildner // Predefined Names that must be implemented as control methods 1690d02842fSSascha Wildner 1700d02842fSSascha Wildner Name (_L01, 1) 1710d02842fSSascha Wildner Name (_E02, 2) 1720d02842fSSascha Wildner Name (_Q03, 3) 1730d02842fSSascha Wildner Name (_ON, 0) 1740d02842fSSascha Wildner Name (_INI, 1) 1750d02842fSSascha Wildner Name (_PTP, 2) 1760d02842fSSascha Wildner 1770d02842fSSascha Wildner // GPE methods that cause type collision (L vs. E) 1780d02842fSSascha Wildner 1790d02842fSSascha Wildner Scope (\_GPE) 1800d02842fSSascha Wildner { 1810d02842fSSascha Wildner Method (_L1D) 1820d02842fSSascha Wildner { 1830d02842fSSascha Wildner } 1840d02842fSSascha Wildner Method (_E1D) 1850d02842fSSascha Wildner { 1860d02842fSSascha Wildner } 1870d02842fSSascha Wildner } 1880d02842fSSascha Wildner 1890d02842fSSascha Wildner // Predefined names that should not have a return value 1900d02842fSSascha Wildner 1910d02842fSSascha Wildner Method (_FDM, 1) 1920d02842fSSascha Wildner { 1930d02842fSSascha Wildner Return (Buffer(1){0x33}) 1940d02842fSSascha Wildner } 1950d02842fSSascha Wildner Method (_Q22) 1960d02842fSSascha Wildner { 1970d02842fSSascha Wildner Return ("Unexpected Return Value") 1980d02842fSSascha Wildner } 1990d02842fSSascha Wildner 2000d02842fSSascha Wildner // _REG must have a corresponding Operation Region declaration 2010d02842fSSascha Wildner // within the same scope 2020d02842fSSascha Wildner 2030d02842fSSascha Wildner Device (EC) 2040d02842fSSascha Wildner { 2050d02842fSSascha Wildner Method (_REG, 2) 2060d02842fSSascha Wildner { 2070d02842fSSascha Wildner } 2080d02842fSSascha Wildner } 2090d02842fSSascha Wildner 2100d02842fSSascha Wildner /* 2110d02842fSSascha Wildner * Resource Descriptor error checking 2120d02842fSSascha Wildner */ 2130d02842fSSascha Wildner Name (RSC1, ResourceTemplate () 2140d02842fSSascha Wildner { 2150d02842fSSascha Wildner // Illegal nested StartDependent macros 2160d02842fSSascha Wildner 2170d02842fSSascha Wildner StartDependentFn (0, 0) 2180d02842fSSascha Wildner { 2190d02842fSSascha Wildner StartDependentFn (0, 0) 2200d02842fSSascha Wildner { 2210d02842fSSascha Wildner } 2220d02842fSSascha Wildner } 2230d02842fSSascha Wildner 2240d02842fSSascha Wildner // Missing EndDependentFn macro 2250d02842fSSascha Wildner }) 2260d02842fSSascha Wildner 2270d02842fSSascha Wildner Name (RSC2, ResourceTemplate () 2280d02842fSSascha Wildner { 2290d02842fSSascha Wildner // AddressMin is larger than AddressMax 2300d02842fSSascha Wildner IO (Decode16, 2310d02842fSSascha Wildner 0x07D0, // Range Minimum 2320d02842fSSascha Wildner 0x03E8, // Range Maximum 2330d02842fSSascha Wildner 0x01, // Alignment 2340d02842fSSascha Wildner 0x20, // Length 2350d02842fSSascha Wildner ) 2360d02842fSSascha Wildner 2370d02842fSSascha Wildner // Length larger than Min/Max window size 2380d02842fSSascha Wildner Memory32 (ReadOnly, 2390d02842fSSascha Wildner 0x00001000, // Range Minimum 2400d02842fSSascha Wildner 0x00002000, // Range Maximum 2410d02842fSSascha Wildner 0x00000004, // Alignment 2420d02842fSSascha Wildner 0x00002000, // Length 2430d02842fSSascha Wildner ) 2440d02842fSSascha Wildner 2450d02842fSSascha Wildner // Min and Max not multiples of alignment value 2460d02842fSSascha Wildner Memory32 (ReadOnly, 2470d02842fSSascha Wildner 0x00001001, // Range Minimum 2480d02842fSSascha Wildner 0x00002002, // Range Maximum 2490d02842fSSascha Wildner 0x00000004, // Alignment 2500d02842fSSascha Wildner 0x00000200, // Length 2510d02842fSSascha Wildner ) 2520d02842fSSascha Wildner 2530d02842fSSascha Wildner // 10-bit ISA I/O address has a max of 0x3FF 2540d02842fSSascha Wildner FixedIO ( 2550d02842fSSascha Wildner 0xFFFF, // Address 2560d02842fSSascha Wildner 0x20, // Length 2570d02842fSSascha Wildner ) 2580d02842fSSascha Wildner 2590d02842fSSascha Wildner // Invalid AccessSize parameter 2600d02842fSSascha Wildner Register (SystemIO, 2610d02842fSSascha Wildner 0x08, // Bit Width 2620d02842fSSascha Wildner 0x00, // Bit Offset 2630d02842fSSascha Wildner 0x0000000000000100, // Address 2640d02842fSSascha Wildner 0x05 // Access Size 2650d02842fSSascha Wildner ) 2660d02842fSSascha Wildner 2670d02842fSSascha Wildner // Invalid ResourceType (0xB0) 2680d02842fSSascha Wildner QWordSpace (0xB0, ResourceConsumer, PosDecode, MinFixed, MaxFixed, 0xA5, 2690d02842fSSascha Wildner 0x0000, // Granularity 2700d02842fSSascha Wildner 0xA000, // Range Minimum 2710d02842fSSascha Wildner 0xBFFF, // Range Maximum 2720d02842fSSascha Wildner 0x0000, // Translation Offset 2730d02842fSSascha Wildner 0x2000, // Length 2740d02842fSSascha Wildner ,, ) 2750d02842fSSascha Wildner 2760d02842fSSascha Wildner // AddressMin is larger than AddressMax 2770d02842fSSascha Wildner WordIO (ResourceProducer, MinFixed, MaxFixed, PosDecode, EntireRange, 2780d02842fSSascha Wildner 0x0000, // Granularity 2790d02842fSSascha Wildner 0x0200, // Range Minimum 2800d02842fSSascha Wildner 0x0100, // Range Maximum 2810d02842fSSascha Wildner 0x0000, // Translation Offset 2820d02842fSSascha Wildner 0x0100, // Length 2830d02842fSSascha Wildner ,, , TypeStatic) 2840d02842fSSascha Wildner 2850d02842fSSascha Wildner // Length larger than Min/Max window size 2860d02842fSSascha Wildner DWordSpace (0xC3, ResourceConsumer, PosDecode, MinFixed, MaxFixed, 0xA5, 2870d02842fSSascha Wildner 0x00000000, // Granularity 2880d02842fSSascha Wildner 0x000C8000, // Range Minimum 2890d02842fSSascha Wildner 0x000C9000, // Range Maximum 2900d02842fSSascha Wildner 0x00000000, // Translation Offset 2910d02842fSSascha Wildner 0x00001002, // Length 2920d02842fSSascha Wildner ,, ) 2930d02842fSSascha Wildner 2940d02842fSSascha Wildner // Granularity must be (power-of-two -1) 2950d02842fSSascha Wildner DWordMemory (ResourceProducer, PosDecode, MinFixed, MaxNotFixed, NonCacheable, ReadWrite, 2960d02842fSSascha Wildner 0x00000010, 2970d02842fSSascha Wildner 0x40000000, 2980d02842fSSascha Wildner 0xFED9FFFF, 2990d02842fSSascha Wildner 0x00000000, 3000d02842fSSascha Wildner 0xBECA0000) 3010d02842fSSascha Wildner 3020d02842fSSascha Wildner // Address Min (with zero length) not on granularity boundary 3030d02842fSSascha Wildner QWordIO (ResourceProducer, MinFixed, MaxNotFixed, PosDecode, EntireRange, 3040d02842fSSascha Wildner 0x0000000000000003, // Granularity 3050d02842fSSascha Wildner 0x0000000000000B02, // Range Minimum 3060d02842fSSascha Wildner 0x0000000000000C00, // Range Maximum 3070d02842fSSascha Wildner 0x0000000000000000, // Translation Offset 3080d02842fSSascha Wildner 0x0000000000000000, // Length 3090d02842fSSascha Wildner ,, , TypeStatic) 3100d02842fSSascha Wildner 3110d02842fSSascha Wildner // Address Max (with zero length) not on (granularity boundary -1) 3120d02842fSSascha Wildner QWordMemory (ResourceProducer, PosDecode, MinNotFixed, MaxFixed, Cacheable, ReadWrite, 3130d02842fSSascha Wildner 0x0000000000000001, // Granularity 3140d02842fSSascha Wildner 0x0000000000100000, // Range Minimum 3150d02842fSSascha Wildner 0x00000000002FFFFE, // Range Maximum 3160d02842fSSascha Wildner 0x0000000000000000, // Translation Offset 3170d02842fSSascha Wildner 0x0000000000000000, // Length 3180d02842fSSascha Wildner ,, , AddressRangeMemory, TypeStatic) 3190d02842fSSascha Wildner 3200d02842fSSascha Wildner // Invalid combination: zero length, both Min and Max are fixed 3210d02842fSSascha Wildner DWordIO (ResourceProducer, MinFixed, MaxFixed, PosDecode, EntireRange, 3220d02842fSSascha Wildner 0x00000000, // Granularity 3230d02842fSSascha Wildner 0x000C8000, // Range Minimum 3240d02842fSSascha Wildner 0x000C8FFF, // Range Maximum 3250d02842fSSascha Wildner 0x00000000, // Translation Offset 3260d02842fSSascha Wildner 0x00000000, // Length 3270d02842fSSascha Wildner ,, ) 3280d02842fSSascha Wildner 3290d02842fSSascha Wildner // Invalid combination: non-zero length, Min Fixed, Max not fixed 3300d02842fSSascha Wildner DWordIO (ResourceProducer, MinFixed, MaxNotFixed, PosDecode, EntireRange, 3310d02842fSSascha Wildner 0x00000001, // Granularity 3320d02842fSSascha Wildner 0x000C8000, // Range Minimum 3330d02842fSSascha Wildner 0x000C8FFF, // Range Maximum 3340d02842fSSascha Wildner 0x00000000, // Translation Offset 3350d02842fSSascha Wildner 0x00000100, // Length 3360d02842fSSascha Wildner ,, ) 3370d02842fSSascha Wildner 3380d02842fSSascha Wildner // Invalid combination: non-zero length, Min not Fixed, Max fixed 3390d02842fSSascha Wildner DWordIO (ResourceProducer, MinNotFixed, MaxFixed, PosDecode, EntireRange, 3400d02842fSSascha Wildner 0x00000001, // Granularity 3410d02842fSSascha Wildner 0x000C8000, // Range Minimum 3420d02842fSSascha Wildner 0x000C8FFF, // Range Maximum 3430d02842fSSascha Wildner 0x00000000, // Translation Offset 3440d02842fSSascha Wildner 0x00000200, // Length 3450d02842fSSascha Wildner ,, ) 3460d02842fSSascha Wildner 3470d02842fSSascha Wildner // Granularity must be zero if non-zero length, min/max fixed 3480d02842fSSascha Wildner DWordIO (ResourceProducer, MinFixed, MaxFixed, PosDecode, EntireRange, 3490d02842fSSascha Wildner 0x0000000F, // Granularity 3500d02842fSSascha Wildner 0x000C8000, // Range Minimum 3510d02842fSSascha Wildner 0x000C8FFF, // Range Maximum 3520d02842fSSascha Wildner 0x00000000, // Translation Offset 3530d02842fSSascha Wildner 0x00001000, // Length 3540d02842fSSascha Wildner ,, ) 3550d02842fSSascha Wildner 3560d02842fSSascha Wildner // Null descriptor (intended to be modified at runtime) must 3570d02842fSSascha Wildner // have a resource tag (to allow it to be modified at runtime) 3580d02842fSSascha Wildner DWordIO (ResourceProducer, MinFixed, MaxFixed, PosDecode, EntireRange, 3590d02842fSSascha Wildner 0x00000000, // Granularity 3600d02842fSSascha Wildner 0x00000000, // Range Minimum 3610d02842fSSascha Wildner 0x00000000, // Range Maximum 3620d02842fSSascha Wildner 0x00000000, // Translation Offset 3630d02842fSSascha Wildner 0x00000000, // Length 3640d02842fSSascha Wildner ,, ) 3650d02842fSSascha Wildner 3660d02842fSSascha Wildner // Missing StartDependentFn macro 3670d02842fSSascha Wildner 3680d02842fSSascha Wildner EndDependentFn () 3690d02842fSSascha Wildner }) 3700d02842fSSascha Wildner 3710d02842fSSascha Wildner // Test descriptor for CreateXxxxField operators in REM1 below 3720d02842fSSascha Wildner 3730d02842fSSascha Wildner Name (RSC3, ResourceTemplate () 3740d02842fSSascha Wildner { 3750d02842fSSascha Wildner DWordIO (ResourceProducer, MinFixed, MaxFixed, PosDecode, EntireRange, 3760d02842fSSascha Wildner 0x00000000, // Granularity 3770d02842fSSascha Wildner 0x000C8000, // Range Minimum 3780d02842fSSascha Wildner 0x000C8FFF, // Range Maximum 3790d02842fSSascha Wildner 0x00000000, // Translation Offset 3800d02842fSSascha Wildner 0x00001000, // Length 3810d02842fSSascha Wildner ,, DWI1) 3820d02842fSSascha Wildner }) 3830d02842fSSascha Wildner 3840d02842fSSascha Wildner Method (REM1) 3850d02842fSSascha Wildner { 3860d02842fSSascha Wildner // Tagged resource field larger than field being created 3870d02842fSSascha Wildner 3880d02842fSSascha Wildner CreateWordField (RSC3, \DWI1._LEN, LEN) 3890d02842fSSascha Wildner CreateByteField (RSC3, \DWI1._MIN, MIN) 3900d02842fSSascha Wildner CreateBitField (RSC3, \DWI1._RNG, RNG1) 3910d02842fSSascha Wildner 3920d02842fSSascha Wildner // Tagged resource field smaller than field being created 3930d02842fSSascha Wildner 3940d02842fSSascha Wildner CreateQWordField (RSC3, \DWI1._MAX, MAX) 3950d02842fSSascha Wildner CreateBitField (RSC3, \DWI1._GRA, GRA) 3960d02842fSSascha Wildner CreateField (RSC3, \DWI1._MIF, 5, MIF) 3970d02842fSSascha Wildner CreateField (RSC3, \DWI1._RNG, 3, RNG2) 3980d02842fSSascha Wildner } 399267c04fdSSascha Wildner 400267c04fdSSascha Wildner Method (L100) 401267c04fdSSascha Wildner { 402267c04fdSSascha Wildner /* Method Local is set but never used */ 403267c04fdSSascha Wildner 404267c04fdSSascha Wildner Store (40, Local0) 405267c04fdSSascha Wildner } 4060d02842fSSascha Wildner} 407