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