badcode.asl revision 1.1.1.7 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