From f7c2f4ba69c3ae7df8fddcc2969e2c21e109dbd1 Mon Sep 17 00:00:00 2001 From: Justus Winter Date: Thu, 25 Feb 2016 18:56:43 +0100 Subject: [PATCH gnumach 2/3] Disable disabling the irq via device_intr_enable --- device/ds_routines.c | 9 ++++----- device/intr.c | 3 ++- include/mach/experimental.defs | 22 +++++++++++++++------- 3 files changed, 21 insertions(+), 13 deletions(-) diff --git a/device/ds_routines.c b/device/ds_routines.c index 4f6b345..9d399ee 100644 --- a/device/ds_routines.c +++ b/device/ds_routines.c @@ -1844,11 +1844,10 @@ experimental_device_intr_enable(ipc_port_t master_port, int line, char status) if (master_port != master_device_port) return D_INVALID_OPERATION; - if (status) - /* TODO: better name for generic-to-arch-specific call */ - enable_irq (line); - else - disable_irq (line); + if (! status) + return D_INVALID_OPERATION; + + enable_irq (line); return 0; #endif /* MACH_XEN */ } diff --git a/device/intr.c b/device/intr.c index 6fca328..02e0bab 100644 --- a/device/intr.c +++ b/device/intr.c @@ -35,11 +35,12 @@ search_intr (int line, ipc_port_t dest) return NULL; } +void intr_thread (void); + /* This function can only be used in the interrupt handler. */ void queue_intr (int line, ipc_port_t dest) { - extern void intr_thread (); struct intr_entry *e; cli (); diff --git a/include/mach/experimental.defs b/include/mach/experimental.defs index ca1eb92..11c51d6 100644 --- a/include/mach/experimental.defs +++ b/include/mach/experimental.defs @@ -52,19 +52,27 @@ routine device_intr_register( in flags : int; in receive_port : mach_port_send_t ); +/* JW: It doesn't look safe to pass flags through. dde sets + * SA_SHIRQ. + * + * ID seems unused. dde hands in 0. + */ /* - * enable/disable the specified line. + * enable the specified line. + */ +/* Is the disable part actually used at all? -- No. */ +/* AIUI, the kernel IRQ handler should always disable the line; and + * the userspace driver only has to reenable it, after acknowledging + * and handling the interrupt... + * + * -- Indeed, and we should change the interface so that the irq is + * also re-enabled if the driver crashes. */ -/* XXX: Naming a function taht can disable something "xxx_enable" is confusing. */ -/* Is the disable part actually used at all? AIUI, the kernel IRQ handler -should always disable the line; and the userspace driver only has to -reenable it, after acknowledging and handling the interrupt... -*/ routine device_intr_enable( master_port : mach_port_t; line : int; - status : char); + status : char /* MUST be true-ish */); /* * This routine is created for allocating DMA buffers. -- 2.1.4