Files
my-os-project2/kernel/hal/x86_64/uACPI/tests/test-cases/table-loading-3.asl
2025-08-17 18:37:57 +02:00

107 lines
2.9 KiB
Plaintext

// Name: Recursive table loads with LoadTable
// Expect: int => 0
DefinitionBlock ("", "DSDT", 2, "uTEST", "TESTTABL", 0xF0F0F0F0)
{
External(ITEM, IntObj)
External(NUMB, IntObj)
External(NUMA, IntObj)
External(VISI, IntObj)
// All dynamic loads branch into here
If (CondRefOf(ITEM)) {
// Recursively start 10 table loads
If (NUMB < 10) {
NUMB += 1
Local0 = NUMB
If (NUMB == 3) {
Local0 = LoadTable("DSDT", "uTEST", "", "", "PARA", Local0)
VISI += 1
} ElseIf (NUMB == 5) {
Local0 = LoadTable("DSDT", "", "", "", "PARA", Local0)
VISI += 10
} ElseIf (NUMB == 7) {
Local0 = LoadTable("DSDT", "", "TESTTABL", "", "", Local0)
VISI += 100
} Else {
Local0 = LoadTable("DSDT", "uTEST", "TESTTABL", "", "PARA", Local0)
VISI += 1000
}
// The last load is expected to fail, everything before should succeed
If (!Local0) {
If (NUMB != 10) {
NUMA = 0xDEADBEEF
Printf("Table load %o failed", NUMB)
}
} Else {
NUMA += 1
}
// Return something bogus here to make sure the return value isn't
// propagated to the caller of Load.
Return (Package { 1, 2 ,3})
}
// We're the last table load, do something naughty to cause an error
Local0 = Package { 1 }
Local1 = RefOf(Local0)
// This code specifically attempts to perform a bogus implicit cast
Local1 = "Hello World"
}
Name (ITEM, 123)
// Number of started table loads
Name (NUMB, 0)
// Number of finished table loads
Name (NUMA, 0)
// Visited branches
Name (VISI, 0)
Name (PARA, 0)
Name (PASS, "FAIL")
Method (MAIN, 0, Serialized)
{
Local0 = LoadTable("DSDT", "uTEST", "TESTTABL", "", "PASS", 0x53534150)
Printf("Recursive loads finished!")
If (!Local0) {
Printf("Table load failed!")
Return (0xCAFEBABE)
}
If (NUMB != 10) {
Printf("Invalid NUMB value %o", ToDecimalString(NUMB))
Return (0xEEFFAABB)
}
If (VISI != 7111) {
Printf("Invalid VISI value %o", ToDecimalString(VISI))
Return (0xAFFAAFFA)
}
If (NUMA != 9) {
Printf("Invalid NUMA value %o", ToDecimalString(NUMA))
Return (0x11223344)
}
If (PARA != 1) {
Printf("Invalid PARA value %o", ToDecimalString(PARA))
Return (0xDDFFBBCC)
}
If (PASS != "PASS") {
Printf("Invalid PASS value %o", PASS)
Return (0xECECECEC)
}
Return (0)
}
}