In this patch, the old interface of device_intr_register and device_intr_ack is removed.
Junling Ma --- Makefrag.am | 2 - device/ds_routines.c | 62 ---------------------- device/intr.c | 104 ++++--------------------------------- device/intr.h | 4 +- include/device/device.defs | 19 ------- include/device/notify.defs | 36 ------------- include/device/notify.h | 34 ------------ 7 files changed, 10 insertions(+), 251 deletions(-) delete mode 100644 include/device/notify.defs delete mode 100644 include/device/notify.h diff --git a/Makefrag.am b/Makefrag.am index ea612275..eb9eaa64 100644 --- a/Makefrag.am +++ b/Makefrag.am @@ -363,8 +363,6 @@ include_device_HEADERS = \ include/device/device_types.h \ include/device/disk_status.h \ include/device/net_status.h \ - include/device/notify.defs \ - include/device/notify.h \ include/device/tape_status.h \ include/device/tty_status.h diff --git a/device/ds_routines.c b/device/ds_routines.c index 333b66c9..3a6921ec 100644 --- a/device/ds_routines.c +++ b/device/ds_routines.c @@ -320,68 +320,6 @@ ds_device_map (device_t dev, vm_prot_t prot, vm_offset_t offset, offset, size, pager, unmap); } -/* TODO: missing deregister support */ -io_return_t -ds_device_intr_register (device_t dev, int id, - int flags, ipc_port_t receive_port) -{ -#if defined(MACH_XEN) || defined(__x86_64__) - return D_INVALID_OPERATION; -#else /* MACH_XEN || __x86_64__ */ - kern_return_t err; - mach_device_t mdev = dev->emul_data; - - /* Refuse if device is dead or not completely open. */ - if (dev == DEVICE_NULL) - return D_NO_SUCH_DEVICE; - - /* No flag is defined for now */ - if (flags != 0) - return D_INVALID_OPERATION; - - /* Must be called on the irq device only */ - if (! name_equal(mdev->dev_ops->d_name, 3, "irq")) - return D_INVALID_OPERATION; - - // TODO detect when the port get destroyed because the driver crashes and - // restart, to replace it when the same device driver calls it again. - err = install_user_intr_handler (id, receive_port, mdev, FALSE); - if (err == D_SUCCESS) - { - /* If the port is installed successfully, increase its reference by 1. - * Thus, the port won't be destroyed after its task is terminated. */ - ip_reference (receive_port); - } - return err; -#endif /* MACH_XEN || __x86_64__ */ -} - -kern_return_t -ds_device_intr_ack (device_t dev, ipc_port_t receive_port) -{ -#if defined(MACH_XEN) || defined(__x86_64__) - return D_INVALID_OPERATION; -#else /* MACH_XEN || __x86_64__ */ - mach_device_t mdev = dev->emul_data; - kern_return_t ret; - - /* Refuse if device is dead or not completely open. */ - if (dev == DEVICE_NULL) - return D_NO_SUCH_DEVICE; - - /* Must be called on the irq device only */ - if (! name_equal(mdev->dev_ops->d_name, 3, "irq")) - return D_INVALID_OPERATION; - - ret = irq_acknowledge(receive_port); - - if (ret == D_SUCCESS) - ipc_port_release_send(receive_port); - - return ret; -#endif /* MACH_XEN || __x86_64__ */ -} - boolean_t ds_notify (mach_msg_header_t *msg) { diff --git a/device/intr.c b/device/intr.c index e78f2193..509788e1 100644 --- a/device/intr.c +++ b/device/intr.c @@ -15,7 +15,6 @@ #include <device/intr.h> #include <device/device_types.h> #include <device/device_port.h> -#include <device/notify.h> #include <kern/printf.h> #include <machine/spl.h> #include <machine/irq.h> @@ -30,7 +29,6 @@ #define SA_INTERRUPT 0x20000000 struct irqdev irqtab; -static boolean_t deliver_intr (int id, ipc_port_t dst_port); struct pt_regs; extern int request_irq (unsigned int irq, void (*handler) (int, void *, struct pt_regs *), unsigned long flags, const char *device, void *dev_id); @@ -67,38 +65,6 @@ search_notification (user_intr_t *handler, ipc_port_t dst_port) return n; } -kern_return_t -irq_acknowledge (ipc_port_t receive_port) -{ - user_intr_t *e; - user_intr_notification_t n = NULL; - unsigned id; - for (id = 0; id < NINTR; ++id) - { - e = irqtab.handler[id]; - if (e && (n = search_notification (e, receive_port)) != NULL) - break; - } - if (id == NINTR || n->device_port) - return D_INVALID_OPERATION; - /* cannot ack twice */ - if (n->acked) - return D_INVALID_OPERATION; - n->acked = TRUE; - kern_return_t ret = D_SUCCESS; - PROTECT(e->lock, - { - if (!e->n_unacked) - ret = D_INVALID_OPERATION; - else { - e->n_unacked--; - if (e->n_unacked == 0) - __enable_irq(id); - } - }); - return ret; -} - static void deliver_user_intr (int id, void *dev_id, struct pt_regs *regs) { @@ -141,13 +107,12 @@ intr_thread (void) queue_iterate (&e->notification_queue, n, user_intr_notification_t, chain) { /* check for dead port */ - while (n && n->dst_port->ip_references == 1) + while (n && !n->dst_port->ip_references) { /* dead, move it to the dead queue */ printf("dead port: %p\n", n->dst_port); next = (user_intr_notification_t)queue_next(&n->chain); queue_remove(&e->notification_queue, n, user_intr_notification_t, chain); - //ipc_port_release (n->dst_port); if (n->request) io_req_free(n->request); /* if waiting for acking, ack it */ @@ -157,8 +122,8 @@ intr_thread (void) if (e->n_unacked == 0) __enable_irq(id); } - kfree((vm_offset_t)n, sizeof(*n)); ds_device_close(&n->device->dev); + kfree((vm_offset_t)n, sizeof(*n)); n = next; } if (!n) break; @@ -166,15 +131,10 @@ intr_thread (void) /* the notification uses the old interface. is the notification port dead? */ if (!e->interrupts) continue; - if (!n->device_port && !deliver_intr(id, n->dst_port)) - continue; /* failed to delivery using the notification port */ - if (n->device_port) - { - if (!n->request) - continue; - ds_read_done(n->request); - io_req_free(n->request); - } + if (!n->request) + continue; + ds_read_done(n->request); + io_req_free(n->request); n->request = NULL; e->n_unacked++; n->acked = FALSE; @@ -199,52 +159,8 @@ intr_thread (void) } } -static boolean_t -deliver_intr (int id, ipc_port_t dst_port) -{ - ipc_kmsg_t kmsg; - device_intr_notification_t *n; - mach_port_t dest = (mach_port_t) dst_port; - - if (dest == MACH_PORT_NULL) - return FALSE; - - kmsg = ikm_alloc(sizeof *n); - if (kmsg == IKM_NULL) - return FALSE; - - ikm_init(kmsg, sizeof *n); - n = (device_intr_notification_t *) &kmsg->ikm_header; - - mach_msg_header_t *m = &n->intr_header; - mach_msg_type_t *t = &n->intr_type; - - m->msgh_bits = MACH_MSGH_BITS(MACH_MSG_TYPE_PORT_SEND, 0); - m->msgh_size = sizeof *n; - m->msgh_seqno = DEVICE_NOTIFY_MSGH_SEQNO; - m->msgh_local_port = MACH_PORT_NULL; - m->msgh_remote_port = MACH_PORT_NULL; - m->msgh_id = DEVICE_INTR_NOTIFY; - - t->msgt_name = MACH_MSG_TYPE_INTEGER_32; - t->msgt_size = 32; - t->msgt_number = 1; - t->msgt_inline = TRUE; - t->msgt_longform = FALSE; - t->msgt_deallocate = FALSE; - t->msgt_unused = 0; - - n->intr_header.msgh_remote_port = dest; - n->id = id; - - ipc_port_copy_send (dst_port); - ipc_mqueue_send_always(kmsg); - - return TRUE; -} - int -install_user_intr_handler (int id, ipc_port_t dst_port, mach_device_t device, boolean_t device_port) +install_user_intr_handler (int id, ipc_port_t dst_port, mach_device_t device) { if (id > NINTR || device == NULL) return D_INVALID_OPERATION; @@ -278,9 +194,7 @@ install_user_intr_handler (int id, ipc_port_t dst_port, mach_device_t device, bo return D_NO_MEMORY; n->dst_port = dst_port; - ipc_port_reference(dst_port); n->device = device; - n->device_port = device_port; n->request = NULL; n->acked = TRUE; PROTECT(e->lock, queue_enter (&e->notification_queue, n, user_intr_notification_t, chain)); @@ -308,7 +222,7 @@ extern int irqopen(dev_t dev, int flag, io_req_t ior) if (e) return D_SUCCESS; ior->io_error = D_SUCCESS; - return install_user_intr_handler (id, ior->io_reply_port, ior->io_device, TRUE); + return install_user_intr_handler (id, ior->io_reply_port, ior->io_device); } void irqclose(dev_t dev, int flags) @@ -327,7 +241,7 @@ extern int irqread(dev_t dev, io_req_t ior) n = search_notification(e, ior->io_reply_port); if (!n) { - int err = install_user_intr_handler(id, ior->io_reply_port, ior->io_device, TRUE); + int err = install_user_intr_handler(id, ior->io_reply_port, ior->io_device); if (err) return err; e = irqtab.handler[id]; diff --git a/device/intr.h b/device/intr.h index 88b40516..07863026 100644 --- a/device/intr.h +++ b/device/intr.h @@ -37,7 +37,6 @@ struct user_intr_notification { boolean_t acked; mach_device_t device; ipc_port_t dst_port; /* Notification port */ - boolean_t device_port; /* whether dst_port is a device port, i.e, using the new interface */ }; typedef struct user_intr_notification * user_intr_notification_t; @@ -53,11 +52,10 @@ struct irqdev { user_intr_t *handler[NINTR]; /* irq handlers for device_open */ }; -extern int install_user_intr_handler (int id, ipc_port_t dst_port, mach_device_t device, boolean_t device_port); +extern int install_user_intr_handler (int id, ipc_port_t dst_port, mach_device_t device); extern void irq_init(); void intr_thread (void); -kern_return_t irq_acknowledge (ipc_port_t receive_port); extern int irqopen(dev_t dev, int flag, io_req_t ior); extern void irqclose(dev_t dev, int flags); diff --git a/include/device/device.defs b/include/device/device.defs index ec4b5bf8..31ed42e2 100644 --- a/include/device/device.defs +++ b/include/device/device.defs @@ -141,22 +141,3 @@ routine device_set_filter( in priority : int; in filter : filter_array_t ); - -routine device_intr_register( - device : device_t; - in id : int; - in flags : int; - in receive_port : mach_port_send_t - ); - -/* - * Acknowledge the specified interrupt notification. - */ -/* - * When an IRQ happens and an intr notification is thus sent, the IRQ line - * is kept disabled until the notification is acknowledged with this RPC - */ -routine device_intr_ack( - device : device_t; - in receive_port : mach_port_send_t); - diff --git a/include/device/notify.defs b/include/device/notify.defs deleted file mode 100644 index 7919b339..00000000 --- a/include/device/notify.defs +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Mach Operating System - * Copyright (c) 1991,1990,1989 Carnegie Mellon University - * All Rights Reserved. - * - * Permission to use, copy, modify and distribute this software and its - * documentation is hereby granted, provided that both the copyright - * notice and this permission notice appear in all copies of the - * software, derivative works or modified versions, and any portions - * thereof, and that both notices appear in supporting documentation. - * - * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" - * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR - * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. - * - * Carnegie Mellon requests users of this software to return to - * - * Software Distribution Coordinator or software.distribut...@cs.cmu.edu - * School of Computer Science - * Carnegie Mellon University - * Pittsburgh PA 15213-3890 - * - * any improvements or extensions that they make and grant Carnegie Mellon - * the rights to redistribute these changes. - */ - -subsystem notify 100; - -#include <mach/std_types.defs> - -serverprefix do_; -serverdemux device_intr_notify_server; - -simpleroutine device_intr_notify( - notify : notify_port_t; - id : int); diff --git a/include/device/notify.h b/include/device/notify.h deleted file mode 100644 index addf9114..00000000 --- a/include/device/notify.h +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright (c) 2010 Free Software Foundation, Inc. - * - * Permission to use, copy, modify and distribute this software and its - * documentation is hereby granted, provided that both the copyright - * notice and this permission notice appear in all copies of the - * software, derivative works or modified versions, and any portions - * thereof, and that both notices appear in supporting documentation. - * - * THE FREE SOFTWARE FOUNDATIONALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" - * CONDITION. THE FREE SOFTWARE FOUNDATION DISCLAIMS ANY LIABILITY OF ANY KIND - * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. - */ - -/* - * Device notification definitions. - */ - -#ifndef _MACH_DEVICE_NOTIFY_H_ -#define _MACH_DEVICE_NOTIFY_H_ - -#include <mach/port.h> -#include <mach/message.h> - -typedef struct -{ - mach_msg_header_t intr_header; - mach_msg_type_t intr_type; - int id; -} device_intr_notification_t; - -#define DEVICE_INTR_NOTIFY 100 - -#endif /* _MACH_DEVICE_NOTIFY_H_ */ -- 2.28.0.rc1