Hello,
Damien Zammit, le dim. 12 oct. 2025 23:06:56 +0000, a ecrit:
> Now the acpi server can know which interrupt controller is in use,
> particularly useful on x86 ISA where there are two different ones.
>
> TESTED: With this patch, 1/2 and the gnumach irq device patch,
> Hurd i386 boots with apic on Thinkpad W530.
> Also still boots on qemu (with different irq numbers detected).
>
> Also-by: Michael Kelly <[email protected]>
> ---
> debian/patches/acpi-init-files.diff | 96 ++++++++++++++++++++++++++++-
> 1 file changed, 95 insertions(+), 1 deletion(-)
>
> diff --git a/debian/patches/acpi-init-files.diff
> b/debian/patches/acpi-init-files.diff
> index 3f95537..aad4c95 100644
> --- a/debian/patches/acpi-init-files.diff
> +++ b/debian/patches/acpi-init-files.diff
> @@ -1,6 +1,6 @@
> --- /dev/null
> +++ b/acpi_init.c
> -@@ -0,0 +1,736 @@
> +@@ -0,0 +1,830 @@
> +// SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0
> +#include <acpi/acpi.h>
> +
> @@ -701,6 +701,96 @@
> + return -EIO;
> +}
> +
> ++#define IRQGETPICMODE 0
> ++# define ACPI_PICMODE_PIC 0
> ++# define ACPI_PICMODE_APIC 1
> ++# define ACPI_PICMODE_SAPIC 2
It'd be better to include a header from gnumach to get these.
> ++/* Fetch the active interrupt mode from GNU mach */
> ++static error_t
> ++acpi_required_pic_mode (int* pic_mode)
> ++{
> ++ mach_port_t devices = MACH_PORT_NULL, irq;
> ++ mach_msg_type_number_t cnt = 0;
> ++
> ++ error_t err = get_privileged_ports(NULL, &devices);
> ++ if (err)
> ++ return err;
> ++
> ++ if (devices == MACH_PORT_NULL)
> ++ return ENODEV;
> ++
> ++ err = device_open(devices, D_READ, "irq", &irq);
You can actually close devices here.
> ++ if (!err)
> ++ {
> ++ /* Determine if the IRQGETPICMODE feature is available in the
> ++ running kernel by specifying a NULL array for 'status'. If
> ++ the feature is available then MIG_ARRAY_TOO_LARGE is returned
> ++ as the returned status cannot fit in the result.
> ++ */
> ++ if (device_get_status(irq, IRQGETPICMODE, NULL, &cnt)
> ++ != MIG_ARRAY_TOO_LARGE)
> ++ err = ENOSYS;
> ++ else
> ++ {
> ++ cnt = 1;
> ++ err = device_get_status(irq, IRQGETPICMODE, pic_mode, &cnt);
> ++ }
> ++
> ++ device_close(irq);
> ++ }
> ++
> ++ mach_port_deallocate (mach_task_self (), devices);
> ++ return err;
> ++}
> ++
> ++static error_t
> ++acpi_set_pic_mode (int pic_mode)
> ++{
> ++ struct acpi_object_list arg;
> ++ union acpi_object obj;
> ++
> ++ if (pic_mode < ACPI_PICMODE_PIC || pic_mode > ACPI_PICMODE_SAPIC)
> ++ return EINVAL;
> ++
> ++ obj.type = ACPI_TYPE_INTEGER;
> ++ obj.integer.value = pic_mode;
> ++
> ++ arg.count = 1;
> ++ arg.pointer = &obj;
> ++
> ++ acpi_handle handle = ACPI_ROOT_OBJECT;
> ++ acpi_status rv = acpi_evaluate_object(handle, "\\_PIC", &arg, NULL);
> ++
> ++ /* A failure of AE_NOT_FOUND means the \_PIC method is not supported.
> ++ The default for the system in this case is ACPI_PICMODE_PIC, so
> ++ it is only a concern if an attempt is made to set a different mode.
> ++ */
> ++ return (ACPI_FAILURE(rv)
> ++ && (rv != AE_NOT_FOUND || (pic_mode != ACPI_PICMODE_PIC))
> ++ ? EIO
> ++ : 0);
> ++}
> ++
> ++static error_t
> ++acpi_configure_pic_mode (void)
> ++{
> ++ int pic_mode = -1;
> ++ error_t err = acpi_required_pic_mode (&pic_mode);
> ++
> ++ if (err)
> ++ {
> ++ acpi_os_printf("Cannot determine PIC mode: %s\n", strerror(err));
But then the acpi server fails with old gnumach? Can't we have some
fallback that at least works a bit in simple cases?
> ++ return err;
> ++ }
> ++
> ++ err = acpi_set_pic_mode (pic_mode);
> ++ if (err)
> ++ acpi_os_printf("Failed to set ACPI PIC mode: %s\n", strerror(err));
> ++
> ++ return err;
> ++}
> ++
> +void acpi_init(void)
> +{
> + acpi_status err;
> @@ -724,6 +814,10 @@
> + if (ACPI_FAILURE (err))
> + goto die;
> +
> ++ err = acpi_configure_pic_mode();
> ++ if (err)
> ++ goto die;
> ++
> + err = acpi_enable_subsystem (ACPI_FULL_INITIALIZATION);
> + if (ACPI_FAILURE (err))
> + goto die;
> --
> 2.45.2
>
>
>
--
Samuel
<D> m'enfin, le 5 juillet, le mec vient visiter le labo...
* D a marque d'une croix rouge le 5 juillet sur son agenda
<y> niarc niarc niarc
<D> cet homme va souffrir
<B> c'est donc le 5 juillet qu'il meurt d'un accident de la route écrasé par un
truck muni d'un pare buffle
-+- #ens-mim - repaire de terroristes -+-