Subversion Repositories Kolibri OS

Rev

Rev 1498 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1498 serge 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")
2216 Serge 38
 
1498 serge 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
 
2216 Serge 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
1498 serge 125
 
2216 Serge 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
    }
1498 serge 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
 
2216 Serge 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
 
1498 serge 206
    /*
207
     * Resource Descriptor error checking
208
     */
209
    Name (RSC1, ResourceTemplate ()
210
    {
211
        // Illegal nested StartDependent macros
212
 
2216 Serge 213
        StartDependentFn (0, 0)
214
        {
215
            StartDependentFn (0, 0)
216
            {
1498 serge 217
            }
218
        }
219
 
2216 Serge 220
        // Missing EndDependentFn macro
1498 serge 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
2216 Serge 256
        Register (SystemIO,
1498 serge 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
 
2216 Serge 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
 
1498 serge 362
        // Missing StartDependentFn macro
363
 
364
        EndDependentFn ()
365
    })
366
}
367