Home | History | Annotate | Line # | Download | only in misc
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