125 lines
3.2 KiB
Plaintext
125 lines
3.2 KiB
Plaintext
// Name: LoadTable scoping rules are correct
|
|
// Expect: int => 0
|
|
|
|
DefinitionBlock ("", "DSDT", 2, "uTEST", "TESTTABL", 0xF0F0F0F0)
|
|
{
|
|
External(SSDT, IntObj)
|
|
External(VAL, IntObj)
|
|
|
|
// All dynamic loads branch into here
|
|
If (CondRefOf(SSDT)) {
|
|
Name (TEST, 0)
|
|
TEST = VAL
|
|
Return (Package { 1 })
|
|
}
|
|
|
|
Name (SSDT, 123)
|
|
Name (VAL, 1)
|
|
|
|
Device (DEV0) {
|
|
Name (LRES, 0)
|
|
}
|
|
|
|
Device (DEV1) { }
|
|
Scope (_SB) {
|
|
Device (DEV1) {
|
|
Name (LRES, "XX")
|
|
Device (DEV1) { }
|
|
}
|
|
}
|
|
|
|
Name (LRES, 99)
|
|
Device (DEV2) {
|
|
Name (LRES, 123)
|
|
}
|
|
|
|
Method (LDTB, 3) {
|
|
Local0 = LoadTable("DSDT", "uTEST", "TESTTABL", Arg0, Arg1, Arg2)
|
|
VAL += 1
|
|
|
|
If (!Local0) {
|
|
Printf("Table load failed!")
|
|
Return (0)
|
|
}
|
|
|
|
Return (1)
|
|
}
|
|
|
|
Method (MAIN)
|
|
{
|
|
/*
|
|
* DEV0 is the scope, LRES should be evaluated relative to it.
|
|
* TEST is expected to be loaded there as well.
|
|
*/
|
|
If (!LDTB("DEV0", "LRES", 0xFEBEFEBE)) {
|
|
Return (1)
|
|
}
|
|
If (!CondRefOf(\DEV0.TEST, Local0)) {
|
|
Printf("No TEST under \\DEV0")
|
|
Return (1)
|
|
}
|
|
If (DerefOf(Local0) != 1) {
|
|
Printf("Incorrect \\DEV0.TEST value %o", DerefOf(Local0))
|
|
Return (1)
|
|
}
|
|
If (\DEV0.LRES != 0xFEBEFEBE) {
|
|
Printf("\\DEV0.LRES has an incorrect value %o", \DEV0.LRES)
|
|
Return (1)
|
|
}
|
|
|
|
CopyObject(0, Local0)
|
|
|
|
Scope (\_SB.DEV1) {
|
|
/*
|
|
* We're already inside \_SB.DEV1, so this DEV1 should match
|
|
* \_SB.DEV1.DEV1, note that there's also \DEV1, that shouldn't
|
|
* get matched here.
|
|
*
|
|
* There's, however, no \_SB.DEV1.DEV1.LRES, so this should resolve
|
|
* into \_SB.DEV1.LRES instead.
|
|
*/
|
|
Local0 = LoadTable("DSDT", "uTEST", "TESTTABL", "DEV1", "LRES", 0x4B4F)
|
|
If (!Local0) {
|
|
Printf("Table load failed!")
|
|
Return (0)
|
|
}
|
|
VAL += 1
|
|
}
|
|
If (!CondRefOf(\_SB.DEV1.DEV1.TEST, Local0)) {
|
|
Printf("No TEST under _SB.DEV1.DEV1")
|
|
Return (1)
|
|
}
|
|
If (DerefOf(Local0) != 2) {
|
|
Printf("Incorrect \\_SB.DEV1.DEV1.TEST value %o", DerefOf(Local0))
|
|
}
|
|
If (\_SB.DEV1.LRES != "OK") {
|
|
Printf("DEV1.LRES has an incorrect value %o", \_SB.DEV1.LRES)
|
|
Return (1)
|
|
}
|
|
|
|
CopyObject(0, Local0)
|
|
|
|
/*
|
|
* DEV2 relative load, however, LRES is specified as an absolute path
|
|
* so it shouldn't get resolved to DEV2.LRES.
|
|
*/
|
|
If (!LDTB("DEV2", "\\LRES", 0xCAFEBABE)) {
|
|
Return (1)
|
|
}
|
|
If (!CondRefOf(\DEV2.TEST, Local0)) {
|
|
Printf("No TEST under \\DEV2")
|
|
Return (1)
|
|
}
|
|
If (DerefOf(Local0) != 3) {
|
|
Printf("Incorrect \\DEV2.TEST value %o", DerefOf(Local0))
|
|
Return (1)
|
|
}
|
|
If (\LRES != 0xCAFEBABE) {
|
|
Printf("\\LRES has an incorrect value %o", \LRES)
|
|
Return (1)
|
|
}
|
|
|
|
Return (0)
|
|
}
|
|
}
|