1/* 2 * badcode.asl 3 * 4 * This file contains examples of the extended error checking and 5 * typechecking capabilities of the iASL compiler. Other ASL compilers 6 * may ignore these errors completely. Note - this is not an exhaustive 7 * list of errors detected by iASL, it shows many of the errors that 8 * are not detected by other ASL compilers. 9 * 10 * To compile, use: 11 * iasl badcode.asl 12 * 13 * Output: 14 * Compilation complete. 45 Errors, 28 Warnings, 11 Remarks, 14 Optimizations 15 * 16 */ 17DefinitionBlock ("badcode.aml", "DSDT", 1, "Intel", "Example", 0x00000001) 18{ 19 Name (INT1, 0) 20 Name (BUF1, Buffer() {0,1,2,3}) 21 Event (EVT1) 22 23 // Invalid SyncLevel in Mutex declaration 24 25 Mutex (MTX1, 32) 26 27 // Integer beyond the table integer size (32 bits) 28 29 Name (BIG, 0x1234567887654321) 30 31 // CPackage length does not match initializer list length 32 33 Name (PKG1, Package(5) {0,1}) 34 35 // Inadvertent use of single backslash in a string 36 37 Name (PATH, Buffer() {"\_SB_.PCI2._CRS"}) 38 39 // Invalid hex escape sequence 40 41 Name (ESC1, "abcdefg\x00hijklmn") 42 43 // Field access beyond region bounds 44 45 OperationRegion (OPR1, SystemMemory, 0x2000, 6) 46 Field (OPR1, DWordAcc, NoLock, Preserve) 47 { 48 Offset (4), 49 FLD1, 8 50 } 51 52 // Some address spaces support only ByteAcc or BufferAcc 53 54 OperationRegion (OPR2, EmbeddedControl, 0x4000, 8) 55 Field (OPR2, DWordAcc, NoLock, Preserve) 56 { 57 FLD2, 8 58 } 59 OperationRegion (OPR3, SMBus, 0x8000, 16) 60 Field (OPR3, WordAcc, NoLock, Preserve) 61 { 62 FLD3, 8 63 } 64 65 // Invalid SyncLevel in method declaration 66 67 Method (MTH1, 0, NotSerialized, 32) 68 { 69 // Invalid arguments and uninitialized locals 70 71 Store (Arg3, Local0) 72 Store (Local1, Local2) 73 74 // Parameter typechecking (MTX1 is invalid type) 75 76 Subtract (MTX1, 4, Local3) 77 78 // Various invalid parameters 79 80 CreateField (BUF1, 0, Subtract (4, 4), FLD1) 81 82 // Unchecked mutex and event timeouts 83 84 Acquire (MTX1, 100) 85 Wait (EVT1, 1) 86 87 // Result from operation is not used - statement has no effect 88 89 Add (INT1, 8) 90 91 // Unreachable code 92 93 Return (0) 94 Store (5, INT1) 95 } 96 97 Method (MTH2) 98 { 99 // Switch with no Case statements 100 101 Switch (ToInteger (INT1)) 102 { 103 Default 104 { 105 } 106 } 107 108 if (LEqual (INT1, 0)) 109 { 110 Return (INT1) 111 } 112 113 // Fallthrough exit path does not return a value 114 } 115 116 Method (MTH3) 117 { 118 // Method MTH2 above does not always return a value 119 120 Store (MTH2 (), Local0) 121 } 122 123 // Method MTH4 does not explicitly return a value 124 125 Method (MTH4) {} 126 Method (MTH5) {Store (MTH4(), Local0)} 127 128 // Invalid _HID values 129 130 Device (H1) 131 { 132 Name (_HID, "*PNP0C0A") // Illegal leading asterisk 133 } 134 Device (H2) 135 { 136 Name (_HID, "PNP") // Too short, must be 7 or 8 chars 137 } 138 Device (H3) 139 { 140 Name (_HID, "MYDEVICE01") // Too long, must be 7 or 8 chars 141 } 142 Device (H4) 143 { 144 Name (_HID, "acpi0001") // non-hex chars must be uppercase 145 } 146 Device (H5) 147 { 148 Name (_HID, "PNP-123") // HID must be alphanumeric 149 } 150 Device (H6) 151 { 152 Name (_HID, "") // Illegal Null HID 153 Name (_CID, "") // Illegal Null CID 154 } 155 156 // Predefined Name typechecking 157 158 Name (_PRW, 4) 159 Name (_FDI, Buffer () {0}) 160 161 // Predefined Name argument count validation 162 // and return value validation 163 164 Method (_OSC, 5) 165 { 166 } 167 168 // Predefined Names that must be implemented as control methods 169 170 Name (_L01, 1) 171 Name (_E02, 2) 172 Name (_Q03, 3) 173 Name (_ON, 0) 174 Name (_INI, 1) 175 Name (_PTP, 2) 176 177 // GPE methods that cause type collision (L vs. E) 178 179 Scope (\_GPE) 180 { 181 Method (_L1D) 182 { 183 } 184 Method (_E1D) 185 { 186 } 187 } 188 189 // Predefined names that should not have a return value 190 191 Method (_FDM, 1) 192 { 193 Return (Buffer(1){0x33}) 194 } 195 Method (_Q22) 196 { 197 Return ("Unexpected Return Value") 198 } 199 200 // _REG must have a corresponding Operation Region declaration 201 // within the same scope 202 203 Device (EC) 204 { 205 Method (_REG, 2) 206 { 207 } 208 } 209 210 /* 211 * Resource Descriptor error checking 212 */ 213 Name (RSC1, ResourceTemplate () 214 { 215 // Illegal nested StartDependent macros 216 217 StartDependentFn (0, 0) 218 { 219 StartDependentFn (0, 0) 220 { 221 } 222 } 223 224 // Missing EndDependentFn macro 225 }) 226 227 Name (RSC2, ResourceTemplate () 228 { 229 // AddressMin is larger than AddressMax 230 IO (Decode16, 231 0x07D0, // Range Minimum 232 0x03E8, // Range Maximum 233 0x01, // Alignment 234 0x20, // Length 235 ) 236 237 // Length larger than Min/Max window size 238 Memory32 (ReadOnly, 239 0x00001000, // Range Minimum 240 0x00002000, // Range Maximum 241 0x00000004, // Alignment 242 0x00002000, // Length 243 ) 244 245 // Min and Max not multiples of alignment value 246 Memory32 (ReadOnly, 247 0x00001001, // Range Minimum 248 0x00002002, // Range Maximum 249 0x00000004, // Alignment 250 0x00000200, // Length 251 ) 252 253 // 10-bit ISA I/O address has a max of 0x3FF 254 FixedIO ( 255 0xFFFF, // Address 256 0x20, // Length 257 ) 258 259 // Invalid AccessSize parameter 260 Register (SystemIO, 261 0x08, // Bit Width 262 0x00, // Bit Offset 263 0x0000000000000100, // Address 264 0x05 // Access Size 265 ) 266 267 // Invalid ResourceType (0xB0) 268 QWordSpace (0xB0, ResourceConsumer, PosDecode, MinFixed, MaxFixed, 0xA5, 269 0x0000, // Granularity 270 0xA000, // Range Minimum 271 0xBFFF, // Range Maximum 272 0x0000, // Translation Offset 273 0x2000, // Length 274 ,, ) 275 276 // AddressMin is larger than AddressMax 277 WordIO (ResourceProducer, MinFixed, MaxFixed, PosDecode, EntireRange, 278 0x0000, // Granularity 279 0x0200, // Range Minimum 280 0x0100, // Range Maximum 281 0x0000, // Translation Offset 282 0x0100, // Length 283 ,, , TypeStatic) 284 285 // Length larger than Min/Max window size 286 DWordSpace (0xC3, ResourceConsumer, PosDecode, MinFixed, MaxFixed, 0xA5, 287 0x00000000, // Granularity 288 0x000C8000, // Range Minimum 289 0x000C9000, // Range Maximum 290 0x00000000, // Translation Offset 291 0x00001002, // Length 292 ,, ) 293 294 // Granularity must be (power-of-two -1) 295 DWordMemory (ResourceProducer, PosDecode, MinFixed, MaxNotFixed, NonCacheable, ReadWrite, 296 0x00000010, 297 0x40000000, 298 0xFED9FFFF, 299 0x00000000, 300 0xBECA0000) 301 302 // Address Min (with zero length) not on granularity boundary 303 QWordIO (ResourceProducer, MinFixed, MaxNotFixed, PosDecode, EntireRange, 304 0x0000000000000003, // Granularity 305 0x0000000000000B02, // Range Minimum 306 0x0000000000000C00, // Range Maximum 307 0x0000000000000000, // Translation Offset 308 0x0000000000000000, // Length 309 ,, , TypeStatic) 310 311 // Address Max (with zero length) not on (granularity boundary -1) 312 QWordMemory (ResourceProducer, PosDecode, MinNotFixed, MaxFixed, Cacheable, ReadWrite, 313 0x0000000000000001, // Granularity 314 0x0000000000100000, // Range Minimum 315 0x00000000002FFFFE, // Range Maximum 316 0x0000000000000000, // Translation Offset 317 0x0000000000000000, // Length 318 ,, , AddressRangeMemory, TypeStatic) 319 320 // Invalid combination: zero length, both Min and Max are fixed 321 DWordIO (ResourceProducer, MinFixed, MaxFixed, PosDecode, EntireRange, 322 0x00000000, // Granularity 323 0x000C8000, // Range Minimum 324 0x000C8FFF, // Range Maximum 325 0x00000000, // Translation Offset 326 0x00000000, // Length 327 ,, ) 328 329 // Invalid combination: non-zero length, Min Fixed, Max not fixed 330 DWordIO (ResourceProducer, MinFixed, MaxNotFixed, PosDecode, EntireRange, 331 0x00000001, // Granularity 332 0x000C8000, // Range Minimum 333 0x000C8FFF, // Range Maximum 334 0x00000000, // Translation Offset 335 0x00000100, // Length 336 ,, ) 337 338 // Invalid combination: non-zero length, Min not Fixed, Max fixed 339 DWordIO (ResourceProducer, MinNotFixed, MaxFixed, PosDecode, EntireRange, 340 0x00000001, // Granularity 341 0x000C8000, // Range Minimum 342 0x000C8FFF, // Range Maximum 343 0x00000000, // Translation Offset 344 0x00000200, // Length 345 ,, ) 346 347 // Granularity must be zero if non-zero length, min/max fixed 348 DWordIO (ResourceProducer, MinFixed, MaxFixed, PosDecode, EntireRange, 349 0x0000000F, // Granularity 350 0x000C8000, // Range Minimum 351 0x000C8FFF, // Range Maximum 352 0x00000000, // Translation Offset 353 0x00001000, // Length 354 ,, ) 355 356 // Null descriptor (intended to be modified at runtime) must 357 // have a resource tag (to allow it to be modified at runtime) 358 DWordIO (ResourceProducer, MinFixed, MaxFixed, PosDecode, EntireRange, 359 0x00000000, // Granularity 360 0x00000000, // Range Minimum 361 0x00000000, // Range Maximum 362 0x00000000, // Translation Offset 363 0x00000000, // Length 364 ,, ) 365 366 // Missing StartDependentFn macro 367 368 EndDependentFn () 369 }) 370 371 // Test descriptor for CreateXxxxField operators in REM1 below 372 373 Name (RSC3, ResourceTemplate () 374 { 375 DWordIO (ResourceProducer, MinFixed, MaxFixed, PosDecode, EntireRange, 376 0x00000000, // Granularity 377 0x000C8000, // Range Minimum 378 0x000C8FFF, // Range Maximum 379 0x00000000, // Translation Offset 380 0x00001000, // Length 381 ,, DWI1) 382 }) 383 384 Method (REM1) 385 { 386 // Tagged resource field larger than field being created 387 388 CreateWordField (RSC3, \DWI1._LEN, LEN) 389 CreateByteField (RSC3, \DWI1._MIN, MIN) 390 CreateBitField (RSC3, \DWI1._RNG, RNG1) 391 392 // Tagged resource field smaller than field being created 393 394 CreateQWordField (RSC3, \DWI1._MAX, MAX) 395 CreateBitField (RSC3, \DWI1._GRA, GRA) 396 CreateField (RSC3, \DWI1._MIF, 5, MIF) 397 CreateField (RSC3, \DWI1._RNG, 3, RNG2) 398 } 399 400 Method (L100) 401 { 402 /* Method Local is set but never used */ 403 404 Store (40, Local0) 405 } 406} 407