Updated to fedora-glibc-20070117T0857
[kopensolaris-gnu/glibc.git] / hurd / exc2signal.c
1 /* Translate Mach exception codes into signal numbers.  Stub version.
2    Copyright (C) 1991, 1992, 1994, 1995, 1997 Free Software Foundation, Inc.
3    This file is part of the GNU C Library.
4
5    The GNU C Library is free software; you can redistribute it and/or
6    modify it under the terms of the GNU Lesser General Public
7    License as published by the Free Software Foundation; either
8    version 2.1 of the License, or (at your option) any later version.
9
10    The GNU C Library is distributed in the hope that it will be useful,
11    but WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13    Lesser General Public License for more details.
14
15    You should have received a copy of the GNU Lesser General Public
16    License along with the GNU C Library; if not, write to the Free
17    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
18    02111-1307 USA.  */
19
20 #include <hurd.h>
21
22 /* This file must be modified with machine-dependent details.  */
23 #error "need to write sysdeps/mach/hurd/MACHINE/exc2signal.c"
24
25 /* Translate the Mach exception codes, as received in an `exception_raise' RPC,
26    into a signal number and signal subcode.  */
27
28 void
29 _hurd_exception2signal (int exception, int code, int subcode,
30                         int *signo, int *sigcode, int *error)
31 {
32   *error = 0;
33
34   switch (exception)
35     {
36     default:
37       *signo = SIGIOT;
38       *sigcode = exception;
39       break;
40
41     case EXC_BAD_ACCESS:
42       if (code == KERN_PROTECTION_FAILURE)
43         *signo = SIGSEGV;
44       else
45         *signo = SIGBUS;
46       *sigcode = subcode;
47       *error = code;
48       break;
49
50     case EXC_BAD_INSTRUCTION:
51       *signo = SIGILL;
52       *sigcode = 0;
53       break;
54
55     case EXC_ARITHMETIC:
56       *signo = SIGFPE;
57       *sigcode = 0;
58       break;
59
60     case EXC_EMULATION:
61     case EXC_SOFTWARE:
62       *signo = SIGEMT;
63       *sigcode = 0;
64       break;
65
66     case EXC_BREAKPOINT:
67       *signo = SIGTRAP;
68       *sigcode = 0;
69       break;
70     }
71 }