Subversion Repositories Kolibri OS

Rev

Rev 1498 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  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.