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