From 09762e80a2f4705f86d09338df9e1f7f6648d361 Mon Sep 17 00:00:00 2001 From: Damien Zammit Date: Wed, 19 Jul 2023 10:56:16 +1000 Subject: acpi: Remove machdev dependency --- acpi/Makefile | 2 +- acpi/main.c | 191 +++++++++++++++++++++++++--------------------------------- 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 #include #include +#include +#include #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 #include #include @@ -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. */ -- cgit v1.2.3