Don't set up args on the stack; pass them in registers.
[kopensolaris-gnu/glibc.git] / sysdeps / mach / hurd / mips / exc2signal.c
1 /* Translate Mach exception codes into signal numbers.  MIPS version.
2 Copyright (C) 1991, 1992, 1994 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 Library General Public License as
7 published by the Free Software Foundation; either version 2 of the
8 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 Library General Public License for more details.
14
15 You should have received a copy of the GNU Library General Public
16 License along with the GNU C Library; see the file COPYING.LIB.  If
17 not, write to the Free Software Foundation, Inc., 675 Mass Ave,
18 Cambridge, MA 02139, USA.  */
19
20 #include <hurd.h>
21 #include <hurd/signal.h>
22 #include <mach/exception.h>
23
24 /* Translate the Mach exception codes, as received in an `exception_raise' RPC,
25    into a signal number and signal subcode.  */
26
27 void
28 _hurd_exception2signal (int exception, int code, int subcode,
29                         int *signo, int *sigcode)
30 {
31   switch (exception)
32     {
33     default:
34       *signo = SIGIOT;
35       *sigcode = exception;
36       break;
37       
38     case EXC_BAD_ACCESS:
39       if (code == KERN_PROTECTION_FAILURE)
40         *signo = SIGSEGV;
41       else
42         *signo = SIGBUS;
43       *sigcode = subcode;
44       break;
45
46     case EXC_BAD_INSTRUCTION:
47       *signo = SIGILL;
48       if (code == EXC_MIPS_II)
49         *sigcode = code;
50       else
51         *sigcode = 0;
52       break;
53       
54     case EXC_ARITHMETIC:
55       switch (code)
56         {
57         case EXC_MIPS_OV:       /* integer overflow */
58           *signo = SIGFPE;
59           *sigcode = EXC_MIPS_FLT_OVERFLOW;
60           break;
61
62         default:
63           *signo = SIGFPE;
64           *sigcode = 0;
65           break;
66
67         case EXC_MIPS_INT:
68           /* Subcode is the fp_status word saved by the hardware.
69              Give an error code corresponding to the first bit set.  */
70           if (subcode == EXC_MIPS_FLT_UNIMP)
71             *signo = SIGILL;
72           else
73             *signo = SIGFPE;
74           *sigcode = subcode;
75           break;
76         }
77       break;
78
79     case EXC_EMULATION:         
80       /* 3.0 doesn't give this one, why, I don't know.  */
81       *signo = SIGEMT;
82       *sigcode = 0;
83       break;
84
85     case EXC_SOFTWARE:
86       *signo = SIGEMT;
87       *sigcode = 0;
88       break;
89       
90     case EXC_BREAKPOINT:
91       *signo = SIGTRAP;
92       *sigcode = code;
93       break;
94     }
95 }