diff options
-rw-r--r-- | proc/mgt.c | 7 | ||||
-rw-r--r-- | proc/mig-decls.h | 42 | ||||
-rw-r--r-- | proc/proc_exc.defs | 8 |
3 files changed, 51 insertions, 6 deletions
@@ -417,7 +417,7 @@ S_proc_handle_exceptions (struct proc *p, the thread_set_state requested by proc_handle_exceptions and then send an exception_raise message as requested. */ kern_return_t -S_proc_exception_raise (mach_port_t excport, +S_proc_exception_raise (struct exc *e, mach_port_t reply, mach_msg_type_name_t reply_type, mach_port_t thread, @@ -428,8 +428,7 @@ S_proc_exception_raise (mach_port_t excport, { error_t err; struct proc *p; - struct exc *e = ports_lookup_port (proc_bucket, excport, exc_class); - if (!e) + if (!e || e->pi.bucket != proc_bucket || e->pi.class != exc_class) return EOPNOTSUPP; p = task_find (task); @@ -455,7 +454,6 @@ S_proc_exception_raise (mach_port_t excport, the faulting thread's state to run its recovery code, which should dequeue that message. */ err = thread_set_state (thread, e->flavor, e->thread_state, e->statecnt); - ports_port_deref (e); mach_port_deallocate (mach_task_self (), thread); mach_port_deallocate (mach_task_self (), task); if (err) @@ -484,7 +482,6 @@ S_proc_exception_raise (mach_port_t excport, /* Nuke the task; we will get a notification message and report that it died with SIGNO. */ task_terminate (task); - ports_port_deref (e); /* In the MACH_SEND_NOTIFY_IN_PROGRESS case, the kernel did a pseudo-receive of the RPC request message that may have added user diff --git a/proc/mig-decls.h b/proc/mig-decls.h new file mode 100644 index 00000000..0d5bd4df --- /dev/null +++ b/proc/mig-decls.h @@ -0,0 +1,42 @@ +/* Translation functions for mig. + + Copyright (C) 2013 Free Software Foundation, Inc. + + Written by Justus Winter <4winter@informatik.uni-hamburg.de> + + 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 __MIG_DECLS_H__ +#define __MIG_DECLS_H__ + +#include "proc.h" + +typedef struct exc* exc_t; + +static inline exc_t __attribute__ ((unused)) +begin_using_exc_port (mach_port_t port) +{ + return ports_lookup_port (NULL, port, exc_class); +} + +static inline void __attribute__ ((unused)) +end_using_exc (exc_t exc) +{ + if (exc != NULL) + ports_port_deref (exc); +} + +#endif diff --git a/proc/proc_exc.defs b/proc/proc_exc.defs index e9c58f1c..c9108246 100644 --- a/proc/proc_exc.defs +++ b/proc/proc_exc.defs @@ -33,9 +33,15 @@ subsystem proc_exc 2400; #include <mach/std_types.defs> ServerPrefix S_; +import "mig-decls.h"; + +type exception_t = mach_port_copy_send_t + cusertype: mach_port_t + intran: exc_t begin_using_exc_port (exception_t) + destructor: end_using_exc (exc_t); routine proc_exception_raise ( - exception_port: mach_port_t; + exception_port: exception_t; replyport reply: mach_port_poly_t; msgoption flags: integer_t; thread: mach_port_t; |