File: _kill.c

package info (click to toggle)
newlib 3.1.0.20181231-1
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 98,256 kB
  • sloc: ansic: 570,997; makefile: 61,308; asm: 47,444; sh: 11,974; perl: 2,731; cpp: 1,064; lisp: 720; python: 557; exp: 350; yacc: 315; xml: 38; awk: 25
file content (51 lines) | stat: -rw-r--r-- 931 bytes parent folder | download | duplicates (7)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include <_ansi.h>
#include <signal.h>
#include "swi.h"

int _kill_shared (int, int, int) __attribute__((__noreturn__));
int _kill (int, int);

int
_kill (int pid, int sig)
{
  if (sig == SIGABRT)
    _kill_shared (pid, sig, ADP_Stopped_RunTimeError);
  else
    _kill_shared (pid, sig, ADP_Stopped_ApplicationExit);
}

int
_kill_shared (int pid, int sig, int reason)
{
  (void) pid; (void) sig;
#ifdef ARM_RDI_MONITOR
  /* Note: The pid argument is thrown away.  */
  int block[2];
  block[1] = sig;
  block[0] = reason;
  int insn;

#if SEMIHOST_V2
  if (_has_ext_exit_extended ())
    {
      insn = AngelSWI_Reason_ReportExceptionExtended;
    }
  else
#endif
    {
      insn = AngelSWI_Reason_ReportException;
    }

#if SEMIHOST_V2
if (_has_ext_exit_extended ())
  do_AngelSWI (insn, block);
else
#endif
  do_AngelSWI (insn, (void*)block[0]);

#else
  asm ("swi %a0" :: "i" (SWI_Exit));
#endif

  __builtin_unreachable();
}