Merge feat/power-events: ACPI events + system power (M21)
The QMP harness channel, the SCI + power button published from ring 3, Notify/GPE dispatch in the AML interpreter, and orderly shutdown — init's M17 stop cascade into a ring-3 S5 write. Proven by injecting a real ACPI power-button event; QEMU powers off through the whole chain. # Conflicts: # system/services/init/init.zig
This commit is contained in:
@@ -152,6 +152,10 @@ pub fn run(case: []const u8, boot_information: *const BootInformation) void {
|
||||
acpiReportTest(boot_information);
|
||||
} else if (eql(case, "acpi-ps2")) {
|
||||
acpiReportTest(boot_information); // same spawn; the harness regex differs
|
||||
} else if (eql(case, "power-button")) {
|
||||
acpiReportTest(boot_information); // boot the manager (spawns the acpi service); harness injects the button
|
||||
} else if (eql(case, "orderly-shutdown")) {
|
||||
orderlyShutdownTest(boot_information);
|
||||
} else if (eql(case, "initial-ramdisk")) {
|
||||
initialRamdiskTest(boot_information);
|
||||
} else if (eql(case, "vfs")) {
|
||||
@@ -1929,6 +1933,27 @@ fn pciScanTest(boot_information: *const BootInformation) void {
|
||||
result();
|
||||
}
|
||||
|
||||
/// M21.3 capstone: orderly shutdown. Boot init with the initial-ramdisk
|
||||
/// published, so init spawns the full service tree (vfs, input, device-manager
|
||||
/// -> discovery/acpi); the harness injects a real power-button event via QMP;
|
||||
/// the acpi service publishes it; init runs the stop sequence over its children
|
||||
/// and asks the power service for S5; the machine powers off (QEMU exits). The
|
||||
/// kernel test only spawns init — the ordered chain is the harness assertion.
|
||||
fn orderlyShutdownTest(boot_information: *const BootInformation) void {
|
||||
log("DANOS-TEST-BEGIN: orderly-shutdown\n", .{});
|
||||
if (boot_information.init_len == 0 or boot_information.initial_ramdisk_len == 0) {
|
||||
check("bootloader handed over init and the initial_ramdisk", false);
|
||||
result();
|
||||
return;
|
||||
}
|
||||
const ramdisk = @as([*]const u8, @ptrFromInt(boot_handoff.physicalToVirtual(boot_information.initial_ramdisk_base)))[0..boot_information.initial_ramdisk_len];
|
||||
process.setInitialRamdisk(ramdisk);
|
||||
const image = @as([*]const u8, @ptrFromInt(boot_handoff.physicalToVirtual(boot_information.init_base)))[0..boot_information.init_len];
|
||||
const spawned = if (process.spawnProcess(image, 4, &.{"/system/services/init"})) true else |_| false;
|
||||
check("init spawned as PID root of user space", spawned);
|
||||
result();
|
||||
}
|
||||
|
||||
/// M20.2: the acpi service registers + reports its _HID devices. Boot normally
|
||||
/// (the manager spawns discovery); the harness's expect regex requires the two
|
||||
/// PS/2 nodes among the service's report lines, each with its _CRS resources —
|
||||
|
||||
Reference in New Issue
Block a user