summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJustus Winter <4winter@informatik.uni-hamburg.de>2014-04-05 18:19:33 +0200
committerJustus Winter <4winter@informatik.uni-hamburg.de>2014-04-05 18:19:33 +0200
commit5500926fee36eda95752e01ccddf8de76e95e1b9 (patch)
tree8330f0de8a5a630e1da329d452bdb3e2748734f3
parent1e45750e01d74e94003b8feec51b119eb9463275 (diff)
add notify-fix-receiver-lookups.patch
-rw-r--r--debian/patches/notify-fix-receiver-lookups.patch408
-rw-r--r--debian/patches/series1
2 files changed, 409 insertions, 0 deletions
diff --git a/debian/patches/notify-fix-receiver-lookups.patch b/debian/patches/notify-fix-receiver-lookups.patch
new file mode 100644
index 00000000..8cc44b2a
--- /dev/null
+++ b/debian/patches/notify-fix-receiver-lookups.patch
@@ -0,0 +1,408 @@
+commit 7b133da0393052cc28db41cdd5e259d5ef6458f3
+Author: Justus Winter <4winter@informatik.uni-hamburg.de>
+Date: Sat Apr 5 17:40:24 2014 +0200
+
+ libports: fix notify_port_t receiver lookups
+
+ * libports/Makefile (MIGSFLAGS): Include mig-mutate.h.
+ * libports/mig-decls.h: New file.
+ * libports/mig-mutate.h: Likewise.
+ * libports/notify-dead-name.c: Fix receiver lookups.
+ * libports/notify-no-senders.c: Likewise.
+ * libports/notify-msg-accepted.c: Adjust function declaration.
+ * libports/notify-port-deleted.c: Likewise.
+ * libports/notify-port-destroyed.c: Likewise.
+ * libports/notify-send-once.c: Likewise.
+ * libports/ports.h: Likewise.
+ * proc/Makefile (MIGSFLAGS): Include mig-mutate.h, move PROCESS mutators...
+ * proc/mig-mutate.h: ... into a new file, add NOTIFY mutators.
+ * proc/notify.c: Fix receiver lookups, adjust function declarations.
+ * term/devio.c (ports_do_mach_notify_send_once): Adjust accordingly.
+
+diff --git a/libports/Makefile b/libports/Makefile
+index 767ee73..30da1c1 100644
+--- a/libports/Makefile
++++ b/libports/Makefile
+@@ -45,5 +45,6 @@ LDLIBS += -lpthread
+ OBJS = $(SRCS:.c=.o) notifyServer.o interruptServer.o
+
+ MIGCOMSFLAGS = -prefix ports_
++MIGSFLAGS = -imacros $(srcdir)/mig-mutate.h
+
+ include ../Makeconf
+diff --git a/libports/mig-decls.h b/libports/mig-decls.h
+new file mode 100644
+index 0000000..f8c4f15
+--- /dev/null
++++ b/libports/mig-decls.h
+@@ -0,0 +1,40 @@
++/*
++ Copyright (C) 2014 Free Software Foundation, Inc.
++ Written by Justus Winter.
++
++ This file is part of the GNU Hurd.
++
++ The GNU Hurd is free software; you can redistribute it and/or
++ modify it under the terms of the GNU General Public License as
++ published by the Free Software Foundation; either version 2, or (at
++ your option) any later version.
++
++ The GNU Hurd is distributed in the hope that it will be useful, but
++ WITHOUT ANY WARRANTY; without even the implied warranty of
++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ General Public License for more details.
++
++ You should have received a copy of the GNU General Public License
++ along with the GNU Hurd. If not, see <http://www.gnu.org/licenses/>. */
++
++#ifndef __LIBPORTS_MIG_DECLS_H__
++#define __LIBPORTS_MIG_DECLS_H__
++
++#include "ports.h"
++
++/* Called by server stub functions. */
++
++static inline struct port_info * __attribute__ ((unused))
++begin_using_port_info_port (mach_port_t port)
++{
++ return ports_lookup_port (0, port, 0);
++}
++
++static inline void __attribute__ ((unused))
++end_using_port_info (struct port_info *p)
++{
++ if (p)
++ ports_port_deref (p);
++}
++
++#endif /* __LIBPORTS_MIG_DECLS_H__ */
+diff --git a/libports/mig-mutate.h b/libports/mig-mutate.h
+new file mode 100644
+index 0000000..2eca719
+--- /dev/null
++++ b/libports/mig-mutate.h
+@@ -0,0 +1,25 @@
++/*
++ Copyright (C) 2014 Free Software Foundation, Inc.
++ Written by Justus Winter.
++
++ This file is part of the GNU Hurd.
++
++ The GNU Hurd is free software; you can redistribute it and/or
++ modify it under the terms of the GNU General Public License as
++ published by the Free Software Foundation; either version 2, or (at
++ your option) any later version.
++
++ The GNU Hurd is distributed in the hope that it will be useful, but
++ WITHOUT ANY WARRANTY; without even the implied warranty of
++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ General Public License for more details.
++
++ You should have received a copy of the GNU General Public License
++ along with the GNU Hurd. If not, see <http://www.gnu.org/licenses/>. */
++
++#define NOTIFY_INTRAN \
++ port_info_t begin_using_port_info_port (mach_port_t)
++#define NOTIFY_DESTRUCTOR \
++ end_using_port_info (port_info_t)
++#define NOTIFY_IMPORTS \
++ import "mig-decls.h";
+diff --git a/libports/notify-dead-name.c b/libports/notify-dead-name.c
+index c67145d..f974e33 100644
+--- a/libports/notify-dead-name.c
++++ b/libports/notify-dead-name.c
+@@ -22,13 +22,12 @@
+ #include "notify_S.h"
+
+ error_t
+-ports_do_mach_notify_dead_name (mach_port_t notify, mach_port_t dead_name)
++ports_do_mach_notify_dead_name (struct port_info *pi,
++ mach_port_t dead_name)
+ {
+- void *pi = ports_lookup_port (0, notify, 0);
+ if (!pi)
+ return EOPNOTSUPP;
+ ports_dead_name (pi, dead_name);
+- ports_port_deref (pi);
+
+ /* Drop gratuitous extra reference that the notification creates. */
+ mach_port_deallocate (mach_task_self (), dead_name);
+diff --git a/libports/notify-msg-accepted.c b/libports/notify-msg-accepted.c
+index c975083..0e49715 100644
+--- a/libports/notify-msg-accepted.c
++++ b/libports/notify-msg-accepted.c
+@@ -22,7 +22,8 @@
+ #include "notify_S.h"
+
+ error_t
+-ports_do_mach_notify_msg_accepted (mach_port_t notify, mach_port_t name)
++ports_do_mach_notify_msg_accepted (struct port_info *pi,
++ mach_port_t name)
+ {
+ return 0;
+ }
+diff --git a/libports/notify-no-senders.c b/libports/notify-no-senders.c
+index dc9b316..55aa853 100644
+--- a/libports/notify-no-senders.c
++++ b/libports/notify-no-senders.c
+@@ -22,12 +22,11 @@
+ #include "notify_S.h"
+
+ error_t
+-ports_do_mach_notify_no_senders (mach_port_t port, mach_port_mscount_t count)
++ports_do_mach_notify_no_senders (struct port_info *pi,
++ mach_port_mscount_t count)
+ {
+- void *pi = ports_lookup_port (0, port, 0);
+ if (!pi)
+ return EOPNOTSUPP;
+ ports_no_senders (pi, count);
+- ports_port_deref (pi);
+ return 0;
+ }
+diff --git a/libports/notify-port-deleted.c b/libports/notify-port-deleted.c
+index 85012af..cfd3379 100644
+--- a/libports/notify-port-deleted.c
++++ b/libports/notify-port-deleted.c
+@@ -22,7 +22,8 @@
+ #include "notify_S.h"
+
+ error_t
+-ports_do_mach_notify_port_deleted (mach_port_t notify, mach_port_t name)
++ports_do_mach_notify_port_deleted (struct port_info *pi,
++ mach_port_t name)
+ {
+ return 0;
+ }
+diff --git a/libports/notify-port-destroyed.c b/libports/notify-port-destroyed.c
+index 78eaf21..b8ece2a 100644
+--- a/libports/notify-port-destroyed.c
++++ b/libports/notify-port-destroyed.c
+@@ -22,7 +22,8 @@
+ #include "notify_S.h"
+
+ error_t
+-ports_do_mach_notify_port_destroyed (mach_port_t notify, mach_port_t name)
++ports_do_mach_notify_port_destroyed (struct port_info *pi,
++ mach_port_t name)
+ {
+ return 0;
+ }
+diff --git a/libports/notify-send-once.c b/libports/notify-send-once.c
+index 09ffcf2..ad0ba33 100644
+--- a/libports/notify-send-once.c
++++ b/libports/notify-send-once.c
+@@ -22,7 +22,7 @@
+ #include "notify_S.h"
+
+ error_t
+-ports_do_mach_notify_send_once (mach_port_t notify)
++ports_do_mach_notify_send_once (struct port_info *pi)
+ {
+ return 0;
+ }
+diff --git a/libports/ports.h b/libports/ports.h
+index 0791841..47d4607 100644
+--- a/libports/ports.h
++++ b/libports/ports.h
+@@ -50,6 +50,8 @@ struct port_info
+ hurd_ihash_locp_t hentry;
+ struct port_info *next, **prevp; /* links on port_class list */
+ };
++typedef struct port_info *port_info_t;
++
+ /* FLAGS above are the following: */
+ #define PORT_HAS_SENDRIGHTS 0x0001 /* send rights extant */
+ #define PORT_INHIBITED PORTS_INHIBITED
+@@ -383,13 +385,19 @@ void ports_interrupt_notified_rpcs (void *object, mach_port_t port,
+ int ports_notify_server (mach_msg_header_t *, mach_msg_header_t *);
+
+ /* Notification server routines called by ports_notify_server. */
+-extern kern_return_t ports_do_mach_notify_dead_name (mach_port_t notify, mach_port_t deadport);
+-extern kern_return_t ports_do_mach_notify_msg_accepted (mach_port_t notify, mach_port_t name);
+-extern kern_return_t ports_do_mach_notify_no_senders (mach_port_t port, mach_port_mscount_t count);
+-extern kern_return_t ports_do_mach_notify_port_deleted (mach_port_t notify, mach_port_t name);
+-extern kern_return_t ports_do_mach_notify_port_destroyed (mach_port_t notify, mach_port_t name);
+ extern kern_return_t
+- ports_do_mach_notify_send_once (mach_port_t notify);
++ ports_do_mach_notify_dead_name (struct port_info *pi, mach_port_t deadport);
++extern kern_return_t
++ ports_do_mach_notify_msg_accepted (struct port_info *pi, mach_port_t name);
++extern kern_return_t
++ ports_do_mach_notify_no_senders (struct port_info *pi,
++ mach_port_mscount_t count);
++extern kern_return_t
++ ports_do_mach_notify_port_deleted (struct port_info *pi, mach_port_t name);
++extern kern_return_t
++ ports_do_mach_notify_port_destroyed (struct port_info *pi, mach_port_t name);
++extern kern_return_t
++ ports_do_mach_notify_send_once (struct port_info *pi);
+
+ /* A default interrupt server */
+ int ports_interrupt_server (mach_msg_header_t *, mach_msg_header_t *);
+diff --git a/proc/Makefile b/proc/Makefile
+index 2eed13c..aa31ffb 100644
+--- a/proc/Makefile
++++ b/proc/Makefile
+@@ -24,9 +24,7 @@ target = proc
+ SRCS = wait.c hash.c host.c info.c main.c mgt.c notify.c pgrp.c msg.c \
+ cpu-types.c stubs.c
+
+-MIGSFLAGS="-DPROCESS_INTRAN=pstruct_t reqport_find (process_t)" \
+- "-DPROCESS_DESTRUCTOR=process_drop (pstruct_t)" \
+- "-DPROCESS_IMPORTS=import \"proc.h\";"
++MIGSFLAGS = -imacros $(srcdir)/mig-mutate.h
+
+ MIGSTUBS = processServer.o notifyServer.o \
+ ourmsgUser.o proc_excUser.o proc_excServer.o
+diff --git a/proc/mig-mutate.h b/proc/mig-mutate.h
+new file mode 100644
+index 0000000..9d4c14d
+--- /dev/null
++++ b/proc/mig-mutate.h
+@@ -0,0 +1,33 @@
++/*
++ Copyright (C) 2014 Free Software Foundation, Inc.
++ Written by Justus Winter.
++
++ This file is part of the GNU Hurd.
++
++ The GNU Hurd is free software; you can redistribute it and/or
++ modify it under the terms of the GNU General Public License as
++ published by the Free Software Foundation; either version 2, or (at
++ your option) any later version.
++
++ The GNU Hurd is distributed in the hope that it will be useful, but
++ WITHOUT ANY WARRANTY; without even the implied warranty of
++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ General Public License for more details.
++
++ You should have received a copy of the GNU General Public License
++ along with the GNU Hurd. If not, see <http://www.gnu.org/licenses/>. */
++
++
++#define PROCESS_INTRAN \
++ pstruct_t reqport_find (process_t)
++#define PROCESS_DESTRUCTOR \
++ process_drop (pstruct_t)
++#define PROCESS_IMPORTS \
++ import "proc.h";
++
++#define NOTIFY_INTRAN \
++ port_info_t begin_using_port_info_port (mach_port_t)
++#define NOTIFY_DESTRUCTOR \
++ end_using_port_info (port_info_t)
++#define NOTIFY_IMPORTS \
++ import "../libports/mig-decls.h";
+diff --git a/proc/notify.c b/proc/notify.c
+index 5a112b0..b6731ae 100644
+--- a/proc/notify.c
++++ b/proc/notify.c
+@@ -36,33 +36,33 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
+ message ports die. Both notifications get sent to the process
+ port. */
+ kern_return_t
+-do_mach_notify_dead_name (mach_port_t notify,
++do_mach_notify_dead_name (struct port_info *pi,
+ mach_port_t deadport)
+ {
+ struct proc *p;
+
+- if (notify == generic_port)
++ if (pi->port_right == generic_port)
+ {
+ check_dead_execdata_notify (deadport);
+ mach_port_deallocate (mach_task_self (), deadport);
+ return 0;
+ }
+
+- p = ports_lookup_port (proc_bucket, notify, proc_class);
++ p = (struct proc *) pi;
+
+- if (!p)
++ if (!p
++ || p->p_pi.bucket != proc_bucket
++ || p->p_pi.class != proc_class)
+ return EOPNOTSUPP;
+
+ if (p->p_task == deadport)
+ {
+ process_has_exited (p);
+- ports_port_deref (p);
+ mach_port_deallocate (mach_task_self (), deadport);
+ return 0;
+ }
+ else
+ {
+- ports_port_deref (p);
+ return EINVAL;
+ }
+ }
+@@ -70,35 +70,35 @@ do_mach_notify_dead_name (mach_port_t notify,
+ /* We get no-senders notifications on exception ports that we
+ handle through proc_handle_exceptions. */
+ kern_return_t
+-do_mach_notify_no_senders (mach_port_t notify,
++do_mach_notify_no_senders (struct port_info *pi,
+ mach_port_mscount_t mscount)
+ {
+- return ports_do_mach_notify_no_senders (notify, mscount);
++ return ports_do_mach_notify_no_senders (pi, mscount);
+ }
+
+ kern_return_t
+-do_mach_notify_port_deleted (mach_port_t notify,
++do_mach_notify_port_deleted (struct port_info *pi,
+ mach_port_t name)
+ {
+ return 0;
+ }
+
+ kern_return_t
+-do_mach_notify_msg_accepted (mach_port_t notify,
++do_mach_notify_msg_accepted (struct port_info *pi,
+ mach_port_t name)
+ {
+ return 0;
+ }
+
+ kern_return_t
+-do_mach_notify_port_destroyed (mach_port_t notify,
++do_mach_notify_port_destroyed (struct port_info *pi,
+ mach_port_t name)
+ {
+ return 0;
+ }
+
+ kern_return_t
+-do_mach_notify_send_once (mach_port_t notify)
++do_mach_notify_send_once (struct port_info *pi)
+ {
+ return 0;
+ }
+diff --git a/term/devio.c b/term/devio.c
+index 7c7d8fd..eedd7b8 100644
+--- a/term/devio.c
++++ b/term/devio.c
+@@ -731,18 +731,18 @@ device_write_reply (mach_port_t replyport,
+ }
+
+ error_t
+-ports_do_mach_notify_send_once (mach_port_t notify)
++ports_do_mach_notify_send_once (struct port_info *pi)
+ {
+ error_t err;
+
+ pthread_mutex_lock (&global_lock);
+
+- if (notify == phys_reply_writes)
++ if (pi->port_right == phys_reply_writes)
+ {
+ err = 0;
+ devio_start_output ();
+ }
+- else if (notify == phys_reply)
++ else if (pi->port_right == phys_reply)
+ {
+ if (input_pending)
+ {
diff --git a/debian/patches/series b/debian/patches/series
index f4632394..fc462332 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -48,3 +48,4 @@ mach-defpager-protected-payload.patch
#ext2fs-skip-unallocated-blocks.patch
fix-receiver-lookups.patch
+notify-fix-receiver-lookups.patch