diff options
Diffstat (limited to 'tests/misc/badcode.asl')
-rw-r--r-- | tests/misc/badcode.asl | 295 |
1 files changed, 295 insertions, 0 deletions
diff --git a/tests/misc/badcode.asl b/tests/misc/badcode.asl new file mode 100644 index 000000000000..36ca0d582f27 --- /dev/null +++ b/tests/misc/badcode.asl @@ -0,0 +1,295 @@ +/* + * badcode.asl + * + * This file contains examples of the extended error checking and + * typechecking capabilities of the iASL compiler. Other ASL compilers + * may ignore these errors completely. Note - this is not an exhaustive + * list of errors detected by iASL, it shows many of the errors that + * are not detected by other ASL compilers. + * + * To compile, use: + * iasl badcode.asl + */ +DefinitionBlock ("badcode.aml", "DSDT", 1, "Intel", "Example", 0x00000001) +{ + Name (INT1, 0) + Name (BUF1, Buffer() {0,1,2,3}) + Event (EVT1) + + // Invalid SyncLevel in Mutex declaration + + Mutex (MTX1, 32) + + // Integer beyond the table integer size (32 bits) + + Name (BIG, 0x1234567887654321) + + // CPackage length does not match initializer list length + + Name (PKG1, Package(5) {0,1}) + + // Inadvertent use of single backslash in a string + + Name (PATH, Buffer() {"\_SB_.PCI2._CRS"}) + + // Invalid hex escape sequence + + Name (ESC1, "abcdefg\x00hijklmn") + + // Field access beyond region bounds + + OperationRegion (OPR1, SystemMemory, 0x2000, 6) + Field (OPR1, DWordAcc, NoLock, Preserve) + { + Offset (4), + FLD1, 8 + } + + // Some address spaces support only ByteAcc or BufferAcc + + OperationRegion (OPR2, EmbeddedControl, 0x4000, 8) + Field (OPR2, DWordAcc, NoLock, Preserve) + { + FLD2, 8 + } + OperationRegion (OPR3, SMBus, 0x8000, 16) + Field (OPR3, WordAcc, NoLock, Preserve) + { + FLD3, 8 + } + + // Invalid SyncLevel in method declaration + + Method (MTH1, 0, NotSerialized, 32) + { + // Invalid arguments and uninitialized locals + + Store (Arg3, Local0) + Store (Local1, Local2) + + // Parameter typechecking (MTX1 is invalid type) + + Subtract (MTX1, 4, Local3) + + // Various invalid parameters + + CreateField (BUF1, 0, Subtract (4, 4), FLD1) + + // Unchecked mutex and event timeouts + + Acquire (MTX1, 100) + Wait (EVT1, 1) + + // Result from operation is not used - statement has no effect + + Add (INT1, 8) + + // Unreachable code + + Return (0) + Store (5, INT1) + } + + Method (MTH2) + { + // Switch with no Case statements + + Switch (ToInteger (INT1)) + { + Default + { + } + } + + if (LEqual (INT1, 0)) + { + Return (INT1) + } + + // Fallthrough exit path does not return a value + } + + Method (MTH3) + { + // Method MTH2 above does not always return a value + + Store (MTH2 (), Local0) + } + + // Invalid _HID value + + Name (_HID, "*PNP0C0A") + + // Predefined Name typechecking + + Name (_PRW, 4) + Name (_FDI, Buffer () {0}) + + // Predefined Name argument count validation + // and return value validation + + Method (_OSC, 5) + { + } + + // Predefined Names that must be implemented as control methods + + Name (_L01, 1) + Name (_E02, 2) + Name (_Q03, 3) + Name (_ON, 0) + Name (_INI, 1) + Name (_PTP, 2) + + /* + * Resource Descriptor error checking + */ + Name (RSC1, ResourceTemplate () + { + // Illegal nested StartDependent macros + + StartDependentFn (0, 0) + { + StartDependentFn (0, 0) + { + } + } + + // Missing EndDependentFn macro + }) + + Name (RSC2, ResourceTemplate () + { + // AddressMin is larger than AddressMax + IO (Decode16, + 0x07D0, // Range Minimum + 0x03E8, // Range Maximum + 0x01, // Alignment + 0x20, // Length + ) + + // Length larger than Min/Max window size + Memory32 (ReadOnly, + 0x00001000, // Range Minimum + 0x00002000, // Range Maximum + 0x00000004, // Alignment + 0x00002000, // Length + ) + + // Min and Max not multiples of alignment value + Memory32 (ReadOnly, + 0x00001001, // Range Minimum + 0x00002002, // Range Maximum + 0x00000004, // Alignment + 0x00000200, // Length + ) + + // 10-bit ISA I/O address has a max of 0x3FF + FixedIO ( + 0xFFFF, // Address + 0x20, // Length + ) + + // Invalid AccessSize parameter + Register (SystemIO, + 0x08, // Bit Width + 0x00, // Bit Offset + 0x0000000000000100, // Address + 0x05 // Access Size + ) + + // Invalid ResourceType (0xB0) + QWordSpace (0xB0, ResourceConsumer, PosDecode, MinFixed, MaxFixed, 0xA5, + 0x0000, // Granularity + 0xA000, // Range Minimum + 0xBFFF, // Range Maximum + 0x0000, // Translation Offset + 0x2000, // Length + ,, ) + + // AddressMin is larger than AddressMax + WordIO (ResourceProducer, MinFixed, MaxFixed, PosDecode, EntireRange, + 0x0000, // Granularity + 0x0200, // Range Minimum + 0x0100, // Range Maximum + 0x0000, // Translation Offset + 0x0100, // Length + ,, , TypeStatic) + + // Length larger than Min/Max window size + DWordSpace (0xC3, ResourceConsumer, PosDecode, MinFixed, MaxFixed, 0xA5, + 0x00000000, // Granularity + 0x000C8000, // Range Minimum + 0x000C9000, // Range Maximum + 0x00000000, // Translation Offset + 0x00001002, // Length + ,, ) + + // Granularity must be (power-of-two -1) + DWordMemory (ResourceProducer, PosDecode, MinFixed, MaxNotFixed, NonCacheable, ReadWrite, + 0x00000010, + 0x40000000, + 0xFED9FFFF, + 0x00000000, + 0xBECA0000) + + // Address Min (with zero length) not on granularity boundary + QWordIO (ResourceProducer, MinFixed, MaxNotFixed, PosDecode, EntireRange, + 0x0000000000000003, // Granularity + 0x0000000000000B02, // Range Minimum + 0x0000000000000C00, // Range Maximum + 0x0000000000000000, // Translation Offset + 0x0000000000000000, // Length + ,, , TypeStatic) + + // Address Max (with zero length) not on (granularity boundary -1) + QWordMemory (ResourceProducer, PosDecode, MinNotFixed, MaxFixed, Cacheable, ReadWrite, + 0x0000000000000001, // Granularity + 0x0000000000100000, // Range Minimum + 0x00000000002FFFFE, // Range Maximum + 0x0000000000000000, // Translation Offset + 0x0000000000000000, // Length + ,, , AddressRangeMemory, TypeStatic) + + // Invalid combination: zero length, both Min and Max are fixed + DWordIO (ResourceProducer, MinFixed, MaxFixed, PosDecode, EntireRange, + 0x00000000, // Granularity + 0x000C8000, // Range Minimum + 0x000C8FFF, // Range Maximum + 0x00000000, // Translation Offset + 0x00000000, // Length + ,, ) + + // Invalid combination: non-zero length, Min Fixed, Max not fixed + DWordIO (ResourceProducer, MinFixed, MaxNotFixed, PosDecode, EntireRange, + 0x00000001, // Granularity + 0x000C8000, // Range Minimum + 0x000C8FFF, // Range Maximum + 0x00000000, // Translation Offset + 0x00000100, // Length + ,, ) + + // Invalid combination: non-zero length, Min not Fixed, Max fixed + DWordIO (ResourceProducer, MinNotFixed, MaxFixed, PosDecode, EntireRange, + 0x00000001, // Granularity + 0x000C8000, // Range Minimum + 0x000C8FFF, // Range Maximum + 0x00000000, // Translation Offset + 0x00000200, // Length + ,, ) + + // Granularity must be zero if non-zero length, min/max fixed + DWordIO (ResourceProducer, MinFixed, MaxFixed, PosDecode, EntireRange, + 0x0000000F, // Granularity + 0x000C8000, // Range Minimum + 0x000C8FFF, // Range Maximum + 0x00000000, // Translation Offset + 0x00001000, // Length + ,, ) + + // Missing StartDependentFn macro + + EndDependentFn () + }) +} + |