]> git.ipfire.org Git - thirdparty/glibc.git/blobdiff - hurd/catch-exc.c
Update copyright dates with scripts/update-copyrights.
[thirdparty/glibc.git] / hurd / catch-exc.c
index 8ab38a2a6130c3a660237466e81645e844aa69c4..be1d61de5a07e987da94fb2d3b1d5140810b7239 100644 (file)
@@ -1,23 +1,23 @@
-/* Copyright (C) 1994, 1995, 1996 Free Software Foundation, Inc.
-This file is part of the GNU C Library.
+/* Copyright (C) 1994-2015 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
 
-The GNU C Library is free software; you can redistribute it and/or
-modify it under the terms of the GNU Library General Public License as
-published by the Free Software Foundation; either version 2 of the
-License, or (at your option) any later version.
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
 
-The GNU C Library 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
-Library General Public License for more details.
+   The GNU C Library 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
+   Lesser General Public License for more details.
 
-You should have received a copy of the GNU Library General Public
-License along with the GNU C Library; see the file COPYING.LIB.  If
-not, write to the Free Software Foundation, Inc., 675 Mass Ave,
-Cambridge, MA 02139, USA.  */
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
 
 #include <mach/exc_server.h>
 #include <hurd/signal.h>
+#include <assert.h>
 
 /* Called by the microkernel when a thread gets an exception.  */
 
@@ -25,22 +25,37 @@ kern_return_t
 _S_catch_exception_raise (mach_port_t port,
                          thread_t thread,
                          task_t task,
-                         int exception,
-                         int code,
-                         int subcode)
+#ifdef EXC_MASK_ALL            /* New interface flavor.  */
+                         exception_type_t exception,
+                         exception_data_t code,
+                         mach_msg_type_number_t codeCnt
+#else                          /* Vanilla Mach 3.0 interface.  */
+                         integer_t exception,
+                         integer_t code, integer_t subcode
+#endif
+                         )
 {
-  int signo, error;
-  long int sigcode;
   struct hurd_sigstate *ss;
+  int signo;
+  struct hurd_signal_detail d;
 
   if (task != __mach_task_self ())
     /* The sender wasn't the kernel.  */
     return EPERM;
 
+  d.exc = exception;
+#ifdef EXC_MASK_ALL
+  assert (codeCnt >= 2);
+  d.exc_code = code[0];
+  d.exc_subcode = code[1];
+#else
+  d.exc_code = code;
+  d.exc_subcode = subcode;
+#endif
+
   /* Call the machine-dependent function to translate the Mach exception
      codes into a signal number and subcode.  */
-  _hurd_exception2signal (exception, code, subcode,
-                         &signo, &sigcode, &error);
+  _hurd_exception2signal (&d, &signo);
 
   /* Find the sigstate structure for the faulting thread.  */
   __mutex_lock (&_hurd_siglock);
@@ -70,9 +85,47 @@ _S_catch_exception_raise (mach_port_t port,
     }
 
   /* Post the signal.  */
-  _hurd_internal_post_signal (ss, signo, sigcode, error,
+  _hurd_internal_post_signal (ss, signo, &d,
                              MACH_PORT_NULL, MACH_MSG_TYPE_PORT_SEND,
                              0);
 
   return KERN_SUCCESS;
 }
+
+#ifdef EXC_MASK_ALL
+/* XXX New interface flavor has additional RPCs that we could be using
+   instead.  These RPCs roll a thread_get_state/thread_set_state into
+   the message, so the signal thread ought to use these to save some calls.
+ */
+kern_return_t
+_S_catch_exception_raise_state (mach_port_t port,
+                               exception_type_t exception,
+                               exception_data_t code,
+                               mach_msg_type_number_t codeCnt,
+                               int *flavor,
+                               thread_state_t old_state,
+                               mach_msg_type_number_t old_stateCnt,
+                               thread_state_t new_state,
+                               mach_msg_type_number_t *new_stateCnt)
+{
+  abort ();
+  return KERN_FAILURE;
+}
+
+kern_return_t
+_S_catch_exception_raise_state_identity (mach_port_t exception_port,
+                                        thread_t thread,
+                                        task_t task,
+                                        exception_type_t exception,
+                                        exception_data_t code,
+                                        mach_msg_type_number_t codeCnt,
+                                        int *flavor,
+                                        thread_state_t old_state,
+                                        mach_msg_type_number_t old_stateCnt,
+                                        thread_state_t new_state,
+                                        mach_msg_type_number_t *new_stateCnt)
+{
+  abort ();
+  return KERN_FAILURE;
+}
+#endif