summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDamien Zammit <damien@zamaudio.com>2023-07-19 10:56:16 +1000
committerDamien Zammit <damien@zamaudio.com>2023-07-20 14:17:01 +1000
commit09762e80a2f4705f86d09338df9e1f7f6648d361 (patch)
tree19e785120e1b83af0b33fad22af7753b62138aab
parent5cc4528bce7e364ffe5cc423db2f2377d00befd5 (diff)
acpi: Remove machdev dependencyfeat-simplify-bootstrap
-rw-r--r--acpi/Makefile2
-rw-r--r--acpi/main.c191
2 files changed, 83 insertions, 110 deletions
diff --git a/acpi/Makefile b/acpi/Makefile
index ceccb351..dddf4fdd 100644
--- a/acpi/Makefile
+++ b/acpi/Makefile
@@ -27,7 +27,7 @@ SRCS = main.c netfs_impl.c acpi.c \
MIGSRCS =
OBJS = $(patsubst %.S,%.o,$(patsubst %.c,%.o, $(SRCS) $(MIGSRCS)))
-HURDLIBS= fshelp ports shouldbeinlibc netfs iohelp ihash machdev trivfs
+HURDLIBS= fshelp ports shouldbeinlibc netfs iohelp ihash
LDLIBS = -lpthread $(libacpica_LIBS)
target = acpi acpi.static
diff --git a/acpi/main.c b/acpi/main.c
index aa153bdb..774eac08 100644
--- a/acpi/main.c
+++ b/acpi/main.c
@@ -26,6 +26,8 @@
#include <argp.h>
#include <hurd/netfs.h>
#include <hurd/fsys.h>
+#include <hurd/startup.h>
+#include <hurd/paths.h>
#include "acpi_S.h"
#include "startup_notify_S.h"
@@ -35,7 +37,6 @@
#include "libnetfs/fsys_S.h"
#include "libports/interrupt_S.h"
#include "libnetfs/ifsock_S.h"
-#include "libmachdev/machdev.h"
#include <device/device.h>
#include <pthread.h>
#include <acpi/acpi_init.h>
@@ -52,6 +53,71 @@ struct acpifs *fs;
static mach_port_t acpi_control_port;
+struct port_class *acpi_shutdown_notify_class;
+
+error_t
+S_startup_dosync (mach_port_t notify_port)
+{
+ /* Nothing to sync */
+ return 0;
+}
+
+static void
+essential_task (void)
+{
+ mach_port_t host, startup;
+ error_t err;
+
+ err = get_privileged_ports (&host, 0);
+ if (err)
+ {
+ mach_print ("WARNING: acpi cannot register as essential task\n");
+ return;
+ }
+ startup = file_name_lookup (_SERVERS_STARTUP, 0, 0);
+ if (startup == MACH_PORT_NULL)
+ {
+ mach_print ("WARNING: acpi cannot register as essential task\n");
+ mach_port_deallocate (mach_task_self (), host);
+ return;
+ }
+ startup_essential_task (startup, mach_task_self (), MACH_PORT_NULL,
+ program_invocation_short_name, host);
+ mach_port_deallocate (mach_task_self (), startup);
+ mach_port_deallocate (mach_task_self (), host);
+}
+
+static void
+arrange_shutdown_notification (void)
+{
+ error_t err;
+ mach_port_t initport, notify;
+ struct port_info *pi;
+
+ acpi_shutdown_notify_class = ports_create_class (0, 0);
+
+ /* Arrange to get notified when the system goes down */
+ err = ports_create_port (acpi_shutdown_notify_class, netfs_port_bucket,
+ sizeof (struct port_info), &pi);
+ if (err)
+ return;
+
+ initport = file_name_lookup (_SERVERS_STARTUP, 0, 0);
+ if (initport == MACH_PORT_NULL)
+ {
+ mach_print ("WARNING: acpi not registered for shutdown\n");
+ return;
+ }
+
+ notify = ports_get_send_right (pi);
+ ports_port_deref (pi);
+ startup_request_notification (initport, notify,
+ MACH_MSG_TYPE_MAKE_SEND,
+ program_invocation_short_name);
+ mach_port_deallocate (mach_task_self (), notify);
+ mach_port_deallocate (mach_task_self (), initport);
+}
+
int
netfs_demuxer (mach_msg_header_t * inp, mach_msg_header_t * outp)
{
@@ -73,67 +139,6 @@ netfs_demuxer (mach_msg_header_t * inp, mach_msg_header_t * outp)
return FALSE;
}
-static io_return_t
-acpi_device_open (mach_port_t reply_port, mach_msg_type_name_t reply_port_type,
- dev_mode_t mode, const char *name, device_t * devp,
- mach_msg_type_name_t * devicePoly)
-{
- io_return_t err = D_SUCCESS;
- mach_port_t dev_master, root;
- string_t retry_name;
- retry_type retry;
- uid_t idlist[] = {0, 0, 0};
-
- if (strncmp(name, "acpi", 3))
- err = D_NO_SUCH_DEVICE;
-
- /* Fall back to opening kernel device master */
- if (err)
- {
- err = get_privileged_ports(NULL, &dev_master);
- if (err)
- return err;
- if (dev_master == MACH_PORT_NULL)
- return D_NO_SUCH_DEVICE;
- err = device_open (dev_master, mode, name, devp);
- if (err)
- return err;
- *devicePoly = MACH_MSG_TYPE_MOVE_SEND;
- return D_SUCCESS;
- }
-
- err = fsys_getroot(acpi_control_port, MACH_PORT_NULL, MACH_MSG_TYPE_COPY_SEND,
- idlist, 3, idlist, 3, 0,
- &retry, retry_name, &root);
- if (err)
- return err;
-
- *devp = root;
- *devicePoly = MACH_MSG_TYPE_COPY_SEND;
- return D_SUCCESS;
-}
-
-static struct machdev_device_emulation_ops acpi_emulation_ops = {
- NULL,
- NULL,
- NULL,
- NULL,
- acpi_device_open,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
-};
-
static mach_port_t
acpifs_startup(mach_port_t bootstrap, int flags)
{
@@ -148,12 +153,13 @@ acpifs_startup(mach_port_t bootstrap, int flags)
acpi_control_port = ports_get_send_right (newpi);
- if (bootstrap != MACH_PORT_NULL)
- {
- err = fsys_startup (bootstrap, flags, acpi_control_port, MACH_MSG_TYPE_COPY_SEND,
+ err = fsys_startup (bootstrap, flags, acpi_control_port, MACH_MSG_TYPE_COPY_SEND,
&realnode);
- assert_perror_backtrace (err);
- }
+ assert_perror_backtrace (err);
+
+ essential_task();
+
+ arrange_shutdown_notification();
return realnode;
}
@@ -163,36 +169,16 @@ main (int argc, char **argv)
{
error_t err;
mach_port_t bootstrap;
- mach_port_t next_task;
- pthread_t t, mt;
file_t underlying_node = MACH_PORT_NULL;
/* Parse options */
alloc_file_system (&fs);
argp_parse (netfs_runtime_argp, argc, argv, 0, 0, 0);
- next_task = fs->next_task;
- if (next_task != MACH_PORT_NULL)
- {
- /* We are a bootstrap process */
-
- machdev_register (&acpi_emulation_ops);
- /* TODO: make libmachdev allow us to also run netfs on the translated path,
- * so that we don't need a second acpi to serve /servers/acpi */
- machdev_trivfs_init (argc, argv, next_task, "acpi", NULL /* _SERVERS "acpi" */, &bootstrap);
-
- machdev_device_init ();
- err = pthread_create (&t, NULL, machdev_server, NULL);
- if (err)
- error (1, err, "creating machdev thread");
- pthread_detach (t);
- }
- else
- {
- task_get_bootstrap_port (mach_task_self (), &bootstrap);
- if (bootstrap == MACH_PORT_NULL)
- error (1, 0, "must be started as a translator");
- }
+ task_get_bootstrap_port (mach_task_self (), &bootstrap);
+ if (bootstrap == MACH_PORT_NULL)
+ error (1, 0, "must be started as a translator");
+
/* Initialize netfs and start the translator. */
netfs_init ();
@@ -202,23 +188,13 @@ main (int argc, char **argv)
if (err)
error (1, err, "mapping time");
- /* Enable ACPI mode of machine */
- acpi_init ();
-
- if (next_task != MACH_PORT_NULL)
- machdev_trivfs_server_startup (bootstrap);
-
- if (next_task == MACH_PORT_NULL)
- underlying_node = netfs_startup (bootstrap, O_READ);
+ underlying_node = netfs_startup (bootstrap, O_READ);
/* Create the root node first */
err = init_root_node (underlying_node);
if (err)
error (1, err, "creating the root node");
- if (next_task != MACH_PORT_NULL)
- acpifs_startup (bootstrap, O_READ);
-
err = init_file_system (fs);
if (err)
error (1, err, "creating the ACPI filesystem");
@@ -233,13 +209,10 @@ main (int argc, char **argv)
if (err)
error (1, err, "setting permissions");
- if (next_task != MACH_PORT_NULL)
- {
- err = pthread_create (&mt, NULL, machdev_trivfs_server_loop, NULL);
- if (err)
- error(1, err, "creating machdev_trivfs_server_loop thread");
- pthread_detach (mt);
- }
+ /* Enable ACPI mode of machine */
+ acpi_init ();
+
+ acpifs_startup (bootstrap, O_READ);
netfs_server_loop (); /* Never returns. */