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