Browse Source

Simple acpi shutdown

Signed-off-by: Graham MacDonald <grahamamacdonald@gmail.com>
Graham MacDonald 5 years ago
parent
commit
f43ca5c791
2 changed files with 43 additions and 1 deletions
  1. 2 1
      sys/src/cmd/acpi/build.json
  2. 41 0
      sys/src/cmd/acpi/shutdown.c

+ 2 - 1
sys/src/cmd/acpi/build.json

@@ -15,7 +15,8 @@
 		"SourceFilesCmd": [
 			"TestACPISleep.c",
 			"crs.c",
-			"irq.c"
+			"irq.c",
+			"shutdown.c"
 		]
 	}
 }

+ 41 - 0
sys/src/cmd/acpi/shutdown.c

@@ -0,0 +1,41 @@
+#include <acpi.h>
+#include <accommon.h>
+#include <acnamesp.h>
+
+// Immediately shutdown via ACPI
+
+void
+main(void)
+{
+	ACPI_STATUS status;
+	ACPI_BUFFER outBuffer = {ACPI_ALLOCATE_BUFFER, nil};
+	extern UINT32 AcpiDbgLevel;
+	unsigned int info;
+
+        // ACPI init
+	status = AcpiInitializeSubsystem();
+	if (ACPI_FAILURE(status))
+		sysfatal("acpi: failed to init subsystem");
+	status = AcpiInitializeTables(NULL, 4, 0);
+	if (ACPI_FAILURE(status))
+		sysfatal("acpi: failed to init tables");
+	status = AcpiLoadTables();
+	if (ACPI_FAILURE(status))
+		sysfatal("acpi: failed to load tables");
+	status = AcpiEnableSubsystem(ACPI_FULL_INITIALIZATION);
+	if (ACPI_FAILURE(status))
+		sysfatal("acpi: failed to enable subsystem");
+	status = AcpiInitializeObjects(ACPI_FULL_INITIALIZATION);
+	if (ACPI_FAILURE(status))
+		sysfatal("acpi: failed to initialize objects");
+
+        // Sleep
+        status = AcpiEnterSleepStatePrep(5);
+	if (ACPI_FAILURE(status))
+		sysfatal("acpi: failed to enter sleep state prep");
+        status = AcpiEnterSleepState(5);
+	if (ACPI_FAILURE(status))
+		sysfatal("acpi: failed to enter sleep state");
+
+	exits(0);
+}