(root)/
glibc-2.38/
hurd/
exc2signal.c
       1  /* Translate Mach exception codes into signal numbers.  Stub version.
       2     Copyright (C) 1991-2023 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, see
      17     <https://www.gnu.org/licenses/>.  */
      18  
      19  #include <hurd.h>
      20  #include <hurd/signal.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 (struct hurd_signal_detail *detail, int *signo)
      30  {
      31    detail->error = 0;
      32  
      33    switch (detail->exc)
      34      {
      35      default:
      36        *signo = SIGIOT;
      37        detail->code = detail->exc;
      38        break;
      39  
      40      case EXC_BAD_ACCESS:
      41        if (detail->exc_code == KERN_PROTECTION_FAILURE)
      42  	*signo = SIGSEGV;
      43        else
      44  	*signo = SIGBUS;
      45        detail->code = detail->exc_subcode;
      46        detail->error = detail->exc_code;
      47        break;
      48  
      49      case EXC_BAD_INSTRUCTION:
      50        *signo = SIGILL;
      51        detail->code = 0;
      52        break;
      53  
      54      case EXC_ARITHMETIC:
      55        *signo = SIGFPE;
      56        detail->code = 0;
      57        break;
      58  
      59      case EXC_EMULATION:
      60      case EXC_SOFTWARE:
      61        *signo = SIGEMT;
      62        detail->code = 0;
      63        break;
      64  
      65      case EXC_BREAKPOINT:
      66        *signo = SIGTRAP;
      67        detail->code = 0;
      68        break;
      69      }
      70  }
      71  libc_hidden_def (_hurd_exception2signal)