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