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