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