[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH 2/2] shutdown: Use new acpi RPC to halt machine, clean up
From: |
Damien Zammit |
Subject: |
[PATCH 2/2] shutdown: Use new acpi RPC to halt machine, clean up |
Date: |
Sat, 03 Sep 2022 00:45:44 +0000 |
This allows clean shutdown of all modern x86 machines
(not just qemu) by using the acpi translator to call
into libacpica code.
---
shutdown/Makefile | 2 +-
shutdown/acpi_shutdown.c | 66 ----------------------------------------
shutdown/acpi_shutdown.h | 18 -----------
shutdown/shutdown.c | 16 ++++++++--
4 files changed, 14 insertions(+), 88 deletions(-)
delete mode 100644 shutdown/acpi_shutdown.c
delete mode 100644 shutdown/acpi_shutdown.h
diff --git a/shutdown/Makefile b/shutdown/Makefile
index 73813dab..fc5e697d 100644
--- a/shutdown/Makefile
+++ b/shutdown/Makefile
@@ -18,7 +18,7 @@
dir := shutdown
makemode := server
-SRCS = shutdown.c acpi_shutdown.c
+SRCS = shutdown.c acpiUser.c
HURDLIBS = ports shouldbeinlibc trivfs iohelp ihash fshelp
LDLIBS = -lpthread
target = shutdown
diff --git a/shutdown/acpi_shutdown.c b/shutdown/acpi_shutdown.c
deleted file mode 100644
index fde70111..00000000
--- a/shutdown/acpi_shutdown.c
+++ /dev/null
@@ -1,66 +0,0 @@
-#include <stdio.h>
-#include <errno.h>
-#include <inttypes.h>
-#include <stdlib.h>
-#include <sys/io.h>
-#include <mach.h>
-#include "acpi_shutdown.h"
-
-void disappear_via_acpi(void)
-{
- uint16_t i, pm1a_ctl, smi_cmd;
- uint8_t regbuf[2], acpi_en;
- FILE *facp;
-
- /* Open the ACPI FADT table */
- facp = fopen(SERVERS_ACPI_FADT, "r");
- if (!facp)
- exit(errno);
-
- /* Grab value to write to SMI_CMD to enable ACPI */
- fseek(facp, SMI_EN_OFFSET, SEEK_SET);
- fread(&acpi_en, 1, 1, facp);
-
- /* Grab SMI_CMD I/O port */
- fseek(facp, SMI_CMD_OFFSET, SEEK_SET);
- fread(regbuf, 2, 1, facp);
- smi_cmd = (uint16_t)regbuf[0] |
- ((uint16_t)regbuf[1] << 8);
-
- /* Grab PM1a Control I/O port */
- fseek(facp, PM1A_CTL_OFFSET, SEEK_SET);
- fread(regbuf, 2, 1, facp);
- pm1a_ctl = (uint16_t)regbuf[0] |
- ((uint16_t)regbuf[1] << 8);
-
- /* Close the ACPI FADT table */
- fclose(facp);
-
- /* Get I/O permissions */
- if (ioperm(smi_cmd, 2, 1)) {
- fprintf(stderr, "EPERM on ioperm(smi_cmd)\n");
- return;
- }
- if (ioperm(pm1a_ctl, 2, 1)) {
- fprintf(stderr, "EPERM on ioperm(pm1a_ctl)\n");
- return;
- }
-
- /* Enable ACPI */
- outb(acpi_en, smi_cmd);
- for (i = 0; i < 300; i++)
- {
- if ( (inw(pm1a_ctl) & SCI_EN) == SCI_EN)
- break;
- }
-
- /* Kill machine */
-
- /* try sleep state 5 first */
- outw(SLP_TYP5 | SLP_EN, pm1a_ctl);
-
- /* if we reach here then above did not work */
- outw(SLP_TYP0 | SLP_EN, pm1a_ctl);
-
- /* Never reached */
-}
diff --git a/shutdown/acpi_shutdown.h b/shutdown/acpi_shutdown.h
deleted file mode 100644
index 50b7f1f6..00000000
--- a/shutdown/acpi_shutdown.h
+++ /dev/null
@@ -1,18 +0,0 @@
-#ifndef _ACPI_SHUTDOWN_H_
-#define _ACPI_SHUTDOWN_H_
-
-#include <hurd/paths.h>
-
-#define _SERVERS_ACPI _SERVERS "/acpi/tables"
-#define SERVERS_ACPI_FADT _SERVERS_ACPI "/FACP"
-#define SLP_TYP0 (0x0 << 10)
-#define SLP_TYP5 (0x5 << 10)
-#define SLP_EN (0x1 << 13)
-#define SCI_EN 1
-#define SMI_CMD_OFFSET 12
-#define SMI_EN_OFFSET 16
-#define PM1A_CTL_OFFSET 28
-
-void disappear_via_acpi(void);
-
-#endif
diff --git a/shutdown/shutdown.c b/shutdown/shutdown.c
index f821b1f2..a4cc4a50 100644
--- a/shutdown/shutdown.c
+++ b/shutdown/shutdown.c
@@ -35,8 +35,10 @@
#include <sys/file.h>
#include <version.h>
-#include "acpi_shutdown.h"
#include "shutdown_S.h"
+#include "acpi_U.h"
+
+#define SLEEP_STATE_S5 5
/* Port bucket we service requests on. */
struct port_bucket *port_bucket;
@@ -56,8 +58,16 @@ struct port_class *trivfs_control_class;
kern_return_t
S_shutdown_shutdown(trivfs_protid_t server)
{
- disappear_via_acpi();
- return 0;
+ kern_return_t err;
+ mach_port_t acpi;
+
+ acpi = file_name_lookup (_SERVERS_ACPI, O_RDONLY, 0);
+ if (acpi == MACH_PORT_NULL)
+ return EIO;
+
+ err = acpi_sleep(acpi, SLEEP_STATE_S5);
+
+ return err;
}
static int
--
2.34.1