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