diff options
Diffstat (limited to 'debian')
-rw-r--r-- | debian/patches/notify-fix-receiver-lookups.patch | 408 | ||||
-rw-r--r-- | debian/patches/series | 1 |
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 |