Home | History | Annotate | Line # | Download | only in misc
badcode.asl revision 1.1.1.3
      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")
     38 
     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 
    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
    125 
    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     }
    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 
    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 
    206     /*
    207      * Resource Descriptor error checking
    208      */
    209     Name (RSC1, ResourceTemplate ()
    210     {
    211         // Illegal nested StartDependent macros
    212 
    213         StartDependentFn (0, 0)
    214         {
    215             StartDependentFn (0, 0)
    216             {
    217             }
    218         }
    219 
    220         // Missing EndDependentFn macro
    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
    256         Register (SystemIO,
    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 
    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 
    362         // Missing StartDependentFn macro
    363 
    364         EndDependentFn ()
    365     })
    366 }
    367 
    368