X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=hurd%2Fcatch-exc.c;h=2e0cfef88a01b6fd66be859f9aca6f489eedceeb;hb=ab7dd85bfbe9a176c2d5055d52185ae6364f97af;hp=72e06db1d38d0fcdcfe1e149a01ec8ee1ee37ac0;hpb=28f540f45bbacd939bfd07f213bcad2bf730b1bf;p=platform%2Fupstream%2Fglibc.git diff --git a/hurd/catch-exc.c b/hurd/catch-exc.c index 72e06db..2e0cfef 100644 --- a/hurd/catch-exc.c +++ b/hurd/catch-exc.c @@ -1,23 +1,24 @@ -/* Copyright (C) 1994, 1995 Free Software Foundation, Inc. -This file is part of the GNU C Library. +/* Copyright (C) 1994,95,96,97,2002 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, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ #include #include +#include /* Called by the microkernel when a thread gets an exception. */ @@ -25,22 +26,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); @@ -64,15 +80,53 @@ _S_catch_exception_raise (mach_port_t port, no code should do anything that can fault while holding the sigstate lock. */ - ss->critical_section = 0; + __spin_unlock (&ss->critical_section_lock); ss->context = NULL; __spin_unlock (&ss->lock); } /* 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