badcode.asl revision 1.1.1.2 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.2 jruoho // Invalid _HID values
120 1.1 jruoho
121 1.1.1.2 jruoho Device (H1)
122 1.1.1.2 jruoho {
123 1.1.1.2 jruoho Name (_HID, "*PNP0C0A") // Illegal leading asterisk
124 1.1.1.2 jruoho }
125 1.1.1.2 jruoho Device (H2)
126 1.1.1.2 jruoho {
127 1.1.1.2 jruoho Name (_HID, "PNP") // Too short, must be 7 or 8 chars
128 1.1.1.2 jruoho }
129 1.1.1.2 jruoho Device (H3)
130 1.1.1.2 jruoho {
131 1.1.1.2 jruoho Name (_HID, "MYDEVICE01") // Too long, must be 7 or 8 chars
132 1.1.1.2 jruoho }
133 1.1.1.2 jruoho Device (H4)
134 1.1.1.2 jruoho {
135 1.1.1.2 jruoho Name (_HID, "acpi0001") // non-hex chars must be uppercase
136 1.1.1.2 jruoho }
137 1.1.1.2 jruoho Device (H5)
138 1.1.1.2 jruoho {
139 1.1.1.2 jruoho Name (_HID, "PNP-123") // HID must be alphanumeric
140 1.1.1.2 jruoho }
141 1.1.1.2 jruoho Device (H6)
142 1.1.1.2 jruoho {
143 1.1.1.2 jruoho Name (_HID, "") // Illegal Null HID
144 1.1.1.2 jruoho Name (_CID, "") // Illegal Null CID
145 1.1.1.2 jruoho }
146 1.1 jruoho
147 1.1 jruoho // Predefined Name typechecking
148 1.1 jruoho
149 1.1 jruoho Name (_PRW, 4)
150 1.1 jruoho Name (_FDI, Buffer () {0})
151 1.1 jruoho
152 1.1 jruoho // Predefined Name argument count validation
153 1.1 jruoho // and return value validation
154 1.1 jruoho
155 1.1 jruoho Method (_OSC, 5)
156 1.1 jruoho {
157 1.1 jruoho }
158 1.1 jruoho
159 1.1 jruoho // Predefined Names that must be implemented as control methods
160 1.1 jruoho
161 1.1 jruoho Name (_L01, 1)
162 1.1 jruoho Name (_E02, 2)
163 1.1 jruoho Name (_Q03, 3)
164 1.1 jruoho Name (_ON, 0)
165 1.1 jruoho Name (_INI, 1)
166 1.1 jruoho Name (_PTP, 2)
167 1.1 jruoho
168 1.1.1.2 jruoho // GPE methods that cause type collision (L vs. E)
169 1.1.1.2 jruoho
170 1.1.1.2 jruoho Scope (\_GPE)
171 1.1.1.2 jruoho {
172 1.1.1.2 jruoho Method (_L1D)
173 1.1.1.2 jruoho {
174 1.1.1.2 jruoho }
175 1.1.1.2 jruoho Method (_E1D)
176 1.1.1.2 jruoho {
177 1.1.1.2 jruoho }
178 1.1.1.2 jruoho }
179 1.1.1.2 jruoho
180 1.1.1.2 jruoho // Predefined names that should not have a return value
181 1.1.1.2 jruoho
182 1.1.1.2 jruoho Method (_FDM, 1)
183 1.1.1.2 jruoho {
184 1.1.1.2 jruoho Return (Buffer(1){0x33})
185 1.1.1.2 jruoho }
186 1.1.1.2 jruoho Method (_Q22)
187 1.1.1.2 jruoho {
188 1.1.1.2 jruoho Return ("Unexpected Return Value")
189 1.1.1.2 jruoho }
190 1.1.1.2 jruoho
191 1.1 jruoho /*
192 1.1 jruoho * Resource Descriptor error checking
193 1.1 jruoho */
194 1.1 jruoho Name (RSC1, ResourceTemplate ()
195 1.1 jruoho {
196 1.1 jruoho // Illegal nested StartDependent macros
197 1.1 jruoho
198 1.1.1.2 jruoho StartDependentFn (0, 0)
199 1.1.1.2 jruoho {
200 1.1.1.2 jruoho StartDependentFn (0, 0)
201 1.1.1.2 jruoho {
202 1.1 jruoho }
203 1.1 jruoho }
204 1.1 jruoho
205 1.1.1.2 jruoho // Missing EndDependentFn macro
206 1.1 jruoho })
207 1.1 jruoho
208 1.1 jruoho Name (RSC2, ResourceTemplate ()
209 1.1 jruoho {
210 1.1 jruoho // AddressMin is larger than AddressMax
211 1.1 jruoho IO (Decode16,
212 1.1 jruoho 0x07D0, // Range Minimum
213 1.1 jruoho 0x03E8, // Range Maximum
214 1.1 jruoho 0x01, // Alignment
215 1.1 jruoho 0x20, // Length
216 1.1 jruoho )
217 1.1 jruoho
218 1.1 jruoho // Length larger than Min/Max window size
219 1.1 jruoho Memory32 (ReadOnly,
220 1.1 jruoho 0x00001000, // Range Minimum
221 1.1 jruoho 0x00002000, // Range Maximum
222 1.1 jruoho 0x00000004, // Alignment
223 1.1 jruoho 0x00002000, // Length
224 1.1 jruoho )
225 1.1 jruoho
226 1.1 jruoho // Min and Max not multiples of alignment value
227 1.1 jruoho Memory32 (ReadOnly,
228 1.1 jruoho 0x00001001, // Range Minimum
229 1.1 jruoho 0x00002002, // Range Maximum
230 1.1 jruoho 0x00000004, // Alignment
231 1.1 jruoho 0x00000200, // Length
232 1.1 jruoho )
233 1.1 jruoho
234 1.1 jruoho // 10-bit ISA I/O address has a max of 0x3FF
235 1.1 jruoho FixedIO (
236 1.1 jruoho 0xFFFF, // Address
237 1.1 jruoho 0x20, // Length
238 1.1 jruoho )
239 1.1 jruoho
240 1.1 jruoho // Invalid AccessSize parameter
241 1.1.1.2 jruoho Register (SystemIO,
242 1.1 jruoho 0x08, // Bit Width
243 1.1 jruoho 0x00, // Bit Offset
244 1.1 jruoho 0x0000000000000100, // Address
245 1.1 jruoho 0x05 // Access Size
246 1.1 jruoho )
247 1.1 jruoho
248 1.1 jruoho // Invalid ResourceType (0xB0)
249 1.1 jruoho QWordSpace (0xB0, ResourceConsumer, PosDecode, MinFixed, MaxFixed, 0xA5,
250 1.1 jruoho 0x0000, // Granularity
251 1.1 jruoho 0xA000, // Range Minimum
252 1.1 jruoho 0xBFFF, // Range Maximum
253 1.1 jruoho 0x0000, // Translation Offset
254 1.1 jruoho 0x2000, // Length
255 1.1 jruoho ,, )
256 1.1 jruoho
257 1.1 jruoho // AddressMin is larger than AddressMax
258 1.1 jruoho WordIO (ResourceProducer, MinFixed, MaxFixed, PosDecode, EntireRange,
259 1.1 jruoho 0x0000, // Granularity
260 1.1 jruoho 0x0200, // Range Minimum
261 1.1 jruoho 0x0100, // Range Maximum
262 1.1 jruoho 0x0000, // Translation Offset
263 1.1 jruoho 0x0100, // Length
264 1.1 jruoho ,, , TypeStatic)
265 1.1 jruoho
266 1.1 jruoho // Length larger than Min/Max window size
267 1.1 jruoho DWordSpace (0xC3, ResourceConsumer, PosDecode, MinFixed, MaxFixed, 0xA5,
268 1.1 jruoho 0x00000000, // Granularity
269 1.1 jruoho 0x000C8000, // Range Minimum
270 1.1 jruoho 0x000C9000, // Range Maximum
271 1.1 jruoho 0x00000000, // Translation Offset
272 1.1 jruoho 0x00001002, // Length
273 1.1 jruoho ,, )
274 1.1 jruoho
275 1.1 jruoho // Granularity must be (power-of-two -1)
276 1.1 jruoho DWordMemory (ResourceProducer, PosDecode, MinFixed, MaxNotFixed, NonCacheable, ReadWrite,
277 1.1 jruoho 0x00000010,
278 1.1 jruoho 0x40000000,
279 1.1 jruoho 0xFED9FFFF,
280 1.1 jruoho 0x00000000,
281 1.1 jruoho 0xBECA0000)
282 1.1 jruoho
283 1.1 jruoho // Address Min (with zero length) not on granularity boundary
284 1.1 jruoho QWordIO (ResourceProducer, MinFixed, MaxNotFixed, PosDecode, EntireRange,
285 1.1 jruoho 0x0000000000000003, // Granularity
286 1.1 jruoho 0x0000000000000B02, // Range Minimum
287 1.1 jruoho 0x0000000000000C00, // Range Maximum
288 1.1 jruoho 0x0000000000000000, // Translation Offset
289 1.1 jruoho 0x0000000000000000, // Length
290 1.1 jruoho ,, , TypeStatic)
291 1.1 jruoho
292 1.1 jruoho // Address Max (with zero length) not on (granularity boundary -1)
293 1.1 jruoho QWordMemory (ResourceProducer, PosDecode, MinNotFixed, MaxFixed, Cacheable, ReadWrite,
294 1.1 jruoho 0x0000000000000001, // Granularity
295 1.1 jruoho 0x0000000000100000, // Range Minimum
296 1.1 jruoho 0x00000000002FFFFE, // Range Maximum
297 1.1 jruoho 0x0000000000000000, // Translation Offset
298 1.1 jruoho 0x0000000000000000, // Length
299 1.1 jruoho ,, , AddressRangeMemory, TypeStatic)
300 1.1 jruoho
301 1.1 jruoho // Invalid combination: zero length, both Min and Max are fixed
302 1.1 jruoho DWordIO (ResourceProducer, MinFixed, MaxFixed, PosDecode, EntireRange,
303 1.1 jruoho 0x00000000, // Granularity
304 1.1 jruoho 0x000C8000, // Range Minimum
305 1.1 jruoho 0x000C8FFF, // Range Maximum
306 1.1 jruoho 0x00000000, // Translation Offset
307 1.1 jruoho 0x00000000, // Length
308 1.1 jruoho ,, )
309 1.1 jruoho
310 1.1 jruoho // Invalid combination: non-zero length, Min Fixed, Max not fixed
311 1.1 jruoho DWordIO (ResourceProducer, MinFixed, MaxNotFixed, PosDecode, EntireRange,
312 1.1 jruoho 0x00000001, // Granularity
313 1.1 jruoho 0x000C8000, // Range Minimum
314 1.1 jruoho 0x000C8FFF, // Range Maximum
315 1.1 jruoho 0x00000000, // Translation Offset
316 1.1 jruoho 0x00000100, // Length
317 1.1 jruoho ,, )
318 1.1 jruoho
319 1.1 jruoho // Invalid combination: non-zero length, Min not Fixed, Max fixed
320 1.1 jruoho DWordIO (ResourceProducer, MinNotFixed, MaxFixed, PosDecode, EntireRange,
321 1.1 jruoho 0x00000001, // Granularity
322 1.1 jruoho 0x000C8000, // Range Minimum
323 1.1 jruoho 0x000C8FFF, // Range Maximum
324 1.1 jruoho 0x00000000, // Translation Offset
325 1.1 jruoho 0x00000200, // Length
326 1.1 jruoho ,, )
327 1.1 jruoho
328 1.1 jruoho // Granularity must be zero if non-zero length, min/max fixed
329 1.1 jruoho DWordIO (ResourceProducer, MinFixed, MaxFixed, PosDecode, EntireRange,
330 1.1 jruoho 0x0000000F, // Granularity
331 1.1 jruoho 0x000C8000, // Range Minimum
332 1.1 jruoho 0x000C8FFF, // Range Maximum
333 1.1 jruoho 0x00000000, // Translation Offset
334 1.1 jruoho 0x00001000, // Length
335 1.1 jruoho ,, )
336 1.1 jruoho
337 1.1.1.2 jruoho // Null descriptor (intended to be modified at runtime) must
338 1.1.1.2 jruoho // have a resource tag (to allow it to be modified at runtime)
339 1.1.1.2 jruoho DWordIO (ResourceProducer, MinFixed, MaxFixed, PosDecode, EntireRange,
340 1.1.1.2 jruoho 0x00000000, // Granularity
341 1.1.1.2 jruoho 0x00000000, // Range Minimum
342 1.1.1.2 jruoho 0x00000000, // Range Maximum
343 1.1.1.2 jruoho 0x00000000, // Translation Offset
344 1.1.1.2 jruoho 0x00000000, // Length
345 1.1.1.2 jruoho ,, )
346 1.1.1.2 jruoho
347 1.1 jruoho // Missing StartDependentFn macro
348 1.1 jruoho
349 1.1 jruoho EndDependentFn ()
350 1.1 jruoho })
351 1.1 jruoho }
352 1.1 jruoho
353